github.com/cosmos/cosmos-sdk@v0.50.10/x/consensus/keeper/keeper_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	cmtproto "github.com/cometbft/cometbft/proto/tendermint/types"
     7  	cmttypes "github.com/cometbft/cometbft/types"
     8  	"github.com/stretchr/testify/suite"
     9  
    10  	storetypes "cosmossdk.io/store/types"
    11  
    12  	"github.com/cosmos/cosmos-sdk/baseapp"
    13  	"github.com/cosmos/cosmos-sdk/runtime"
    14  	"github.com/cosmos/cosmos-sdk/testutil"
    15  	sdk "github.com/cosmos/cosmos-sdk/types"
    16  	moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
    17  	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
    18  	consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper"
    19  	"github.com/cosmos/cosmos-sdk/x/consensus/types"
    20  )
    21  
    22  type KeeperTestSuite struct {
    23  	suite.Suite
    24  	ctx                   sdk.Context
    25  	consensusParamsKeeper *consensusparamkeeper.Keeper
    26  
    27  	queryClient types.QueryClient
    28  }
    29  
    30  func (s *KeeperTestSuite) SetupTest() {
    31  	key := storetypes.NewKVStoreKey(consensusparamkeeper.StoreKey)
    32  	testCtx := testutil.DefaultContextWithDB(s.T(), key, storetypes.NewTransientStoreKey("transient_test"))
    33  	header := cmtproto.Header{Height: 5}
    34  	ctx := testCtx.Ctx.WithBlockHeader(header)
    35  	encCfg := moduletestutil.MakeTestEncodingConfig()
    36  	storeService := runtime.NewKVStoreService(key)
    37  
    38  	keeper := consensusparamkeeper.NewKeeper(encCfg.Codec, storeService, authtypes.NewModuleAddress("gov").String(), runtime.EventService{})
    39  
    40  	s.ctx = ctx
    41  	s.consensusParamsKeeper = &keeper
    42  
    43  	types.RegisterInterfaces(encCfg.InterfaceRegistry)
    44  	queryHelper := baseapp.NewQueryServerTestHelper(ctx, encCfg.InterfaceRegistry)
    45  	types.RegisterQueryServer(queryHelper, keeper)
    46  	s.queryClient = types.NewQueryClient(queryHelper)
    47  	err := s.consensusParamsKeeper.ParamsStore.Set(ctx, cmttypes.DefaultConsensusParams().ToProto())
    48  	s.Require().NoError(err)
    49  }
    50  
    51  func TestKeeperTestSuite(t *testing.T) {
    52  	suite.Run(t, new(KeeperTestSuite))
    53  }
    54  
    55  func (s *KeeperTestSuite) TestGRPCQueryConsensusParams() {
    56  	// Create ConsensusParams with modified fields
    57  	modifiedConsensusParams := cmttypes.DefaultConsensusParams().ToProto()
    58  	modifiedConsensusParams.Block.MaxBytes++
    59  	modifiedConsensusParams.Block.MaxGas = 100
    60  	modifiedConsensusParams.Evidence.MaxAgeDuration++
    61  	modifiedConsensusParams.Evidence.MaxAgeNumBlocks++
    62  	modifiedConsensusParams.Evidence.MaxBytes++
    63  	modifiedConsensusParams.Validator.PubKeyTypes = []string{cmttypes.ABCIPubKeyTypeSecp256k1}
    64  
    65  	testCases := []struct {
    66  		msg      string
    67  		req      types.QueryParamsRequest
    68  		malleate func()
    69  		response types.QueryParamsResponse
    70  		expPass  bool
    71  	}{
    72  		{
    73  			"success",
    74  			types.QueryParamsRequest{},
    75  			func() {
    76  				input := &types.MsgUpdateParams{
    77  					Authority: s.consensusParamsKeeper.GetAuthority(),
    78  					Block:     modifiedConsensusParams.Block,
    79  					Validator: modifiedConsensusParams.Validator,
    80  					Evidence:  modifiedConsensusParams.Evidence,
    81  				}
    82  				_, err := s.consensusParamsKeeper.UpdateParams(s.ctx, input)
    83  				s.Require().NoError(err)
    84  			},
    85  			types.QueryParamsResponse{
    86  				Params: &cmtproto.ConsensusParams{
    87  					Block:     modifiedConsensusParams.Block,
    88  					Validator: modifiedConsensusParams.Validator,
    89  					Evidence:  modifiedConsensusParams.Evidence,
    90  					Version:   modifiedConsensusParams.Version,
    91  					Abci: &cmtproto.ABCIParams{
    92  						VoteExtensionsEnableHeight: 0,
    93  					},
    94  				},
    95  			},
    96  			true,
    97  		},
    98  		{
    99  			"success with abci",
   100  			types.QueryParamsRequest{},
   101  			func() {
   102  				input := &types.MsgUpdateParams{
   103  					Authority: s.consensusParamsKeeper.GetAuthority(),
   104  					Block:     modifiedConsensusParams.Block,
   105  					Validator: modifiedConsensusParams.Validator,
   106  					Evidence:  modifiedConsensusParams.Evidence,
   107  					Abci: &cmtproto.ABCIParams{
   108  						VoteExtensionsEnableHeight: 1234,
   109  					},
   110  				}
   111  				_, err := s.consensusParamsKeeper.UpdateParams(s.ctx, input)
   112  				s.Require().NoError(err)
   113  			},
   114  			types.QueryParamsResponse{
   115  				Params: &cmtproto.ConsensusParams{
   116  					Block:     modifiedConsensusParams.Block,
   117  					Validator: modifiedConsensusParams.Validator,
   118  					Evidence:  modifiedConsensusParams.Evidence,
   119  					Version:   modifiedConsensusParams.Version,
   120  					Abci: &cmtproto.ABCIParams{
   121  						VoteExtensionsEnableHeight: 1234,
   122  					},
   123  				},
   124  			},
   125  			true,
   126  		},
   127  	}
   128  
   129  	for _, tc := range testCases {
   130  		s.Run(tc.msg, func() {
   131  			s.SetupTest() // reset
   132  
   133  			tc.malleate()
   134  			res, err := s.consensusParamsKeeper.Params(s.ctx, &tc.req)
   135  
   136  			if tc.expPass {
   137  				s.Require().NoError(err)
   138  				s.Require().NotNil(res)
   139  				s.Require().Equal(tc.response.Params, res.Params)
   140  			} else {
   141  				s.Require().Error(err)
   142  				s.Require().Nil(res)
   143  			}
   144  		})
   145  	}
   146  }
   147  
   148  func (s *KeeperTestSuite) TestUpdateParams() {
   149  	defaultConsensusParams := cmttypes.DefaultConsensusParams().ToProto()
   150  	testCases := []struct {
   151  		name      string
   152  		input     *types.MsgUpdateParams
   153  		expErr    bool
   154  		expErrMsg string
   155  	}{
   156  		{
   157  			name: "valid params",
   158  			input: &types.MsgUpdateParams{
   159  				Authority: s.consensusParamsKeeper.GetAuthority(),
   160  				Block:     defaultConsensusParams.Block,
   161  				Validator: defaultConsensusParams.Validator,
   162  				Evidence:  defaultConsensusParams.Evidence,
   163  			},
   164  			expErr:    false,
   165  			expErrMsg: "",
   166  		},
   167  		{
   168  			name: "invalid  params",
   169  			input: &types.MsgUpdateParams{
   170  				Authority: s.consensusParamsKeeper.GetAuthority(),
   171  				Block:     &cmtproto.BlockParams{MaxGas: -10, MaxBytes: -10},
   172  				Validator: defaultConsensusParams.Validator,
   173  				Evidence:  defaultConsensusParams.Evidence,
   174  			},
   175  			expErr:    true,
   176  			expErrMsg: "block.MaxBytes must be -1 or greater than 0. Got -10",
   177  		},
   178  		{
   179  			name: "invalid authority",
   180  			input: &types.MsgUpdateParams{
   181  				Authority: "invalid",
   182  				Block:     defaultConsensusParams.Block,
   183  				Validator: defaultConsensusParams.Validator,
   184  				Evidence:  defaultConsensusParams.Evidence,
   185  			},
   186  			expErr:    true,
   187  			expErrMsg: "invalid authority",
   188  		},
   189  		{
   190  			name: "nil evidence params",
   191  			input: &types.MsgUpdateParams{
   192  				Authority: s.consensusParamsKeeper.GetAuthority(),
   193  				Block:     defaultConsensusParams.Block,
   194  				Validator: defaultConsensusParams.Validator,
   195  				Evidence:  nil,
   196  			},
   197  			expErr:    true,
   198  			expErrMsg: "all parameters must be present",
   199  		},
   200  		{
   201  			name: "nil block params",
   202  			input: &types.MsgUpdateParams{
   203  				Authority: s.consensusParamsKeeper.GetAuthority(),
   204  				Block:     nil,
   205  				Validator: defaultConsensusParams.Validator,
   206  				Evidence:  defaultConsensusParams.Evidence,
   207  			},
   208  			expErr:    true,
   209  			expErrMsg: "all parameters must be present",
   210  		},
   211  		{
   212  			name: "nil validator params",
   213  			input: &types.MsgUpdateParams{
   214  				Authority: s.consensusParamsKeeper.GetAuthority(),
   215  				Block:     defaultConsensusParams.Block,
   216  				Validator: nil,
   217  				Evidence:  defaultConsensusParams.Evidence,
   218  			},
   219  			expErr:    true,
   220  			expErrMsg: "all parameters must be present",
   221  		},
   222  		{
   223  			name: "valid ABCI update",
   224  			input: &types.MsgUpdateParams{
   225  				Authority: s.consensusParamsKeeper.GetAuthority(),
   226  				Block:     defaultConsensusParams.Block,
   227  				Validator: defaultConsensusParams.Validator,
   228  				Evidence:  defaultConsensusParams.Evidence,
   229  				Abci: &cmtproto.ABCIParams{
   230  					VoteExtensionsEnableHeight: 1235,
   231  				},
   232  			},
   233  			expErr:    false,
   234  			expErrMsg: "",
   235  		},
   236  		{
   237  			name: "noop ABCI update",
   238  			input: &types.MsgUpdateParams{
   239  				Authority: s.consensusParamsKeeper.GetAuthority(),
   240  				Block:     defaultConsensusParams.Block,
   241  				Validator: defaultConsensusParams.Validator,
   242  				Evidence:  defaultConsensusParams.Evidence,
   243  				Abci: &cmtproto.ABCIParams{
   244  					VoteExtensionsEnableHeight: 1235,
   245  				},
   246  			},
   247  			expErr:    false,
   248  			expErrMsg: "",
   249  		},
   250  		{
   251  			name: "valid ABCI clear",
   252  			input: &types.MsgUpdateParams{
   253  				Authority: s.consensusParamsKeeper.GetAuthority(),
   254  				Block:     defaultConsensusParams.Block,
   255  				Validator: defaultConsensusParams.Validator,
   256  				Evidence:  defaultConsensusParams.Evidence,
   257  				Abci: &cmtproto.ABCIParams{
   258  					VoteExtensionsEnableHeight: 0,
   259  				},
   260  			},
   261  			expErr:    false,
   262  			expErrMsg: "",
   263  		},
   264  		{
   265  			name: "invalid ABCI update - current height",
   266  			input: &types.MsgUpdateParams{
   267  				Authority: s.consensusParamsKeeper.GetAuthority(),
   268  				Block:     defaultConsensusParams.Block,
   269  				Validator: defaultConsensusParams.Validator,
   270  				Evidence:  defaultConsensusParams.Evidence,
   271  				Abci: &cmtproto.ABCIParams{
   272  					VoteExtensionsEnableHeight: 5,
   273  				},
   274  			},
   275  			expErr:    true,
   276  			expErrMsg: "vote extensions cannot be updated to a past or current height",
   277  		},
   278  		{
   279  			name: "invalid ABCI update - past height",
   280  			input: &types.MsgUpdateParams{
   281  				Authority: s.consensusParamsKeeper.GetAuthority(),
   282  				Block:     defaultConsensusParams.Block,
   283  				Validator: defaultConsensusParams.Validator,
   284  				Evidence:  defaultConsensusParams.Evidence,
   285  				Abci: &cmtproto.ABCIParams{
   286  					VoteExtensionsEnableHeight: 4,
   287  				},
   288  			},
   289  			expErr:    true,
   290  			expErrMsg: "vote extensions cannot be updated to a past or current height",
   291  		},
   292  	}
   293  
   294  	for _, tc := range testCases {
   295  		tc := tc
   296  		s.Run(tc.name, func() {
   297  			s.SetupTest()
   298  			_, err := s.consensusParamsKeeper.UpdateParams(s.ctx, tc.input)
   299  			if tc.expErr {
   300  				s.Require().Error(err)
   301  				s.Require().Contains(err.Error(), tc.expErrMsg)
   302  			} else {
   303  				s.Require().NoError(err)
   304  
   305  				res, err := s.consensusParamsKeeper.Params(s.ctx, &types.QueryParamsRequest{})
   306  				s.Require().NoError(err)
   307  
   308  				if tc.input.Abci != nil {
   309  					s.Require().Equal(tc.input.Abci, res.Params.Abci)
   310  				}
   311  				s.Require().Equal(tc.input.Block, res.Params.Block)
   312  				s.Require().Equal(tc.input.Evidence, res.Params.Evidence)
   313  				s.Require().Equal(tc.input.Validator, res.Params.Validator)
   314  			}
   315  		})
   316  	}
   317  }