github.com/cosmos/cosmos-sdk@v0.50.10/x/staking/types/keys_test.go (about)

     1  package types_test
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/hex"
     6  	math2 "math"
     7  	"math/big"
     8  	"strconv"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"cosmossdk.io/math"
    15  
    16  	"github.com/cosmos/cosmos-sdk/codec/address"
    17  	"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
    18  	sdk "github.com/cosmos/cosmos-sdk/types"
    19  	"github.com/cosmos/cosmos-sdk/x/staking/types"
    20  )
    21  
    22  var (
    23  	keysPK1   = ed25519.GenPrivKeyFromSecret([]byte{1}).PubKey()
    24  	keysPK2   = ed25519.GenPrivKeyFromSecret([]byte{2}).PubKey()
    25  	keysPK3   = ed25519.GenPrivKeyFromSecret([]byte{3}).PubKey()
    26  	keysAddr1 = keysPK1.Address()
    27  	keysAddr2 = keysPK2.Address()
    28  	keysAddr3 = keysPK3.Address()
    29  )
    30  
    31  func TestGetValidatorPowerRank(t *testing.T) {
    32  	valAddr1 := sdk.ValAddress(keysAddr1)
    33  	val1 := newValidator(t, valAddr1, keysPK1)
    34  	val1.Tokens = math.ZeroInt()
    35  	val2, val3, val4 := val1, val1, val1
    36  	val2.Tokens = sdk.TokensFromConsensusPower(1, sdk.DefaultPowerReduction)
    37  	val3.Tokens = sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)
    38  	x := new(big.Int).Exp(big.NewInt(2), big.NewInt(40), big.NewInt(0))
    39  	val4.Tokens = sdk.TokensFromConsensusPower(x.Int64(), sdk.DefaultPowerReduction)
    40  
    41  	tests := []struct {
    42  		validator types.Validator
    43  		wantHex   string
    44  	}{
    45  		{val1, "230000000000000000149c288ede7df62742fc3b7d0962045a8cef0f79f6"},
    46  		{val2, "230000000000000001149c288ede7df62742fc3b7d0962045a8cef0f79f6"},
    47  		{val3, "23000000000000000a149c288ede7df62742fc3b7d0962045a8cef0f79f6"},
    48  		{val4, "230000010000000000149c288ede7df62742fc3b7d0962045a8cef0f79f6"},
    49  	}
    50  	for i, tt := range tests {
    51  		got := hex.EncodeToString(types.GetValidatorsByPowerIndexKey(tt.validator, sdk.DefaultPowerReduction, address.NewBech32Codec("cosmosvaloper")))
    52  
    53  		require.Equal(t, tt.wantHex, got, "Keys did not match on test case %d", i)
    54  	}
    55  }
    56  
    57  func TestGetREDByValDstIndexKey(t *testing.T) {
    58  	tests := []struct {
    59  		delAddr    sdk.AccAddress
    60  		valSrcAddr sdk.ValAddress
    61  		valDstAddr sdk.ValAddress
    62  		wantHex    string
    63  	}{
    64  		{
    65  			sdk.AccAddress(keysAddr1), sdk.ValAddress(keysAddr1), sdk.ValAddress(keysAddr1),
    66  			"361463d771218209d8bd03c482f69dfba57310f086091463d771218209d8bd03c482f69dfba57310f086091463d771218209d8bd03c482f69dfba57310f08609",
    67  		},
    68  		{
    69  			sdk.AccAddress(keysAddr1), sdk.ValAddress(keysAddr2), sdk.ValAddress(keysAddr3),
    70  			"36143ab62f0d93849be495e21e3e9013a517038f45bd1463d771218209d8bd03c482f69dfba57310f08609145ef3b5f25c54946d4a89fc0d09d2f126614540f2",
    71  		},
    72  		{
    73  			sdk.AccAddress(keysAddr2), sdk.ValAddress(keysAddr1), sdk.ValAddress(keysAddr3),
    74  			"36143ab62f0d93849be495e21e3e9013a517038f45bd145ef3b5f25c54946d4a89fc0d09d2f126614540f21463d771218209d8bd03c482f69dfba57310f08609",
    75  		},
    76  	}
    77  	for i, tt := range tests {
    78  		got := hex.EncodeToString(types.GetREDByValDstIndexKey(tt.delAddr, tt.valSrcAddr, tt.valDstAddr))
    79  
    80  		require.Equal(t, tt.wantHex, got, "Keys did not match on test case %d", i)
    81  	}
    82  }
    83  
    84  func TestGetREDByValSrcIndexKey(t *testing.T) {
    85  	tests := []struct {
    86  		delAddr    sdk.AccAddress
    87  		valSrcAddr sdk.ValAddress
    88  		valDstAddr sdk.ValAddress
    89  		wantHex    string
    90  	}{
    91  		{
    92  			sdk.AccAddress(keysAddr1), sdk.ValAddress(keysAddr1), sdk.ValAddress(keysAddr1),
    93  			"351463d771218209d8bd03c482f69dfba57310f086091463d771218209d8bd03c482f69dfba57310f086091463d771218209d8bd03c482f69dfba57310f08609",
    94  		},
    95  		{
    96  			sdk.AccAddress(keysAddr1), sdk.ValAddress(keysAddr2), sdk.ValAddress(keysAddr3),
    97  			"35145ef3b5f25c54946d4a89fc0d09d2f126614540f21463d771218209d8bd03c482f69dfba57310f08609143ab62f0d93849be495e21e3e9013a517038f45bd",
    98  		},
    99  		{
   100  			sdk.AccAddress(keysAddr2), sdk.ValAddress(keysAddr1), sdk.ValAddress(keysAddr3),
   101  			"351463d771218209d8bd03c482f69dfba57310f08609145ef3b5f25c54946d4a89fc0d09d2f126614540f2143ab62f0d93849be495e21e3e9013a517038f45bd",
   102  		},
   103  	}
   104  	for i, tt := range tests {
   105  		got := hex.EncodeToString(types.GetREDByValSrcIndexKey(tt.delAddr, tt.valSrcAddr, tt.valDstAddr))
   106  
   107  		require.Equal(t, tt.wantHex, got, "Keys did not match on test case %d", i)
   108  	}
   109  }
   110  
   111  func TestGetValidatorQueueKey(t *testing.T) {
   112  	ts := time.Now()
   113  	height := int64(1024)
   114  
   115  	bz := types.GetValidatorQueueKey(ts, height)
   116  	rTs, rHeight, err := types.ParseValidatorQueueKey(bz)
   117  	require.NoError(t, err)
   118  	require.Equal(t, ts.UTC(), rTs.UTC())
   119  	require.Equal(t, rHeight, height)
   120  }
   121  
   122  func TestTestGetValidatorQueueKeyOrder(t *testing.T) {
   123  	ts := time.Now().UTC()
   124  	height := int64(1000)
   125  
   126  	endKey := types.GetValidatorQueueKey(ts, height)
   127  
   128  	keyA := types.GetValidatorQueueKey(ts.Add(-10*time.Minute), height-10)
   129  	keyB := types.GetValidatorQueueKey(ts.Add(-5*time.Minute), height+50)
   130  	keyC := types.GetValidatorQueueKey(ts.Add(10*time.Minute), height+100)
   131  
   132  	require.Equal(t, -1, bytes.Compare(keyA, endKey)) // keyA <= endKey
   133  	require.Equal(t, -1, bytes.Compare(keyB, endKey)) // keyB <= endKey
   134  	require.Equal(t, 1, bytes.Compare(keyC, endKey))  // keyB >= endKey
   135  }
   136  
   137  func TestGetHistoricalInfoKey(t *testing.T) {
   138  	tests := []struct {
   139  		height int64
   140  		want   []byte
   141  	}{
   142  		{0, append(types.HistoricalInfoKey, []byte{0, 0, 0, 0, 0, 0, 0, 0}...)},
   143  		{1, append(types.HistoricalInfoKey, []byte{0, 0, 0, 0, 0, 0, 0, 1}...)},
   144  		{2, append(types.HistoricalInfoKey, []byte{0, 0, 0, 0, 0, 0, 0, 2}...)},
   145  		{514, append(types.HistoricalInfoKey, []byte{0, 0, 0, 0, 0, 0, 2, 2}...)},
   146  		{math2.MaxInt64, append(types.HistoricalInfoKey, []byte{127, 255, 255, 255, 255, 255, 255, 255}...)},
   147  	}
   148  	for _, tt := range tests {
   149  		t.Run(strconv.FormatInt(tt.height, 10), func(t *testing.T) {
   150  			require.Equal(t, tt.want, types.GetHistoricalInfoKey(tt.height))
   151  		})
   152  	}
   153  }