github.com/Finschia/finschia-sdk@v0.49.1/x/params/types/subspace_test.go (about) 1 package types_test 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/Finschia/ostracon/libs/log" 9 "github.com/stretchr/testify/suite" 10 tmproto "github.com/tendermint/tendermint/proto/tendermint/types" 11 dbm "github.com/tendermint/tm-db" 12 13 "github.com/Finschia/finschia-sdk/codec" 14 "github.com/Finschia/finschia-sdk/simapp" 15 "github.com/Finschia/finschia-sdk/store" 16 sdk "github.com/Finschia/finschia-sdk/types" 17 "github.com/Finschia/finschia-sdk/x/params/types" 18 ) 19 20 type SubspaceTestSuite struct { 21 suite.Suite 22 23 cdc codec.BinaryCodec 24 amino *codec.LegacyAmino 25 ctx sdk.Context 26 ss types.Subspace 27 } 28 29 func (suite *SubspaceTestSuite) SetupTest() { 30 db := dbm.NewMemDB() 31 32 ms := store.NewCommitMultiStore(db) 33 ms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) 34 suite.NoError(ms.LoadLatestVersion()) 35 36 encCfg := simapp.MakeTestEncodingConfig() 37 ss := types.NewSubspace(encCfg.Marshaler, encCfg.Amino, key, tkey, "testsubspace") 38 39 suite.cdc = encCfg.Marshaler 40 suite.amino = encCfg.Amino 41 suite.ctx = sdk.NewContext(ms, tmproto.Header{}, false, log.NewNopLogger()) 42 suite.ss = ss.WithKeyTable(paramKeyTable()) 43 } 44 45 func (suite *SubspaceTestSuite) TestKeyTable() { 46 suite.Require().True(suite.ss.HasKeyTable()) 47 suite.Require().Panics(func() { 48 suite.ss.WithKeyTable(paramKeyTable()) 49 }) 50 suite.Require().NotPanics(func() { 51 ss := types.NewSubspace(suite.cdc, suite.amino, key, tkey, "testsubspace2") 52 _ = ss.WithKeyTable(paramKeyTable()) 53 }) 54 } 55 56 func (suite *SubspaceTestSuite) TestGetSet() { 57 var v time.Duration 58 t := time.Hour * 48 59 60 suite.Require().Panics(func() { 61 suite.ss.Get(suite.ctx, keyUnbondingTime, &v) 62 }) 63 suite.Require().NotEqual(t, v) 64 suite.Require().NotPanics(func() { 65 suite.ss.Set(suite.ctx, keyUnbondingTime, t) 66 }) 67 suite.Require().NotPanics(func() { 68 suite.ss.Get(suite.ctx, keyUnbondingTime, &v) 69 }) 70 suite.Require().Equal(t, v) 71 } 72 73 func (suite *SubspaceTestSuite) TestGetIfExists() { 74 var v time.Duration 75 76 suite.Require().NotPanics(func() { 77 suite.ss.GetIfExists(suite.ctx, keyUnbondingTime, &v) 78 }) 79 suite.Require().Equal(time.Duration(0), v) 80 } 81 82 func (suite *SubspaceTestSuite) TestGetRaw() { 83 t := time.Hour * 48 84 85 suite.Require().NotPanics(func() { 86 suite.ss.Set(suite.ctx, keyUnbondingTime, t) 87 }) 88 suite.Require().NotPanics(func() { 89 res := suite.ss.GetRaw(suite.ctx, keyUnbondingTime) 90 suite.Require().Equal("2231373238303030303030303030303022", fmt.Sprintf("%X", res)) 91 }) 92 } 93 94 func (suite *SubspaceTestSuite) TestHas() { 95 t := time.Hour * 48 96 97 suite.Require().False(suite.ss.Has(suite.ctx, keyUnbondingTime)) 98 suite.Require().NotPanics(func() { 99 suite.ss.Set(suite.ctx, keyUnbondingTime, t) 100 }) 101 suite.Require().True(suite.ss.Has(suite.ctx, keyUnbondingTime)) 102 } 103 104 func (suite *SubspaceTestSuite) TestUpdate() { 105 suite.Require().Panics(func() { 106 suite.ss.Update(suite.ctx, []byte("invalid_key"), nil) // nolint:errcheck 107 }) 108 109 t := time.Hour * 48 110 suite.Require().NotPanics(func() { 111 suite.ss.Set(suite.ctx, keyUnbondingTime, t) 112 }) 113 114 bad := time.Minute * 5 115 116 bz, err := suite.amino.MarshalJSON(bad) 117 suite.Require().NoError(err) 118 suite.Require().Error(suite.ss.Update(suite.ctx, keyUnbondingTime, bz)) 119 120 good := time.Hour * 360 121 bz, err = suite.amino.MarshalJSON(good) 122 suite.Require().NoError(err) 123 suite.Require().NoError(suite.ss.Update(suite.ctx, keyUnbondingTime, bz)) 124 125 var v time.Duration 126 127 suite.Require().NotPanics(func() { 128 suite.ss.Get(suite.ctx, keyUnbondingTime, &v) 129 }) 130 suite.Require().Equal(good, v) 131 } 132 133 func (suite *SubspaceTestSuite) TestGetParamSet() { 134 a := params{ 135 UnbondingTime: time.Hour * 48, 136 MaxValidators: 100, 137 BondDenom: "stake", 138 } 139 suite.Require().NotPanics(func() { 140 suite.ss.Set(suite.ctx, keyUnbondingTime, a.UnbondingTime) 141 suite.ss.Set(suite.ctx, keyMaxValidators, a.MaxValidators) 142 suite.ss.Set(suite.ctx, keyBondDenom, a.BondDenom) 143 }) 144 145 b := params{} 146 suite.Require().NotPanics(func() { 147 suite.ss.GetParamSet(suite.ctx, &b) 148 }) 149 suite.Require().Equal(a.UnbondingTime, b.UnbondingTime) 150 suite.Require().Equal(a.MaxValidators, b.MaxValidators) 151 suite.Require().Equal(a.BondDenom, b.BondDenom) 152 } 153 154 func (suite *SubspaceTestSuite) TestGetParamSetIfExists() { 155 a := params{ 156 UnbondingTime: time.Hour * 48, 157 MaxValidators: 100, 158 BondDenom: "stake", 159 } 160 suite.Require().NotPanics(func() { 161 suite.ss.Set(suite.ctx, keyUnbondingTime, a.UnbondingTime) 162 suite.ss.Set(suite.ctx, keyMaxValidators, a.MaxValidators) 163 suite.ss.Set(suite.ctx, keyBondDenom, a.BondDenom) 164 }) 165 166 b := paramsV2{} 167 suite.Require().NotPanics(func() { 168 suite.ss.GetParamSetIfExists(suite.ctx, &b) 169 }) 170 suite.Require().Equal(a.UnbondingTime, b.UnbondingTime) 171 suite.Require().Equal(a.MaxValidators, b.MaxValidators) 172 suite.Require().Equal(a.BondDenom, b.BondDenom) 173 suite.Require().Zero(b.MaxRedelegationEntries) 174 suite.Require().False(suite.ss.Has(suite.ctx, keyMaxRedelegationEntries), "key from the new param version should not yet exist") 175 } 176 177 func (suite *SubspaceTestSuite) TestSetParamSet() { 178 testCases := []struct { 179 name string 180 ps types.ParamSet 181 }{ 182 {"invalid unbonding time", ¶ms{time.Hour * 1, 100, "stake"}}, 183 {"invalid bond denom", ¶ms{time.Hour * 48, 100, ""}}, 184 } 185 186 for _, tc := range testCases { 187 suite.Run(tc.name, func() { 188 suite.Require().Panics(func() { 189 suite.ss.SetParamSet(suite.ctx, tc.ps) 190 }) 191 }) 192 } 193 194 a := params{ 195 UnbondingTime: time.Hour * 48, 196 MaxValidators: 100, 197 BondDenom: "stake", 198 } 199 suite.Require().NotPanics(func() { 200 suite.ss.SetParamSet(suite.ctx, &a) 201 }) 202 203 b := params{} 204 suite.Require().NotPanics(func() { 205 suite.ss.GetParamSet(suite.ctx, &b) 206 }) 207 suite.Require().Equal(a.UnbondingTime, b.UnbondingTime) 208 suite.Require().Equal(a.MaxValidators, b.MaxValidators) 209 suite.Require().Equal(a.BondDenom, b.BondDenom) 210 } 211 212 func (suite *SubspaceTestSuite) TestName() { 213 suite.Require().Equal("testsubspace", suite.ss.Name()) 214 } 215 216 func TestKeeperTestSuite(t *testing.T) { 217 suite.Run(t, new(SubspaceTestSuite)) 218 }