github.com/leonlxy/hyperledger@v1.0.0-alpha.0.20170427033203-34922035d248/core/common/ccprovider/sigcdspackage_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 ccprovider 18 19 import ( 20 "fmt" 21 "os" 22 "testing" 23 24 "github.com/hyperledger/fabric/core/common/ccpackage" 25 "github.com/hyperledger/fabric/protos/common" 26 pb "github.com/hyperledger/fabric/protos/peer" 27 "github.com/hyperledger/fabric/protos/utils" 28 ) 29 30 func processSignedCDS(cds *pb.ChaincodeDeploymentSpec, policy *common.SignaturePolicyEnvelope, tofs bool) (*SignedCDSPackage, []byte, *ChaincodeData, error) { 31 env, err := ccpackage.OwnerCreateSignedCCDepSpec(cds, policy, nil) 32 if err != nil { 33 return nil, nil, nil, fmt.Errorf("could not create package %s", err) 34 } 35 36 b := utils.MarshalOrPanic(env) 37 38 ccpack := &SignedCDSPackage{} 39 cd, err := ccpack.InitFromBuffer(b) 40 if err != nil { 41 return nil, nil, nil, fmt.Errorf("error owner creating package %s", err) 42 } 43 44 if tofs { 45 if err = ccpack.PutChaincodeToFS(); err != nil { 46 return nil, nil, nil, fmt.Errorf("error putting package on the FS %s", err) 47 } 48 } 49 50 return ccpack, b, cd, nil 51 } 52 53 func TestPutSigCDSCC(t *testing.T) { 54 ccdir := setupccdir() 55 defer os.RemoveAll(ccdir) 56 57 cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")} 58 59 ccpack, _, cd, err := processSignedCDS(cds, &common.SignaturePolicyEnvelope{Version: 1}, true) 60 if err != nil { 61 t.Fatalf("cannot create package %s", err) 62 return 63 } 64 65 if err = ccpack.ValidateCC(cd); err != nil { 66 t.Fatalf("error validating package %s", err) 67 return 68 } 69 } 70 71 func TestPutSignedCDSErrorPaths(t *testing.T) { 72 ccdir := setupccdir() 73 defer os.RemoveAll(ccdir) 74 75 cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")} 76 77 ccpack, b, _, err := processSignedCDS(cds, &common.SignaturePolicyEnvelope{Version: 1}, true) 78 if err != nil { 79 t.Fatalf("cannot create package %s", err) 80 return 81 } 82 83 //validate with invalid name 84 if err = ccpack.ValidateCC(&ChaincodeData{Name: "invalname", Version: "0"}); err == nil { 85 t.Fatalf("expected error validating package") 86 return 87 } 88 89 //remove the buffer 90 ccpack.buf = nil 91 if err = ccpack.PutChaincodeToFS(); err == nil { 92 t.Fatalf("expected error putting package on the FS") 93 return 94 } 95 96 //put back the buffer but remove the depspec 97 ccpack.buf = b 98 savDepSpec := ccpack.sDepSpec 99 ccpack.sDepSpec = nil 100 if err = ccpack.PutChaincodeToFS(); err == nil { 101 t.Fatalf("expected error putting package on the FS") 102 return 103 } 104 105 //put back dep spec 106 ccpack.sDepSpec = savDepSpec 107 108 //...but remove the chaincode directory 109 os.RemoveAll(ccdir) 110 if err = ccpack.PutChaincodeToFS(); err == nil { 111 t.Fatalf("expected error putting package on the FS") 112 return 113 } 114 } 115 116 func TestSigCDSGetCCPackage(t *testing.T) { 117 cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")} 118 119 env, err := ccpackage.OwnerCreateSignedCCDepSpec(cds, &common.SignaturePolicyEnvelope{Version: 1}, nil) 120 if err != nil { 121 t.Fatalf("cannot create package") 122 return 123 } 124 125 b := utils.MarshalOrPanic(env) 126 127 ccpack, err := GetCCPackage(b) 128 if err != nil { 129 t.Fatalf("failed to get CCPackage %s", err) 130 return 131 } 132 133 cccdspack, ok := ccpack.(*CDSPackage) 134 if ok || cccdspack != nil { 135 t.Fatalf("expected CDSPackage type cast to fail but succeeded") 136 return 137 } 138 139 ccsignedcdspack, ok := ccpack.(*SignedCDSPackage) 140 if !ok || ccsignedcdspack == nil { 141 t.Fatalf("failed to get Signed CDS CCPackage") 142 return 143 } 144 145 cds2 := ccsignedcdspack.GetDepSpec() 146 if cds2 == nil { 147 t.Fatalf("nil dep spec in Signed CDS CCPackage") 148 return 149 } 150 151 if cds2.ChaincodeSpec.ChaincodeId.Name != cds.ChaincodeSpec.ChaincodeId.Name || cds2.ChaincodeSpec.ChaincodeId.Version != cds.ChaincodeSpec.ChaincodeId.Version { 152 t.Fatalf("dep spec in Signed CDS CCPackage does not match %v != %v", cds, cds2) 153 return 154 } 155 } 156 157 func TestInvalidSigCDSGetCCPackage(t *testing.T) { 158 cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")} 159 160 b := utils.MarshalOrPanic(cds) 161 162 ccpack, err := GetCCPackage(b) 163 if err != nil { 164 t.Fatalf("failed to get CCPackage %s", err) 165 return 166 } 167 168 ccsignedcdspack, ok := ccpack.(*SignedCDSPackage) 169 if ok || ccsignedcdspack != nil { 170 t.Fatalf("expected failure to get Signed CDS CCPackage but succeeded") 171 return 172 } 173 } 174 175 //switch the chaincodes on the FS and validate 176 func TestSignedCDSSwitchChaincodes(t *testing.T) { 177 ccdir := setupccdir() 178 defer os.RemoveAll(ccdir) 179 180 //someone modifyed the code on the FS with "badcode" 181 cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("badcode")} 182 183 //write the bad code to the fs 184 badccpack, _, _, err := processSignedCDS(cds, &common.SignaturePolicyEnvelope{Version: 1}, true) 185 if err != nil { 186 t.Fatalf("error putting CDS to FS %s", err) 187 return 188 } 189 190 //mimic the good code ChaincodeData from the instantiate... 191 cds.CodePackage = []byte("goodcode") 192 193 //...and generate the CD for it (don't overwrite the bad code) 194 _, _, goodcd, err := processSignedCDS(cds, &common.SignaturePolicyEnvelope{Version: 1}, false) 195 if err != nil { 196 t.Fatalf("error putting CDS to FS %s", err) 197 return 198 } 199 200 if err = badccpack.ValidateCC(goodcd); err == nil { 201 t.Fatalf("expected goodcd to fail against bad package but succeeded!") 202 return 203 } 204 }