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 }