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)
|
||||
response.TxID = tx.ID()
|
||||
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()
|
||||
|
|
|
@ -6,6 +6,9 @@ package platformvm
|
|||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/ava-labs/gecko/utils/formatting"
|
||||
)
|
||||
|
||||
func TestAddDefaultSubnetValidator(t *testing.T) {
|
||||
|
@ -50,3 +53,184 @@ func TestImportKey(t *testing.T) {
|
|||
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{}
|
||||
Codec.Unmarshal(reply.Bytes.Bytes, genesis)
|
||||
if err := Codec.Unmarshal(reply.Bytes.Bytes, genesis); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
validators := genesis.Validators
|
||||
if validators.Len() == 0 {
|
||||
t.Fatal("Validators should contain 3 validators")
|
||||
}
|
||||
currentValidator := validators.Remove()
|
||||
for validators.Len() > 0 {
|
||||
nextValidator := validators.Remove()
|
||||
|
|
|
@ -192,6 +192,8 @@ func defaultVM() *VM {
|
|||
panic("no subnets found")
|
||||
} // end delete
|
||||
|
||||
vm.registerDBTypes()
|
||||
|
||||
return vm
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue