Skip to content

Commit

Permalink
[vms/platformvm] Miscellaneous testing cleanups (#2891)
Browse files Browse the repository at this point in the history
  • Loading branch information
dhrubabasu authored Mar 29, 2024
1 parent 2dbc9ba commit ce8253c
Show file tree
Hide file tree
Showing 3 changed files with 179 additions and 195 deletions.
10 changes: 3 additions & 7 deletions vms/platformvm/txs/executor/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ func newEnvironment(t *testing.T, f fork) *environment {
backend: backend,
}

addSubnet(t, env, txBuilder)
addSubnet(t, env)

t.Cleanup(func() {
env.ctx.Lock.Lock()
Expand Down Expand Up @@ -204,16 +204,12 @@ func newEnvironment(t *testing.T, f fork) *environment {
return env
}

func addSubnet(
t *testing.T,
env *environment,
txBuilder *txstest.Builder,
) {
func addSubnet(t *testing.T, env *environment) {
require := require.New(t)

// Create a subnet
var err error
testSubnet1, err = txBuilder.NewCreateSubnetTx(
testSubnet1, err = env.txBuilder.NewCreateSubnetTx(
&secp256k1fx.OutputOwners{
Threshold: 2,
Addrs: []ids.ShortID{
Expand Down
256 changes: 125 additions & 131 deletions vms/platformvm/txs/executor/proposal_tx_executor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,15 @@ func TestProposalTxExecuteAddDelegator(t *testing.T) {

// [addMinStakeValidator] adds a new validator to the primary network's
// pending validator set with the minimum staking amount
addMinStakeValidator := func(target *environment) {
tx, err := target.txBuilder.NewAddValidatorTx(
addMinStakeValidator := func(env *environment) {
require := require.New(t)

tx, err := env.txBuilder.NewAddValidatorTx(
&txs.Validator{
NodeID: newValidatorID,
Start: newValidatorStartTime,
End: newValidatorEndTime,
Wght: target.config.MinValidatorStake,
Wght: env.config.MinValidatorStake,
},
&secp256k1fx.OutputOwners{
Threshold: 1,
Expand All @@ -47,7 +49,7 @@ func TestProposalTxExecuteAddDelegator(t *testing.T) {
reward.PercentDenominator, // Shares
[]*secp256k1.PrivateKey{preFundedKeys[0]},
)
require.NoError(t, err)
require.NoError(err)

addValTx := tx.Unsigned.(*txs.AddValidatorTx)
staker, err := state.NewCurrentStaker(
Expand All @@ -56,32 +58,34 @@ func TestProposalTxExecuteAddDelegator(t *testing.T) {
addValTx.StartTime(),
0,
)
require.NoError(t, err)
require.NoError(err)

target.state.PutCurrentValidator(staker)
target.state.AddTx(tx, status.Committed)
target.state.SetHeight(dummyHeight)
require.NoError(t, target.state.Commit())
env.state.PutCurrentValidator(staker)
env.state.AddTx(tx, status.Committed)
env.state.SetHeight(dummyHeight)
require.NoError(env.state.Commit())
}

// [addMaxStakeValidator] adds a new validator to the primary network's
// pending validator set with the maximum staking amount
addMaxStakeValidator := func(target *environment) {
tx, err := target.txBuilder.NewAddValidatorTx(
addMaxStakeValidator := func(env *environment) {
require := require.New(t)

tx, err := env.txBuilder.NewAddValidatorTx(
&txs.Validator{
NodeID: newValidatorID,
Start: newValidatorStartTime,
End: newValidatorEndTime,
Wght: target.config.MaxValidatorStake,
Wght: env.config.MaxValidatorStake,
},
&secp256k1fx.OutputOwners{
Threshold: 1,
Addrs: []ids.ShortID{rewardAddress},
},
reward.PercentDenominator, // Shared
reward.PercentDenominator,
[]*secp256k1.PrivateKey{preFundedKeys[0]},
)
require.NoError(t, err)
require.NoError(err)

addValTx := tx.Unsigned.(*txs.AddValidatorTx)
staker, err := state.NewCurrentStaker(
Expand All @@ -90,160 +94,150 @@ func TestProposalTxExecuteAddDelegator(t *testing.T) {
addValTx.StartTime(),
0,
)
require.NoError(t, err)
require.NoError(err)

target.state.PutCurrentValidator(staker)
target.state.AddTx(tx, status.Committed)
target.state.SetHeight(dummyHeight)
require.NoError(t, target.state.Commit())
env.state.PutCurrentValidator(staker)
env.state.AddTx(tx, status.Committed)
env.state.SetHeight(dummyHeight)
require.NoError(env.state.Commit())
}

dummyH := newEnvironment(t, apricotPhase5)
currentTimestamp := dummyH.state.GetTimestamp()
env := newEnvironment(t, apricotPhase5)
currentTimestamp := env.state.GetTimestamp()

type test struct {
description string
stakeAmount uint64
startTime uint64
endTime uint64
nodeID ids.NodeID
rewardAddress ids.ShortID
feeKeys []*secp256k1.PrivateKey
setup func(*environment)
AP3Time time.Time
expectedErr error
description string
stakeAmount uint64
startTime uint64
endTime uint64
nodeID ids.NodeID
feeKeys []*secp256k1.PrivateKey
setup func(*environment)
AP3Time time.Time
expectedErr error
}

tests := []test{
{
description: "validator stops validating earlier than delegator",
stakeAmount: dummyH.config.MinDelegatorStake,
startTime: uint64(defaultValidateStartTime.Unix()) + 1,
endTime: uint64(defaultValidateEndTime.Unix()) + 1,
nodeID: nodeID,
rewardAddress: rewardAddress,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: nil,
AP3Time: defaultGenesisTime,
expectedErr: ErrPeriodMismatch,
description: "validator stops validating earlier than delegator",
stakeAmount: env.config.MinDelegatorStake,
startTime: uint64(defaultValidateStartTime.Unix()) + 1,
endTime: uint64(defaultValidateEndTime.Unix()) + 1,
nodeID: nodeID,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: nil,
AP3Time: defaultGenesisTime,
expectedErr: ErrPeriodMismatch,
},
{
description: "validator not in the current or pending validator sets",
stakeAmount: dummyH.config.MinDelegatorStake,
startTime: uint64(defaultValidateStartTime.Add(5 * time.Second).Unix()),
endTime: uint64(defaultValidateEndTime.Add(-5 * time.Second).Unix()),
nodeID: newValidatorID,
rewardAddress: rewardAddress,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: nil,
AP3Time: defaultGenesisTime,
expectedErr: database.ErrNotFound,
description: "validator not in the current or pending validator sets",
stakeAmount: env.config.MinDelegatorStake,
startTime: uint64(defaultValidateStartTime.Add(5 * time.Second).Unix()),
endTime: uint64(defaultValidateEndTime.Add(-5 * time.Second).Unix()),
nodeID: newValidatorID,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: nil,
AP3Time: defaultGenesisTime,
expectedErr: database.ErrNotFound,
},
{
description: "delegator starts before validator",
stakeAmount: dummyH.config.MinDelegatorStake,
startTime: newValidatorStartTime - 1, // start validating subnet before primary network
endTime: newValidatorEndTime,
nodeID: newValidatorID,
rewardAddress: rewardAddress,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMinStakeValidator,
AP3Time: defaultGenesisTime,
expectedErr: ErrPeriodMismatch,
description: "delegator starts before validator",
stakeAmount: env.config.MinDelegatorStake,
startTime: newValidatorStartTime - 1, // start validating subnet before primary network
endTime: newValidatorEndTime,
nodeID: newValidatorID,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMinStakeValidator,
AP3Time: defaultGenesisTime,
expectedErr: ErrPeriodMismatch,
},
{
description: "delegator stops before validator",
stakeAmount: dummyH.config.MinDelegatorStake,
startTime: newValidatorStartTime,
endTime: newValidatorEndTime + 1, // stop validating subnet after stopping validating primary network
nodeID: newValidatorID,
rewardAddress: rewardAddress,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMinStakeValidator,
AP3Time: defaultGenesisTime,
expectedErr: ErrPeriodMismatch,
description: "delegator stops before validator",
stakeAmount: env.config.MinDelegatorStake,
startTime: newValidatorStartTime,
endTime: newValidatorEndTime + 1, // stop validating subnet after stopping validating primary network
nodeID: newValidatorID,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMinStakeValidator,
AP3Time: defaultGenesisTime,
expectedErr: ErrPeriodMismatch,
},
{
description: "valid",
stakeAmount: dummyH.config.MinDelegatorStake,
startTime: newValidatorStartTime, // same start time as for primary network
endTime: newValidatorEndTime, // same end time as for primary network
nodeID: newValidatorID,
rewardAddress: rewardAddress,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMinStakeValidator,
AP3Time: defaultGenesisTime,
expectedErr: nil,
description: "valid",
stakeAmount: env.config.MinDelegatorStake,
startTime: newValidatorStartTime, // same start time as for primary network
endTime: newValidatorEndTime, // same end time as for primary network
nodeID: newValidatorID,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMinStakeValidator,
AP3Time: defaultGenesisTime,
expectedErr: nil,
},
{
description: "starts delegating at current timestamp",
stakeAmount: dummyH.config.MinDelegatorStake, // weight
startTime: uint64(currentTimestamp.Unix()), // start time
endTime: uint64(defaultValidateEndTime.Unix()), // end time
nodeID: nodeID, // node ID
rewardAddress: rewardAddress, // Reward Address
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]}, // tx fee payer
setup: nil,
AP3Time: defaultGenesisTime,
expectedErr: ErrTimestampNotBeforeStartTime,
description: "starts delegating at current timestamp",
stakeAmount: env.config.MinDelegatorStake,
startTime: uint64(currentTimestamp.Unix()),
endTime: uint64(defaultValidateEndTime.Unix()),
nodeID: nodeID,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: nil,
AP3Time: defaultGenesisTime,
expectedErr: ErrTimestampNotBeforeStartTime,
},
{
description: "tx fee paying key has no funds",
stakeAmount: dummyH.config.MinDelegatorStake, // weight
startTime: uint64(defaultValidateStartTime.Unix()) + 1, // start time
endTime: uint64(defaultValidateEndTime.Unix()), // end time
nodeID: nodeID, // node ID
rewardAddress: rewardAddress, // Reward Address
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[1]}, // tx fee payer
setup: func(target *environment) { // Remove all UTXOs owned by keys[1]
utxoIDs, err := target.state.UTXOIDs(
description: "tx fee paying key has no funds",
stakeAmount: env.config.MinDelegatorStake,
startTime: uint64(defaultValidateStartTime.Unix()) + 1,
endTime: uint64(defaultValidateEndTime.Unix()),
nodeID: nodeID,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[1]},
setup: func(env *environment) { // Remove all UTXOs owned by keys[1]
utxoIDs, err := env.state.UTXOIDs(
preFundedKeys[1].PublicKey().Address().Bytes(),
ids.Empty,
math.MaxInt32)
require.NoError(t, err)

for _, utxoID := range utxoIDs {
target.state.DeleteUTXO(utxoID)
env.state.DeleteUTXO(utxoID)
}
target.state.SetHeight(dummyHeight)
require.NoError(t, target.state.Commit())
env.state.SetHeight(dummyHeight)
require.NoError(t, env.state.Commit())
},
AP3Time: defaultGenesisTime,
expectedErr: ErrFlowCheckFailed,
},
{
description: "over delegation before AP3",
stakeAmount: dummyH.config.MinDelegatorStake,
startTime: newValidatorStartTime, // same start time as for primary network
endTime: newValidatorEndTime, // same end time as for primary network
nodeID: newValidatorID,
rewardAddress: rewardAddress,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMaxStakeValidator,
AP3Time: defaultValidateEndTime,
expectedErr: nil,
description: "over delegation before AP3",
stakeAmount: env.config.MinDelegatorStake,
startTime: newValidatorStartTime, // same start time as for primary network
endTime: newValidatorEndTime, // same end time as for primary network
nodeID: newValidatorID,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMaxStakeValidator,
AP3Time: defaultValidateEndTime,
expectedErr: nil,
},
{
description: "over delegation after AP3",
stakeAmount: dummyH.config.MinDelegatorStake,
startTime: newValidatorStartTime, // same start time as for primary network
endTime: newValidatorEndTime, // same end time as for primary network
nodeID: newValidatorID,
rewardAddress: rewardAddress,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMaxStakeValidator,
AP3Time: defaultGenesisTime,
expectedErr: ErrOverDelegated,
description: "over delegation after AP3",
stakeAmount: env.config.MinDelegatorStake,
startTime: newValidatorStartTime, // same start time as for primary network
endTime: newValidatorEndTime, // same end time as for primary network
nodeID: newValidatorID,
feeKeys: []*secp256k1.PrivateKey{preFundedKeys[0]},
setup: addMaxStakeValidator,
AP3Time: defaultGenesisTime,
expectedErr: ErrOverDelegated,
},
}

for _, tt := range tests {
t.Run(tt.description, func(t *testing.T) {
require := require.New(t)
freshTH := newEnvironment(t, apricotPhase5)
freshTH.config.ApricotPhase3Time = tt.AP3Time
env := newEnvironment(t, apricotPhase5)
env.config.ApricotPhase3Time = tt.AP3Time

tx, err := freshTH.txBuilder.NewAddDelegatorTx(
tx, err := env.txBuilder.NewAddDelegatorTx(
&txs.Validator{
NodeID: tt.nodeID,
Start: tt.startTime,
Expand All @@ -252,26 +246,26 @@ func TestProposalTxExecuteAddDelegator(t *testing.T) {
},
&secp256k1fx.OutputOwners{
Threshold: 1,
Addrs: []ids.ShortID{tt.rewardAddress},
Addrs: []ids.ShortID{rewardAddress},
},
tt.feeKeys,
)
require.NoError(err)

if tt.setup != nil {
tt.setup(freshTH)
tt.setup(env)
}

onCommitState, err := state.NewDiff(lastAcceptedID, freshTH)
onCommitState, err := state.NewDiff(lastAcceptedID, env)
require.NoError(err)

onAbortState, err := state.NewDiff(lastAcceptedID, freshTH)
onAbortState, err := state.NewDiff(lastAcceptedID, env)
require.NoError(err)

executor := ProposalTxExecutor{
OnCommitState: onCommitState,
OnAbortState: onAbortState,
Backend: &freshTH.backend,
Backend: &env.backend,
Tx: tx,
}
err = tx.Unsigned.Visit(&executor)
Expand Down
Loading

0 comments on commit ce8253c

Please sign in to comment.