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

104 lines
4.1 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package chaincode
import (
"fmt"
"testing"
"github.com/hyperledger/fabric/bccsp"
"github.com/hyperledger/fabric/bccsp/sw"
"github.com/hyperledger/fabric/internal/peer/common"
"github.com/spf13/cobra"
"github.com/stretchr/testify/require"
)
func TestQueryCmd(t *testing.T) {
mockCF, err := getMockChaincodeCmdFactory()
require.NoError(t, err, "Error getting mock chaincode command factory")
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
// reset channelID, it might have been set by previous test
channelID = ""
// Failure case: run query command without -C option
args := []string{"-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"}
cmd := newQueryCmdForTest(mockCF, args, cryptoProvider)
err = cmd.Execute()
require.Error(t, err, "'peer chaincode query' command should have failed without -C flag")
// Success case: run query command without -r or -x option
args = []string{"-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"}
cmd = newQueryCmdForTest(mockCF, args, cryptoProvider)
err = cmd.Execute()
require.NoError(t, err, "Run chaincode query cmd error")
// Success case: run query command with -r option
args = []string{"-r", "-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"}
cmd = newQueryCmdForTest(mockCF, args, cryptoProvider)
err = cmd.Execute()
require.NoError(t, err, "Run chaincode query cmd error")
chaincodeQueryRaw = false
// Success case: run query command with -x option
args = []string{"-x", "-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"}
cmd = newQueryCmdForTest(mockCF, args, cryptoProvider)
err = cmd.Execute()
require.NoError(t, err, "Run chaincode query cmd error")
// Failure case: run query command with both -x and -r options
args = []string{"-r", "-x", "-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"}
cmd = newQueryCmdForTest(mockCF, args, cryptoProvider)
err = cmd.Execute()
require.Error(t, err, "Expected error executing query command with both -r and -x options")
// Failure case: run query command with mock chaincode cmd factory built to return error
mockCF, err = getMockChaincodeCmdFactoryWithErr()
require.NoError(t, err, "Error getting mock chaincode command factory")
args = []string{"-r", "-n", "example02", "-c", "{\"Args\": [\"query\",\"a\"]}"}
cmd = newQueryCmdForTest(mockCF, args, cryptoProvider)
err = cmd.Execute()
require.Error(t, err, "Expected error executing query command")
}
func TestQueryCmdEndorsementFailure(t *testing.T) {
args := []string{"-C", "mychannel", "-n", "example02", "-c", "{\"Args\": [\"queryinvalid\",\"a\"]}"}
ccRespStatus := [2]int32{502, 400}
ccRespPayload := [][]byte{[]byte("Invalid function name"), []byte("Incorrect parameters")}
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
for i := 0; i < 2; i++ {
mockCF, err := getMockChaincodeCmdFactoryEndorsementFailure(ccRespStatus[i], ccRespPayload[i])
require.NoError(t, err, "Error getting mock chaincode command factory")
cmd := newQueryCmdForTest(mockCF, args, cryptoProvider)
err = cmd.Execute()
require.Error(t, err)
require.Regexp(t, "endorsement failure during query", err.Error())
require.Regexp(t, fmt.Sprintf("response: status:%d payload:\"%s\"", ccRespStatus[i], ccRespPayload[i]), err.Error())
}
// failure - nil proposal response
mockCF, err := getMockChaincodeCmdFactory()
require.NoError(t, err, "Error getting mock chaincode command factory")
mockCF.EndorserClients[0] = common.GetMockEndorserClient(nil, nil)
mockCF.EndorserClients[1] = common.GetMockEndorserClient(nil, nil)
cmd := newQueryCmdForTest(mockCF, args, cryptoProvider)
err = cmd.Execute()
require.Error(t, err)
require.Regexp(t, "error during query: received nil proposal response", err.Error())
}
func newQueryCmdForTest(cf *ChaincodeCmdFactory, args []string, cryptoProvider bccsp.BCCSP) *cobra.Command {
cmd := queryCmd(cf, cryptoProvider)
addFlags(cmd)
cmd.SetArgs(args)
return cmd
}