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  }