Skip to content

Commit

Permalink
Replace iterator equality helper (#3380)
Browse files Browse the repository at this point in the history
  • Loading branch information
StephenButtolph authored Sep 10, 2024
1 parent 8974ed8 commit 6cf2941
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 38 deletions.
12 changes: 12 additions & 0 deletions utils/iterator/slice.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,18 @@ package iterator

var _ Iterator[any] = (*slice[any])(nil)

// ToSlice returns a slice that contains all of the elements from [it] in order.
// [it] will be released before returning.
func ToSlice[T any](it Iterator[T]) []T {
defer it.Release()

var elements []T
for it.Next() {
elements = append(elements, it.Value())
}
return elements
}

type slice[T any] struct {
index int
elements []T
Expand Down
11 changes: 9 additions & 2 deletions vms/platformvm/state/diff_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/utils"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/iterator"
"github.com/ava-labs/avalanchego/utils/iterator/iteratormock"
"github.com/ava-labs/avalanchego/vms/components/avax"
"github.com/ava-labs/avalanchego/vms/components/gas"
Expand Down Expand Up @@ -530,14 +531,20 @@ func assertChainsEqual(t *testing.T, expected, actual Chain) {
actualCurrentStakerIterator, actualErr := actual.GetCurrentStakerIterator()
require.Equal(expectedErr, actualErr)
if expectedErr == nil {
assertIteratorsEqual(t, expectedCurrentStakerIterator, actualCurrentStakerIterator)
require.Equal(
iterator.ToSlice(expectedCurrentStakerIterator),
iterator.ToSlice(actualCurrentStakerIterator),
)
}

expectedPendingStakerIterator, expectedErr := expected.GetPendingStakerIterator()
actualPendingStakerIterator, actualErr := actual.GetPendingStakerIterator()
require.Equal(expectedErr, actualErr)
if expectedErr == nil {
assertIteratorsEqual(t, expectedPendingStakerIterator, actualPendingStakerIterator)
require.Equal(
iterator.ToSlice(expectedPendingStakerIterator),
iterator.ToSlice(actualPendingStakerIterator),
)
}

require.Equal(expected.GetTimestamp(), actual.GetTimestamp())
Expand Down
81 changes: 48 additions & 33 deletions vms/platformvm/state/stakers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,10 @@ func TestBaseStakersValidator(t *testing.T) {
require.ErrorIs(err, database.ErrNotFound)

stakerIterator := v.GetStakerIterator()
assertIteratorsEqual(t, iterator.FromSlice(delegator), stakerIterator)
require.Equal(
[]*Staker{delegator},
iterator.ToSlice(stakerIterator),
)

v.PutValidator(staker)

Expand All @@ -97,46 +100,63 @@ func TestBaseStakersValidator(t *testing.T) {
v.DeleteDelegator(delegator)

stakerIterator = v.GetStakerIterator()
assertIteratorsEqual(t, iterator.FromSlice(staker), stakerIterator)
require.Equal(
[]*Staker{staker},
iterator.ToSlice(stakerIterator),
)

v.DeleteValidator(staker)

_, err = v.GetValidator(staker.SubnetID, staker.NodeID)
require.ErrorIs(err, database.ErrNotFound)

stakerIterator = v.GetStakerIterator()
assertIteratorsEqual(t, iterator.Empty[*Staker]{}, stakerIterator)
require.Empty(
iterator.ToSlice(stakerIterator),
)
}

func TestBaseStakersDelegator(t *testing.T) {
require := require.New(t)
staker := newTestStaker()
delegator := newTestStaker()

v := newBaseStakers()

delegatorIterator := v.GetDelegatorIterator(delegator.SubnetID, delegator.NodeID)
assertIteratorsEqual(t, iterator.Empty[*Staker]{}, delegatorIterator)
require.Empty(
iterator.ToSlice(delegatorIterator),
)

v.PutDelegator(delegator)

delegatorIterator = v.GetDelegatorIterator(delegator.SubnetID, ids.GenerateTestNodeID())
assertIteratorsEqual(t, iterator.Empty[*Staker]{}, delegatorIterator)
require.Empty(
iterator.ToSlice(delegatorIterator),
)

delegatorIterator = v.GetDelegatorIterator(delegator.SubnetID, delegator.NodeID)
assertIteratorsEqual(t, iterator.FromSlice(delegator), delegatorIterator)
require.Equal(
[]*Staker{delegator},
iterator.ToSlice(delegatorIterator),
)

v.DeleteDelegator(delegator)

delegatorIterator = v.GetDelegatorIterator(delegator.SubnetID, delegator.NodeID)
assertIteratorsEqual(t, iterator.Empty[*Staker]{}, delegatorIterator)
require.Empty(
iterator.ToSlice(delegatorIterator),
)

v.PutValidator(staker)

v.PutDelegator(delegator)
v.DeleteDelegator(delegator)

delegatorIterator = v.GetDelegatorIterator(staker.SubnetID, staker.NodeID)
assertIteratorsEqual(t, iterator.Empty[*Staker]{}, delegatorIterator)
require.Empty(
iterator.ToSlice(delegatorIterator),
)
}

func TestDiffStakersValidator(t *testing.T) {
Expand All @@ -160,7 +180,10 @@ func TestDiffStakersValidator(t *testing.T) {
require.Equal(unmodified, status)

stakerIterator := v.GetStakerIterator(iterator.Empty[*Staker]{})
assertIteratorsEqual(t, iterator.FromSlice(delegator), stakerIterator)
require.Equal(
[]*Staker{delegator},
iterator.ToSlice(stakerIterator),
)

require.NoError(v.PutValidator(staker))

Expand All @@ -177,7 +200,10 @@ func TestDiffStakersValidator(t *testing.T) {
require.Equal(unmodified, status)

stakerIterator = v.GetStakerIterator(iterator.Empty[*Staker]{})
assertIteratorsEqual(t, iterator.FromSlice(delegator), stakerIterator)
require.Equal(
[]*Staker{delegator},
iterator.ToSlice(stakerIterator),
)
}

func TestDiffStakersDeleteValidator(t *testing.T) {
Expand All @@ -198,25 +224,33 @@ func TestDiffStakersDeleteValidator(t *testing.T) {
}

func TestDiffStakersDelegator(t *testing.T) {
require := require.New(t)
staker := newTestStaker()
delegator := newTestStaker()

v := diffStakers{}

require.NoError(t, v.PutValidator(staker))
require.NoError(v.PutValidator(staker))

delegatorIterator := v.GetDelegatorIterator(iterator.Empty[*Staker]{}, ids.GenerateTestID(), delegator.NodeID)
assertIteratorsEqual(t, iterator.Empty[*Staker]{}, delegatorIterator)
require.Empty(
iterator.ToSlice(delegatorIterator),
)

v.PutDelegator(delegator)

delegatorIterator = v.GetDelegatorIterator(iterator.Empty[*Staker]{}, delegator.SubnetID, delegator.NodeID)
assertIteratorsEqual(t, iterator.FromSlice(delegator), delegatorIterator)
require.Equal(
[]*Staker{delegator},
iterator.ToSlice(delegatorIterator),
)

v.DeleteDelegator(delegator)

delegatorIterator = v.GetDelegatorIterator(iterator.Empty[*Staker]{}, ids.GenerateTestID(), delegator.NodeID)
assertIteratorsEqual(t, iterator.Empty[*Staker]{}, delegatorIterator)
require.Empty(
iterator.ToSlice(delegatorIterator),
)
}

func newTestStaker() *Staker {
Expand All @@ -235,22 +269,3 @@ func newTestStaker() *Staker {
Priority: txs.PrimaryNetworkDelegatorCurrentPriority,
}
}

func assertIteratorsEqual(t *testing.T, expected, actual iterator.Iterator[*Staker]) {
require := require.New(t)

t.Helper()

for expected.Next() {
require.True(actual.Next())

expectedStaker := expected.Value()
actualStaker := actual.Value()

require.Equal(expectedStaker, actualStaker)
}
require.False(actual.Next())

expected.Release()
actual.Release()
}
13 changes: 10 additions & 3 deletions vms/platformvm/state/state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,18 +88,25 @@ func TestStateSyncGenesis(t *testing.T) {

delegatorIterator, err := state.GetCurrentDelegatorIterator(constants.PrimaryNetworkID, defaultValidatorNodeID)
require.NoError(err)
assertIteratorsEqual(t, iterator.Empty[*Staker]{}, delegatorIterator)
require.Empty(
iterator.ToSlice(delegatorIterator),
)

stakerIterator, err := state.GetCurrentStakerIterator()
require.NoError(err)
assertIteratorsEqual(t, iterator.FromSlice(staker), stakerIterator)
require.Equal(
[]*Staker{staker},
iterator.ToSlice(stakerIterator),
)

_, err = state.GetPendingValidator(constants.PrimaryNetworkID, defaultValidatorNodeID)
require.ErrorIs(err, database.ErrNotFound)

delegatorIterator, err = state.GetPendingDelegatorIterator(constants.PrimaryNetworkID, defaultValidatorNodeID)
require.NoError(err)
assertIteratorsEqual(t, iterator.Empty[*Staker]{}, delegatorIterator)
require.Empty(
iterator.ToSlice(delegatorIterator),
)
}

// Whenever we store a staker, a whole bunch a data structures are updated
Expand Down

0 comments on commit 6cf2941

Please sign in to comment.