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  }