github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/params/keeper_upgrade_test.go (about) 1 package params 2 3 import ( 4 "fmt" 5 "reflect" 6 "testing" 7 8 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store" 9 storetypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types" 10 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 11 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 12 "github.com/fibonacci-chain/fbc/libs/tendermint/libs/log" 13 tmdb "github.com/fibonacci-chain/fbc/libs/tm-db" 14 "github.com/fibonacci-chain/fbc/x/params/types" 15 "github.com/stretchr/testify/suite" 16 ) 17 18 type UpgradeKeeperSuite struct { 19 suite.Suite 20 ms storetypes.CommitMultiStore 21 paramsKeeper Keeper 22 } 23 24 func (suite *UpgradeKeeperSuite) SetupTest() { 25 db := tmdb.NewMemDB() 26 storeKey := sdk.NewKVStoreKey(StoreKey) 27 tstoreKey := sdk.NewTransientStoreKey(TStoreKey) 28 29 suite.ms = store.NewCommitMultiStore(tmdb.NewMemDB()) 30 suite.ms.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) 31 suite.ms.MountStoreWithDB(tstoreKey, sdk.StoreTypeTransient, db) 32 err := suite.ms.LoadLatestVersion() 33 suite.NoError(err) 34 35 suite.paramsKeeper = NewKeeper(ModuleCdc, storeKey, tstoreKey, log.NewNopLogger()) 36 } 37 38 func (suite *UpgradeKeeperSuite) Context(height int64) sdk.Context { 39 return sdk.NewContext(suite.ms, abci.Header{Height: height}, false, log.NewNopLogger()) 40 } 41 42 func TestUpgradeKeeper(t *testing.T) { 43 suite.Run(t, new(UpgradeKeeperSuite)) 44 } 45 46 func (suite *UpgradeKeeperSuite) TestUpgradeClaim() { 47 const currentHeight = 10 48 tests := []struct { 49 isClaim bool 50 isUpgradeEffective bool 51 name string 52 cb func(types.UpgradeInfo) 53 }{ 54 {true, true, "name1", nil}, 55 {true, true, "name2", func(types.UpgradeInfo) {}}, 56 {true, false, "name3", nil}, 57 {true, false, "name4", func(types.UpgradeInfo) {}}, 58 {false, true, "name5", nil}, 59 {false, false, "name6", nil}, 60 } 61 62 ctx := suite.Context(currentHeight) 63 for _, tt := range tests { 64 if tt.isUpgradeEffective { 65 info := types.UpgradeInfo{ 66 Name: tt.name, 67 EffectiveHeight: currentHeight - 1, 68 Status: types.UpgradeStatusEffective, 69 } 70 suite.NoError(suite.paramsKeeper.writeUpgradeInfo(ctx, info, false)) 71 } 72 if tt.isClaim { 73 suite.paramsKeeper.ClaimReadyForUpgrade(tt.name, tt.cb) 74 } 75 76 cb, exist := suite.paramsKeeper.queryReadyForUpgrade(tt.name) 77 suite.Equal(tt.isClaim, exist) 78 if tt.isClaim { 79 suite.Equal(reflect.ValueOf(tt.cb).Pointer(), reflect.ValueOf(cb[0]).Pointer()) 80 } 81 } 82 } 83 84 func (suite *UpgradeKeeperSuite) TestUpgradeEffective() { 85 tests := []struct { 86 isStore bool 87 effectiveHeight uint64 88 currentHeight int64 89 status types.UpgradeStatus 90 expectEffective bool 91 //expectEffectiveWithKeep bool 92 }{ 93 {true, 10, 9, types.UpgradeStatusEffective, false}, 94 {true, 10, 10, types.UpgradeStatusEffective, true}, 95 {true, 10, 11, types.UpgradeStatusEffective, true}, 96 {true, 10, 11, types.UpgradeStatusPreparing, false}, 97 {true, 10, 11, types.UpgradeStatusWaitingEffective, false}, 98 {true, 10, 9, types.UpgradeStatusPreparing, false}, 99 {true, 10, 9, types.UpgradeStatusWaitingEffective, false}, 100 {false, 10, 11, types.UpgradeStatusEffective, true}, 101 {false, 10, 10, types.UpgradeStatusEffective, true}, 102 {false, 10, 9, types.UpgradeStatusEffective, false}, 103 } 104 105 for i, tt := range tests { 106 ctx := suite.Context(tt.currentHeight) 107 108 expectInfo := types.UpgradeInfo{ 109 Name: fmt.Sprintf("name-%d", i), 110 EffectiveHeight: tt.effectiveHeight, 111 Status: tt.status, 112 Config: fmt.Sprintf("config-%d", i), 113 } 114 if tt.isStore { 115 suite.NoError(suite.paramsKeeper.writeUpgradeInfo(ctx, expectInfo, false)) 116 } 117 118 suite.Equal(tt.expectEffective, isUpgradeEffective(ctx, expectInfo)) 119 isEffective := suite.paramsKeeper.IsUpgradeEffective(ctx, expectInfo.Name) 120 info, err := suite.paramsKeeper.GetEffectiveUpgradeInfo(ctx, expectInfo.Name) 121 if tt.isStore { 122 suite.Equal(tt.expectEffective, isEffective) 123 if tt.expectEffective { 124 suite.NoError(err) 125 suite.Equal(expectInfo, info) 126 127 } 128 } else { 129 suite.Equal(false, isEffective) 130 suite.Error(err) 131 } 132 } 133 }