2019-05-28 01:44:04 -07:00
|
|
|
package types
|
2018-10-03 23:42:03 -07:00
|
|
|
|
|
|
|
import (
|
2020-07-31 09:55:32 -07:00
|
|
|
"bytes"
|
2018-10-03 23:42:03 -07:00
|
|
|
"encoding/hex"
|
2018-10-05 03:42:52 -07:00
|
|
|
"math/big"
|
2018-10-03 23:42:03 -07:00
|
|
|
"testing"
|
2020-07-31 09:55:32 -07:00
|
|
|
"time"
|
2018-10-03 23:42:03 -07:00
|
|
|
|
2020-07-31 09:55:32 -07:00
|
|
|
"github.com/stretchr/testify/require"
|
2018-10-03 23:42:03 -07:00
|
|
|
"github.com/tendermint/tendermint/crypto/ed25519"
|
2018-12-10 06:27:25 -08:00
|
|
|
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
2018-10-03 23:42:03 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2019-05-28 01:44:04 -07:00
|
|
|
keysPK1 = ed25519.GenPrivKeyFromSecret([]byte{1}).PubKey()
|
|
|
|
keysPK2 = ed25519.GenPrivKeyFromSecret([]byte{2}).PubKey()
|
|
|
|
keysPK3 = ed25519.GenPrivKeyFromSecret([]byte{3}).PubKey()
|
|
|
|
keysAddr1 = keysPK1.Address()
|
|
|
|
keysAddr2 = keysPK2.Address()
|
|
|
|
keysAddr3 = keysPK3.Address()
|
2018-10-03 23:42:03 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestGetValidatorPowerRank(t *testing.T) {
|
2019-05-28 01:44:04 -07:00
|
|
|
valAddr1 := sdk.ValAddress(keysAddr1)
|
|
|
|
emptyDesc := Description{}
|
|
|
|
val1 := NewValidator(valAddr1, keysPK1, emptyDesc)
|
2019-01-02 12:29:47 -08:00
|
|
|
val1.Tokens = sdk.ZeroInt()
|
2018-10-05 03:42:52 -07:00
|
|
|
val2, val3, val4 := val1, val1, val1
|
2019-06-12 08:57:47 -07:00
|
|
|
val2.Tokens = sdk.TokensFromConsensusPower(1)
|
|
|
|
val3.Tokens = sdk.TokensFromConsensusPower(10)
|
2018-10-05 03:42:52 -07:00
|
|
|
x := new(big.Int).Exp(big.NewInt(2), big.NewInt(40), big.NewInt(0))
|
2019-06-12 08:57:47 -07:00
|
|
|
val4.Tokens = sdk.TokensFromConsensusPower(x.Int64())
|
2018-10-03 23:42:03 -07:00
|
|
|
|
|
|
|
tests := []struct {
|
2019-05-28 01:44:04 -07:00
|
|
|
validator Validator
|
2018-10-03 23:42:03 -07:00
|
|
|
wantHex string
|
|
|
|
}{
|
2018-12-10 02:49:37 -08:00
|
|
|
{val1, "2300000000000000009c288ede7df62742fc3b7d0962045a8cef0f79f6"},
|
|
|
|
{val2, "2300000000000000019c288ede7df62742fc3b7d0962045a8cef0f79f6"},
|
|
|
|
{val3, "23000000000000000a9c288ede7df62742fc3b7d0962045a8cef0f79f6"},
|
|
|
|
{val4, "2300000100000000009c288ede7df62742fc3b7d0962045a8cef0f79f6"},
|
2018-10-03 23:42:03 -07:00
|
|
|
}
|
|
|
|
for i, tt := range tests {
|
|
|
|
got := hex.EncodeToString(getValidatorPowerRank(tt.validator))
|
|
|
|
|
2020-07-31 09:55:32 -07:00
|
|
|
require.Equal(t, tt.wantHex, got, "Keys did not match on test case %d", i)
|
2018-10-03 23:42:03 -07:00
|
|
|
}
|
|
|
|
}
|
2018-10-05 03:42:52 -07:00
|
|
|
|
|
|
|
func TestGetREDByValDstIndexKey(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
delAddr sdk.AccAddress
|
|
|
|
valSrcAddr sdk.ValAddress
|
|
|
|
valDstAddr sdk.ValAddress
|
|
|
|
wantHex string
|
|
|
|
}{
|
2019-05-28 01:44:04 -07:00
|
|
|
{sdk.AccAddress(keysAddr1), sdk.ValAddress(keysAddr1), sdk.ValAddress(keysAddr1),
|
2018-10-21 15:26:58 -07:00
|
|
|
"3663d771218209d8bd03c482f69dfba57310f0860963d771218209d8bd03c482f69dfba57310f0860963d771218209d8bd03c482f69dfba57310f08609"},
|
2019-05-28 01:44:04 -07:00
|
|
|
{sdk.AccAddress(keysAddr1), sdk.ValAddress(keysAddr2), sdk.ValAddress(keysAddr3),
|
2018-10-21 15:26:58 -07:00
|
|
|
"363ab62f0d93849be495e21e3e9013a517038f45bd63d771218209d8bd03c482f69dfba57310f086095ef3b5f25c54946d4a89fc0d09d2f126614540f2"},
|
2019-05-28 01:44:04 -07:00
|
|
|
{sdk.AccAddress(keysAddr2), sdk.ValAddress(keysAddr1), sdk.ValAddress(keysAddr3),
|
2018-10-21 15:26:58 -07:00
|
|
|
"363ab62f0d93849be495e21e3e9013a517038f45bd5ef3b5f25c54946d4a89fc0d09d2f126614540f263d771218209d8bd03c482f69dfba57310f08609"},
|
2018-10-05 03:42:52 -07:00
|
|
|
}
|
|
|
|
for i, tt := range tests {
|
|
|
|
got := hex.EncodeToString(GetREDByValDstIndexKey(tt.delAddr, tt.valSrcAddr, tt.valDstAddr))
|
|
|
|
|
2020-07-31 09:55:32 -07:00
|
|
|
require.Equal(t, tt.wantHex, got, "Keys did not match on test case %d", i)
|
2018-10-05 03:42:52 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetREDByValSrcIndexKey(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
delAddr sdk.AccAddress
|
|
|
|
valSrcAddr sdk.ValAddress
|
|
|
|
valDstAddr sdk.ValAddress
|
|
|
|
wantHex string
|
|
|
|
}{
|
2019-05-28 01:44:04 -07:00
|
|
|
{sdk.AccAddress(keysAddr1), sdk.ValAddress(keysAddr1), sdk.ValAddress(keysAddr1),
|
2018-10-21 15:26:58 -07:00
|
|
|
"3563d771218209d8bd03c482f69dfba57310f0860963d771218209d8bd03c482f69dfba57310f0860963d771218209d8bd03c482f69dfba57310f08609"},
|
2019-05-28 01:44:04 -07:00
|
|
|
{sdk.AccAddress(keysAddr1), sdk.ValAddress(keysAddr2), sdk.ValAddress(keysAddr3),
|
2018-10-21 15:26:58 -07:00
|
|
|
"355ef3b5f25c54946d4a89fc0d09d2f126614540f263d771218209d8bd03c482f69dfba57310f086093ab62f0d93849be495e21e3e9013a517038f45bd"},
|
2019-05-28 01:44:04 -07:00
|
|
|
{sdk.AccAddress(keysAddr2), sdk.ValAddress(keysAddr1), sdk.ValAddress(keysAddr3),
|
2018-10-21 15:26:58 -07:00
|
|
|
"3563d771218209d8bd03c482f69dfba57310f086095ef3b5f25c54946d4a89fc0d09d2f126614540f23ab62f0d93849be495e21e3e9013a517038f45bd"},
|
2018-10-05 03:42:52 -07:00
|
|
|
}
|
|
|
|
for i, tt := range tests {
|
|
|
|
got := hex.EncodeToString(GetREDByValSrcIndexKey(tt.delAddr, tt.valSrcAddr, tt.valDstAddr))
|
|
|
|
|
2020-07-31 09:55:32 -07:00
|
|
|
require.Equal(t, tt.wantHex, got, "Keys did not match on test case %d", i)
|
2018-10-05 03:42:52 -07:00
|
|
|
}
|
|
|
|
}
|
2020-07-31 09:55:32 -07:00
|
|
|
|
|
|
|
func TestGetValidatorQueueKey(t *testing.T) {
|
|
|
|
ts := time.Now()
|
|
|
|
height := int64(1024)
|
|
|
|
|
|
|
|
bz := GetValidatorQueueKey(ts, height)
|
|
|
|
rTs, rHeight, err := ParseValidatorQueueKey(bz)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, ts.UTC(), rTs.UTC())
|
|
|
|
require.Equal(t, rHeight, height)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestTestGetValidatorQueueKeyOrder(t *testing.T) {
|
|
|
|
ts := time.Now().UTC()
|
|
|
|
height := int64(1000)
|
|
|
|
|
|
|
|
endKey := GetValidatorQueueKey(ts, height)
|
|
|
|
|
|
|
|
keyA := GetValidatorQueueKey(ts.Add(-10*time.Minute), height-10)
|
|
|
|
keyB := GetValidatorQueueKey(ts.Add(-5*time.Minute), height+50)
|
|
|
|
keyC := GetValidatorQueueKey(ts.Add(10*time.Minute), height+100)
|
|
|
|
|
|
|
|
require.Equal(t, -1, bytes.Compare(keyA, endKey)) // keyA <= endKey
|
|
|
|
require.Equal(t, -1, bytes.Compare(keyB, endKey)) // keyB <= endKey
|
|
|
|
require.Equal(t, 1, bytes.Compare(keyC, endKey)) // keyB >= endKey
|
|
|
|
}
|