github.com/true-sqn/fabric@v2.1.1+incompatible/internal/peer/chaincode/package_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package chaincode
     8  
     9  import (
    10  	"fmt"
    11  	"io/ioutil"
    12  	"os"
    13  	"testing"
    14  
    15  	"github.com/golang/protobuf/proto"
    16  	pcommon "github.com/hyperledger/fabric-protos-go/common"
    17  	pb "github.com/hyperledger/fabric-protos-go/peer"
    18  	"github.com/hyperledger/fabric/bccsp/sw"
    19  	"github.com/hyperledger/fabric/internal/peer/common"
    20  	"github.com/hyperledger/fabric/msp"
    21  	msptesttools "github.com/hyperledger/fabric/msp/mgmt/testtools"
    22  	"github.com/stretchr/testify/assert"
    23  )
    24  
    25  func TestMain(m *testing.M) {
    26  	err := msptesttools.LoadMSPSetupForTesting()
    27  	if err != nil {
    28  		panic(fmt.Sprintf("Fatal error when reading MSP config: %s", err))
    29  	}
    30  
    31  	os.Exit(m.Run())
    32  }
    33  
    34  func newTempDir() string {
    35  	tempDir, err := ioutil.TempDir("/tmp", "packagetest-")
    36  	if err != nil {
    37  		panic(err)
    38  	}
    39  	return tempDir
    40  }
    41  
    42  func mockCDSFactory(spec *pb.ChaincodeSpec) (*pb.ChaincodeDeploymentSpec, error) {
    43  	return &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec, CodePackage: []byte("somecode")}, nil
    44  }
    45  
    46  func extractSignedCCDepSpec(env *pcommon.Envelope) (*pcommon.ChannelHeader, *pb.SignedChaincodeDeploymentSpec, error) {
    47  	p := &pcommon.Payload{}
    48  	err := proto.Unmarshal(env.Payload, p)
    49  	if err != nil {
    50  		return nil, nil, err
    51  	}
    52  	ch := &pcommon.ChannelHeader{}
    53  	err = proto.Unmarshal(p.Header.ChannelHeader, ch)
    54  	if err != nil {
    55  		return nil, nil, err
    56  	}
    57  
    58  	sp := &pb.SignedChaincodeDeploymentSpec{}
    59  	err = proto.Unmarshal(p.Data, sp)
    60  	if err != nil {
    61  		return nil, nil, err
    62  	}
    63  
    64  	return ch, sp, nil
    65  }
    66  
    67  // TestCDSPackage tests generation of the old ChaincodeDeploymentSpec install
    68  // which we will presumably continue to support at least for a bit
    69  func TestCDSPackage(t *testing.T) {
    70  	pdir := newTempDir()
    71  	defer os.RemoveAll(pdir)
    72  
    73  	ccpackfile := pdir + "/ccpack.file"
    74  	err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", ccpackfile}, false)
    75  	if err != nil {
    76  		t.Fatalf("Run chaincode package cmd error:%v", err)
    77  	}
    78  
    79  	b, err := ioutil.ReadFile(ccpackfile)
    80  	if err != nil {
    81  		t.Fatalf("package file %s not created", ccpackfile)
    82  	}
    83  	cds := &pb.ChaincodeDeploymentSpec{}
    84  	err = proto.Unmarshal(b, cds)
    85  	if err != nil {
    86  		t.Fatalf("could not unmarshall package into CDS")
    87  	}
    88  }
    89  
    90  // helper to create a SignedChaincodeDeploymentSpec
    91  func createSignedCDSPackage(t *testing.T, args []string, sign bool) error {
    92  	p := newPackagerForTest(t, sign)
    93  
    94  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
    95  	assert.NoError(t, err)
    96  	cmd := packageCmd(nil, mockCDSFactory, p, cryptoProvider)
    97  	addFlags(cmd)
    98  
    99  	cmd.SetArgs(args)
   100  
   101  	if err := cmd.Execute(); err != nil {
   102  		return err
   103  	}
   104  
   105  	return nil
   106  }
   107  
   108  func mockChaincodeCmdFactoryForTest(sign bool) (*ChaincodeCmdFactory, error) {
   109  	var signer msp.SigningIdentity
   110  	var err error
   111  	if sign {
   112  		signer, err = common.GetDefaultSigner()
   113  		if err != nil {
   114  			return nil, fmt.Errorf("Get default signer error: %v", err)
   115  		}
   116  	}
   117  
   118  	cf := &ChaincodeCmdFactory{Signer: signer}
   119  	return cf, nil
   120  }
   121  
   122  // TestSignedCDSPackage generates the new envelope encapsulating
   123  // CDS, policy
   124  func TestSignedCDSPackage(t *testing.T) {
   125  	pdir := newTempDir()
   126  	defer os.RemoveAll(pdir)
   127  
   128  	ccpackfile := pdir + "/ccpack.file"
   129  	err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", ccpackfile}, false)
   130  	if err != nil {
   131  		t.Fatalf("could not create signed cds package %s", err)
   132  	}
   133  
   134  	b, err := ioutil.ReadFile(ccpackfile)
   135  	if err != nil {
   136  		t.Fatalf("package file %s not created", ccpackfile)
   137  	}
   138  
   139  	e := &pcommon.Envelope{}
   140  	err = proto.Unmarshal(b, e)
   141  	if err != nil {
   142  		t.Fatalf("could not unmarshall envelope")
   143  	}
   144  
   145  	_, p, err := extractSignedCCDepSpec(e)
   146  	if err != nil {
   147  		t.Fatalf("could not extract signed dep spec")
   148  	}
   149  
   150  	if p.OwnerEndorsements != nil {
   151  		t.Fatalf("expected no signatures but found endorsements")
   152  	}
   153  }
   154  
   155  // TestSignedCDSPackageWithSignature generates the new envelope encapsulating
   156  // CDS, policy and signs the package with local MSP
   157  func TestSignedCDSPackageWithSignature(t *testing.T) {
   158  	pdir := newTempDir()
   159  	defer os.RemoveAll(pdir)
   160  
   161  	ccpackfile := pdir + "/ccpack.file"
   162  	err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", "-S", ccpackfile}, true)
   163  	if err != nil {
   164  		t.Fatalf("could not create signed cds package %s", err)
   165  	}
   166  
   167  	b, err := ioutil.ReadFile(ccpackfile)
   168  	if err != nil {
   169  		t.Fatalf("package file %s not created", ccpackfile)
   170  	}
   171  	e := &pcommon.Envelope{}
   172  	err = proto.Unmarshal(b, e)
   173  	if err != nil {
   174  		t.Fatalf("could not unmarshall envelope")
   175  	}
   176  
   177  	_, p, err := extractSignedCCDepSpec(e)
   178  	if err != nil {
   179  		t.Fatalf("could not extract signed dep spec")
   180  	}
   181  
   182  	if p.OwnerEndorsements == nil {
   183  		t.Fatalf("expected signatures and found nil")
   184  	}
   185  }
   186  
   187  func TestNoOwnerToSign(t *testing.T) {
   188  	pdir := newTempDir()
   189  	defer os.RemoveAll(pdir)
   190  
   191  	ccpackfile := pdir + "/ccpack.file"
   192  	// note "-S" requires signer but we are passing fase
   193  	err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", "-S", ccpackfile}, false)
   194  
   195  	if err == nil {
   196  		t.Fatalf("Expected error with nil signer but succeeded")
   197  	}
   198  }
   199  
   200  func TestInvalidPolicy(t *testing.T) {
   201  	pdir := newTempDir()
   202  	defer os.RemoveAll(pdir)
   203  
   204  	ccpackfile := pdir + "/ccpack.file"
   205  	err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", "-i", "AND('a bad policy')", ccpackfile}, false)
   206  
   207  	if err == nil {
   208  		t.Fatalf("Expected error with nil signer but succeeded")
   209  	}
   210  }
   211  
   212  func newPackagerForTest(t *testing.T /*pr PlatformRegistry, w Writer,*/, sign bool) *Packager {
   213  	mockCF, err := mockChaincodeCmdFactoryForTest(sign)
   214  	if err != nil {
   215  		t.Fatal("error creating mock ChaincodeCmdFactory", err)
   216  	}
   217  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
   218  	assert.NoError(t, err)
   219  
   220  	p := &Packager{
   221  		ChaincodeCmdFactory: mockCF,
   222  		CDSFactory:          mockCDSFactory,
   223  		CryptoProvider:      cryptoProvider,
   224  	}
   225  
   226  	return p
   227  }