github.com/defanghe/fabric@v2.1.1+incompatible/internal/peer/chaincode/query_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 "fmt" 11 "testing" 12 13 "github.com/hyperledger/fabric/bccsp" 14 "github.com/hyperledger/fabric/bccsp/sw" 15 "github.com/hyperledger/fabric/internal/peer/common" 16 "github.com/spf13/cobra" 17 "github.com/stretchr/testify/assert" 18 ) 19 20 func TestQueryCmd(t *testing.T) { 21 mockCF, err := getMockChaincodeCmdFactory() 22 assert.NoError(t, err, "Error getting mock chaincode command factory") 23 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 24 assert.NoError(t, err) 25 // reset channelID, it might have been set by previous test 26 channelID = "" 27 28 // Failure case: run query command without -C option 29 args := []string{"-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"} 30 cmd := newQueryCmdForTest(mockCF, args, cryptoProvider) 31 err = cmd.Execute() 32 assert.Error(t, err, "'peer chaincode query' command should have failed without -C flag") 33 34 // Success case: run query command without -r or -x option 35 args = []string{"-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"} 36 cmd = newQueryCmdForTest(mockCF, args, cryptoProvider) 37 err = cmd.Execute() 38 assert.NoError(t, err, "Run chaincode query cmd error") 39 40 // Success case: run query command with -r option 41 args = []string{"-r", "-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"} 42 cmd = newQueryCmdForTest(mockCF, args, cryptoProvider) 43 err = cmd.Execute() 44 assert.NoError(t, err, "Run chaincode query cmd error") 45 chaincodeQueryRaw = false 46 47 // Success case: run query command with -x option 48 args = []string{"-x", "-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"} 49 cmd = newQueryCmdForTest(mockCF, args, cryptoProvider) 50 err = cmd.Execute() 51 assert.NoError(t, err, "Run chaincode query cmd error") 52 53 // Failure case: run query command with both -x and -r options 54 args = []string{"-r", "-x", "-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"} 55 cmd = newQueryCmdForTest(mockCF, args, cryptoProvider) 56 err = cmd.Execute() 57 assert.Error(t, err, "Expected error executing query command with both -r and -x options") 58 59 // Failure case: run query command with mock chaincode cmd factory built to return error 60 mockCF, err = getMockChaincodeCmdFactoryWithErr() 61 assert.NoError(t, err, "Error getting mock chaincode command factory") 62 args = []string{"-r", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"} 63 cmd = newQueryCmdForTest(mockCF, args, cryptoProvider) 64 err = cmd.Execute() 65 assert.Error(t, err, "Expected error executing query command") 66 } 67 68 func TestQueryCmdEndorsementFailure(t *testing.T) { 69 args := []string{"-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"queryinvalid\",\"a\"]}"} 70 ccRespStatus := [2]int32{502, 400} 71 ccRespPayload := [][]byte{[]byte("Invalid function name"), []byte("Incorrect parameters")} 72 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 73 assert.NoError(t, err) 74 75 for i := 0; i < 2; i++ { 76 mockCF, err := getMockChaincodeCmdFactoryEndorsementFailure(ccRespStatus[i], ccRespPayload[i]) 77 assert.NoError(t, err, "Error getting mock chaincode command factory") 78 79 cmd := newQueryCmdForTest(mockCF, args, cryptoProvider) 80 err = cmd.Execute() 81 assert.Error(t, err) 82 assert.Regexp(t, "endorsement failure during query", err.Error()) 83 assert.Regexp(t, fmt.Sprintf("response: status:%d payload:\"%s\"", ccRespStatus[i], ccRespPayload[i]), err.Error()) 84 } 85 86 // failure - nil proposal response 87 mockCF, err := getMockChaincodeCmdFactory() 88 assert.NoError(t, err, "Error getting mock chaincode command factory") 89 mockCF.EndorserClients[0] = common.GetMockEndorserClient(nil, nil) 90 mockCF.EndorserClients[1] = common.GetMockEndorserClient(nil, nil) 91 92 cmd := newQueryCmdForTest(mockCF, args, cryptoProvider) 93 err = cmd.Execute() 94 assert.Error(t, err) 95 assert.Regexp(t, "error during query: received nil proposal response", err.Error()) 96 } 97 98 func newQueryCmdForTest(cf *ChaincodeCmdFactory, args []string, cryptoProvider bccsp.BCCSP) *cobra.Command { 99 cmd := queryCmd(cf, cryptoProvider) 100 addFlags(cmd) 101 cmd.SetArgs(args) 102 return cmd 103 }