github.com/kchristidis/fabric@v1.0.4-0.20171028114726-837acd08cde1/peer/chaincode/package_test.go (about)

     1  /*
     2   Copyright IBM Corp. 2017 All Rights Reserved.
     3  
     4   Licensed under the Apache License, Version 2.0 (the "License");
     5   you may not use this file except in compliance with the License.
     6   You may obtain a copy of the License at
     7  
     8        http://www.apache.org/licenses/LICENSE-2.0
     9  
    10   Unless required by applicable law or agreed to in writing, software
    11   distributed under the License is distributed on an "AS IS" BASIS,
    12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   See the License for the specific language governing permissions and
    14   limitations under the License.
    15  */
    16  
    17  package chaincode
    18  
    19  import (
    20  	"fmt"
    21  	"io/ioutil"
    22  	"os"
    23  	"testing"
    24  
    25  	"github.com/golang/protobuf/proto"
    26  
    27  	"github.com/hyperledger/fabric/msp"
    28  	"github.com/hyperledger/fabric/peer/common"
    29  	pcommon "github.com/hyperledger/fabric/protos/common"
    30  	pb "github.com/hyperledger/fabric/protos/peer"
    31  )
    32  
    33  func newTempDir() string {
    34  	tempDir, err := ioutil.TempDir("/tmp", "packagetest-")
    35  	if err != nil {
    36  		panic(err)
    37  	}
    38  	return tempDir
    39  }
    40  
    41  func mockCDSFactory(spec *pb.ChaincodeSpec) (*pb.ChaincodeDeploymentSpec, error) {
    42  	return &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec, CodePackage: []byte("somecode")}, nil
    43  }
    44  
    45  func extractSignedCCDepSpec(env *pcommon.Envelope) (*pcommon.ChannelHeader, *pb.SignedChaincodeDeploymentSpec, error) {
    46  	p := &pcommon.Payload{}
    47  	err := proto.Unmarshal(env.Payload, p)
    48  	if err != nil {
    49  		return nil, nil, err
    50  	}
    51  	ch := &pcommon.ChannelHeader{}
    52  	err = proto.Unmarshal(p.Header.ChannelHeader, ch)
    53  	if err != nil {
    54  		return nil, nil, err
    55  	}
    56  
    57  	sp := &pb.SignedChaincodeDeploymentSpec{}
    58  	err = proto.Unmarshal(p.Data, sp)
    59  	if err != nil {
    60  		return nil, nil, err
    61  	}
    62  
    63  	return ch, sp, nil
    64  }
    65  
    66  // TestCDSPackage tests generation of the old ChaincodeDeploymentSpec install
    67  // which we will presumably continue to support at least for a bit
    68  func TestCDSPackage(t *testing.T) {
    69  	pdir := newTempDir()
    70  	defer os.RemoveAll(pdir)
    71  
    72  	ccpackfile := pdir + "/ccpack.file"
    73  	err := createSignedCDSPackage([]string{"-n", "somecc", "-p", "some/go/package", "-v", "0", ccpackfile}, false)
    74  	if err != nil {
    75  		t.Fatalf("Run chaincode package cmd error:%v", err)
    76  	}
    77  
    78  	b, err := ioutil.ReadFile(ccpackfile)
    79  	if err != nil {
    80  		t.Fatalf("package file %s not created", ccpackfile)
    81  	}
    82  	cds := &pb.ChaincodeDeploymentSpec{}
    83  	err = proto.Unmarshal(b, cds)
    84  	if err != nil {
    85  		t.Fatalf("could not unmarshall package into CDS")
    86  	}
    87  }
    88  
    89  //helper to create a SignedChaincodeDeploymentSpec
    90  func createSignedCDSPackage(args []string, sign bool) error {
    91  	InitMSP()
    92  	var signer msp.SigningIdentity
    93  	var err error
    94  	if sign {
    95  
    96  		signer, err = common.GetDefaultSigner()
    97  		if err != nil {
    98  			return fmt.Errorf("Get default signer error: %v", err)
    99  		}
   100  	}
   101  
   102  	mockCF := &ChaincodeCmdFactory{Signer: signer}
   103  
   104  	cmd := packageCmd(mockCF, mockCDSFactory)
   105  	addFlags(cmd)
   106  
   107  	cmd.SetArgs(args)
   108  
   109  	if err := cmd.Execute(); err != nil {
   110  		return err
   111  	}
   112  
   113  	return nil
   114  }
   115  
   116  // TestSignedCDSPackage generates the new envelope encapsulating
   117  // CDS, policy
   118  func TestSignedCDSPackage(t *testing.T) {
   119  	pdir := newTempDir()
   120  	defer os.RemoveAll(pdir)
   121  
   122  	ccpackfile := pdir + "/ccpack.file"
   123  	err := createSignedCDSPackage([]string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", ccpackfile}, false)
   124  	if err != nil {
   125  		t.Fatalf("could not create signed cds package %s", err)
   126  	}
   127  
   128  	b, err := ioutil.ReadFile(ccpackfile)
   129  	if err != nil {
   130  		t.Fatalf("package file %s not created", ccpackfile)
   131  	}
   132  
   133  	e := &pcommon.Envelope{}
   134  	err = proto.Unmarshal(b, e)
   135  	if err != nil {
   136  		t.Fatalf("could not unmarshall envelope")
   137  	}
   138  
   139  	_, p, err := extractSignedCCDepSpec(e)
   140  	if err != nil {
   141  		t.Fatalf("could not extract signed dep spec")
   142  	}
   143  
   144  	if p.OwnerEndorsements != nil {
   145  		t.Fatalf("expected no signtures but found endorsements")
   146  	}
   147  }
   148  
   149  // TestSignedCDSPackageWithSignature generates the new envelope encapsulating
   150  // CDS, policy and signs the package with local MSP
   151  func TestSignedCDSPackageWithSignature(t *testing.T) {
   152  	pdir := newTempDir()
   153  	defer os.RemoveAll(pdir)
   154  
   155  	ccpackfile := pdir + "/ccpack.file"
   156  	err := createSignedCDSPackage([]string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", "-S", ccpackfile}, true)
   157  	if err != nil {
   158  		t.Fatalf("could not create signed cds package %s", err)
   159  	}
   160  
   161  	b, err := ioutil.ReadFile(ccpackfile)
   162  	if err != nil {
   163  		t.Fatalf("package file %s not created", ccpackfile)
   164  	}
   165  	e := &pcommon.Envelope{}
   166  	err = proto.Unmarshal(b, e)
   167  	if err != nil {
   168  		t.Fatalf("could not unmarshall envelope")
   169  	}
   170  
   171  	_, p, err := extractSignedCCDepSpec(e)
   172  	if err != nil {
   173  		t.Fatalf("could not extract signed dep spec")
   174  	}
   175  
   176  	if p.OwnerEndorsements == nil {
   177  		t.Fatalf("expected signtures and found nil")
   178  	}
   179  }
   180  
   181  func TestNoOwnerToSign(t *testing.T) {
   182  	pdir := newTempDir()
   183  	defer os.RemoveAll(pdir)
   184  
   185  	ccpackfile := pdir + "/ccpack.file"
   186  	//note "-S" requires signer but we are passing fase
   187  	err := createSignedCDSPackage([]string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", "-S", ccpackfile}, false)
   188  
   189  	if err == nil {
   190  		t.Fatalf("Expected error with nil signer but succeeded")
   191  	}
   192  }
   193  
   194  func TestInvalidPolicy(t *testing.T) {
   195  	pdir := newTempDir()
   196  	defer os.RemoveAll(pdir)
   197  
   198  	ccpackfile := pdir + "/ccpack.file"
   199  	err := createSignedCDSPackage([]string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", "-i", "AND('a bad policy')", ccpackfile}, false)
   200  
   201  	if err == nil {
   202  		t.Fatalf("Expected error with nil signer but succeeded")
   203  	}
   204  }