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  }