github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/core/common/ccprovider/cdspackage_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 "io/ioutil" 22 "os" 23 "testing" 24 25 pb "github.com/hyperledger/fabric/protos/peer" 26 "github.com/hyperledger/fabric/protos/utils" 27 "github.com/stretchr/testify/assert" 28 ) 29 30 func setupccdir() string { 31 tempDir, err := ioutil.TempDir("/tmp", "ccprovidertest") 32 if err != nil { 33 panic(err) 34 } 35 SetChaincodesPath(tempDir) 36 return tempDir 37 } 38 39 func processCDS(cds *pb.ChaincodeDeploymentSpec, tofs bool) (*CDSPackage, []byte, *ChaincodeData, error) { 40 b := utils.MarshalOrPanic(cds) 41 42 ccpack := &CDSPackage{} 43 cd, err := ccpack.InitFromBuffer(b) 44 if err != nil { 45 return nil, nil, nil, fmt.Errorf("error owner creating package %s", err) 46 } 47 48 if tofs { 49 if err = ccpack.PutChaincodeToFS(); err != nil { 50 return nil, nil, nil, fmt.Errorf("error putting package on the FS %s", err) 51 } 52 } 53 54 return ccpack, b, cd, nil 55 } 56 57 func TestPutCDSCC(t *testing.T) { 58 ccdir := setupccdir() 59 defer os.RemoveAll(ccdir) 60 61 cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")} 62 63 ccpack, _, cd, err := processCDS(cds, true) 64 if err != nil { 65 t.Fatalf("error putting CDS to FS %s", err) 66 return 67 } 68 69 if err = ccpack.ValidateCC(cd); err != nil { 70 t.Fatalf("error validating package %s", err) 71 return 72 } 73 } 74 75 func TestPutCDSErrorPaths(t *testing.T) { 76 ccdir := setupccdir() 77 defer os.RemoveAll(ccdir) 78 79 cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, 80 Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")} 81 82 ccpack, b, _, err := processCDS(cds, true) 83 if err != nil { 84 t.Fatalf("error putting CDS to FS %s", err) 85 return 86 } 87 88 //validate with invalid name 89 if err = ccpack.ValidateCC(&ChaincodeData{Name: "invalname", Version: "0"}); err == nil { 90 t.Fatalf("expected error validating package") 91 return 92 } 93 //remove the buffer 94 ccpack.buf = nil 95 if err = ccpack.PutChaincodeToFS(); err == nil { 96 t.Fatalf("expected error putting package on the FS") 97 return 98 } 99 100 //put back the buffer but remove the depspec 101 ccpack.buf = b 102 savDepSpec := ccpack.depSpec 103 ccpack.depSpec = nil 104 if err = ccpack.PutChaincodeToFS(); err == nil { 105 t.Fatalf("expected error putting package on the FS") 106 return 107 } 108 109 //put back dep spec 110 ccpack.depSpec = savDepSpec 111 112 //...but remove the chaincode directory 113 os.RemoveAll(ccdir) 114 if err = ccpack.PutChaincodeToFS(); err == nil { 115 t.Fatalf("expected error putting package on the FS") 116 return 117 } 118 } 119 120 func TestCDSGetCCPackage(t *testing.T) { 121 cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")} 122 123 b := utils.MarshalOrPanic(cds) 124 125 ccpack, err := GetCCPackage(b) 126 if err != nil { 127 t.Fatalf("failed to get CDS CCPackage %s", err) 128 return 129 } 130 131 cccdspack, ok := ccpack.(*CDSPackage) 132 if !ok || cccdspack == nil { 133 t.Fatalf("failed to get CDS CCPackage") 134 return 135 } 136 137 cds2 := cccdspack.GetDepSpec() 138 if cds2 == nil { 139 t.Fatalf("nil dep spec in CDS CCPackage") 140 return 141 } 142 143 if cds2.ChaincodeSpec.ChaincodeId.Name != cds.ChaincodeSpec.ChaincodeId.Name || cds2.ChaincodeSpec.ChaincodeId.Version != cds.ChaincodeSpec.ChaincodeId.Version { 144 t.Fatalf("dep spec in CDS CCPackage does not match %v != %v", cds, cds2) 145 return 146 } 147 } 148 149 //switch the chaincodes on the FS and validate 150 func TestCDSSwitchChaincodes(t *testing.T) { 151 ccdir := setupccdir() 152 defer os.RemoveAll(ccdir) 153 154 //someone modified the code on the FS with "badcode" 155 cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("badcode")} 156 157 //write the bad code to the fs 158 badccpack, _, _, err := processCDS(cds, true) 159 if err != nil { 160 t.Fatalf("error putting CDS to FS %s", err) 161 return 162 } 163 164 //mimic the good code ChaincodeData from the instantiate... 165 cds.CodePackage = []byte("goodcode") 166 167 //...and generate the CD for it (don't overwrite the bad code) 168 _, _, goodcd, err := processCDS(cds, false) 169 if err != nil { 170 t.Fatalf("error putting CDS to FS %s", err) 171 return 172 } 173 174 if err = badccpack.ValidateCC(goodcd); err == nil { 175 t.Fatalf("expected goodcd to fail against bad package but succeeded!") 176 return 177 } 178 } 179 180 func TestPutChaincodeToFSErrorPaths(t *testing.T) { 181 ccpack := &CDSPackage{} 182 err := ccpack.PutChaincodeToFS() 183 assert.Error(t, err) 184 assert.Contains(t, err.Error(), "uninitialized package", "Unexpected error returned") 185 186 ccpack.buf = []byte("hello") 187 err = ccpack.PutChaincodeToFS() 188 assert.Error(t, err) 189 assert.Contains(t, err.Error(), "id cannot be nil if buf is not nil", "Unexpected error returned") 190 191 ccpack.id = []byte("cc123") 192 err = ccpack.PutChaincodeToFS() 193 assert.Error(t, err) 194 assert.Contains(t, err.Error(), "depspec cannot be nil if buf is not nil", "Unexpected error returned") 195 196 ccpack.depSpec = &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, 197 Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")} 198 err = ccpack.PutChaincodeToFS() 199 assert.Error(t, err) 200 assert.Contains(t, err.Error(), "nil data", "Unexpected error returned") 201 202 ccpack.data = &CDSData{} 203 err = ccpack.PutChaincodeToFS() 204 assert.Error(t, err) 205 assert.Contains(t, err.Error(), "nil data bytes", "Unexpected error returned") 206 } 207 208 func TestValidateCCErrorPaths(t *testing.T) { 209 cpack := &CDSPackage{} 210 ccdata := &ChaincodeData{} 211 err := cpack.ValidateCC(ccdata) 212 assert.Error(t, err) 213 assert.Contains(t, err.Error(), "uninitialized package", "Unexpected error returned") 214 215 cpack.depSpec = &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, 216 Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")} 217 err = cpack.ValidateCC(ccdata) 218 assert.Error(t, err) 219 assert.Contains(t, err.Error(), "nil data", "Unexpected error returned") 220 }