github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/staking/keeper/historical_info_test.go (about) 1 package keeper 2 3 import ( 4 "sort" 5 "testing" 6 7 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 8 9 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 10 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/types" 11 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestHistoricalInfo(t *testing.T) { 16 ctx, _, keeper, _ := CreateTestInput(t, false, 10) 17 validators := make([]types.Validator, len(addrVals)) 18 19 for i, valAddr := range addrVals { 20 validators[i] = types.NewValidator(valAddr, PKs[i], types.Description{}) 21 } 22 23 hi := types.NewHistoricalInfo(ctx.BlockHeader(), validators) 24 25 keeper.SetHistoricalInfo(ctx, 2, hi) 26 27 recv, found := keeper.GetHistoricalInfo(ctx, 2) 28 require.True(t, found, "HistoricalInfo not found after set") 29 require.Equal(t, hi, recv, "HistoricalInfo not equal") 30 require.True(t, sort.IsSorted(types.Validators(recv.ValSet)), "HistoricalInfo validators is not sorted") 31 32 keeper.DeleteHistoricalInfo(ctx, 2) 33 34 recv, found = keeper.GetHistoricalInfo(ctx, 2) 35 require.False(t, found, "HistoricalInfo found after delete") 36 require.Equal(t, types.HistoricalInfo{}, recv, "HistoricalInfo is not empty") 37 } 38 39 func TestTrackHistoricalInfo(t *testing.T) { 40 ctx, _, k, _ := CreateTestInput(t, false, 10) 41 42 // set historical entries in params to 5 43 params := types.DefaultParams() 44 params.HistoricalEntries = 5 45 k.SetParams(ctx, params) 46 47 // set historical info at 5, 4 which should be pruned 48 // and check that it has been stored 49 h4 := abci.Header{ 50 ChainID: "HelloChain", 51 Height: 4, 52 } 53 h5 := abci.Header{ 54 ChainID: "HelloChain", 55 Height: 5, 56 } 57 valSet := []types.Validator{ 58 types.NewValidator(sdk.ValAddress(Addrs[0]), PKs[0], types.Description{}), 59 types.NewValidator(sdk.ValAddress(Addrs[1]), PKs[1], types.Description{}), 60 } 61 hi4 := types.NewHistoricalInfo(h4, valSet) 62 hi5 := types.NewHistoricalInfo(h5, valSet) 63 k.SetHistoricalInfo(ctx, 4, hi4) 64 k.SetHistoricalInfo(ctx, 5, hi5) 65 recv, found := k.GetHistoricalInfo(ctx, 4) 66 require.True(t, found) 67 require.Equal(t, hi4, recv) 68 recv, found = k.GetHistoricalInfo(ctx, 5) 69 require.True(t, found) 70 require.Equal(t, hi5, recv) 71 72 // Set last validators in keeper 73 val1 := types.NewValidator(sdk.ValAddress(Addrs[2]), PKs[2], types.Description{}) 74 k.SetValidator(ctx, val1) 75 k.SetLastValidatorPower(ctx, val1.OperatorAddress, 10) 76 val2 := types.NewValidator(sdk.ValAddress(Addrs[3]), PKs[3], types.Description{}) 77 vals := []types.Validator{val1, val2} 78 sort.Sort(types.Validators(vals)) 79 k.SetValidator(ctx, val2) 80 k.SetLastValidatorPower(ctx, val2.OperatorAddress, 8) 81 82 // Set Header for BeginBlock context 83 header := abci.Header{ 84 ChainID: "HelloChain", 85 Height: 10, 86 } 87 ctx.SetBlockHeader(header) 88 89 k.TrackHistoricalInfo(ctx) 90 91 // Check HistoricalInfo at height 10 is persisted 92 expected := types.HistoricalInfo{ 93 Header: header, 94 ValSet: vals, 95 } 96 recv, found = k.GetHistoricalInfo(ctx, 10) 97 require.True(t, found, "GetHistoricalInfo failed after BeginBlock") 98 require.Equal(t, expected, recv, "GetHistoricalInfo returned eunexpected result") 99 100 // Check HistoricalInfo at height 5, 4 is pruned 101 recv, found = k.GetHistoricalInfo(ctx, 4) 102 require.False(t, found, "GetHistoricalInfo did not prune earlier height") 103 require.Equal(t, types.HistoricalInfo{}, recv, "GetHistoricalInfo at height 4 is not empty after prune") 104 recv, found = k.GetHistoricalInfo(ctx, 5) 105 require.False(t, found, "GetHistoricalInfo did not prune first prune height") 106 require.Equal(t, types.HistoricalInfo{}, recv, "GetHistoricalInfo at height 5 is not empty after prune") 107 }