github.com/true-sqn/fabric@v2.1.1+incompatible/internal/peer/chaincode/list_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package chaincode
     8  
     9  import (
    10  	"encoding/hex"
    11  	"fmt"
    12  	"testing"
    13  
    14  	"github.com/golang/protobuf/proto"
    15  	pb "github.com/hyperledger/fabric-protos-go/peer"
    16  	"github.com/hyperledger/fabric/bccsp/sw"
    17  	"github.com/hyperledger/fabric/internal/peer/common"
    18  	"github.com/stretchr/testify/assert"
    19  )
    20  
    21  func TestChaincodeListCmd(t *testing.T) {
    22  	signer, err := common.GetDefaultSigner()
    23  	if err != nil {
    24  		t.Fatalf("Get default signer error: %s", err)
    25  	}
    26  
    27  	installedCqr := &pb.ChaincodeQueryResponse{
    28  		Chaincodes: []*pb.ChaincodeInfo{
    29  			{Name: "mycc1", Version: "1.0", Path: "codePath1", Input: "input", Escc: "escc", Vscc: "vscc", Id: []byte{1, 2, 3}},
    30  			{Name: "mycc2", Version: "1.0", Path: "codePath2", Input: "input", Escc: "escc", Vscc: "vscc"},
    31  		},
    32  	}
    33  	installedCqrBytes, err := proto.Marshal(installedCqr)
    34  	if err != nil {
    35  		t.Fatalf("Marshal error: %s", err)
    36  	}
    37  
    38  	mockResponse := &pb.ProposalResponse{
    39  		Response:    &pb.Response{Status: 200, Payload: installedCqrBytes},
    40  		Endorsement: &pb.Endorsement{},
    41  	}
    42  	mockEndorserClients := []pb.EndorserClient{common.GetMockEndorserClient(mockResponse, nil)}
    43  	mockBroadcastClient := common.GetMockBroadcastClient(nil)
    44  	mockCF := &ChaincodeCmdFactory{
    45  		EndorserClients: mockEndorserClients,
    46  		Signer:          signer,
    47  		BroadcastClient: mockBroadcastClient,
    48  	}
    49  
    50  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
    51  	assert.NoError(t, err)
    52  
    53  	cmd := listCmd(mockCF, cryptoProvider)
    54  
    55  	t.Run("get installed chaincodes - lscc", func(t *testing.T) {
    56  		resetFlags()
    57  
    58  		args := []string{"--installed"}
    59  		cmd.SetArgs(args)
    60  		if err := cmd.Execute(); err != nil {
    61  			t.Errorf("Run chaincode list cmd to get installed chaincodes error:%v", err)
    62  		}
    63  	})
    64  
    65  	t.Run("get instantiated chaincodes - no channel", func(t *testing.T) {
    66  		resetFlags()
    67  
    68  		args := []string{"--instantiated"}
    69  		cmd.SetArgs(args)
    70  		err = cmd.Execute()
    71  		assert.Error(t, err, "Run chaincode list cmd to get instantiated chaincodes should fail if invoked without -C flag")
    72  	})
    73  
    74  	t.Run("get instantiated chaincodes - no channel", func(t *testing.T) {
    75  		resetFlags()
    76  
    77  		args := []string{"--instantiated"}
    78  		cmd.SetArgs(args)
    79  		err = cmd.Execute()
    80  		assert.Error(t, err, "Run chaincode list cmd to get instantiated chaincodes should fail if invoked without -C flag")
    81  	})
    82  
    83  	t.Run("get instantiated chaincodes - success", func(t *testing.T) {
    84  		resetFlags()
    85  		instantiatedChaincodesCmd := listCmd(mockCF, cryptoProvider)
    86  		args := []string{"--instantiated", "-C", "mychannel"}
    87  		instantiatedChaincodesCmd.SetArgs(args)
    88  		if err := instantiatedChaincodesCmd.Execute(); err != nil {
    89  			t.Errorf("Run chaincode list cmd to get instantiated chaincodes error:%v", err)
    90  		}
    91  	})
    92  
    93  	t.Run("both --installed and --instantiated set - no channel", func(t *testing.T) {
    94  		resetFlags()
    95  
    96  		// Wrong case: Set both "--installed" and "--instantiated"
    97  		cmd = listCmd(mockCF, cryptoProvider)
    98  		args := []string{"--installed", "--instantiated"}
    99  		cmd.SetArgs(args)
   100  		err = cmd.Execute()
   101  		assert.Error(t, err, "Run chaincode list cmd to get instantiated/installed chaincodes should fail if invoked without -C flag")
   102  	})
   103  
   104  	t.Run("both --installed and --instantiated set - no channel", func(t *testing.T) {
   105  		resetFlags()
   106  		args := []string{"--installed", "--instantiated", "-C", "mychannel"}
   107  		cmd.SetArgs(args)
   108  		expectErr := fmt.Errorf("must explicitly specify \"--installed\" or \"--instantiated\"")
   109  		err = cmd.Execute()
   110  		assert.Error(t, err)
   111  		assert.Equal(t, expectErr.Error(), err.Error())
   112  	})
   113  
   114  	t.Run("neither --installed nor --instantiated set", func(t *testing.T) {
   115  		resetFlags()
   116  		args := []string{"-C", "mychannel"}
   117  		cmd.SetArgs(args)
   118  
   119  		expectErr := fmt.Errorf("must explicitly specify \"--installed\" or \"--instantiated\"")
   120  		err = cmd.Execute()
   121  		assert.Error(t, err)
   122  		assert.Equal(t, expectErr.Error(), err.Error())
   123  	})
   124  }
   125  
   126  func TestChaincodeListFailure(t *testing.T) {
   127  	signer, err := common.GetDefaultSigner()
   128  	if err != nil {
   129  		t.Fatalf("Get default signer error: %s", err)
   130  	}
   131  
   132  	mockResponse := &pb.ProposalResponse{
   133  		Response:    &pb.Response{Status: 500, Message: "error message"},
   134  		Endorsement: &pb.Endorsement{},
   135  	}
   136  	mockEndorserClients := []pb.EndorserClient{common.GetMockEndorserClient(mockResponse, nil)}
   137  	mockBroadcastClient := common.GetMockBroadcastClient(nil)
   138  	mockCF := &ChaincodeCmdFactory{
   139  		EndorserClients: mockEndorserClients,
   140  		Signer:          signer,
   141  		BroadcastClient: mockBroadcastClient,
   142  	}
   143  
   144  	// reset channelID, it might have been set by previous test
   145  	channelID = ""
   146  
   147  	resetFlags()
   148  
   149  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
   150  	assert.NoError(t, err)
   151  
   152  	// Get instantiated chaincodes
   153  	instantiatedChaincodesCmd := listCmd(mockCF, cryptoProvider)
   154  	args := []string{"--instantiated", "-C", "mychannel"}
   155  	instantiatedChaincodesCmd.SetArgs(args)
   156  	err = instantiatedChaincodesCmd.Execute()
   157  	assert.Error(t, err)
   158  	assert.Regexp(t, "bad response: 500 - error message", err.Error())
   159  }
   160  
   161  func TestString(t *testing.T) {
   162  	id := []byte{1, 2, 3, 4, 5}
   163  	idBytes := hex.EncodeToString(id)
   164  	b, _ := hex.DecodeString(idBytes)
   165  	ccInf := &ccInfo{
   166  		ChaincodeInfo: &pb.ChaincodeInfo{
   167  			Name:    "ccName",
   168  			Id:      b,
   169  			Version: "1.0",
   170  			Escc:    "escc",
   171  			Input:   "input",
   172  			Vscc:    "vscc",
   173  		},
   174  	}
   175  	assert.Equal(t, "Name: ccName, Version: 1.0, Input: input, Escc: escc, Vscc: vscc, Id: 0102030405", ccInf.String())
   176  }