go_study/fabric-main/internal/peer/chaincode/upgrade_test.go

172 lines
5.1 KiB
Go

/*
Copyright Digital Asset Holdings, LLC. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package chaincode
import (
"errors"
"fmt"
"testing"
"time"
pb "github.com/hyperledger/fabric-protos-go/peer"
"github.com/hyperledger/fabric/bccsp/sw"
"github.com/hyperledger/fabric/internal/peer/common"
"github.com/spf13/viper"
"github.com/stretchr/testify/require"
)
func TestUpgradeCmd(t *testing.T) {
signer, err := common.GetDefaultSigner()
if err != nil {
t.Fatalf("Get default signer error: %v", err)
}
mockResponse := &pb.ProposalResponse{
Response: &pb.Response{Status: 200},
Endorsement: &pb.Endorsement{},
}
mockEndorserClients := []pb.EndorserClient{common.GetMockEndorserClient(mockResponse, nil)}
mockBroadcastClient := common.GetMockBroadcastClient(nil)
mockCF := &ChaincodeCmdFactory{
EndorserClients: mockEndorserClients,
Signer: signer,
BroadcastClient: mockBroadcastClient,
}
// reset channelID, it might have been set by previous test
channelID = ""
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
cmd := upgradeCmd(mockCF, cryptoProvider)
addFlags(cmd)
args := []string{
"-n", "mychaincode", "-p", "mychaincodepath",
"-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}",
}
cmd.SetArgs(args)
err = cmd.Execute()
require.Error(t, err, "'peer chaincode upgrade' command should have failed without -C flag")
args = []string{
"-C", "mychannel", "-n", "mychaincode", "-p", "mychaincodepath",
"-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}",
}
cmd.SetArgs(args)
err = cmd.Execute()
require.NoError(t, err, "'peer chaincode upgrade' command failed")
}
func TestUpgradeCmdEndorseFail(t *testing.T) {
signer, err := common.GetDefaultSigner()
if err != nil {
t.Fatalf("Get default signer error: %v", err)
}
errCode := int32(500)
errMsg := "upgrade error"
mockResponse := &pb.ProposalResponse{Response: &pb.Response{Status: errCode, Message: errMsg}}
mockEndorserClients := []pb.EndorserClient{common.GetMockEndorserClient(mockResponse, nil)}
mockBroadcastClient := common.GetMockBroadcastClient(nil)
mockCF := &ChaincodeCmdFactory{
EndorserClients: mockEndorserClients,
Signer: signer,
BroadcastClient: mockBroadcastClient,
}
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
cmd := upgradeCmd(mockCF, cryptoProvider)
addFlags(cmd)
args := []string{
"-C", "mychannel", "-n", "mychaincode", "-p", "mychaincodepath",
"-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}",
}
cmd.SetArgs(args)
expectErrMsg := fmt.Sprintf("could not assemble transaction, err proposal response was not successful, error code %d, msg %s", errCode, errMsg)
if err := cmd.Execute(); err == nil {
t.Errorf("Run chaincode upgrade cmd error:%v", err)
} else {
if err.Error() != expectErrMsg {
t.Errorf("Run chaincode upgrade cmd get unexpected error: %s", err.Error())
}
}
}
func TestUpgradeCmdSendTXFail(t *testing.T) {
signer, err := common.GetDefaultSigner()
if err != nil {
t.Fatalf("Get default signer error: %v", err)
}
mockResponse := &pb.ProposalResponse{
Response: &pb.Response{Status: 200},
Endorsement: &pb.Endorsement{},
}
mockEndorserClients := []pb.EndorserClient{common.GetMockEndorserClient(mockResponse, nil)}
sendErr := errors.New("send tx failed")
mockBroadcastClient := common.GetMockBroadcastClient(sendErr)
mockCF := &ChaincodeCmdFactory{
EndorserClients: mockEndorserClients,
Signer: signer,
BroadcastClient: mockBroadcastClient,
}
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
cmd := upgradeCmd(mockCF, cryptoProvider)
addFlags(cmd)
args := []string{"-C", "mychannel", "-n", "mychaincode", "-p", "mychaincodepath", "-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}"}
cmd.SetArgs(args)
expectErrMsg := sendErr.Error()
if err := cmd.Execute(); err == nil {
t.Errorf("Run chaincode upgrade cmd error:%v", err)
} else {
if err.Error() != expectErrMsg {
t.Errorf("Run chaincode upgrade cmd get unexpected error: %s", err.Error())
}
}
}
func TestUpgradeCmdWithNilCF(t *testing.T) {
defer viper.Reset()
defer resetFlags()
// set timeout for failure cases
viper.Set("peer.client.connTimeout", 10*time.Millisecond)
// trap possible SIGSEV panic
defer func() {
var err error
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
}
require.NoError(t, err, "'peer chaincode upgrade' command should have failed without a panic")
}()
channelID = ""
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
cmd := upgradeCmd(nil, cryptoProvider)
addFlags(cmd)
args := []string{
"-C", "mychannel", "-n", "mychaincode", "-p", "mychaincodepath",
"-v", "anotherversion", "-c", "{\"Function\":\"init\",\"Args\": [\"param\",\"1\"]}",
}
cmd.SetArgs(args)
err = cmd.Execute()
require.Error(t, err, "'peer chaincode upgrade' command should have failed without a panic")
}