Skip to content

Commit a6b4d28

Browse files
hieuvubkmergify[bot]
authored andcommitted
test(server/v2/cometbft): Add Consensus query p2p, app, grpc (#22771)
(cherry picked from commit 9f7f17b)
1 parent d183da2 commit a6b4d28

File tree

2 files changed

+194
-9
lines changed

2 files changed

+194
-9
lines changed

server/v2/cometbft/abci_test.go

+188-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/json"
77
"errors"
88
"io"
9+
"reflect"
910
"strings"
1011
"sync"
1112
"testing"
@@ -15,6 +16,7 @@ import (
1516
abciproto "github.com/cometbft/cometbft/api/cometbft/abci/v1"
1617
v1 "github.com/cometbft/cometbft/api/cometbft/types/v1"
1718
"github.com/cosmos/gogoproto/proto"
19+
gogoproto "github.com/cosmos/gogoproto/proto"
1820
gogotypes "github.com/cosmos/gogoproto/types"
1921
"github.com/stretchr/testify/require"
2022

@@ -33,6 +35,9 @@ import (
3335
"cosmossdk.io/server/v2/stf/branch"
3436
"cosmossdk.io/server/v2/stf/mock"
3537
consensustypes "cosmossdk.io/x/consensus/types"
38+
39+
"github.com/cosmos/cosmos-sdk/testutil/testdata"
40+
sdk "github.com/cosmos/cosmos-sdk/types"
3641
)
3742

3843
var (
@@ -53,7 +58,9 @@ var (
5358
Msg: &gogotypes.BoolValue{Value: true},
5459
GasLimit: 0,
5560
}
56-
actorName = []byte("cookies")
61+
actorName = []byte("cookies")
62+
testAcc = sdk.AccAddress([]byte("addr1_______________"))
63+
versionStr = "0.0.0"
5764
)
5865

5966
func getQueryRouterBuilder[T any, PT interface {
@@ -583,11 +590,7 @@ func TestConsensus_Info(t *testing.T) {
583590
require.Equal(t, res.LastBlockHeight, int64(1))
584591
}
585592

586-
// TODO:
587-
// - GRPC request
588-
// - app request
589-
// - p2p request
590-
func TestConsensus_Query(t *testing.T) {
593+
func TestConsensus_QueryStore(t *testing.T) {
591594
c := setUpConsensus(t, 100_000, cometmock.MockMempool[mock.Tx]{})
592595

593596
// Write data to state storage
@@ -648,11 +651,149 @@ func TestConsensus_Query(t *testing.T) {
648651
require.Equal(t, res.Value, []byte(nil))
649652
}
650653

654+
func TestConsensus_GRPCQuery(t *testing.T) {
655+
c := setUpConsensus(t, 100_000, cometmock.MockMempool[mock.Tx]{})
656+
657+
_, err := c.InitChain(context.Background(), &abciproto.InitChainRequest{
658+
Time: time.Now(),
659+
ChainId: "test",
660+
InitialHeight: 1,
661+
})
662+
require.NoError(t, err)
663+
664+
_, err = c.FinalizeBlock(context.Background(), &abciproto.FinalizeBlockRequest{
665+
Time: time.Now(),
666+
Height: 1,
667+
Txs: [][]byte{mockTx.Bytes()},
668+
Hash: emptyHash[:],
669+
})
670+
require.NoError(t, err)
671+
672+
// empty request
673+
res, err := c.Query(context.Background(), &abciproto.QueryRequest{})
674+
require.NoError(t, err)
675+
require.Equal(t, res.Code, uint32(1))
676+
require.Contains(t, res.Log, "no query path provided")
677+
678+
// query request not exist in handler map
679+
invalidReq := testdata.EchoRequest{
680+
Message: "echo",
681+
}
682+
invalidReqBz, err := invalidReq.Marshal()
683+
require.NoError(t, err)
684+
invalidQuery := abci.QueryRequest{
685+
Data: invalidReqBz,
686+
Path: "testpb.EchoRequest",
687+
}
688+
invalidRes, err := c.Query(context.TODO(), &invalidQuery)
689+
require.Error(t, err)
690+
require.Nil(t, invalidRes)
691+
require.Contains(t, err.Error(), "no query handler found")
692+
693+
// Valid query
694+
req := testdata.SayHelloRequest{Name: "foo"}
695+
reqBz, err := req.Marshal()
696+
require.NoError(t, err)
697+
reqQuery := abci.QueryRequest{
698+
Data: reqBz,
699+
Path: "testpb.SayHelloRequest",
700+
}
701+
702+
resQuery, err := c.Query(context.TODO(), &reqQuery)
703+
require.NoError(t, err)
704+
require.Equal(t, abci.CodeTypeOK, resQuery.Code, resQuery)
705+
706+
var response testdata.SayHelloResponse
707+
require.NoError(t, response.Unmarshal(resQuery.Value))
708+
require.Equal(t, "Hello foo!", response.Greeting)
709+
}
710+
711+
func TestConsensus_P2PQuery(t *testing.T) {
712+
c := setUpConsensus(t, 100_000, cometmock.MockMempool[mock.Tx]{})
713+
714+
_, err := c.InitChain(context.Background(), &abciproto.InitChainRequest{
715+
Time: time.Now(),
716+
ChainId: "test",
717+
InitialHeight: 1,
718+
})
719+
require.NoError(t, err)
720+
721+
_, err = c.FinalizeBlock(context.Background(), &abciproto.FinalizeBlockRequest{
722+
Time: time.Now(),
723+
Height: 1,
724+
Txs: [][]byte{mockTx.Bytes()},
725+
Hash: emptyHash[:],
726+
})
727+
require.NoError(t, err)
728+
729+
// empty request
730+
res, err := c.Query(context.Background(), &abciproto.QueryRequest{})
731+
require.NoError(t, err)
732+
require.Equal(t, res.Code, uint32(1))
733+
require.Contains(t, res.Log, "no query path provided")
734+
735+
addrQuery := abci.QueryRequest{
736+
Path: "/p2p/filter/addr/1.1.1.1:8000",
737+
}
738+
res, err = c.Query(context.TODO(), &addrQuery)
739+
require.NoError(t, err)
740+
require.Equal(t, uint32(3), res.Code)
741+
742+
idQuery := abci.QueryRequest{
743+
Path: "/p2p/filter/id/testid",
744+
}
745+
res, err = c.Query(context.TODO(), &idQuery)
746+
require.NoError(t, err)
747+
require.Equal(t, uint32(4), res.Code)
748+
}
749+
750+
func TestConsensus_AppQuery(t *testing.T) {
751+
c := setUpConsensus(t, 100_000, cometmock.MockMempool[mock.Tx]{})
752+
753+
_, err := c.InitChain(context.Background(), &abciproto.InitChainRequest{
754+
Time: time.Now(),
755+
ChainId: "test",
756+
InitialHeight: 1,
757+
})
758+
require.NoError(t, err)
759+
760+
_, err = c.FinalizeBlock(context.Background(), &abciproto.FinalizeBlockRequest{
761+
Time: time.Now(),
762+
Height: 1,
763+
Txs: [][]byte{mockTx.Bytes()},
764+
Hash: emptyHash[:],
765+
})
766+
require.NoError(t, err)
767+
768+
tx := mock.Tx{
769+
Sender: testAcc,
770+
Msg: &gogotypes.BoolValue{Value: true},
771+
GasLimit: 1000,
772+
}
773+
txBytes := tx.Bytes()
774+
775+
// simulate by calling Query with encoded tx
776+
query := abci.QueryRequest{
777+
Path: "/app/simulate",
778+
Data: txBytes,
779+
}
780+
queryResult, err := c.Query(context.TODO(), &query)
781+
require.NoError(t, err)
782+
require.True(t, queryResult.IsOK(), queryResult.Log)
783+
784+
// Query app version
785+
res, err := c.Query(context.TODO(), &abci.QueryRequest{Path: "app/version"})
786+
require.NoError(t, err)
787+
require.True(t, res.IsOK())
788+
require.Equal(t, versionStr, string(res.Value))
789+
}
790+
651791
func setUpConsensus(t *testing.T, gasLimit uint64, mempool mempool.Mempool[mock.Tx]) *consensus[mock.Tx] {
652792
t.Helper()
653793

794+
queryHandler := make(map[string]appmodulev2.Handler)
654795
msgRouterBuilder := getMsgRouterBuilder(t, func(ctx context.Context, msg *gogotypes.BoolValue) (*gogotypes.BoolValue, error) {
655-
return nil, nil
796+
return msg, nil
656797
})
657798

658799
queryRouterBuilder := getQueryRouterBuilder(t, func(ctx context.Context, q *consensustypes.QueryParamsRequest) (*consensustypes.QueryParamsResponse, error) {
@@ -669,6 +810,32 @@ func setUpConsensus(t *testing.T, gasLimit uint64, mempool mempool.Mempool[mock.
669810
}, nil
670811
})
671812

813+
helloFooHandler := func(ctx context.Context, msg transaction.Msg) (msgResp transaction.Msg, err error) {
814+
typedReq := msg.(*testdata.SayHelloRequest)
815+
handler := testdata.QueryImpl{}
816+
typedResp, err := handler.SayHello(ctx, typedReq)
817+
if err != nil {
818+
return nil, err
819+
}
820+
821+
return typedResp, nil
822+
}
823+
824+
queryRouterBuilder.RegisterHandler(
825+
proto.MessageName(&testdata.SayHelloRequest{}),
826+
helloFooHandler,
827+
)
828+
829+
queryHandler[proto.MessageName(&testdata.SayHelloRequest{})] = appmodulev2.Handler{
830+
Func: helloFooHandler,
831+
MakeMsg: func() transaction.Msg {
832+
return reflect.New(gogoproto.MessageType(proto.MessageName(&testdata.SayHelloRequest{})).Elem()).Interface().(transaction.Msg)
833+
},
834+
MakeMsgResp: func() transaction.Msg {
835+
return reflect.New(gogoproto.MessageType(proto.MessageName(&testdata.SayHelloResponse{})).Elem()).Interface().(transaction.Msg)
836+
},
837+
}
838+
672839
s, err := stf.New(
673840
log.NewNopLogger().With("module", "stf"),
674841
msgRouterBuilder,
@@ -709,6 +876,16 @@ func setUpConsensus(t *testing.T, gasLimit uint64, mempool mempool.Mempool[mock.
709876
nil,
710877
)
711878

879+
addrPeerFilter := func(info string) (*abci.QueryResponse, error) {
880+
require.Equal(t, "1.1.1.1:8000", info)
881+
return &abci.QueryResponse{Code: uint32(3)}, nil
882+
}
883+
884+
idPeerFilter := func(id string) (*abci.QueryResponse, error) {
885+
require.Equal(t, "testid", id)
886+
return &abci.QueryResponse{Code: uint32(4)}, nil
887+
}
888+
712889
return &consensus[mock.Tx]{
713890
logger: log.NewNopLogger(),
714891
appName: "testing-app",
@@ -719,6 +896,10 @@ func setUpConsensus(t *testing.T, gasLimit uint64, mempool mempool.Mempool[mock.
719896
txCodec: mock.TxCodec{},
720897
chainID: "test",
721898
getProtoRegistry: sync.OnceValues(proto.MergedRegistry),
899+
queryHandlersMap: queryHandler,
900+
addrPeerFilter: addrPeerFilter,
901+
idPeerFilter: idPeerFilter,
902+
version: versionStr,
722903
}
723904
}
724905

server/v2/cometbft/utils.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,19 @@ func intoABCISimulationResponse(txRes server.TxResult, indexSet map[string]struc
190190
msgResponses[i] = anyMsg
191191
}
192192

193+
errMsg := ""
194+
if txRes.Error != nil {
195+
errMsg = txRes.Error.Error()
196+
}
197+
193198
res := &sdk.SimulationResponse{
194199
GasInfo: sdk.GasInfo{
195200
GasWanted: txRes.GasWanted,
196201
GasUsed: txRes.GasUsed,
197202
},
198203
Result: &sdk.Result{
199204
Data: []byte{},
200-
Log: txRes.Error.Error(),
205+
Log: errMsg,
201206
Events: abciEvents,
202207
MsgResponses: msgResponses,
203208
},
@@ -284,7 +289,6 @@ func gRPCErrorToSDKError(err error) *abci.QueryResponse {
284289
res.Log = err.Error()
285290
}
286291
return res
287-
288292
}
289293

290294
status, ok := grpcstatus.FromError(err)

0 commit comments

Comments
 (0)