mirror of https://github.com/poanetwork/gecko.git
Add test to ensure IssueTx maintains ordering of unissued events heap
This commit is contained in:
parent
e15c1bad8c
commit
26f5503a43
|
@ -1290,7 +1290,7 @@ func (service *Service) IssueTx(_ *http.Request, args *IssueTxArgs, response *Is
|
||||||
service.vm.unissuedAtomicTxs = append(service.vm.unissuedAtomicTxs, tx)
|
service.vm.unissuedAtomicTxs = append(service.vm.unissuedAtomicTxs, tx)
|
||||||
response.TxID = tx.ID()
|
response.TxID = tx.ID()
|
||||||
default:
|
default:
|
||||||
return errors.New("Could not parse given tx. Must be a TimedTx, DecisionTx, or AtomicTx")
|
return errors.New("Could not parse given tx. Must not be a TimedTx, DecisionTx, or AtomicTx")
|
||||||
}
|
}
|
||||||
|
|
||||||
service.vm.resetTimer()
|
service.vm.resetTimer()
|
||||||
|
|
|
@ -6,6 +6,9 @@ package platformvm
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/ava-labs/gecko/utils/formatting"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAddDefaultSubnetValidator(t *testing.T) {
|
func TestAddDefaultSubnetValidator(t *testing.T) {
|
||||||
|
@ -50,3 +53,184 @@ func TestImportKey(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIssueTxKeepsTimedEventsSorted(t *testing.T) {
|
||||||
|
vm := defaultVM()
|
||||||
|
vm.Ctx.Lock.Lock()
|
||||||
|
defer func() {
|
||||||
|
vm.Shutdown()
|
||||||
|
vm.Ctx.Lock.Unlock()
|
||||||
|
}()
|
||||||
|
|
||||||
|
service := Service{vm: vm}
|
||||||
|
|
||||||
|
pendingValidatorStartTime1 := defaultGenesisTime.Add(3 * time.Second)
|
||||||
|
pendingValidatorEndTime1 := pendingValidatorStartTime1.Add(MinimumStakingDuration)
|
||||||
|
nodeIDKey1, _ := vm.factory.NewPrivateKey()
|
||||||
|
nodeID1 := nodeIDKey1.PublicKey().Address()
|
||||||
|
addPendingValidatorTx1, err := vm.newAddDefaultSubnetValidatorTx(
|
||||||
|
defaultNonce+1,
|
||||||
|
defaultStakeAmount,
|
||||||
|
uint64(pendingValidatorStartTime1.Unix()),
|
||||||
|
uint64(pendingValidatorEndTime1.Unix()),
|
||||||
|
nodeID1,
|
||||||
|
nodeID1,
|
||||||
|
NumberOfShares,
|
||||||
|
testNetworkID,
|
||||||
|
defaultKey,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
txBytes1, err := Codec.Marshal(genericTx{Tx: addPendingValidatorTx1})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
args1 := &IssueTxArgs{}
|
||||||
|
args1.Tx = formatting.CB58{Bytes: txBytes1}
|
||||||
|
reply1 := IssueTxResponse{}
|
||||||
|
|
||||||
|
err = service.IssueTx(nil, args1, &reply1)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingValidatorStartTime2 := defaultGenesisTime.Add(2 * time.Second)
|
||||||
|
pendingValidatorEndTime2 := pendingValidatorStartTime2.Add(MinimumStakingDuration)
|
||||||
|
nodeIDKey2, _ := vm.factory.NewPrivateKey()
|
||||||
|
nodeID2 := nodeIDKey2.PublicKey().Address()
|
||||||
|
addPendingValidatorTx2, err := vm.newAddDefaultSubnetValidatorTx(
|
||||||
|
defaultNonce+1,
|
||||||
|
defaultStakeAmount,
|
||||||
|
uint64(pendingValidatorStartTime2.Unix()),
|
||||||
|
uint64(pendingValidatorEndTime2.Unix()),
|
||||||
|
nodeID2,
|
||||||
|
nodeID2,
|
||||||
|
NumberOfShares,
|
||||||
|
testNetworkID,
|
||||||
|
defaultKey,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
txBytes2, err := Codec.Marshal(genericTx{Tx: addPendingValidatorTx2})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
args2 := IssueTxArgs{Tx: formatting.CB58{Bytes: txBytes2}}
|
||||||
|
reply2 := IssueTxResponse{}
|
||||||
|
|
||||||
|
err = service.IssueTx(nil, &args2, &reply2)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingValidatorStartTime3 := defaultGenesisTime.Add(10 * time.Second)
|
||||||
|
pendingValidatorEndTime3 := pendingValidatorStartTime3.Add(MinimumStakingDuration)
|
||||||
|
nodeIDKey3, _ := vm.factory.NewPrivateKey()
|
||||||
|
nodeID3 := nodeIDKey3.PublicKey().Address()
|
||||||
|
addPendingValidatorTx3, err := vm.newAddDefaultSubnetValidatorTx(
|
||||||
|
defaultNonce+1,
|
||||||
|
defaultStakeAmount,
|
||||||
|
uint64(pendingValidatorStartTime3.Unix()),
|
||||||
|
uint64(pendingValidatorEndTime3.Unix()),
|
||||||
|
nodeID3,
|
||||||
|
nodeID3,
|
||||||
|
NumberOfShares,
|
||||||
|
testNetworkID,
|
||||||
|
defaultKey,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
txBytes3, err := Codec.Marshal(genericTx{Tx: addPendingValidatorTx3})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
args3 := IssueTxArgs{Tx: formatting.CB58{Bytes: txBytes3}}
|
||||||
|
reply3 := IssueTxResponse{}
|
||||||
|
|
||||||
|
err = service.IssueTx(nil, &args3, &reply3)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingValidatorStartTime4 := defaultGenesisTime.Add(1 * time.Second)
|
||||||
|
pendingValidatorEndTime4 := pendingValidatorStartTime4.Add(MinimumStakingDuration)
|
||||||
|
nodeIDKey4, _ := vm.factory.NewPrivateKey()
|
||||||
|
nodeID4 := nodeIDKey4.PublicKey().Address()
|
||||||
|
addPendingValidatorTx4, err := vm.newAddDefaultSubnetValidatorTx(
|
||||||
|
defaultNonce+1,
|
||||||
|
defaultStakeAmount,
|
||||||
|
uint64(pendingValidatorStartTime4.Unix()),
|
||||||
|
uint64(pendingValidatorEndTime4.Unix()),
|
||||||
|
nodeID4,
|
||||||
|
nodeID4,
|
||||||
|
NumberOfShares,
|
||||||
|
testNetworkID,
|
||||||
|
defaultKey,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
txBytes4, err := Codec.Marshal(genericTx{Tx: addPendingValidatorTx4})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
args4 := IssueTxArgs{Tx: formatting.CB58{Bytes: txBytes4}}
|
||||||
|
reply4 := IssueTxResponse{}
|
||||||
|
|
||||||
|
err = service.IssueTx(nil, &args4, &reply4)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingValidatorStartTime5 := defaultGenesisTime.Add(50 * time.Second)
|
||||||
|
pendingValidatorEndTime5 := pendingValidatorStartTime5.Add(MinimumStakingDuration)
|
||||||
|
nodeIDKey5, _ := vm.factory.NewPrivateKey()
|
||||||
|
nodeID5 := nodeIDKey5.PublicKey().Address()
|
||||||
|
addPendingValidatorTx5, err := vm.newAddDefaultSubnetValidatorTx(
|
||||||
|
defaultNonce+1,
|
||||||
|
defaultStakeAmount,
|
||||||
|
uint64(pendingValidatorStartTime5.Unix()),
|
||||||
|
uint64(pendingValidatorEndTime5.Unix()),
|
||||||
|
nodeID5,
|
||||||
|
nodeID5,
|
||||||
|
NumberOfShares,
|
||||||
|
testNetworkID,
|
||||||
|
defaultKey,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
txBytes5, err := Codec.Marshal(genericTx{Tx: addPendingValidatorTx5})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
args5 := IssueTxArgs{Tx: formatting.CB58{Bytes: txBytes5}}
|
||||||
|
reply5 := IssueTxResponse{}
|
||||||
|
|
||||||
|
err = service.IssueTx(nil, &args5, &reply5)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
currentEvent := vm.unissuedEvents.Remove()
|
||||||
|
for vm.unissuedEvents.Len() > 0 {
|
||||||
|
nextEvent := vm.unissuedEvents.Remove()
|
||||||
|
if !currentEvent.StartTime().Before(nextEvent.StartTime()) {
|
||||||
|
t.Fatal("IssueTx does not keep event heap ordered")
|
||||||
|
}
|
||||||
|
currentEvent = nextEvent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -169,8 +169,13 @@ func TestBuildGenesisReturnsSortedValidators(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
genesis := &Genesis{}
|
genesis := &Genesis{}
|
||||||
Codec.Unmarshal(reply.Bytes.Bytes, genesis)
|
if err := Codec.Unmarshal(reply.Bytes.Bytes, genesis); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
validators := genesis.Validators
|
validators := genesis.Validators
|
||||||
|
if validators.Len() == 0 {
|
||||||
|
t.Fatal("Validators should contain 3 validators")
|
||||||
|
}
|
||||||
currentValidator := validators.Remove()
|
currentValidator := validators.Remove()
|
||||||
for validators.Len() > 0 {
|
for validators.Len() > 0 {
|
||||||
nextValidator := validators.Remove()
|
nextValidator := validators.Remove()
|
||||||
|
|
|
@ -192,6 +192,8 @@ func defaultVM() *VM {
|
||||||
panic("no subnets found")
|
panic("no subnets found")
|
||||||
} // end delete
|
} // end delete
|
||||||
|
|
||||||
|
vm.registerDBTypes()
|
||||||
|
|
||||||
return vm
|
return vm
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue