// TestUpgradeAndInvoke deploys chaincode_example01, upgrade it with chaincode_example02, then invoke it func TestDeployAndUpgrade(t *testing.T) { chainID := util.GetTestChainID() var ctxt = context.Background() url1 := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example01" url2 := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02" chaincodeID1 := &pb.ChaincodeID{Path: url1, Name: "upgradeex01"} chaincodeID2 := &pb.ChaincodeID{Path: url2, Name: "upgradeex01"} f := "init" argsDeploy := util.ToChaincodeArgs(f, "a", "100", "b", "200") spec := &pb.ChaincodeSpec{Type: 1, ChaincodeID: chaincodeID1, CtorMsg: &pb.ChaincodeInput{Args: argsDeploy}} cccid1 := chaincode.NewCCContext(chainID, "upgradeex01", "", "", false, nil) cccid2 := chaincode.NewCCContext(chainID, "upgradeex02", "", "", false, nil) resp, prop, err := deploy(endorserServer, chainID, spec, nil) chaincodeName := spec.ChaincodeID.Name if err != nil { t.Fail() chaincode.GetChain().Stop(ctxt, cccid1, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID1}}) chaincode.GetChain().Stop(ctxt, cccid2, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID2}}) t.Logf("Error deploying <%s>: %s", chaincodeName, err) return } err = endorserServer.(*Endorser).commitTxSimulation(prop, chainID, signer, resp) if err != nil { t.Fail() chaincode.GetChain().Stop(ctxt, cccid1, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID1}}) chaincode.GetChain().Stop(ctxt, cccid2, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID2}}) t.Logf("Error committing <%s>: %s", chaincodeName, err) return } argsUpgrade := util.ToChaincodeArgs(f, "a", "150", "b", "300") spec = &pb.ChaincodeSpec{Type: 1, ChaincodeID: chaincodeID2, CtorMsg: &pb.ChaincodeInput{Args: argsUpgrade}} resp, prop, err = upgrade(endorserServer, chainID, spec, nil) if err != nil { t.Fail() chaincode.GetChain().Stop(ctxt, cccid1, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID1}}) chaincode.GetChain().Stop(ctxt, cccid2, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID2}}) t.Logf("Error upgrading <%s>: %s", chaincodeName, err) return } fmt.Printf("Upgrade test passed\n") t.Logf("Upgrade test passed") chaincode.GetChain().Stop(ctxt, cccid1, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID1}}) chaincode.GetChain().Stop(ctxt, cccid2, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID2}}) }
//call specified chaincode (system or user) func (e *Endorser) callChaincode(ctxt context.Context, chainID string, txid string, prop *pb.Proposal, cis *pb.ChaincodeInvocationSpec, cid *pb.ChaincodeID, txsim ledger.TxSimulator) ([]byte, *pb.ChaincodeEvent, error) { var err error var b []byte var ccevent *pb.ChaincodeEvent if txsim != nil { ctxt = context.WithValue(ctxt, chaincode.TXSimulatorKey, txsim) } //is this a system chaincode syscc := chaincode.IsSysCC(cid.Name) cccid := chaincode.NewCCContext(chainID, cid.Name, "", txid, syscc, prop) b, ccevent, err = chaincode.ExecuteChaincode(ctxt, cccid, cis.ChaincodeSpec.CtorMsg.Args) if err != nil { return nil, nil, err } //----- BEGIN - SECTION THAT MAY NEED TO BE DONE IN LCCC ------ //if this a call to deploy a chaincode, We need a mechanism //to pass TxSimulator into LCCC. Till that is worked out this //special code does the actual deploy, upgrade here so as to collect //all state under one TxSimulator // //NOTE that if there's an error all simulation, including the chaincode //table changes in lccc will be thrown away if cid.Name == "lccc" && len(cis.ChaincodeSpec.CtorMsg.Args) == 3 && (string(cis.ChaincodeSpec.CtorMsg.Args[0]) == "deploy" || string(cis.ChaincodeSpec.CtorMsg.Args[0]) == "upgrade") { var cds *pb.ChaincodeDeploymentSpec cds, err = putils.GetChaincodeDeploymentSpec(cis.ChaincodeSpec.CtorMsg.Args[2]) if err != nil { return nil, nil, err } //this should not be a system chaincode if chaincode.IsSysCC(cds.ChaincodeSpec.ChaincodeID.Name) { return nil, nil, fmt.Errorf("attempting to deploy a system chaincode %s/%s", cds.ChaincodeSpec.ChaincodeID.Name, chainID) } cccid = chaincode.NewCCContext(chainID, cds.ChaincodeSpec.ChaincodeID.Name, "", txid, false, prop) err = e.deploy(ctxt, cccid, cds) if err != nil { return nil, nil, err } } //----- END ------- return b, ccevent, err }
//TestRedeploy - deploy two times, second time should fail but example02 should remain deployed func TestRedeploy(t *testing.T) { chainID := util.GetTestChainID() //invalid arguments spec := &pb.ChaincodeSpec{Type: 1, ChaincodeID: &pb.ChaincodeID{Name: "ex02", Path: "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"}, CtorMsg: &pb.ChaincodeInput{Args: [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}}} cccid := chaincode.NewCCContext(chainID, "ex02", "", "", false, nil) _, _, err := deploy(endorserServer, chainID, spec, nil) if err != nil { t.Fail() t.Logf("error in endorserServer.ProcessProposal %s", err) chaincode.GetChain().Stop(context.Background(), cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec}) return } //second time should not fail as we are just simulating _, _, err = deploy(endorserServer, chainID, spec, nil) if err != nil { t.Fail() t.Logf("error in endorserServer.ProcessProposal %s", err) chaincode.GetChain().Stop(context.Background(), cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec}) return } chaincode.GetChain().Stop(context.Background(), cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec}) }
//TestDeploy deploy chaincode example01 func TestDeploy(t *testing.T) { chainID := util.GetTestChainID() spec := &pb.ChaincodeSpec{Type: 1, ChaincodeID: &pb.ChaincodeID{Name: "ex01", Path: "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example01"}, CtorMsg: &pb.ChaincodeInput{Args: [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}}} cccid := chaincode.NewCCContext(chainID, "ex01", "", "", false, nil) _, _, err := deploy(endorserServer, chainID, spec, nil) if err != nil { t.Fail() t.Logf("Deploy-error in deploy %s", err) chaincode.GetChain().Stop(context.Background(), cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec}) return } chaincode.GetChain().Stop(context.Background(), cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec}) }
// TestDeployAndInvoke deploys and invokes chaincode_example01 func TestDeployAndInvoke(t *testing.T) { chainID := util.GetTestChainID() var ctxt = context.Background() url := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example01" chaincodeID := &pb.ChaincodeID{Path: url, Name: "ex01"} args := []string{"10"} f := "init" argsDeploy := util.ToChaincodeArgs(f, "a", "100", "b", "200") spec := &pb.ChaincodeSpec{Type: 1, ChaincodeID: chaincodeID, CtorMsg: &pb.ChaincodeInput{Args: argsDeploy}} cccid := chaincode.NewCCContext(chainID, "ex01", "", "", false, nil) resp, prop, err := deploy(endorserServer, chainID, spec, nil) chaincodeID1 := spec.ChaincodeID.Name if err != nil { t.Fail() t.Logf("Error deploying <%s>: %s", chaincodeID1, err) chaincode.GetChain().Stop(ctxt, cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID}}) return } err = endorserServer.(*Endorser).commitTxSimulation(prop, chainID, signer, resp) if err != nil { t.Fail() t.Logf("Error committing <%s>: %s", chaincodeID1, err) chaincode.GetChain().Stop(ctxt, cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID}}) return } f = "invoke" invokeArgs := append([]string{f}, args...) spec = &pb.ChaincodeSpec{Type: 1, ChaincodeID: chaincodeID, CtorMsg: &pb.ChaincodeInput{Args: util.ToChaincodeArgs(invokeArgs...)}} resp, err = invoke(chainID, spec) if err != nil { t.Fail() t.Logf("Error invoking transaction: %s", err) chaincode.GetChain().Stop(ctxt, cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID}}) return } fmt.Printf("Invoke test passed\n") t.Logf("Invoke test passed") chaincode.GetChain().Stop(ctxt, cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: chaincodeID}}) }
func isTxValidForVscc(payload *common.Payload, envBytes []byte) error { // TODO: Extract the VSCC/policy from LCCC as soon as this is ready vscc := "vscc" chainName := payload.Header.ChainHeader.ChainID if chainName == "" { err := fmt.Errorf("transaction header does not contain an chain ID") logger.Errorf("%s", err) return err } txid := "N/A" // FIXME: is that appropriate? // build arguments for VSCC invocation // args[0] - function name (not used now) // args[1] - serialized Envelope args := [][]byte{[]byte(""), envBytes} // create VSCC invocation proposal vsccCis := &pb.ChaincodeInvocationSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: pb.ChaincodeSpec_GOLANG, ChaincodeID: &pb.ChaincodeID{Name: vscc}, CtorMsg: &pb.ChaincodeInput{Args: args}}} prop, err := putils.CreateProposalFromCIS(txid, chainName, vsccCis, []byte("")) if err != nil { logger.Errorf("Cannot create a proposal to invoke VSCC, err %s\n", err) return err } // get context for the chaincode execution var txsim ledger.TxSimulator lgr := peer.GetLedger(chainName) txsim, err = lgr.NewTxSimulator() if err != nil { logger.Errorf("Cannot obtain tx simulator, err %s\n", err) return err } defer txsim.Done() ctxt := context.WithValue(context.Background(), chaincode.TXSimulatorKey, txsim) cccid := chaincode.NewCCContext(chainName, vscc, "", txid, true, prop) // invoke VSCC _, _, err = chaincode.ExecuteChaincode(ctxt, cccid, args) if err != nil { logger.Errorf("VSCC check failed for transaction, error %s", err) return err } return nil }
//TestDeployBadPayload set payload to nil and do a deploy. It should fail and example02 should not be deployed func TestDeployBadPayload(t *testing.T) { chainID := util.GetTestChainID() //invalid arguments spec := &pb.ChaincodeSpec{Type: 1, ChaincodeID: &pb.ChaincodeID{Name: "ex02", Path: "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"}, CtorMsg: &pb.ChaincodeInput{Args: [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}}} cccid := chaincode.NewCCContext(chainID, "ex02", "", "", false, nil) f := func(cds *pb.ChaincodeDeploymentSpec) { cds.CodePackage = nil } _, _, err := deploy(endorserServer, chainID, spec, f) if err == nil { t.Fail() t.Log("DeployBadPayload-expected error in deploy but succeeded") chaincode.GetChain().Stop(context.Background(), cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec}) return } chaincode.GetChain().Stop(context.Background(), cccid, &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec}) }