mirror of https://github.com/poanetwork/gecko.git
250 lines
6.4 KiB
Go
250 lines
6.4 KiB
Go
// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package platformvm
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/ava-labs/gecko/ids"
|
|
)
|
|
|
|
func TestTxHeapStart(t *testing.T) {
|
|
vm := defaultVM()
|
|
txHeap := EventHeap{SortByStartTime: true}
|
|
|
|
validator0, err := vm.newAddDefaultSubnetValidatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
1, // startTime
|
|
3, // endTime
|
|
ids.NewShortID([20]byte{1}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // shares
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
validator1, err := vm.newAddDefaultSubnetValidatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
1, // startTime
|
|
3, // endTime
|
|
ids.NewShortID([20]byte{}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // shares
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
validator2, err := vm.newAddDefaultSubnetValidatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
2, // startTime
|
|
4, // endTime
|
|
ids.NewShortID([20]byte{}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // shares
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
txHeap.Add(validator2)
|
|
if timestamp := txHeap.Timestamp(); !timestamp.Equal(validator2.StartTime()) {
|
|
t.Fatalf("TxHeap.Timestamp returned %s, expected %s", timestamp, validator2.StartTime())
|
|
}
|
|
|
|
txHeap.Add(validator1)
|
|
if timestamp := txHeap.Timestamp(); !timestamp.Equal(validator1.StartTime()) {
|
|
t.Fatalf("TxHeap.Timestamp returned %s, expected %s", timestamp, validator1.StartTime())
|
|
}
|
|
|
|
txHeap.Add(validator0)
|
|
if timestamp := txHeap.Timestamp(); !timestamp.Equal(validator0.StartTime()) {
|
|
t.Fatalf("TxHeap.Timestamp returned %s, expected %s", timestamp, validator0.StartTime())
|
|
} else if top := txHeap.Peek(); !top.ID().Equals(validator0.ID()) {
|
|
t.Fatalf("TxHeap prioritized %s, expected %s", top.ID(), validator0.ID())
|
|
}
|
|
}
|
|
|
|
func TestTxHeapStop(t *testing.T) {
|
|
vm := defaultVM()
|
|
txHeap := EventHeap{}
|
|
|
|
validator0, err := vm.newAddDefaultSubnetValidatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
1, // startTime
|
|
3, // endTime
|
|
ids.NewShortID([20]byte{1}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // shares
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
validator1, err := vm.newAddDefaultSubnetValidatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
1, // startTime
|
|
3, // endTime
|
|
ids.NewShortID([20]byte{}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // shares
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
validator2, err := vm.newAddDefaultSubnetValidatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
2, // startTime
|
|
4, // endTime
|
|
ids.NewShortID([20]byte{}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // shares
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
txHeap.Add(validator2)
|
|
if timestamp := txHeap.Timestamp(); !timestamp.Equal(validator2.EndTime()) {
|
|
t.Fatalf("TxHeap.Timestamp returned %s, expected %s", timestamp, validator2.EndTime())
|
|
}
|
|
|
|
txHeap.Add(validator1)
|
|
if timestamp := txHeap.Timestamp(); !timestamp.Equal(validator1.EndTime()) {
|
|
t.Fatalf("TxHeap.Timestamp returned %s, expected %s", timestamp, validator1.EndTime())
|
|
}
|
|
|
|
txHeap.Add(validator0)
|
|
if timestamp := txHeap.Timestamp(); !timestamp.Equal(validator0.EndTime()) {
|
|
t.Fatalf("TxHeap.Timestamp returned %s, expected %s", timestamp, validator0.EndTime())
|
|
} else if top := txHeap.Txs[0]; !top.ID().Equals(validator0.ID()) {
|
|
t.Fatalf("TxHeap prioritized %s, expected %s", top.ID(), validator0.ID())
|
|
}
|
|
}
|
|
|
|
func TestTxHeapStartValidatorVsDelegatorOrdering(t *testing.T) {
|
|
vm := defaultVM()
|
|
txHeap := EventHeap{SortByStartTime: true}
|
|
|
|
validator, err := vm.newAddDefaultSubnetValidatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
1, // startTime
|
|
3, // endTime
|
|
ids.NewShortID([20]byte{}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // shares
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
delegator, err := vm.newAddDefaultSubnetDelegatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
1, // startTime
|
|
3, // endTime
|
|
ids.NewShortID([20]byte{}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
txHeap.Add(validator)
|
|
txHeap.Add(delegator)
|
|
|
|
if top := txHeap.Txs[0]; !top.ID().Equals(validator.ID()) {
|
|
t.Fatalf("TxHeap prioritized %s, expected %s", top.ID(), validator.ID())
|
|
}
|
|
}
|
|
|
|
func TestTxHeapStopValidatorVsDelegatorOrdering(t *testing.T) {
|
|
vm := defaultVM()
|
|
txHeap := EventHeap{}
|
|
|
|
validator, err := vm.newAddDefaultSubnetValidatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
1, // startTime
|
|
3, // endTime
|
|
ids.NewShortID([20]byte{}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // shares
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
delegator, err := vm.newAddDefaultSubnetDelegatorTx(
|
|
5, // nonce
|
|
123, // stake amount
|
|
1, // startTime
|
|
3, // endTime
|
|
ids.NewShortID([20]byte{}), // node ID
|
|
ids.NewShortID([20]byte{1, 2, 3, 4, 5, 6, 7}), // destination
|
|
0, // network ID
|
|
keys[0], // key
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
txHeap.Add(validator)
|
|
txHeap.Add(delegator)
|
|
|
|
if top := txHeap.Txs[0]; !top.ID().Equals(delegator.ID()) {
|
|
t.Fatalf("TxHeap prioritized %s, expected %s", top.ID(), delegator.ID())
|
|
}
|
|
}
|
|
|
|
// Ensure *AddValidatorTxHeap are marshaled/unmarshaled correctly
|
|
func TestMarshalAddValidatorTxHeap(t *testing.T) {
|
|
validators := GenesisCurrentValidators()
|
|
|
|
bytes, err := Codec.Marshal(validators)
|
|
if err != nil {
|
|
t.Fatal("err")
|
|
}
|
|
|
|
stakersUnmarshaled := EventHeap{}
|
|
if err := Codec.Unmarshal(bytes, &stakersUnmarshaled); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
for i, originalTx := range validators.Txs {
|
|
unmarshaledTx := stakersUnmarshaled.Txs[i]
|
|
unmarshaledTx.initialize(nil)
|
|
if !originalTx.ID().Equals(unmarshaledTx.ID()) {
|
|
t.Fatalf("Wrong IDs returned")
|
|
}
|
|
}
|
|
}
|