Skip to content

Commit

Permalink
x/params: query gRPC service (#6585)
Browse files Browse the repository at this point in the history
* Add grpc queries in x/params

* Modify grpc query tests format

* Modify query request and revert changes in querier

* Fix protobuf lint issues
  • Loading branch information
akhilkumarpilli authored Jul 8, 2020
1 parent 3fc5a4d commit 674845c
Show file tree
Hide file tree
Showing 6 changed files with 830 additions and 0 deletions.
25 changes: 25 additions & 0 deletions proto/cosmos/params/query.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
syntax = "proto3";
package cosmos.params;

import "gogoproto/gogo.proto";
import "cosmos/params/params.proto";

option go_package = "github.com/cosmos/cosmos-sdk/x/params/types/proposal";

// Query creates service with Parameters as rpc
service Query{
// Parameters queries all params
rpc Parameters (QueryParametersRequest) returns (QueryParametersResponse) {}
}

// QueryParametersRequest is request type for the Query/Parameters RPC method
message QueryParametersRequest{
string subspace = 1;

string key = 2;
}

// QueryParametersResponse is response type for the Query/Parameters RPC method
message QueryParametersResponse{
cosmos.params.ParamChange params = 1 [(gogoproto.nullable) = false];
}
36 changes: 36 additions & 0 deletions x/params/keeper/grpc_query.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package keeper

import (
"context"

"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"

sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/x/params/types/proposal"
)

var _ proposal.QueryServer = Keeper{}

// Parameters returns subspace params
func (k Keeper) Parameters(c context.Context, req *proposal.QueryParametersRequest) (*proposal.QueryParametersResponse, error) {
if req == nil {
return nil, status.Errorf(codes.InvalidArgument, "empty request")
}

if req.Subspace == "" || req.Key == "" {
return nil, status.Errorf(codes.InvalidArgument, "invalid request")
}

ss, ok := k.GetSubspace(req.Subspace)
if !ok {
return nil, sdkerrors.Wrap(proposal.ErrUnknownSubspace, req.Subspace)
}

ctx := sdk.UnwrapSDKContext(c)
rawValue := ss.GetRaw(ctx, []byte(req.Key))
params := proposal.NewParamChange(req.Subspace, req.Key, string(rawValue))

return &proposal.QueryParametersResponse{Params: params}, nil
}
86 changes: 86 additions & 0 deletions x/params/keeper/grpc_query_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package keeper_test

import (
"fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/params/types"
"github.com/cosmos/cosmos-sdk/x/params/types/proposal"
)

func (suite *KeeperTestSuite) TestGRPCQueryParams() {
var (
req *proposal.QueryParametersRequest
expValue string
space types.Subspace
)
key := []byte("key")

testCases := []struct {
msg string
malleate func()
expPass bool
}{
{
"empty request",
func() {
req = &proposal.QueryParametersRequest{}
},
false,
},
{
"invalid request with subspace not found",
func() {
req = &proposal.QueryParametersRequest{Subspace: "test"}
},
false,
},
{
"invalid request with subspace and key not found",
func() {
req = &proposal.QueryParametersRequest{Subspace: "test", Key: "key"}
},
false,
},
{
"success",
func() {
space = suite.app.ParamsKeeper.Subspace("test").
WithKeyTable(types.NewKeyTable(types.NewParamSetPair(key, paramJSON{}, validateNoOp)))
req = &proposal.QueryParametersRequest{Subspace: "test", Key: "key"}
expValue = ""
},
true,
},
{
"update value success",
func() {
err := space.Update(suite.ctx, key, []byte(`{"param1":"10241024"}`))
suite.Require().NoError(err)
req = &proposal.QueryParametersRequest{Subspace: "test", Key: "key"}
expValue = `{"param1":"10241024"}`
},
true,
},
}

suite.SetupTest()
ctx := sdk.WrapSDKContext(suite.ctx)

for _, tc := range testCases {
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
tc.malleate()

res, err := suite.queryClient.Parameters(ctx, req)

if tc.expPass {
suite.Require().NoError(err)
suite.Require().NotNil(res)
suite.Require().Equal(expValue, res.Params.Value)
} else {
suite.Require().Error(err)
suite.Require().Nil(res)
}
})
}
}
34 changes: 34 additions & 0 deletions x/params/keeper/keeper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,46 @@ import (
"testing"

"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
abci "github.com/tendermint/tendermint/abci/types"

"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/simapp"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/params/types"
"github.com/cosmos/cosmos-sdk/x/params/types/proposal"
)

type KeeperTestSuite struct {
suite.Suite

app *simapp.SimApp
ctx sdk.Context

queryClient proposal.QueryClient
}

func (suite *KeeperTestSuite) SetupTest() {
suite.app, suite.ctx = createTestApp(true)

queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry())
proposal.RegisterQueryServer(queryHelper, suite.app.ParamsKeeper)
suite.queryClient = proposal.NewQueryClient(queryHelper)
}

func TestKeeperTestSuite(t *testing.T) {
suite.Run(t, new(KeeperTestSuite))
}

// returns context and app
func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) {
app := simapp.Setup(isCheckTx)
ctx := app.BaseApp.NewContext(isCheckTx, abci.Header{})

return app, ctx
}

func validateNoOp(_ interface{}) error { return nil }

func TestKeeper(t *testing.T) {
Expand Down
8 changes: 8 additions & 0 deletions x/params/types/proposal/proposal.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,11 @@ func ValidateChanges(changes []ParamChange) error {

return nil
}

// NewQueryParametersRequest returns the new instance of QueryParametersRequest
func NewQueryParametersRequest(ss, key string) *QueryParametersRequest {
return &QueryParametersRequest{
Subspace: ss,
Key: key,
}
}
Loading

0 comments on commit 674845c

Please sign in to comment.