github.com/cosmos/cosmos-sdk@v0.50.10/client/grpc_query_test.go (about) 1 package client_test 2 3 import ( 4 "context" 5 "testing" 6 7 abci "github.com/cometbft/cometbft/abci/types" 8 cmtjson "github.com/cometbft/cometbft/libs/json" 9 dbm "github.com/cosmos/cosmos-db" 10 "github.com/stretchr/testify/suite" 11 "google.golang.org/grpc" 12 "google.golang.org/grpc/metadata" 13 14 "cosmossdk.io/depinject" 15 "cosmossdk.io/log" 16 "cosmossdk.io/math" 17 18 "github.com/cosmos/cosmos-sdk/baseapp" 19 "github.com/cosmos/cosmos-sdk/codec" 20 codectypes "github.com/cosmos/cosmos-sdk/codec/types" 21 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" 22 "github.com/cosmos/cosmos-sdk/runtime" 23 "github.com/cosmos/cosmos-sdk/testutil/sims" 24 "github.com/cosmos/cosmos-sdk/testutil/testdata" 25 sdk "github.com/cosmos/cosmos-sdk/types" 26 "github.com/cosmos/cosmos-sdk/x/auth/testutil" 27 authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" 28 bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" 29 "github.com/cosmos/cosmos-sdk/x/bank/types" 30 ) 31 32 type IntegrationTestSuite struct { 33 suite.Suite 34 35 ctx sdk.Context 36 cdc codec.Codec 37 genesisAccount *authtypes.BaseAccount 38 bankClient types.QueryClient 39 testClient testdata.QueryClient 40 genesisAccountBalance int64 41 } 42 43 func (s *IntegrationTestSuite) SetupSuite() { 44 s.T().Log("setting up integration test suite") 45 var ( 46 interfaceRegistry codectypes.InterfaceRegistry 47 bankKeeper bankkeeper.BaseKeeper 48 appBuilder *runtime.AppBuilder 49 cdc codec.Codec 50 ) 51 52 // TODO duplicated from testutils/sims/app_helpers.go 53 // need more composable startup options for simapp, this test needed a handle to the closed over genesis account 54 // to query balances 55 err := depinject.Inject( 56 depinject.Configs( 57 testutil.AppConfig, 58 depinject.Supply(log.NewNopLogger()), 59 ), 60 &interfaceRegistry, &bankKeeper, &appBuilder, &cdc) 61 s.NoError(err) 62 63 app := appBuilder.Build(dbm.NewMemDB(), nil) 64 err = app.Load(true) 65 s.NoError(err) 66 67 valSet, err := sims.CreateRandomValidatorSet() 68 s.NoError(err) 69 70 // generate genesis account 71 s.genesisAccountBalance = 100000000000000 72 senderPrivKey := secp256k1.GenPrivKey() 73 acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) 74 balance := types.Balance{ 75 Address: acc.GetAddress().String(), 76 Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(s.genesisAccountBalance))), 77 } 78 79 genesisState, err := sims.GenesisStateWithValSet(cdc, app.DefaultGenesis(), valSet, []authtypes.GenesisAccount{acc}, balance) 80 s.NoError(err) 81 82 stateBytes, err := cmtjson.MarshalIndent(genesisState, "", " ") 83 s.NoError(err) 84 85 // init chain will set the validator set and initialize the genesis accounts 86 app.InitChain(&abci.RequestInitChain{ 87 Validators: []abci.ValidatorUpdate{}, 88 ConsensusParams: sims.DefaultConsensusParams, 89 AppStateBytes: stateBytes, 90 }, 91 ) 92 93 app.FinalizeBlock(&abci.RequestFinalizeBlock{ 94 Height: app.LastBlockHeight() + 1, 95 Hash: app.LastCommitID().Hash, 96 NextValidatorsHash: valSet.Hash(), 97 }) 98 99 // end of app init 100 101 s.ctx = app.BaseApp.NewContext(false) 102 s.cdc = cdc 103 queryHelper := baseapp.NewQueryServerTestHelper(s.ctx, interfaceRegistry) 104 types.RegisterQueryServer(queryHelper, bankKeeper) 105 testdata.RegisterQueryServer(queryHelper, testdata.QueryImpl{}) 106 s.bankClient = types.NewQueryClient(queryHelper) 107 s.testClient = testdata.NewQueryClient(queryHelper) 108 s.genesisAccount = acc 109 } 110 111 func (s *IntegrationTestSuite) TearDownSuite() { 112 s.T().Log("tearing down integration test suite") 113 } 114 115 func (s *IntegrationTestSuite) TestGRPCQuery() { 116 denom := sdk.DefaultBondDenom 117 118 // gRPC query to test service should work 119 testRes, err := s.testClient.Echo(context.Background(), &testdata.EchoRequest{Message: "hello"}) 120 s.Require().NoError(err) 121 s.Require().Equal("hello", testRes.Message) 122 123 // gRPC query to bank service should work 124 var header metadata.MD 125 res, err := s.bankClient.Balance( 126 context.Background(), 127 &types.QueryBalanceRequest{Address: s.genesisAccount.GetAddress().String(), Denom: denom}, 128 grpc.Header(&header), // Also fetch grpc header 129 ) 130 s.Require().NoError(err) 131 bal := res.GetBalance() 132 s.Equal(sdk.NewCoin(denom, math.NewInt(s.genesisAccountBalance)), *bal) 133 } 134 135 func TestIntegrationTestSuite(t *testing.T) { 136 suite.Run(t, new(IntegrationTestSuite)) 137 }