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

177 lines
5.4 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package chaincode
import (
"encoding/hex"
"fmt"
"testing"
"github.com/golang/protobuf/proto"
pb "github.com/hyperledger/fabric-protos-go/peer"
"github.com/hyperledger/fabric/bccsp/sw"
"github.com/hyperledger/fabric/internal/peer/common"
"github.com/stretchr/testify/require"
)
func TestChaincodeListCmd(t *testing.T) {
signer, err := common.GetDefaultSigner()
if err != nil {
t.Fatalf("Get default signer error: %s", err)
}
installedCqr := &pb.ChaincodeQueryResponse{
Chaincodes: []*pb.ChaincodeInfo{
{Name: "mycc1", Version: "1.0", Path: "codePath1", Input: "input", Escc: "escc", Vscc: "vscc", Id: []byte{1, 2, 3}},
{Name: "mycc2", Version: "1.0", Path: "codePath2", Input: "input", Escc: "escc", Vscc: "vscc"},
},
}
installedCqrBytes, err := proto.Marshal(installedCqr)
if err != nil {
t.Fatalf("Marshal error: %s", err)
}
mockResponse := &pb.ProposalResponse{
Response: &pb.Response{Status: 200, Payload: installedCqrBytes},
Endorsement: &pb.Endorsement{},
}
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 := listCmd(mockCF, cryptoProvider)
t.Run("get installed chaincodes - lscc", func(t *testing.T) {
resetFlags()
args := []string{"--installed"}
cmd.SetArgs(args)
if err := cmd.Execute(); err != nil {
t.Errorf("Run chaincode list cmd to get installed chaincodes error:%v", err)
}
})
t.Run("get instantiated chaincodes - no channel", func(t *testing.T) {
resetFlags()
args := []string{"--instantiated"}
cmd.SetArgs(args)
err = cmd.Execute()
require.Error(t, err, "Run chaincode list cmd to get instantiated chaincodes should fail if invoked without -C flag")
})
t.Run("get instantiated chaincodes - no channel", func(t *testing.T) {
resetFlags()
args := []string{"--instantiated"}
cmd.SetArgs(args)
err = cmd.Execute()
require.Error(t, err, "Run chaincode list cmd to get instantiated chaincodes should fail if invoked without -C flag")
})
t.Run("get instantiated chaincodes - success", func(t *testing.T) {
resetFlags()
instantiatedChaincodesCmd := listCmd(mockCF, cryptoProvider)
args := []string{"--instantiated", "-C", "mychannel"}
instantiatedChaincodesCmd.SetArgs(args)
if err := instantiatedChaincodesCmd.Execute(); err != nil {
t.Errorf("Run chaincode list cmd to get instantiated chaincodes error:%v", err)
}
})
t.Run("both --installed and --instantiated set - no channel", func(t *testing.T) {
resetFlags()
// Wrong case: Set both "--installed" and "--instantiated"
cmd = listCmd(mockCF, cryptoProvider)
args := []string{"--installed", "--instantiated"}
cmd.SetArgs(args)
err = cmd.Execute()
require.Error(t, err, "Run chaincode list cmd to get instantiated/installed chaincodes should fail if invoked without -C flag")
})
t.Run("both --installed and --instantiated set - no channel", func(t *testing.T) {
resetFlags()
args := []string{"--installed", "--instantiated", "-C", "mychannel"}
cmd.SetArgs(args)
expectErr := fmt.Errorf("must explicitly specify \"--installed\" or \"--instantiated\"")
err = cmd.Execute()
require.Error(t, err)
require.Equal(t, expectErr.Error(), err.Error())
})
t.Run("neither --installed nor --instantiated set", func(t *testing.T) {
resetFlags()
args := []string{"-C", "mychannel"}
cmd.SetArgs(args)
expectErr := fmt.Errorf("must explicitly specify \"--installed\" or \"--instantiated\"")
err = cmd.Execute()
require.Error(t, err)
require.Equal(t, expectErr.Error(), err.Error())
})
}
func TestChaincodeListFailure(t *testing.T) {
signer, err := common.GetDefaultSigner()
if err != nil {
t.Fatalf("Get default signer error: %s", err)
}
mockResponse := &pb.ProposalResponse{
Response: &pb.Response{Status: 500, Message: "error message"},
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 = ""
resetFlags()
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
// Get instantiated chaincodes
instantiatedChaincodesCmd := listCmd(mockCF, cryptoProvider)
args := []string{"--instantiated", "-C", "mychannel"}
instantiatedChaincodesCmd.SetArgs(args)
err = instantiatedChaincodesCmd.Execute()
require.Error(t, err)
require.Regexp(t, "bad response: 500 - error message", err.Error())
}
func TestString(t *testing.T) {
id := []byte{1, 2, 3, 4, 5}
idBytes := hex.EncodeToString(id)
b, _ := hex.DecodeString(idBytes)
ccInf := &ccInfo{
ChaincodeInfo: &pb.ChaincodeInfo{
Name: "ccName",
Id: b,
Version: "1.0",
Escc: "escc",
Input: "input",
Vscc: "vscc",
},
}
require.Equal(t, "Name: ccName, Version: 1.0, Input: input, Escc: escc, Vscc: vscc, Id: 0102030405", ccInf.String())
}