172 lines
5.1 KiB
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")
|
|
}
|