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