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