github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/internal/peer/chaincode/upgrade_test.go (about) 1 /* 2 Copyright Digital Asset Holdings, LLC. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package chaincode 8 9 import ( 10 "errors" 11 "fmt" 12 "testing" 13 "time" 14 15 "github.com/hechain20/hechain/bccsp/sw" 16 "github.com/hechain20/hechain/internal/peer/common" 17 pb "github.com/hyperledger/fabric-protos-go/peer" 18 "github.com/spf13/viper" 19 "github.com/stretchr/testify/require" 20 ) 21 22 func TestUpgradeCmd(t *testing.T) { 23 signer, err := common.GetDefaultSigner() 24 if err != nil { 25 t.Fatalf("Get default signer error: %v", err) 26 } 27 28 mockResponse := &pb.ProposalResponse{ 29 Response: &pb.Response{Status: 200}, 30 Endorsement: &pb.Endorsement{}, 31 } 32 mockEndorserClients := []pb.EndorserClient{common.GetMockEndorserClient(mockResponse, nil)} 33 mockBroadcastClient := common.GetMockBroadcastClient(nil) 34 mockCF := &ChaincodeCmdFactory{ 35 EndorserClients: mockEndorserClients, 36 Signer: signer, 37 BroadcastClient: mockBroadcastClient, 38 } 39 40 // reset channelID, it might have been set by previous test 41 channelID = "" 42 43 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 44 require.NoError(t, err) 45 cmd := upgradeCmd(mockCF, cryptoProvider) 46 addFlags(cmd) 47 48 args := []string{ 49 "-n", "mychaincode", "-p", "mychaincodepath", 50 "-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}", 51 } 52 cmd.SetArgs(args) 53 err = cmd.Execute() 54 require.Error(t, err, "'peer chaincode upgrade' command should have failed without -C flag") 55 56 args = []string{ 57 "-C", "mychannel", "-n", "mychaincode", "-p", "mychaincodepath", 58 "-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}", 59 } 60 cmd.SetArgs(args) 61 err = cmd.Execute() 62 require.NoError(t, err, "'peer chaincode upgrade' command failed") 63 } 64 65 func TestUpgradeCmdEndorseFail(t *testing.T) { 66 signer, err := common.GetDefaultSigner() 67 if err != nil { 68 t.Fatalf("Get default signer error: %v", err) 69 } 70 71 errCode := int32(500) 72 errMsg := "upgrade error" 73 mockResponse := &pb.ProposalResponse{Response: &pb.Response{Status: errCode, Message: errMsg}} 74 75 mockEndorserClients := []pb.EndorserClient{common.GetMockEndorserClient(mockResponse, nil)} 76 mockBroadcastClient := common.GetMockBroadcastClient(nil) 77 mockCF := &ChaincodeCmdFactory{ 78 EndorserClients: mockEndorserClients, 79 Signer: signer, 80 BroadcastClient: mockBroadcastClient, 81 } 82 83 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 84 require.NoError(t, err) 85 cmd := upgradeCmd(mockCF, cryptoProvider) 86 addFlags(cmd) 87 88 args := []string{ 89 "-C", "mychannel", "-n", "mychaincode", "-p", "mychaincodepath", 90 "-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}", 91 } 92 cmd.SetArgs(args) 93 94 expectErrMsg := fmt.Sprintf("could not assemble transaction, err proposal response was not successful, error code %d, msg %s", errCode, errMsg) 95 if err := cmd.Execute(); err == nil { 96 t.Errorf("Run chaincode upgrade cmd error:%v", err) 97 } else { 98 if err.Error() != expectErrMsg { 99 t.Errorf("Run chaincode upgrade cmd get unexpected error: %s", err.Error()) 100 } 101 } 102 } 103 104 func TestUpgradeCmdSendTXFail(t *testing.T) { 105 signer, err := common.GetDefaultSigner() 106 if err != nil { 107 t.Fatalf("Get default signer error: %v", err) 108 } 109 110 mockResponse := &pb.ProposalResponse{ 111 Response: &pb.Response{Status: 200}, 112 Endorsement: &pb.Endorsement{}, 113 } 114 mockEndorserClients := []pb.EndorserClient{common.GetMockEndorserClient(mockResponse, nil)} 115 sendErr := errors.New("send tx failed") 116 mockBroadcastClient := common.GetMockBroadcastClient(sendErr) 117 mockCF := &ChaincodeCmdFactory{ 118 EndorserClients: mockEndorserClients, 119 Signer: signer, 120 BroadcastClient: mockBroadcastClient, 121 } 122 123 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 124 require.NoError(t, err) 125 cmd := upgradeCmd(mockCF, cryptoProvider) 126 addFlags(cmd) 127 128 args := []string{"-C", "mychannel", "-n", "mychaincode", "-p", "mychaincodepath", "-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}"} 129 cmd.SetArgs(args) 130 131 expectErrMsg := sendErr.Error() 132 if err := cmd.Execute(); err == nil { 133 t.Errorf("Run chaincode upgrade cmd error:%v", err) 134 } else { 135 if err.Error() != expectErrMsg { 136 t.Errorf("Run chaincode upgrade cmd get unexpected error: %s", err.Error()) 137 } 138 } 139 } 140 141 func TestUpgradeCmdWithNilCF(t *testing.T) { 142 defer viper.Reset() 143 defer resetFlags() 144 145 // set timeout for failure cases 146 viper.Set("peer.client.connTimeout", 10*time.Millisecond) 147 148 // trap possible SIGSEV panic 149 defer func() { 150 var err error 151 if r := recover(); r != nil { 152 err = fmt.Errorf("%v", r) 153 } 154 require.NoError(t, err, "'peer chaincode upgrade' command should have failed without a panic") 155 }() 156 157 channelID = "" 158 159 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 160 require.NoError(t, err) 161 cmd := upgradeCmd(nil, cryptoProvider) 162 addFlags(cmd) 163 164 args := []string{ 165 "-C", "mychannel", "-n", "mychaincode", "-p", "mychaincodepath", 166 "-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}", 167 } 168 cmd.SetArgs(args) 169 err = cmd.Execute() 170 require.Error(t, err, "'peer chaincode upgrade' command should have failed without a panic") 171 }