From ee0d1895d7d0984f07f85caa30e6aee5b5ed7c3b Mon Sep 17 00:00:00 2001 From: happycoder9345 Date: Wed, 9 Oct 2024 11:09:16 +0800 Subject: [PATCH] add grpc_query test --- x/ccev/keeper/grpc_query.go | 16 +++++ x/ccev/keeper/grpc_query_test.go | 120 ++++++++++++++++++++++++++++++- x/ccev/testutil/test_data.go | 40 +++++------ x/ccev/types/key.go | 2 +- 4 files changed, 154 insertions(+), 24 deletions(-) diff --git a/x/ccev/keeper/grpc_query.go b/x/ccev/keeper/grpc_query.go index 4abd3f0..35fa695 100644 --- a/x/ccev/keeper/grpc_query.go +++ b/x/ccev/keeper/grpc_query.go @@ -51,6 +51,10 @@ func (q Querier) Clients(goCtx context.Context, req *types.QueryClientsRequest) func (q Querier) Contract(goCtx context.Context, req *types.QueryContractRequest) (*types.QueryContractResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) + if !q.hasClient(ctx, req.ChainId) { + return nil, errorsmod.Wrapf(types.ErrNotFoundClient, "client %d not found", req.ChainId) + } + contract := q.getContract(ctx, req.ChainId, common.HexToAddress(req.Address)) if contract == nil { return &types.QueryContractResponse{}, errorsmod.Wrapf(types.ErrNotFoundContract, "contract %d not found, cannot update", req.ChainId) @@ -62,6 +66,10 @@ func (q Querier) Contract(goCtx context.Context, req *types.QueryContractRequest func (q Querier) Header(goCtx context.Context, req *types.QueryHeaderRequest) (*types.QueryHeaderResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) + if !q.hasClient(ctx, req.ChainId) { + return nil, errorsmod.Wrapf(types.ErrNotFoundClient, "client %d not found", req.ChainId) + } + header, found := q.GetHeader(ctx, req.ChainId, req.Number) if !found { return nil, errorsmod.Wrapf(types.ErrHeaderNotFound, "header %d not found", req.Number) @@ -73,6 +81,10 @@ func (q Querier) Header(goCtx context.Context, req *types.QueryHeaderRequest) (* func (q Querier) HeaderByHash(goCtx context.Context, req *types.QueryHeaderByHashRequest) (*types.QueryHeaderByHashResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) + if !q.hasClient(ctx, req.ChainId) { + return nil, errorsmod.Wrapf(types.ErrNotFoundClient, "client %d not found", req.ChainId) + } + header, found := q.GetHeaderByHash(ctx, req.ChainId, req.Hash) if !found { return nil, errorsmod.Wrapf(types.ErrHeaderNotFound, "header %x not found", req.Hash) @@ -84,6 +96,10 @@ func (q Querier) HeaderByHash(goCtx context.Context, req *types.QueryHeaderByHas func (q Querier) LatestHeader(goCtx context.Context, req *types.QueryLatestHeaderRequest) (*types.QueryLatestHeaderResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) + if !q.hasClient(ctx, req.ChainId) { + return nil, errorsmod.Wrapf(types.ErrNotFoundClient, "client %d not found", req.ChainId) + } + header, found := q.GetLatestHeader(ctx, req.ChainId) if !found { return nil, errorsmod.Wrap(types.ErrHeaderNotFound, "latested header not found") diff --git a/x/ccev/keeper/grpc_query_test.go b/x/ccev/keeper/grpc_query_test.go index 4106cfd..69ccb2e 100644 --- a/x/ccev/keeper/grpc_query_test.go +++ b/x/ccev/keeper/grpc_query_test.go @@ -218,6 +218,7 @@ func (suite *KeeperTestSuite) TestHeader() { name: "success", msg: &types.QueryHeaderRequest{ ChainId: 56, + Number: headers[1].Number, }, setup: func() { suite.CreateClient(56, "Binance Smart Chain", *headers[0]) @@ -242,6 +243,119 @@ func (suite *KeeperTestSuite) TestHeader() { }) } } -func (suite *KeeperTestSuite) TestHeaderByHash() {} -func (suite *KeeperTestSuite) TestLatestHeader() {} -func (suite *KeeperTestSuite) TestParams() {} +func (suite *KeeperTestSuite) TestHeaderByHash() { + headers := testutil.GetTestHeaders(suite.T()) + testCases := []struct { + name string + msg *types.QueryHeaderByHashRequest + setup func() + expect *types.TinyHeader + expectErr bool + expectErrMsg string + }{ + { + name: "client not found", + msg: &types.QueryHeaderByHashRequest{ + ChainId: 56, + }, + setup: func() {}, + expectErr: true, + expectErrMsg: "client not found", + }, + { + name: "header not found", + msg: &types.QueryHeaderByHashRequest{ + ChainId: 56, + }, + setup: func() { + suite.CreateClient(56, "Binance Smart Chain", *headers[0]) + }, + expectErr: true, + expectErrMsg: "header not found", + }, + { + name: "success", + msg: &types.QueryHeaderByHashRequest{ + ChainId: 56, + Hash: headers[1].Hash, + }, + setup: func() { + suite.CreateClient(56, "Binance Smart Chain", *headers[0]) + suite.UploadHeaders(56, []types.TinyHeader{*headers[1]}) + }, + expect: headers[1], + }, + + } + for _, tc := range testCases { + suite.Run(tc.name, func() { + suite.SetupTest() + tc.setup() + res, err := suite.queryClient.HeaderByHash(suite.ctx, tc.msg) + if tc.expectErr { + suite.Require().Error(err) + suite.Require().Contains(err.Error(), tc.expectErrMsg) + } else { + suite.Require().NoError(err) + suite.Require().Equal(tc.expect, res.Header) + } + }) + } +} +func (suite *KeeperTestSuite) TestLatestHeader() { + headers := testutil.GetTestHeaders(suite.T()) + testCases := []struct { + name string + msg *types.QueryLatestHeaderRequest + setup func() + expect *types.TinyHeader + expectErr bool + expectErrMsg string + }{ + { + name: "client not found", + msg: &types.QueryLatestHeaderRequest{ + ChainId: 56, + }, + setup: func() {}, + expectErr: true, + expectErrMsg: "client not found", + }, + { + name: "success", + msg: &types.QueryLatestHeaderRequest{ + ChainId: 56, + }, + setup: func() { + suite.CreateClient(56, "Binance Smart Chain", *headers[0]) + }, + expect: headers[0], + }, + { + name: "success(upload multiple headers)", + msg: &types.QueryLatestHeaderRequest{ + ChainId: 56, + }, + setup: func() { + suite.CreateClient(56, "Binance Smart Chain", *headers[0]) + suite.UploadHeaders(56, []types.TinyHeader{*headers[1]}) + }, + expect: headers[1], + }, + + } + for _, tc := range testCases { + suite.Run(tc.name, func() { + suite.SetupTest() + tc.setup() + res, err := suite.queryClient.LatestHeader(suite.ctx, tc.msg) + if tc.expectErr { + suite.Require().Error(err) + suite.Require().Contains(err.Error(), tc.expectErrMsg) + } else { + suite.Require().NoError(err) + suite.Require().Equal(tc.expect, res.Header) + } + }) + } +} diff --git a/x/ccev/testutil/test_data.go b/x/ccev/testutil/test_data.go index a9bc293..c25f859 100644 --- a/x/ccev/testutil/test_data.go +++ b/x/ccev/testutil/test_data.go @@ -13,54 +13,54 @@ import ( var testHeaders = `[ { - "hash": "5pzSSKjPxobzBo8qT8/NTMkSR0DQQla6dVQiyqvOnGo=", + "hash": "0xe69cd248a8cfc686f3068f2a4fcfcd4cc9124740d04256ba755422caabce9c6a", "number": 42768115, - "receipt_root": "oVj2iQpuYg8+ljmso1u1i30v5nmoUlFHDkfuyDaNPjA=" + "receipt_root": "0xa158f6890a6e620f3e9639aca35bb58b7d2fe679a85251470e47eec8368d3e30" }, { - "hash": "hrYymksY4TjTZRlpSBN0GQta8po7gfsycIKbcASY2d4=", + "hash": "0x86b6329a4b18e138d3651969481374190b5af29a3b81fb3270829b700498d9de", "number": 42768116, - "receipt_root": "fJ+698rHJSO4J1h5H/bacUU18rXb/Yjq9f1X4YPPF7Q=" + "receipt_root": "0x7c9fbaf7cac72523b82758791ff6da714535f2b5dbfd88eaf5fd57e183cf17b4" }, { - "hash": "U/mYpWMaVqz/2izhMV/kbJXZt6RH7aq92myHgc0N65A=", + "hash": "0x53f998a5631a56acffda2ce1315fe46c95d9b7a447edaabdda6c8781cd0deb90", "number": 42768117, - "receipt_root": "ssyoH5lRvQD/61OFYpgG0MGr3B2cdz+h6llMi0AKGJk=" + "receipt_root": "0xb2cca81f9951bd00ffeb5385629806d0c1abdc1d9c773fa1ea594c8b400a1899" }, { - "hash": "/tffHEYRQNF7S07ZQqJMFPMls1TYuVup7y2wXK1JNXQ=", + "hash": "0xfed7df1c461140d17b4b4ed942a24c14f325b354d8b95ba9ef2db05cad493574", "number": 42768118, - "receipt_root": "eQEl5Rt87fpbS8/epeYjqlj22TiGzvMJ+k/GBA+3lps=" + "receipt_root": "0x790125e51b7cedfa5b4bcfdea5e623aa58f6d93886cef309fa4fc6040fb7969b" }, { - "hash": "mRmD8fUj+wLdgmjChs9NU4CING9IrQNI47lXajutYSU=", + "hash": "0x991983f1f523fb02dd8268c286cf4d538088346f48ad0348e3b9576a3bad6125", "number": 42768119, - "receipt_root": "oLjRQ8UPcH4Itw3DoJVvSZTJcHsesNTTI4cTjn30PUg=" + "receipt_root": "0xa0b8d143c50f707e08b70dc3a0956f4994c9707b1eb0d4d32387138e7df43d48" }, { - "hash": "oVNGVaqjKSwk3SFXDPKSCsQUFOT5x4TvLjkVGNcv0cY=", + "hash": "0xa1534655aaa3292c24dd21570cf2920ac41414e4f9c784ef2e391518d72fd1c6", "number": 42768120, - "receipt_root": "HOelxLHsQ8H/u7AWhRkbojcSKVK48QUOV119D0+XQ98=" + "receipt_root": "0x1ce7a5c4b1ec43c1ffbbb01685191ba237122952b8f1050e575d7d0f4f9743df" }, { - "hash": "vev78tC4b4tzzDHiEeR8w4nyEi4zjFBIQI74AVIpwyE=", + "hash": "0xbdebfbf2d0b86f8b73cc31e211e47cc389f2122e338c5048408ef8015229c321", "number": 42768121, - "receipt_root": "R1pe5mrbeNQHFagpCFoSihdSNeGvoZpXGvkFIT+\nMD1g=" + "receipt_root": "0x475a5ee66adb78d40715a829085a128a175235e1afa19a571af905213f8c0f58" }, { - "hash": "DAsmidyvJU+ODhrSjT4skBCp7ZMHf+1SAgdMEK9VP18=", + "hash": "0x0c0b2689dcaf254f8e0e1ad28d3e2c9010a9ed93077fed5202074c10af553f5f", "number": 42768122, - "receipt_root": "qru8pflpPAVYpL0zU0xv0C82bVIy+lUr4vXlYYpjBrc=" + "receipt_root": "0xaabbbca5f9693c0558a4bd33534c6fd02f366d5232fa552be2f5e5618a6306b7" }, { - "hash": "7YIw2+1/P+TxeKWlo8Hz6eXn2qlCokjWXHB18PjIbHQ=", + "hash": "0xed8230dbed7f3fe4f178a5a5a3c1f3e9e5e7daa942a248d65c7075f0f8c86c74", "number": 42768123, - "receipt_root": "tG6vk+KUKJ075wMQcnIx8R02htdyU3uHkhwyodSOyGY=" + "receipt_root": "0xb46eaf93e294289d3be70310727231f11d3686d772537b87921c32a1d48ec866" }, { - "hash": "AapiOfFbavBdm8vyJsKTSoJ6pC7LItyN/Mfy2lIKLU8=", + "hash": "0x01aa6239f15b6af05d9bcbf226c2934a827aa42ecb22dc8dfcc7f2da520a2d4f", "number": 42768124, - "receipt_root": "D+KXfE4FSRLqG+FLROw/JHC8y2id21fkQT1/2JIOpA0=" + "receipt_root": "0x0fe2977c4e054912ea1be14b44ec3f2470bccb689ddb57e4413d7fd8920ea40d" } ]` diff --git a/x/ccev/types/key.go b/x/ccev/types/key.go index 2451195..5a90fa8 100644 --- a/x/ccev/types/key.go +++ b/x/ccev/types/key.go @@ -42,7 +42,7 @@ func KeyHeader(blockNumber uint64) []byte { // KeyHeaderHash returns the key for the header hash func KeyHeaderHash(hash string) []byte { - return append(KeyPrefixHeadHash, common.Hex2Bytes(hash)...) + return append(KeyPrefixHeadHash, common.FromHex(hash)...) } // KeyLatestHeaderNumber returns the key for the latest header number