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