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 }