From a93ed22860d0f0ad2b4375529265a8af7fb4a6f2 Mon Sep 17 00:00:00 2001 From: Tyler <48813565+technicallyty@users.noreply.github.com> Date: Wed, 26 May 2021 10:25:48 -0700 Subject: [PATCH] test: add test for unpacking interface on validator request (#9391) * test unpack on validator * *add line to docs about validator being encoded in any * add test to show how to unpack interfaces with validator object * Update docs/core/encoding.md Co-authored-by: Amaury <1293565+amaurym@users.noreply.github.com> * sort imports * Update docs/core/encoding.md Co-authored-by: Ryan Christoffersen <12519942+ryanchristo@users.noreply.github.com> Co-authored-by: technicallyty <48813565+tytech3@users.noreply.github.com> Co-authored-by: Amaury <1293565+amaurym@users.noreply.github.com> Co-authored-by: Ryan Christoffersen <12519942+ryanchristo@users.noreply.github.com> --- docs/core/encoding.md | 3 ++- server/grpc/server_test.go | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/docs/core/encoding.md b/docs/core/encoding.md index 7b6b1274ca..b5d862c35c 100644 --- a/docs/core/encoding.md +++ b/docs/core/encoding.md @@ -197,7 +197,8 @@ The above `Profile` example is a fictive example used for educational purposes. - the `sdk.Msg` interface for encoding different `Msg`s in a transaction, - the `AccountI` interface for encodinig different types of accounts (similar to the above example) in the x/auth query responses, - the `Evidencei` interface for encoding different types of evidences in the x/evidence module, -- the `AuthorizationI` interface for encoding different types of x/authz authorizations. +- the `AuthorizationI` interface for encoding different types of x/authz authorizations, +- the [`Validator`](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/x/staking/types/staking.pb.go#L306-L337) struct that contains information about a validator. A real-life example of encoding the pubkey as `Any` inside the Validator struct in x/staking is shown in the following example: diff --git a/server/grpc/server_test.go b/server/grpc/server_test.go index e3bd71fe4f..7f3c7a742c 100644 --- a/server/grpc/server_test.go +++ b/server/grpc/server_test.go @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" + "google.golang.org/grpc" "google.golang.org/grpc/metadata" rpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" @@ -20,6 +21,7 @@ import ( reflectionv1 "github.com/cosmos/cosmos-sdk/client/grpc/reflection" clienttx "github.com/cosmos/cosmos-sdk/client/tx" reflectionv2 "github.com/cosmos/cosmos-sdk/server/grpc/reflection/v2alpha1" + "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/testutil/network" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" @@ -29,11 +31,13 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx/signing" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) type IntegrationTestSuite struct { suite.Suite + app *simapp.SimApp cfg network.Config network *network.Network conn *grpc.ClientConn @@ -41,7 +45,7 @@ type IntegrationTestSuite struct { func (s *IntegrationTestSuite) SetupSuite() { s.T().Log("setting up integration test suite") - + s.app = simapp.Setup(false) s.cfg = network.DefaultConfig() s.cfg.NumValidators = 1 s.network = network.New(s.T(), s.cfg) @@ -213,6 +217,28 @@ func (s *IntegrationTestSuite) TestGRPCServerInvalidHeaderHeights() { } } +// TestGRPCUnpacker - tests the grpc endpoint for Validator and using the interface registry unpack and extract the +// ConsAddr. (ref: https://github.com/cosmos/cosmos-sdk/issues/8045) +func (s *IntegrationTestSuite) TestGRPCUnpacker() { + ir := s.app.InterfaceRegistry() + queryClient := stakingtypes.NewQueryClient(s.conn) + validator, err := queryClient.Validator(context.Background(), + &stakingtypes.QueryValidatorRequest{ValidatorAddr: s.network.Validators[0].ValAddress.String()}) + require.NoError(s.T(), err) + + // no unpacked interfaces yet, so ConsAddr will be nil + nilAddr, err := validator.Validator.GetConsAddr() + require.Error(s.T(), err) + require.Nil(s.T(), nilAddr) + + // unpack the interfaces and now ConsAddr is not nil + err = validator.Validator.UnpackInterfaces(ir) + require.NoError(s.T(), err) + addr, err := validator.Validator.GetConsAddr() + require.NotNil(s.T(), addr) + require.NoError(s.T(), err) +} + // mkTxBuilder creates a TxBuilder containing a signed tx from validator 0. func (s IntegrationTestSuite) mkTxBuilder() client.TxBuilder { val := s.network.Validators[0]