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 }