Skip to content

Pchain - Cleanup NodeID generation in UTs #2291

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 23 commits into from
Nov 16, 2023
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions ids/test_generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,15 @@ func GenerateTestShortID() ShortID {
return newShortID
}

// BuildTestShortID is an utility to build ShortID from bytes in UTs
// It must not be used in production code. In production code we should
// use ToShortID, which performs proper length checking.
func BuildTestShortID(src []byte) ShortID {
res := ShortID{}
copy(res[:], src)
return res
}

// GenerateTestNodeID returns a new ID that should only be used for testing
func GenerateTestNodeID() NodeID {
return NodeID(GenerateTestShortID())
Expand Down
2 changes: 1 addition & 1 deletion tests/e2e/static-handlers/suites.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ var _ = ginkgo.Describe("[StaticHandlers]", func() {
GenesisValidator: api.GenesisValidator{
StartTime: json.Uint64(time.Date(1997, 1, 1, 0, 0, 0, 0, time.UTC).Unix()),
EndTime: json.Uint64(time.Date(1997, 1, 30, 0, 0, 0, 0, time.UTC).Unix()),
NodeID: ids.NodeID(id),
NodeID: ids.BuildTestNodeID(id[:]),
},
RewardOwner: &api.Owner{
Threshold: 1,
Expand Down
15 changes: 12 additions & 3 deletions vms/platformvm/block/builder/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,19 @@ var (
testSubnet1 *txs.Tx
testSubnet1ControlKeys = preFundedKeys[0:3]

// Node IDs of genesis validators. Initialized in init function
genesisNodeIDs []ids.NodeID

errMissing = errors.New("missing")
)

func init() {
genesisNodeIDs = make([]ids.NodeID, len(preFundedKeys))
for i := range preFundedKeys {
genesisNodeIDs[i] = ids.GenerateTestNodeID()
}
}

type mutableSharedMemory struct {
atomic.SharedMemory
}
Expand Down Expand Up @@ -357,9 +367,8 @@ func buildGenesisTest(t *testing.T, ctx *snow.Context) []byte {
}
}

genesisValidators := make([]api.GenesisPermissionlessValidator, len(preFundedKeys))
for i, key := range preFundedKeys {
nodeID := ids.NodeID(key.PublicKey().Address())
genesisValidators := make([]api.GenesisPermissionlessValidator, len(genesisNodeIDs))
for i, nodeID := range genesisNodeIDs {
addr, err := address.FormatBech32(constants.UnitTestHRP, nodeID.Bytes())
require.NoError(err)
genesisValidators[i] = api.GenesisPermissionlessValidator{
Expand Down
15 changes: 12 additions & 3 deletions vms/platformvm/block/executor/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,19 @@ var (
genesisBlkID ids.ID
testSubnet1 *txs.Tx

// Node IDs of genesis validators. Initialized in init function
genesisNodeIDs []ids.NodeID

errMissing = errors.New("missing")
)

func init() {
genesisNodeIDs = make([]ids.NodeID, len(preFundedKeys))
for i := range preFundedKeys {
genesisNodeIDs[i] = ids.GenerateTestNodeID()
}
}

type stakerStatus uint

type staker struct {
Expand Down Expand Up @@ -399,9 +409,8 @@ func buildGenesisTest(ctx *snow.Context) []byte {
}
}

genesisValidators := make([]api.GenesisPermissionlessValidator, len(preFundedKeys))
for i, key := range preFundedKeys {
nodeID := ids.NodeID(key.PublicKey().Address())
genesisValidators := make([]api.GenesisPermissionlessValidator, len(genesisNodeIDs))
for i, nodeID := range genesisNodeIDs {
addr, err := address.FormatBech32(constants.UnitTestHRP, nodeID.Bytes())
if err != nil {
panic(err)
Expand Down
62 changes: 25 additions & 37 deletions vms/platformvm/block/executor/proposal_block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -392,57 +392,52 @@ func TestBanffProposalBlockUpdateStakers(t *testing.T) {
// Staker5: |--------------------|

// Staker0 it's here just to allow to issue a proposal block with the chosen endTime.
staker0RewardAddress := ids.ShortID{2}

// In this test multiple stakers may join and leave the staker set at the same time.
// The order in which they do it is asserted; the order may depend on the staker.TxID,
// which in turns depend on every feature of the transaction creating the staker.
// So in this test we avoid ids.GenerateTestNodeID, in favour of ids.BuildTestNodeID
// so that TxID does not depend on the order we run tests.
staker0 := staker{
nodeID: ids.NodeID(staker0RewardAddress),
rewardAddress: staker0RewardAddress,
nodeID: ids.BuildTestNodeID([]byte{0xf0}),
rewardAddress: ids.BuildTestShortID([]byte{0xf0}),
startTime: defaultGenesisTime,
endTime: time.Time{}, // actual endTime depends on specific test
}

staker1RewardAddress := ids.GenerateTestShortID()
staker1 := staker{
nodeID: ids.NodeID(staker1RewardAddress),
rewardAddress: staker1RewardAddress,
nodeID: ids.BuildTestNodeID([]byte{0xf1}),
rewardAddress: ids.BuildTestShortID([]byte{0xf1}),
startTime: defaultGenesisTime.Add(1 * time.Minute),
endTime: defaultGenesisTime.Add(10 * defaultMinStakingDuration).Add(1 * time.Minute),
}

staker2RewardAddress := ids.ShortID{1}
staker2 := staker{
nodeID: ids.NodeID(staker2RewardAddress),
rewardAddress: staker2RewardAddress,
nodeID: ids.BuildTestNodeID([]byte{0xf2}),
rewardAddress: ids.BuildTestShortID([]byte{0xf2}),
startTime: staker1.startTime.Add(1 * time.Minute),
endTime: staker1.startTime.Add(1 * time.Minute).Add(defaultMinStakingDuration),
}

staker3RewardAddress := ids.GenerateTestShortID()
staker3 := staker{
nodeID: ids.NodeID(staker3RewardAddress),
rewardAddress: staker3RewardAddress,
nodeID: ids.BuildTestNodeID([]byte{0xf3}),
rewardAddress: ids.BuildTestShortID([]byte{0xf3}),
startTime: staker2.startTime.Add(1 * time.Minute),
endTime: staker2.endTime.Add(1 * time.Minute),
}

staker3Sub := staker{
nodeID: staker3.nodeID,
rewardAddress: staker3.rewardAddress,
nodeID: ids.BuildTestNodeID([]byte{0xf3}),
rewardAddress: ids.BuildTestShortID([]byte{0xff}),
startTime: staker3.startTime.Add(1 * time.Minute),
endTime: staker3.endTime.Add(-1 * time.Minute),
}

staker4RewardAddress := ids.GenerateTestShortID()
staker4 := staker{
nodeID: ids.NodeID(staker4RewardAddress),
rewardAddress: staker4RewardAddress,
nodeID: ids.BuildTestNodeID([]byte{0xf4}),
rewardAddress: ids.BuildTestShortID([]byte{0xf4}),
startTime: staker3.startTime,
endTime: staker3.endTime,
}

staker5RewardAddress := ids.GenerateTestShortID()
staker5 := staker{
nodeID: ids.NodeID(staker5RewardAddress),
rewardAddress: staker5RewardAddress,
nodeID: ids.BuildTestNodeID([]byte{0xf5}),
rewardAddress: ids.BuildTestShortID([]byte{0xf5}),
startTime: staker2.endTime,
endTime: staker2.endTime.Add(defaultMinStakingDuration),
}
Expand Down Expand Up @@ -541,15 +536,11 @@ func TestBanffProposalBlockUpdateStakers(t *testing.T) {
},
},
{
description: "advance time to staker5 end",
description: "advance time to staker5 start",
stakers: []staker{staker1, staker2, staker3, staker4, staker5},
advanceTimeTo: []time.Time{staker1.startTime, staker2.startTime, staker3.startTime, staker5.startTime},
expectedStakers: map[ids.NodeID]stakerStatus{
staker1.nodeID: current,

// given its txID, staker2 will be
// rewarded and moved out of current stakers set
// staker2.nodeID: current,
staker3.nodeID: current,
staker4.nodeID: current,
staker5.nodeID: current,
Expand All @@ -564,7 +555,6 @@ func TestBanffProposalBlockUpdateStakers(t *testing.T) {
defer func() {
require.NoError(shutdownEnvironment(env))
}()

env.config.BanffTime = time.Time{} // activate Banff

subnetID := testSubnet1.ID()
Expand Down Expand Up @@ -721,8 +711,7 @@ func TestBanffProposalBlockRemoveSubnetValidator(t *testing.T) {
env.config.TrackedSubnets.Add(subnetID)

// Add a subnet validator to the staker set
subnetValidatorNodeID := ids.NodeID(preFundedKeys[0].PublicKey().Address())
// Starts after the corre
subnetValidatorNodeID := genesisNodeIDs[0]
subnetVdr1StartTime := defaultValidateStartTime
subnetVdr1EndTime := defaultValidateStartTime.Add(defaultMinStakingDuration)
tx, err := env.txBuilder.NewAddSubnetValidatorTx(
Expand Down Expand Up @@ -750,7 +739,7 @@ func TestBanffProposalBlockRemoveSubnetValidator(t *testing.T) {
// The above validator is now part of the staking set

// Queue a staker that joins the staker set after the above validator leaves
subnetVdr2NodeID := ids.NodeID(preFundedKeys[1].PublicKey().Address())
subnetVdr2NodeID := genesisNodeIDs[1]
tx, err = env.txBuilder.NewAddSubnetValidatorTx(
1, // Weight
uint64(subnetVdr1EndTime.Add(time.Second).Unix()), // Start time
Expand Down Expand Up @@ -862,8 +851,7 @@ func TestBanffProposalBlockTrackedSubnet(t *testing.T) {
}

// Add a subnet validator to the staker set
subnetValidatorNodeID := ids.NodeID(preFundedKeys[0].PublicKey().Address())

subnetValidatorNodeID := genesisNodeIDs[0]
subnetVdr1StartTime := defaultGenesisTime.Add(1 * time.Minute)
subnetVdr1EndTime := defaultGenesisTime.Add(10 * defaultMinStakingDuration).Add(1 * time.Minute)
tx, err := env.txBuilder.NewAddSubnetValidatorTx(
Expand Down Expand Up @@ -1145,7 +1133,7 @@ func TestBanffProposalBlockDelegatorStakers(t *testing.T) {
pendingValidatorEndTime := pendingValidatorStartTime.Add(defaultMinStakingDuration)
nodeIDKey, _ := secp256k1.NewPrivateKey()
rewardAddress := nodeIDKey.PublicKey().Address()
nodeID := ids.NodeID(rewardAddress)
nodeID := ids.BuildTestNodeID(rewardAddress[:])

_, err := addPendingValidator(
env,
Expand Down
41 changes: 22 additions & 19 deletions vms/platformvm/block/executor/standard_block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -363,39 +363,45 @@ func TestBanffStandardBlockUpdateStakers(t *testing.T) {
// Staker3sub: |----------------|
// Staker4: |------------------------|
// Staker5: |--------------------|

// In this test multiple stakers may join and leave the staker set at the same time.
// The order in which they do it is asserted; the order may depend on the staker.TxID,
// which in turns depend on every feature of the transaction creating the staker.
// So in this test we avoid ids.GenerateTestNodeID, in favour of ids.BuildTestNodeID
// so that TxID does not depend on the order we run tests.
staker1 := staker{
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
nodeID: ids.BuildTestNodeID([]byte{0xf1}),
rewardAddress: ids.BuildTestShortID([]byte{0xf1}),
startTime: defaultGenesisTime.Add(1 * time.Minute),
endTime: defaultGenesisTime.Add(10 * defaultMinStakingDuration).Add(1 * time.Minute),
}
staker2 := staker{
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
nodeID: ids.BuildTestNodeID([]byte{0xf2}),
rewardAddress: ids.BuildTestShortID([]byte{0xf2}),
startTime: staker1.startTime.Add(1 * time.Minute),
endTime: staker1.startTime.Add(1 * time.Minute).Add(defaultMinStakingDuration),
}
staker3 := staker{
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
nodeID: ids.BuildTestNodeID([]byte{0xf3}),
rewardAddress: ids.BuildTestShortID([]byte{0xf3}),
startTime: staker2.startTime.Add(1 * time.Minute),
endTime: staker2.endTime.Add(1 * time.Minute),
}
staker3Sub := staker{
nodeID: staker3.nodeID,
rewardAddress: ids.GenerateTestShortID(),
nodeID: ids.BuildTestNodeID([]byte{0xf3}),
rewardAddress: ids.BuildTestShortID([]byte{0xff}),
startTime: staker3.startTime.Add(1 * time.Minute),
endTime: staker3.endTime.Add(-1 * time.Minute),
}
staker4 := staker{
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
nodeID: ids.BuildTestNodeID([]byte{0xf4}),
rewardAddress: ids.BuildTestShortID([]byte{0xf4}),
startTime: staker3.startTime,
endTime: staker3.endTime,
}
staker5 := staker{
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
nodeID: ids.BuildTestNodeID([]byte{0xf5}),
rewardAddress: ids.BuildTestShortID([]byte{0xf5}),
startTime: staker2.endTime,
endTime: staker2.endTime.Add(defaultMinStakingDuration),
}
Expand Down Expand Up @@ -474,12 +480,11 @@ func TestBanffStandardBlockUpdateStakers(t *testing.T) {
},
},
{
description: "advance time to staker5 end",
description: "advance time to staker5 start",
stakers: []staker{staker1, staker2, staker3, staker4, staker5},
advanceTimeTo: []time.Time{staker1.startTime, staker2.startTime, staker3.startTime, staker5.startTime},
expectedStakers: map[ids.NodeID]stakerStatus{
staker1.nodeID: current,
staker2.nodeID: current,
staker3.nodeID: current,
staker4.nodeID: current,
staker5.nodeID: current,
Expand Down Expand Up @@ -602,8 +607,7 @@ func TestBanffStandardBlockRemoveSubnetValidator(t *testing.T) {
env.config.TrackedSubnets.Add(subnetID)

// Add a subnet validator to the staker set
subnetValidatorNodeID := ids.NodeID(preFundedKeys[0].PublicKey().Address())
// Starts after the corre
subnetValidatorNodeID := genesisNodeIDs[0]
subnetVdr1StartTime := defaultValidateStartTime
subnetVdr1EndTime := defaultValidateStartTime.Add(defaultMinStakingDuration)
tx, err := env.txBuilder.NewAddSubnetValidatorTx(
Expand Down Expand Up @@ -631,7 +635,7 @@ func TestBanffStandardBlockRemoveSubnetValidator(t *testing.T) {
// The above validator is now part of the staking set

// Queue a staker that joins the staker set after the above validator leaves
subnetVdr2NodeID := ids.NodeID(preFundedKeys[1].PublicKey().Address())
subnetVdr2NodeID := genesisNodeIDs[1]
tx, err = env.txBuilder.NewAddSubnetValidatorTx(
1, // Weight
uint64(subnetVdr1EndTime.Add(time.Second).Unix()), // Start time
Expand Down Expand Up @@ -702,8 +706,7 @@ func TestBanffStandardBlockTrackedSubnet(t *testing.T) {
}

// Add a subnet validator to the staker set
subnetValidatorNodeID := ids.NodeID(preFundedKeys[0].PublicKey().Address())

subnetValidatorNodeID := genesisNodeIDs[0]
subnetVdr1StartTime := defaultGenesisTime.Add(1 * time.Minute)
subnetVdr1EndTime := defaultGenesisTime.Add(10 * defaultMinStakingDuration).Add(1 * time.Minute)
tx, err := env.txBuilder.NewAddSubnetValidatorTx(
Expand Down
4 changes: 2 additions & 2 deletions vms/platformvm/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ func TestGetStake(t *testing.T) {

// Add a delegator
stakeAmount := service.vm.MinDelegatorStake + 12345
delegatorNodeID := ids.NodeID(keys[0].PublicKey().Address())
delegatorNodeID := genesisNodeIDs[0]
delegatorEndTime := uint64(defaultGenesisTime.Add(defaultMinStakingDuration).Unix())
tx, err := service.vm.txBuilder.NewAddDelegatorTx(
stakeAmount,
Expand Down Expand Up @@ -626,7 +626,7 @@ func TestGetCurrentValidators(t *testing.T) {

// Add a delegator
stakeAmount := service.vm.MinDelegatorStake + 12345
validatorNodeID := ids.NodeID(keys[1].PublicKey().Address())
validatorNodeID := genesisNodeIDs[1]
delegatorStartTime := uint64(defaultValidateStartTime.Unix())
delegatorEndTime := uint64(defaultValidateStartTime.Add(defaultMinStakingDuration).Unix())

Expand Down
Loading