github.com/defanghe/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 }