github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/core/scc/vscc/validator_onevalidsignature_test.go (about) 1 /* 2 Copyright IBM Corp. 2016 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 package vscc 17 18 import ( 19 "testing" 20 21 "fmt" 22 "os" 23 24 "archive/tar" 25 "compress/gzip" 26 27 "bytes" 28 29 "github.com/golang/protobuf/proto" 30 "github.com/hyperledger/fabric/common/cauthdsl" 31 lm "github.com/hyperledger/fabric/common/mocks/ledger" 32 "github.com/hyperledger/fabric/common/mocks/scc" 33 "github.com/hyperledger/fabric/common/util" 34 "github.com/hyperledger/fabric/core/chaincode/shim" 35 "github.com/hyperledger/fabric/core/common/ccpackage" 36 "github.com/hyperledger/fabric/core/common/ccprovider" 37 "github.com/hyperledger/fabric/core/common/sysccprovider" 38 cutils "github.com/hyperledger/fabric/core/container/util" 39 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/rwsetutil" 40 per "github.com/hyperledger/fabric/core/peer" 41 "github.com/hyperledger/fabric/core/policy" 42 "github.com/hyperledger/fabric/core/scc/lscc" 43 "github.com/hyperledger/fabric/msp" 44 mspmgmt "github.com/hyperledger/fabric/msp/mgmt" 45 "github.com/hyperledger/fabric/msp/mgmt/testtools" 46 "github.com/hyperledger/fabric/protos/common" 47 mspproto "github.com/hyperledger/fabric/protos/msp" 48 "github.com/hyperledger/fabric/protos/peer" 49 "github.com/hyperledger/fabric/protos/utils" 50 "github.com/stretchr/testify/assert" 51 ) 52 53 func createTx(endorsedByDuplicatedIdentity bool) (*common.Envelope, error) { 54 ccid := &peer.ChaincodeID{Name: "foo", Version: "v1"} 55 cis := &peer.ChaincodeInvocationSpec{ChaincodeSpec: &peer.ChaincodeSpec{ChaincodeId: ccid}} 56 57 prop, _, err := utils.CreateProposalFromCIS(common.HeaderType_ENDORSER_TRANSACTION, util.GetTestChainID(), cis, sid) 58 if err != nil { 59 return nil, err 60 } 61 62 presp, err := utils.CreateProposalResponse(prop.Header, prop.Payload, &peer.Response{Status: 200}, []byte("res"), nil, ccid, nil, id) 63 if err != nil { 64 return nil, err 65 } 66 67 var env *common.Envelope 68 if endorsedByDuplicatedIdentity { 69 env, err = utils.CreateSignedTx(prop, id, presp, presp) 70 } else { 71 env, err = utils.CreateSignedTx(prop, id, presp) 72 } 73 if err != nil { 74 return nil, err 75 } 76 return env, err 77 } 78 79 func processSignedCDS(cds *peer.ChaincodeDeploymentSpec, policy *common.SignaturePolicyEnvelope) ([]byte, error) { 80 env, err := ccpackage.OwnerCreateSignedCCDepSpec(cds, policy, nil) 81 if err != nil { 82 return nil, fmt.Errorf("could not create package %s", err) 83 } 84 85 b := utils.MarshalOrPanic(env) 86 87 ccpack := &ccprovider.SignedCDSPackage{} 88 cd, err := ccpack.InitFromBuffer(b) 89 if err != nil { 90 return nil, fmt.Errorf("error owner creating package %s", err) 91 } 92 93 if err = ccpack.PutChaincodeToFS(); err != nil { 94 return nil, fmt.Errorf("error putting package on the FS %s", err) 95 } 96 97 cd.InstantiationPolicy = utils.MarshalOrPanic(policy) 98 99 return utils.MarshalOrPanic(cd), nil 100 } 101 102 func constructDeploymentSpec(name string, path string, version string, initArgs [][]byte, createFS bool) (*peer.ChaincodeDeploymentSpec, error) { 103 spec := &peer.ChaincodeSpec{Type: 1, ChaincodeId: &peer.ChaincodeID{Name: name, Path: path, Version: version}, Input: &peer.ChaincodeInput{Args: initArgs}} 104 105 codePackageBytes := bytes.NewBuffer(nil) 106 gz := gzip.NewWriter(codePackageBytes) 107 tw := tar.NewWriter(gz) 108 109 err := cutils.WriteBytesToPackage("src/garbage.go", []byte(name+path+version), tw) 110 if err != nil { 111 return nil, err 112 } 113 114 tw.Close() 115 gz.Close() 116 117 chaincodeDeploymentSpec := &peer.ChaincodeDeploymentSpec{ChaincodeSpec: spec, CodePackage: codePackageBytes.Bytes()} 118 119 if createFS { 120 err := ccprovider.PutChaincodeIntoFS(chaincodeDeploymentSpec) 121 if err != nil { 122 return nil, err 123 } 124 } 125 126 return chaincodeDeploymentSpec, nil 127 } 128 129 func createCCDataRWset(nameK, nameV, version string, policy []byte) ([]byte, error) { 130 cd := &ccprovider.ChaincodeData{ 131 Name: nameV, 132 Version: version, 133 InstantiationPolicy: policy, 134 } 135 136 cdbytes := utils.MarshalOrPanic(cd) 137 138 rwsetBuilder := rwsetutil.NewRWSetBuilder() 139 rwsetBuilder.AddToWriteSet("lscc", nameK, cdbytes) 140 rwset := rwsetBuilder.GetTxReadWriteSet() 141 return rwset.ToProtoBytes() 142 } 143 144 func createLSCCTx(ccname, ccver, f string, res []byte) (*common.Envelope, error) { 145 return createLSCCTxPutCds(ccname, ccver, f, res, nil, true) 146 } 147 148 func createLSCCTxPutCds(ccname, ccver, f string, res, cdsbytes []byte, putcds bool) (*common.Envelope, error) { 149 cds := &peer.ChaincodeDeploymentSpec{ 150 ChaincodeSpec: &peer.ChaincodeSpec{ 151 ChaincodeId: &peer.ChaincodeID{ 152 Name: ccname, 153 Version: ccver, 154 }, 155 Type: peer.ChaincodeSpec_GOLANG, 156 }, 157 } 158 159 cdsBytes, err := proto.Marshal(cds) 160 if err != nil { 161 return nil, err 162 } 163 164 var cis *peer.ChaincodeInvocationSpec 165 if putcds { 166 if cdsbytes != nil { 167 cdsBytes = cdsbytes 168 } 169 cis = &peer.ChaincodeInvocationSpec{ 170 ChaincodeSpec: &peer.ChaincodeSpec{ 171 ChaincodeId: &peer.ChaincodeID{Name: "lscc"}, 172 Input: &peer.ChaincodeInput{ 173 Args: [][]byte{[]byte(f), []byte("barf"), cdsBytes}, 174 }, 175 Type: peer.ChaincodeSpec_GOLANG, 176 }, 177 } 178 } else { 179 cis = &peer.ChaincodeInvocationSpec{ 180 ChaincodeSpec: &peer.ChaincodeSpec{ 181 ChaincodeId: &peer.ChaincodeID{Name: "lscc"}, 182 Input: &peer.ChaincodeInput{ 183 Args: [][]byte{[]byte(f), []byte("barf")}, 184 }, 185 Type: peer.ChaincodeSpec_GOLANG, 186 }, 187 } 188 } 189 190 prop, _, err := utils.CreateProposalFromCIS(common.HeaderType_ENDORSER_TRANSACTION, util.GetTestChainID(), cis, sid) 191 if err != nil { 192 return nil, err 193 } 194 195 ccid := &peer.ChaincodeID{Name: ccname, Version: ccver} 196 197 presp, err := utils.CreateProposalResponse(prop.Header, prop.Payload, &peer.Response{Status: 200}, res, nil, ccid, nil, id) 198 if err != nil { 199 return nil, err 200 } 201 202 return utils.CreateSignedTx(prop, id, presp) 203 } 204 205 func TestInit(t *testing.T) { 206 v := new(ValidatorOneValidSignature) 207 stub := shim.NewMockStub("validatoronevalidsignature", v) 208 209 if res := stub.MockInit("1", nil); res.Status != shim.OK { 210 t.Fatalf("vscc init failed with %s", res.Message) 211 } 212 } 213 214 func getSignedByMSPMemberPolicy(mspID string) ([]byte, error) { 215 p := cauthdsl.SignedByMspMember(mspID) 216 217 b, err := utils.Marshal(p) 218 if err != nil { 219 return nil, fmt.Errorf("Could not marshal policy, err %s", err) 220 } 221 222 return b, err 223 } 224 225 func getSignedByOneMemberTwicePolicy(mspID string) ([]byte, error) { 226 principal := &mspproto.MSPPrincipal{ 227 PrincipalClassification: mspproto.MSPPrincipal_ROLE, 228 Principal: utils.MarshalOrPanic(&mspproto.MSPRole{Role: mspproto.MSPRole_MEMBER, MspIdentifier: mspID})} 229 230 p := &common.SignaturePolicyEnvelope{ 231 Version: 0, 232 Rule: cauthdsl.NOutOf(2, []*common.SignaturePolicy{cauthdsl.SignedBy(0), cauthdsl.SignedBy(0)}), 233 Identities: []*mspproto.MSPPrincipal{principal}, 234 } 235 b, err := utils.Marshal(p) 236 if err != nil { 237 return nil, fmt.Errorf("Could not marshal policy, err %s", err) 238 } 239 240 return b, err 241 } 242 243 func getSignedByMSPAdminPolicy(mspID string) ([]byte, error) { 244 p := cauthdsl.SignedByMspAdmin(mspID) 245 246 b, err := utils.Marshal(p) 247 if err != nil { 248 return nil, fmt.Errorf("Could not marshal policy, err %s", err) 249 } 250 251 return b, err 252 } 253 254 func TestInvoke(t *testing.T) { 255 v := new(ValidatorOneValidSignature) 256 stub := shim.NewMockStub("validatoronevalidsignature", v) 257 258 // Failed path: Invalid arguments 259 args := [][]byte{[]byte("dv")} 260 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 261 t.Fatalf("vscc invoke should have failed") 262 } 263 264 // not enough args 265 args = [][]byte{[]byte("dv"), []byte("tx")} 266 args[1] = nil 267 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 268 t.Fatalf("vscc invoke should have failed") 269 } 270 271 // nil args 272 args = [][]byte{nil, nil, nil} 273 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 274 t.Fatalf("vscc invoke should have failed") 275 } 276 277 // nil args 278 args = [][]byte{[]byte("a"), []byte("a"), nil} 279 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 280 t.Fatalf("vscc invoke should have failed") 281 } 282 283 // broken Envelope 284 args = [][]byte{[]byte("a"), []byte("a"), []byte("a")} 285 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 286 t.Fatalf("vscc invoke should have failed") 287 } 288 289 // (still) broken Envelope 290 args = [][]byte{[]byte("a"), utils.MarshalOrPanic(&common.Envelope{Payload: []byte("barf")}), []byte("a")} 291 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 292 t.Fatalf("vscc invoke should have failed") 293 } 294 295 // (still) broken Envelope 296 b := utils.MarshalOrPanic(&common.Envelope{Payload: utils.MarshalOrPanic(&common.Payload{Header: &common.Header{ChannelHeader: []byte("barf")}})}) 297 args = [][]byte{[]byte("a"), b, []byte("a")} 298 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 299 t.Fatalf("vscc invoke should have failed") 300 } 301 302 tx, err := createTx(false) 303 if err != nil { 304 t.Fatalf("createTx returned err %s", err) 305 } 306 307 envBytes, err := utils.GetBytesEnvelope(tx) 308 if err != nil { 309 t.Fatalf("GetBytesEnvelope returned err %s", err) 310 } 311 312 // broken policy 313 args = [][]byte{[]byte("dv"), envBytes, []byte("barf")} 314 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 315 t.Fatalf("vscc invoke should have failed") 316 } 317 318 policy, err := getSignedByMSPMemberPolicy(mspid) 319 if err != nil { 320 t.Fatalf("failed getting policy, err %s", err) 321 } 322 323 // broken type 324 b = utils.MarshalOrPanic(&common.Envelope{Payload: utils.MarshalOrPanic(&common.Payload{Header: &common.Header{ChannelHeader: utils.MarshalOrPanic(&common.ChannelHeader{Type: int32(common.HeaderType_ORDERER_TRANSACTION)})}})}) 325 args = [][]byte{[]byte("dv"), b, policy} 326 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 327 t.Fatalf("vscc invoke should have failed") 328 } 329 330 // broken tx payload 331 b = utils.MarshalOrPanic(&common.Envelope{Payload: utils.MarshalOrPanic(&common.Payload{Header: &common.Header{ChannelHeader: utils.MarshalOrPanic(&common.ChannelHeader{Type: int32(common.HeaderType_ORDERER_TRANSACTION)})}})}) 332 args = [][]byte{[]byte("dv"), b, policy} 333 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 334 t.Fatalf("vscc invoke should have failed") 335 } 336 337 // good path: signed by the right MSP 338 args = [][]byte{[]byte("dv"), envBytes, policy} 339 res := stub.MockInvoke("1", args) 340 if res.Status != shim.OK { 341 t.Fatalf("vscc invoke returned err %s", err) 342 } 343 344 // bad path: signed by the wrong MSP 345 policy, err = getSignedByMSPMemberPolicy("barf") 346 if err != nil { 347 t.Fatalf("failed getting policy, err %s", err) 348 } 349 350 args = [][]byte{[]byte("dv"), envBytes, policy} 351 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 352 t.Fatalf("vscc invoke should have failed") 353 } 354 355 // bad path: signed by duplicated MSP identity 356 policy, err = getSignedByOneMemberTwicePolicy(mspid) 357 if err != nil { 358 t.Fatalf("failed getting policy, err %s", err) 359 } 360 tx, err = createTx(true) 361 if err != nil { 362 t.Fatalf("createTx returned err %s", err) 363 } 364 envBytes, err = utils.GetBytesEnvelope(tx) 365 if err != nil { 366 t.Fatalf("GetBytesEnvelope returned err %s", err) 367 } 368 args = [][]byte{[]byte("dv"), envBytes, policy} 369 if res := stub.MockInvoke("1", args); res.Status == shim.OK || res.Message != DUPLICATED_IDENTITY_ERROR { 370 t.Fatalf("vscc invoke should have failed due to policy evaluation failure caused by duplicated identity") 371 } 372 } 373 374 func TestInvalidFunction(t *testing.T) { 375 v := new(ValidatorOneValidSignature) 376 stub := shim.NewMockStub("validatoronevalidsignature", v) 377 378 lccc := new(lscc.LifeCycleSysCC) 379 stublccc := shim.NewMockStub("lscc", lccc) 380 381 State := make(map[string]map[string][]byte) 382 State["lscc"] = stublccc.State 383 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 384 stub.MockPeerChaincode("lscc", stublccc) 385 386 r1 := stub.MockInit("1", [][]byte{}) 387 if r1.Status != shim.OK { 388 fmt.Println("Init failed", string(r1.Message)) 389 t.FailNow() 390 } 391 392 r := stublccc.MockInit("1", [][]byte{}) 393 if r.Status != shim.OK { 394 fmt.Println("Init failed", string(r.Message)) 395 t.FailNow() 396 } 397 398 ccname := "mycc" 399 ccver := "1" 400 401 res, err := createCCDataRWset(ccname, ccname, ccver, nil) 402 assert.NoError(t, err) 403 404 tx, err := createLSCCTx(ccname, ccver, lscc.GETCCDATA, res) 405 if err != nil { 406 t.Fatalf("createTx returned err %s", err) 407 } 408 409 envBytes, err := utils.GetBytesEnvelope(tx) 410 if err != nil { 411 t.Fatalf("GetBytesEnvelope returned err %s", err) 412 } 413 414 // good path: signed by the right MSP 415 policy, err := getSignedByMSPMemberPolicy(mspid) 416 if err != nil { 417 t.Fatalf("failed getting policy, err %s", err) 418 } 419 420 args := [][]byte{[]byte("dv"), envBytes, policy} 421 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 422 t.Fatalf("vscc invoke should have failed") 423 } 424 } 425 426 func TestRWSetTooBig(t *testing.T) { 427 v := new(ValidatorOneValidSignature) 428 stub := shim.NewMockStub("validatoronevalidsignature", v) 429 430 lccc := new(lscc.LifeCycleSysCC) 431 stublccc := shim.NewMockStub("lscc", lccc) 432 433 State := make(map[string]map[string][]byte) 434 State["lscc"] = stublccc.State 435 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 436 stub.MockPeerChaincode("lscc", stublccc) 437 438 r1 := stub.MockInit("1", [][]byte{}) 439 if r1.Status != shim.OK { 440 fmt.Println("Init failed", string(r1.Message)) 441 t.FailNow() 442 } 443 444 r := stublccc.MockInit("1", [][]byte{}) 445 if r.Status != shim.OK { 446 fmt.Println("Init failed", string(r.Message)) 447 t.FailNow() 448 } 449 450 ccname := "mycc" 451 ccver := "1" 452 453 cd := &ccprovider.ChaincodeData{ 454 Name: ccname, 455 Version: ccver, 456 InstantiationPolicy: nil, 457 } 458 459 cdbytes := utils.MarshalOrPanic(cd) 460 461 rwsetBuilder := rwsetutil.NewRWSetBuilder() 462 rwsetBuilder.AddToWriteSet("lscc", ccname, cdbytes) 463 rwsetBuilder.AddToWriteSet("lscc", "spurious", []byte("spurious")) 464 rwset := rwsetBuilder.GetTxReadWriteSet() 465 res, err := rwset.ToProtoBytes() 466 assert.NoError(t, err) 467 468 tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, res) 469 if err != nil { 470 t.Fatalf("createTx returned err %s", err) 471 } 472 473 envBytes, err := utils.GetBytesEnvelope(tx) 474 if err != nil { 475 t.Fatalf("GetBytesEnvelope returned err %s", err) 476 } 477 478 // good path: signed by the right MSP 479 policy, err := getSignedByMSPMemberPolicy(mspid) 480 if err != nil { 481 t.Fatalf("failed getting policy, err %s", err) 482 } 483 484 args := [][]byte{[]byte("dv"), envBytes, policy} 485 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 486 t.Fatalf("vscc invoke should have failed") 487 } 488 } 489 490 func TestValidateDeployFail(t *testing.T) { 491 v := new(ValidatorOneValidSignature) 492 stub := shim.NewMockStub("validatoronevalidsignature", v) 493 494 lccc := new(lscc.LifeCycleSysCC) 495 stublccc := shim.NewMockStub("lscc", lccc) 496 497 State := make(map[string]map[string][]byte) 498 State["lscc"] = stublccc.State 499 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 500 stub.MockPeerChaincode("lscc", stublccc) 501 502 r1 := stub.MockInit("1", [][]byte{}) 503 if r1.Status != shim.OK { 504 fmt.Println("Init failed", string(r1.Message)) 505 t.FailNow() 506 } 507 508 r := stublccc.MockInit("1", [][]byte{}) 509 if r.Status != shim.OK { 510 fmt.Println("Init failed", string(r.Message)) 511 t.FailNow() 512 } 513 514 ccname := "mycc" 515 ccver := "1" 516 517 /*********************/ 518 /* test no write set */ 519 /*********************/ 520 521 tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, nil) 522 if err != nil { 523 t.Fatalf("createTx returned err %s", err) 524 } 525 526 envBytes, err := utils.GetBytesEnvelope(tx) 527 if err != nil { 528 t.Fatalf("GetBytesEnvelope returned err %s", err) 529 } 530 531 // good path: signed by the right MSP 532 policy, err := getSignedByMSPMemberPolicy(mspid) 533 if err != nil { 534 t.Fatalf("failed getting policy, err %s", err) 535 } 536 537 args := [][]byte{[]byte("dv"), envBytes, policy} 538 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 539 t.Fatalf("vscc invoke should have failed") 540 } 541 542 /************************/ 543 /* test bogus write set */ 544 /************************/ 545 546 rwsetBuilder := rwsetutil.NewRWSetBuilder() 547 rwsetBuilder.AddToWriteSet("lscc", ccname, []byte("barf")) 548 rwset := rwsetBuilder.GetTxReadWriteSet() 549 resBogus, err := rwset.ToProtoBytes() 550 assert.NoError(t, err) 551 552 tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, resBogus) 553 if err != nil { 554 t.Fatalf("createTx returned err %s", err) 555 } 556 557 envBytes, err = utils.GetBytesEnvelope(tx) 558 if err != nil { 559 t.Fatalf("GetBytesEnvelope returned err %s", err) 560 } 561 562 // good path: signed by the right MSP 563 policy, err = getSignedByMSPMemberPolicy(mspid) 564 if err != nil { 565 t.Fatalf("failed getting policy, err %s", err) 566 } 567 568 args = [][]byte{[]byte("dv"), envBytes, policy} 569 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 570 t.Fatalf("vscc invoke should have failed") 571 } 572 573 /**********************/ 574 /* test bad LSCC args */ 575 /**********************/ 576 577 res, err := createCCDataRWset(ccname, ccname, ccver, nil) 578 assert.NoError(t, err) 579 580 tx, err = createLSCCTxPutCds(ccname, ccver, lscc.DEPLOY, res, nil, false) 581 if err != nil { 582 t.Fatalf("createTx returned err %s", err) 583 } 584 585 envBytes, err = utils.GetBytesEnvelope(tx) 586 if err != nil { 587 t.Fatalf("GetBytesEnvelope returned err %s", err) 588 } 589 590 // good path: signed by the right MSP 591 policy, err = getSignedByMSPMemberPolicy(mspid) 592 if err != nil { 593 t.Fatalf("failed getting policy, err %s", err) 594 } 595 596 args = [][]byte{[]byte("dv"), envBytes, policy} 597 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 598 t.Fatalf("vscc invoke should have failed") 599 } 600 601 /**********************/ 602 /* test bad LSCC args */ 603 /**********************/ 604 605 res, err = createCCDataRWset(ccname, ccname, ccver, nil) 606 assert.NoError(t, err) 607 608 tx, err = createLSCCTxPutCds(ccname, ccver, lscc.DEPLOY, res, []byte("barf"), true) 609 if err != nil { 610 t.Fatalf("createTx returned err %s", err) 611 } 612 613 envBytes, err = utils.GetBytesEnvelope(tx) 614 if err != nil { 615 t.Fatalf("GetBytesEnvelope returned err %s", err) 616 } 617 618 // good path: signed by the right MSP 619 policy, err = getSignedByMSPMemberPolicy(mspid) 620 if err != nil { 621 t.Fatalf("failed getting policy, err %s", err) 622 } 623 624 args = [][]byte{[]byte("dv"), envBytes, policy} 625 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 626 t.Fatalf("vscc invoke should have failed") 627 } 628 629 /***********************/ 630 /* test bad cc version */ 631 /***********************/ 632 633 res, err = createCCDataRWset(ccname, ccname, ccver+".1", nil) 634 assert.NoError(t, err) 635 636 tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res) 637 if err != nil { 638 t.Fatalf("createTx returned err %s", err) 639 } 640 641 envBytes, err = utils.GetBytesEnvelope(tx) 642 if err != nil { 643 t.Fatalf("GetBytesEnvelope returned err %s", err) 644 } 645 646 // good path: signed by the right MSP 647 policy, err = getSignedByMSPMemberPolicy(mspid) 648 if err != nil { 649 t.Fatalf("failed getting policy, err %s", err) 650 } 651 652 args = [][]byte{[]byte("dv"), envBytes, policy} 653 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 654 t.Fatalf("vscc invoke should have failed") 655 } 656 657 /*************/ 658 /* bad rwset */ 659 /*************/ 660 661 tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, []byte("barf")) 662 if err != nil { 663 t.Fatalf("createTx returned err %s", err) 664 } 665 666 envBytes, err = utils.GetBytesEnvelope(tx) 667 if err != nil { 668 t.Fatalf("GetBytesEnvelope returned err %s", err) 669 } 670 671 // good path: signed by the right MSP 672 policy, err = getSignedByMSPMemberPolicy(mspid) 673 if err != nil { 674 t.Fatalf("failed getting policy, err %s", err) 675 } 676 677 args = [][]byte{[]byte("dv"), envBytes, policy} 678 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 679 t.Fatalf("vscc invoke should have failed") 680 } 681 682 /********************/ 683 /* test bad cc name */ 684 /********************/ 685 686 res, err = createCCDataRWset(ccname+".badbad", ccname, ccver, nil) 687 assert.NoError(t, err) 688 689 tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res) 690 if err != nil { 691 t.Fatalf("createTx returned err %s", err) 692 } 693 694 envBytes, err = utils.GetBytesEnvelope(tx) 695 if err != nil { 696 t.Fatalf("GetBytesEnvelope returned err %s", err) 697 } 698 699 policy, err = getSignedByMSPMemberPolicy(mspid) 700 if err != nil { 701 t.Fatalf("failed getting policy, err %s", err) 702 } 703 704 args = [][]byte{[]byte("dv"), envBytes, policy} 705 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 706 t.Fatalf("vscc invoke should have failed") 707 } 708 709 /**********************/ 710 /* test bad cc name 2 */ 711 /**********************/ 712 713 res, err = createCCDataRWset(ccname, ccname+".badbad", ccver, nil) 714 assert.NoError(t, err) 715 716 tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res) 717 if err != nil { 718 t.Fatalf("createTx returned err %s", err) 719 } 720 721 envBytes, err = utils.GetBytesEnvelope(tx) 722 if err != nil { 723 t.Fatalf("GetBytesEnvelope returned err %s", err) 724 } 725 726 policy, err = getSignedByMSPMemberPolicy(mspid) 727 if err != nil { 728 t.Fatalf("failed getting policy, err %s", err) 729 } 730 731 args = [][]byte{[]byte("dv"), envBytes, policy} 732 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 733 t.Fatalf("vscc invoke should have failed") 734 } 735 736 /************************/ 737 /* test suprious writes */ 738 /************************/ 739 740 cd := &ccprovider.ChaincodeData{ 741 Name: ccname, 742 Version: ccver, 743 InstantiationPolicy: nil, 744 } 745 746 cdbytes := utils.MarshalOrPanic(cd) 747 rwsetBuilder = rwsetutil.NewRWSetBuilder() 748 rwsetBuilder.AddToWriteSet("lscc", ccname, cdbytes) 749 rwsetBuilder.AddToWriteSet("bogusbogus", "key", []byte("val")) 750 rwset = rwsetBuilder.GetTxReadWriteSet() 751 res, err = rwset.ToProtoBytes() 752 assert.NoError(t, err) 753 754 tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res) 755 if err != nil { 756 t.Fatalf("createTx returned err %s", err) 757 } 758 759 envBytes, err = utils.GetBytesEnvelope(tx) 760 if err != nil { 761 t.Fatalf("GetBytesEnvelope returned err %s", err) 762 } 763 764 policy, err = getSignedByMSPMemberPolicy(mspid) 765 if err != nil { 766 t.Fatalf("failed getting policy, err %s", err) 767 } 768 769 args = [][]byte{[]byte("dv"), envBytes, policy} 770 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 771 t.Fatalf("vscc invoke should have failed") 772 } 773 } 774 775 func TestAlreadyDeployed(t *testing.T) { 776 v := new(ValidatorOneValidSignature) 777 stub := shim.NewMockStub("validatoronevalidsignature", v) 778 779 lccc := new(lscc.LifeCycleSysCC) 780 stublccc := shim.NewMockStub("lscc", lccc) 781 782 State := make(map[string]map[string][]byte) 783 State["lscc"] = stublccc.State 784 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 785 stub.MockPeerChaincode("lscc", stublccc) 786 787 r1 := stub.MockInit("1", [][]byte{}) 788 if r1.Status != shim.OK { 789 fmt.Println("Init failed", string(r1.Message)) 790 t.FailNow() 791 } 792 793 r := stublccc.MockInit("1", [][]byte{}) 794 if r.Status != shim.OK { 795 fmt.Println("Init failed", string(r.Message)) 796 t.FailNow() 797 } 798 799 ccname := "mycc" 800 ccver := "1" 801 path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02" 802 803 ppath := lccctestpath + "/" + ccname + "." + ccver 804 805 os.Remove(ppath) 806 807 cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, true) 808 if err != nil { 809 fmt.Printf("%s\n", err) 810 t.FailNow() 811 } 812 defer os.Remove(ppath) 813 var b []byte 814 if b, err = proto.Marshal(cds); err != nil || b == nil { 815 t.FailNow() 816 } 817 818 sProp2, _ := utils.MockSignedEndorserProposal2OrPanic(chainId, &peer.ChaincodeSpec{}, id) 819 args := [][]byte{[]byte("deploy"), []byte(ccname), b} 820 if res := stublccc.MockInvokeWithSignedProposal("1", args, sProp2); res.Status != shim.OK { 821 fmt.Printf("%#v\n", res) 822 t.FailNow() 823 } 824 825 simresres, err := createCCDataRWset(ccname, ccname, ccver, nil) 826 assert.NoError(t, err) 827 828 tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, simresres) 829 if err != nil { 830 t.Fatalf("createTx returned err %s", err) 831 } 832 833 envBytes, err := utils.GetBytesEnvelope(tx) 834 if err != nil { 835 t.Fatalf("GetBytesEnvelope returned err %s", err) 836 } 837 838 // good path: signed by the right MSP 839 policy, err := getSignedByMSPMemberPolicy(mspid) 840 if err != nil { 841 t.Fatalf("failed getting policy, err %s", err) 842 } 843 844 args = [][]byte{[]byte("dv"), envBytes, policy} 845 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 846 t.Fatalf("vscc invocation should have failed") 847 } 848 } 849 850 func TestValidateDeployNoLedger(t *testing.T) { 851 v := new(ValidatorOneValidSignature) 852 stub := shim.NewMockStub("validatoronevalidsignature", v) 853 854 lccc := new(lscc.LifeCycleSysCC) 855 stublccc := shim.NewMockStub("lscc", lccc) 856 857 State := make(map[string]map[string][]byte) 858 State["lscc"] = stublccc.State 859 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{QErr: fmt.Errorf("Simulated error")}) 860 stub.MockPeerChaincode("lscc", stublccc) 861 862 r1 := stub.MockInit("1", [][]byte{}) 863 if r1.Status != shim.OK { 864 fmt.Println("Init failed", string(r1.Message)) 865 t.FailNow() 866 } 867 868 r := stublccc.MockInit("1", [][]byte{}) 869 if r.Status != shim.OK { 870 fmt.Println("Init failed", string(r.Message)) 871 t.FailNow() 872 } 873 874 ccname := "mycc" 875 ccver := "1" 876 877 defaultPolicy, err := getSignedByMSPAdminPolicy(mspid) 878 assert.NoError(t, err) 879 res, err := createCCDataRWset(ccname, ccname, ccver, defaultPolicy) 880 assert.NoError(t, err) 881 882 tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, res) 883 if err != nil { 884 t.Fatalf("createTx returned err %s", err) 885 } 886 887 envBytes, err := utils.GetBytesEnvelope(tx) 888 if err != nil { 889 t.Fatalf("GetBytesEnvelope returned err %s", err) 890 } 891 892 // good path: signed by the right MSP 893 policy, err := getSignedByMSPMemberPolicy(mspid) 894 if err != nil { 895 t.Fatalf("failed getting policy, err %s", err) 896 } 897 898 args := [][]byte{[]byte("dv"), envBytes, policy} 899 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 900 t.Fatalf("vscc invoke should have failed") 901 } 902 } 903 904 func TestValidateDeployOK(t *testing.T) { 905 v := new(ValidatorOneValidSignature) 906 stub := shim.NewMockStub("validatoronevalidsignature", v) 907 908 lccc := new(lscc.LifeCycleSysCC) 909 stublccc := shim.NewMockStub("lscc", lccc) 910 911 State := make(map[string]map[string][]byte) 912 State["lscc"] = stublccc.State 913 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 914 stub.MockPeerChaincode("lscc", stublccc) 915 916 r1 := stub.MockInit("1", [][]byte{}) 917 if r1.Status != shim.OK { 918 fmt.Println("Init failed", string(r1.Message)) 919 t.FailNow() 920 } 921 922 r := stublccc.MockInit("1", [][]byte{}) 923 if r.Status != shim.OK { 924 fmt.Println("Init failed", string(r.Message)) 925 t.FailNow() 926 } 927 928 ccname := "mycc" 929 ccver := "1" 930 931 defaultPolicy, err := getSignedByMSPAdminPolicy(mspid) 932 assert.NoError(t, err) 933 res, err := createCCDataRWset(ccname, ccname, ccver, defaultPolicy) 934 assert.NoError(t, err) 935 936 tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, res) 937 if err != nil { 938 t.Fatalf("createTx returned err %s", err) 939 } 940 941 envBytes, err := utils.GetBytesEnvelope(tx) 942 if err != nil { 943 t.Fatalf("GetBytesEnvelope returned err %s", err) 944 } 945 946 // good path: signed by the right MSP 947 policy, err := getSignedByMSPMemberPolicy(mspid) 948 if err != nil { 949 t.Fatalf("failed getting policy, err %s", err) 950 } 951 952 args := [][]byte{[]byte("dv"), envBytes, policy} 953 if res := stub.MockInvoke("1", args); res.Status != shim.OK { 954 t.Fatalf("vscc invoke returned err %s", res.Message) 955 } 956 } 957 958 func TestValidateDeployWithPolicies(t *testing.T) { 959 v := new(ValidatorOneValidSignature) 960 stub := shim.NewMockStub("validatoronevalidsignature", v) 961 962 lccc := new(lscc.LifeCycleSysCC) 963 stublccc := shim.NewMockStub("lscc", lccc) 964 965 State := make(map[string]map[string][]byte) 966 State["lscc"] = stublccc.State 967 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 968 stub.MockPeerChaincode("lscc", stublccc) 969 970 r1 := stub.MockInit("1", [][]byte{}) 971 if r1.Status != shim.OK { 972 fmt.Println("Init failed", string(r1.Message)) 973 t.FailNow() 974 } 975 976 r := stublccc.MockInit("1", [][]byte{}) 977 if r.Status != shim.OK { 978 fmt.Println("Init failed", string(r.Message)) 979 t.FailNow() 980 } 981 982 ccname := "mycc" 983 ccver := "1" 984 985 /*********************************************/ 986 /* test 1: success with an accept-all policy */ 987 /*********************************************/ 988 989 res, err := createCCDataRWset(ccname, ccname, ccver, cauthdsl.MarshaledAcceptAllPolicy) 990 assert.NoError(t, err) 991 992 tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, res) 993 if err != nil { 994 t.Fatalf("createTx returned err %s", err) 995 } 996 997 envBytes, err := utils.GetBytesEnvelope(tx) 998 if err != nil { 999 t.Fatalf("GetBytesEnvelope returned err %s", err) 1000 } 1001 1002 // good path: signed by the right MSP 1003 policy, err := getSignedByMSPMemberPolicy(mspid) 1004 if err != nil { 1005 t.Fatalf("failed getting policy, err %s", err) 1006 } 1007 1008 args := [][]byte{[]byte("dv"), envBytes, policy} 1009 if res := stub.MockInvoke("1", args); res.Status != shim.OK { 1010 t.Fatalf("vscc invoke returned err %s", res.Message) 1011 } 1012 1013 /********************************************/ 1014 /* test 2: failure with a reject-all policy */ 1015 /********************************************/ 1016 1017 res, err = createCCDataRWset(ccname, ccname, ccver, cauthdsl.MarshaledRejectAllPolicy) 1018 assert.NoError(t, err) 1019 1020 tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res) 1021 if err != nil { 1022 t.Fatalf("createTx returned err %s", err) 1023 } 1024 1025 envBytes, err = utils.GetBytesEnvelope(tx) 1026 if err != nil { 1027 t.Fatalf("GetBytesEnvelope returned err %s", err) 1028 } 1029 1030 // good path: signed by the right MSP 1031 policy, err = getSignedByMSPMemberPolicy(mspid) 1032 if err != nil { 1033 t.Fatalf("failed getting policy, err %s", err) 1034 } 1035 1036 args = [][]byte{[]byte("dv"), envBytes, policy} 1037 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 1038 t.Fatalf("vscc invoke should have failed") 1039 } 1040 } 1041 1042 func TestInvalidUpgrade(t *testing.T) { 1043 v := new(ValidatorOneValidSignature) 1044 stub := shim.NewMockStub("validatoronevalidsignature", v) 1045 1046 lccc := new(lscc.LifeCycleSysCC) 1047 stublccc := shim.NewMockStub("lscc", lccc) 1048 1049 State := make(map[string]map[string][]byte) 1050 State["lscc"] = stublccc.State 1051 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 1052 stub.MockPeerChaincode("lscc", stublccc) 1053 1054 r1 := stub.MockInit("1", [][]byte{}) 1055 if r1.Status != shim.OK { 1056 fmt.Println("Init failed", string(r1.Message)) 1057 t.FailNow() 1058 } 1059 1060 r := stublccc.MockInit("1", [][]byte{}) 1061 if r.Status != shim.OK { 1062 fmt.Println("Init failed", string(r.Message)) 1063 t.FailNow() 1064 } 1065 1066 ccname := "mycc" 1067 ccver := "2" 1068 1069 simresres, err := createCCDataRWset(ccname, ccname, ccver, nil) 1070 assert.NoError(t, err) 1071 1072 tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres) 1073 if err != nil { 1074 t.Fatalf("createTx returned err %s", err) 1075 } 1076 1077 envBytes, err := utils.GetBytesEnvelope(tx) 1078 if err != nil { 1079 t.Fatalf("GetBytesEnvelope returned err %s", err) 1080 } 1081 1082 // good path: signed by the right MSP 1083 policy, err := getSignedByMSPMemberPolicy(mspid) 1084 if err != nil { 1085 t.Fatalf("failed getting policy, err %s", err) 1086 } 1087 1088 args := [][]byte{[]byte("dv"), envBytes, policy} 1089 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 1090 t.Fatalf("vscc invocation should have failed") 1091 } 1092 } 1093 1094 func TestValidateUpgradeOK(t *testing.T) { 1095 v := new(ValidatorOneValidSignature) 1096 stub := shim.NewMockStub("validatoronevalidsignature", v) 1097 1098 lccc := new(lscc.LifeCycleSysCC) 1099 stublccc := shim.NewMockStub("lscc", lccc) 1100 1101 State := make(map[string]map[string][]byte) 1102 State["lscc"] = stublccc.State 1103 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 1104 stub.MockPeerChaincode("lscc", stublccc) 1105 1106 r1 := stub.MockInit("1", [][]byte{}) 1107 if r1.Status != shim.OK { 1108 fmt.Println("Init failed", string(r1.Message)) 1109 t.FailNow() 1110 } 1111 1112 r := stublccc.MockInit("1", [][]byte{}) 1113 if r.Status != shim.OK { 1114 fmt.Println("Init failed", string(r.Message)) 1115 t.FailNow() 1116 } 1117 1118 ccname := "mycc" 1119 ccver := "1" 1120 path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02" 1121 1122 ppath := lccctestpath + "/" + ccname + "." + ccver 1123 1124 os.Remove(ppath) 1125 1126 cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, true) 1127 if err != nil { 1128 fmt.Printf("%s\n", err) 1129 t.FailNow() 1130 } 1131 defer os.Remove(ppath) 1132 var b []byte 1133 if b, err = proto.Marshal(cds); err != nil || b == nil { 1134 t.FailNow() 1135 } 1136 1137 sProp2, _ := utils.MockSignedEndorserProposal2OrPanic(chainId, &peer.ChaincodeSpec{}, id) 1138 args := [][]byte{[]byte("deploy"), []byte(ccname), b} 1139 if res := stublccc.MockInvokeWithSignedProposal("1", args, sProp2); res.Status != shim.OK { 1140 fmt.Printf("%#v\n", res) 1141 t.FailNow() 1142 } 1143 1144 ccver = "2" 1145 1146 simresres, err := createCCDataRWset(ccname, ccname, ccver, nil) 1147 assert.NoError(t, err) 1148 1149 tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres) 1150 if err != nil { 1151 t.Fatalf("createTx returned err %s", err) 1152 } 1153 1154 envBytes, err := utils.GetBytesEnvelope(tx) 1155 if err != nil { 1156 t.Fatalf("GetBytesEnvelope returned err %s", err) 1157 } 1158 1159 // good path: signed by the right MSP 1160 policy, err := getSignedByMSPMemberPolicy(mspid) 1161 if err != nil { 1162 t.Fatalf("failed getting policy, err %s", err) 1163 } 1164 1165 args = [][]byte{[]byte("dv"), envBytes, policy} 1166 if res := stub.MockInvoke("1", args); res.Status != shim.OK { 1167 t.Fatalf("vscc invoke returned err %s", res.Message) 1168 } 1169 } 1170 1171 func TestInvalidateUpgradeBadVersion(t *testing.T) { 1172 v := new(ValidatorOneValidSignature) 1173 stub := shim.NewMockStub("validatoronevalidsignature", v) 1174 1175 lccc := new(lscc.LifeCycleSysCC) 1176 stublccc := shim.NewMockStub("lscc", lccc) 1177 1178 State := make(map[string]map[string][]byte) 1179 State["lscc"] = stublccc.State 1180 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 1181 stub.MockPeerChaincode("lscc", stublccc) 1182 1183 r1 := stub.MockInit("1", [][]byte{}) 1184 if r1.Status != shim.OK { 1185 fmt.Println("Init failed", string(r1.Message)) 1186 t.FailNow() 1187 } 1188 1189 r := stublccc.MockInit("1", [][]byte{}) 1190 if r.Status != shim.OK { 1191 fmt.Println("Init failed", string(r.Message)) 1192 t.FailNow() 1193 } 1194 1195 ccname := "mycc" 1196 ccver := "1" 1197 path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02" 1198 1199 ppath := lccctestpath + "/" + ccname + "." + ccver 1200 1201 os.Remove(ppath) 1202 1203 cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, true) 1204 if err != nil { 1205 fmt.Printf("%s\n", err) 1206 t.FailNow() 1207 } 1208 defer os.Remove(ppath) 1209 var b []byte 1210 if b, err = proto.Marshal(cds); err != nil || b == nil { 1211 t.FailNow() 1212 } 1213 1214 sProp2, _ := utils.MockSignedEndorserProposal2OrPanic(chainId, &peer.ChaincodeSpec{}, id) 1215 args := [][]byte{[]byte("deploy"), []byte(ccname), b} 1216 if res := stublccc.MockInvokeWithSignedProposal("1", args, sProp2); res.Status != shim.OK { 1217 fmt.Printf("%#v\n", res) 1218 t.FailNow() 1219 } 1220 1221 simresres, err := createCCDataRWset(ccname, ccname, ccver, nil) 1222 assert.NoError(t, err) 1223 1224 tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres) 1225 if err != nil { 1226 t.Fatalf("createTx returned err %s", err) 1227 } 1228 1229 envBytes, err := utils.GetBytesEnvelope(tx) 1230 if err != nil { 1231 t.Fatalf("GetBytesEnvelope returned err %s", err) 1232 } 1233 1234 // good path: signed by the right MSP 1235 policy, err := getSignedByMSPMemberPolicy(mspid) 1236 if err != nil { 1237 t.Fatalf("failed getting policy, err %s", err) 1238 } 1239 1240 args = [][]byte{[]byte("dv"), envBytes, policy} 1241 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 1242 t.Fatalf("vscc invoke should have failed") 1243 } 1244 } 1245 1246 func TestValidateUpgradeWithPoliciesOK(t *testing.T) { 1247 v := new(ValidatorOneValidSignature) 1248 stub := shim.NewMockStub("validatoronevalidsignature", v) 1249 1250 lccc := new(lscc.LifeCycleSysCC) 1251 stublccc := shim.NewMockStub("lscc", lccc) 1252 1253 State := make(map[string]map[string][]byte) 1254 State["lscc"] = stublccc.State 1255 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 1256 stub.MockPeerChaincode("lscc", stublccc) 1257 1258 r1 := stub.MockInit("1", [][]byte{}) 1259 if r1.Status != shim.OK { 1260 fmt.Println("Init failed", string(r1.Message)) 1261 t.FailNow() 1262 } 1263 1264 r := stublccc.MockInit("1", [][]byte{}) 1265 if r.Status != shim.OK { 1266 fmt.Println("Init failed", string(r.Message)) 1267 t.FailNow() 1268 } 1269 1270 ccname := "mycc" 1271 ccver := "1" 1272 path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02" 1273 1274 ppath := lccctestpath + "/" + ccname + "." + ccver 1275 1276 os.Remove(ppath) 1277 1278 cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, false) 1279 if err != nil { 1280 fmt.Printf("%s\n", err) 1281 t.FailNow() 1282 } 1283 _, err = processSignedCDS(cds, cauthdsl.AcceptAllPolicy) 1284 assert.NoError(t, err) 1285 defer os.Remove(ppath) 1286 var b []byte 1287 if b, err = proto.Marshal(cds); err != nil || b == nil { 1288 t.FailNow() 1289 } 1290 1291 sProp2, _ := utils.MockSignedEndorserProposal2OrPanic(chainId, &peer.ChaincodeSpec{}, id) 1292 args := [][]byte{[]byte("deploy"), []byte(ccname), b} 1293 if res := stublccc.MockInvokeWithSignedProposal("1", args, sProp2); res.Status != shim.OK { 1294 fmt.Printf("%#v\n", res) 1295 t.FailNow() 1296 } 1297 1298 ccver = "2" 1299 1300 simresres, err := createCCDataRWset(ccname, ccname, ccver, nil) 1301 assert.NoError(t, err) 1302 1303 tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres) 1304 if err != nil { 1305 t.Fatalf("createTx returned err %s", err) 1306 } 1307 1308 envBytes, err := utils.GetBytesEnvelope(tx) 1309 if err != nil { 1310 t.Fatalf("GetBytesEnvelope returned err %s", err) 1311 } 1312 1313 // good path: signed by the right MSP 1314 policy, err := getSignedByMSPMemberPolicy(mspid) 1315 if err != nil { 1316 t.Fatalf("failed getting policy, err %s", err) 1317 } 1318 1319 args = [][]byte{[]byte("dv"), envBytes, policy} 1320 if res := stub.MockInvoke("1", args); res.Status != shim.OK { 1321 t.Fatalf("vscc invoke returned err %s", res.Message) 1322 } 1323 } 1324 1325 func TestValidateUpgradeWithPoliciesFail(t *testing.T) { 1326 v := new(ValidatorOneValidSignature) 1327 stub := shim.NewMockStub("validatoronevalidsignature", v) 1328 1329 lccc := new(lscc.LifeCycleSysCC) 1330 stublccc := shim.NewMockStub("lscc", lccc) 1331 1332 State := make(map[string]map[string][]byte) 1333 State["lscc"] = stublccc.State 1334 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)}) 1335 stub.MockPeerChaincode("lscc", stublccc) 1336 1337 r1 := stub.MockInit("1", [][]byte{}) 1338 if r1.Status != shim.OK { 1339 fmt.Println("Init failed", string(r1.Message)) 1340 t.FailNow() 1341 } 1342 1343 r := stublccc.MockInit("1", [][]byte{}) 1344 if r.Status != shim.OK { 1345 fmt.Println("Init failed", string(r.Message)) 1346 t.FailNow() 1347 } 1348 1349 ccname := "mycc" 1350 ccver := "1" 1351 path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02" 1352 1353 ppath := lccctestpath + "/" + ccname + "." + ccver 1354 1355 os.Remove(ppath) 1356 1357 cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, false) 1358 if err != nil { 1359 fmt.Printf("%s\n", err) 1360 t.FailNow() 1361 } 1362 cdbytes, err := processSignedCDS(cds, cauthdsl.RejectAllPolicy) 1363 assert.NoError(t, err) 1364 defer os.Remove(ppath) 1365 var b []byte 1366 if b, err = proto.Marshal(cds); err != nil || b == nil { 1367 t.FailNow() 1368 } 1369 1370 // Simulate the lscc invocation whilst skipping the policy validation, 1371 // otherwise we wouldn't be able to deply a chaincode with a reject all policy 1372 stublccc.MockTransactionStart("barf") 1373 err = stublccc.PutState(ccname, cdbytes) 1374 assert.NoError(t, err) 1375 stublccc.MockTransactionEnd("barf") 1376 1377 ccver = "2" 1378 1379 simresres, err := createCCDataRWset(ccname, ccname, ccver, nil) 1380 assert.NoError(t, err) 1381 1382 tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres) 1383 if err != nil { 1384 t.Fatalf("createTx returned err %s", err) 1385 } 1386 1387 envBytes, err := utils.GetBytesEnvelope(tx) 1388 if err != nil { 1389 t.Fatalf("GetBytesEnvelope returned err %s", err) 1390 } 1391 1392 // good path: signed by the right MSP 1393 policy, err := getSignedByMSPMemberPolicy(mspid) 1394 if err != nil { 1395 t.Fatalf("failed getting policy, err %s", err) 1396 } 1397 1398 args := [][]byte{[]byte("dv"), envBytes, policy} 1399 if res := stub.MockInvoke("1", args); res.Status == shim.OK { 1400 t.Fatalf("vscc invocation should have failed") 1401 } 1402 } 1403 1404 var id msp.SigningIdentity 1405 var sid []byte 1406 var mspid string 1407 var chainId string = util.GetTestChainID() 1408 1409 type mockPolicyCheckerFactory struct { 1410 } 1411 1412 func (c *mockPolicyCheckerFactory) NewPolicyChecker() policy.PolicyChecker { 1413 return &mockPolicyChecker{} 1414 } 1415 1416 type mockPolicyChecker struct { 1417 } 1418 1419 func (c *mockPolicyChecker) CheckPolicy(channelID, policyName string, signedProp *peer.SignedProposal) error { 1420 return nil 1421 } 1422 1423 func (c *mockPolicyChecker) CheckPolicyBySignedData(channelID, policyName string, sd []*common.SignedData) error { 1424 return nil 1425 } 1426 1427 func (c *mockPolicyChecker) CheckPolicyNoChannel(policyName string, signedProp *peer.SignedProposal) error { 1428 return nil 1429 } 1430 1431 var lccctestpath = "/tmp/lscc-validation-test" 1432 1433 func TestMain(m *testing.M) { 1434 ccprovider.SetChaincodesPath(lccctestpath) 1435 sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{}) 1436 policy.RegisterPolicyCheckerFactory(&mockPolicyCheckerFactory{}) 1437 1438 mspGetter := func(cid string) []string { 1439 return []string{"DEFAULT"} 1440 } 1441 1442 per.MockSetMSPIDGetter(mspGetter) 1443 1444 var err error 1445 1446 // setup the MSP manager so that we can sign/verify 1447 msptesttools.LoadMSPSetupForTesting() 1448 1449 id, err = mspmgmt.GetLocalMSP().GetDefaultSigningIdentity() 1450 if err != nil { 1451 fmt.Printf("GetSigningIdentity failed with err %s", err) 1452 os.Exit(-1) 1453 } 1454 1455 sid, err = id.Serialize() 1456 if err != nil { 1457 fmt.Printf("Serialize failed with err %s", err) 1458 os.Exit(-1) 1459 } 1460 1461 // determine the MSP identifier for the first MSP in the default chain 1462 var msp msp.MSP 1463 mspMgr := mspmgmt.GetManagerForChain(chainId) 1464 msps, err := mspMgr.GetMSPs() 1465 if err != nil { 1466 fmt.Printf("Could not retrieve the MSPs for the chain manager, err %s", err) 1467 os.Exit(-1) 1468 } 1469 if len(msps) == 0 { 1470 fmt.Printf("At least one MSP was expected") 1471 os.Exit(-1) 1472 } 1473 for _, m := range msps { 1474 msp = m 1475 break 1476 } 1477 mspid, err = msp.GetIdentifier() 1478 if err != nil { 1479 fmt.Printf("Failure getting the msp identifier, err %s", err) 1480 os.Exit(-1) 1481 } 1482 1483 // also set the MSP for the "test" chain 1484 mspmgmt.XXXSetMSPManager("mycc", mspmgmt.GetManagerForChain(util.GetTestChainID())) 1485 1486 os.Exit(m.Run()) 1487 }