github.com/lzy4123/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 }