github.com/MetalBlockchain/metalgo@v1.11.9/vms/platformvm/state/staker_diff_iterator_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package state
     5  
     6  import (
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/MetalBlockchain/metalgo/ids"
    13  	"github.com/MetalBlockchain/metalgo/vms/platformvm/txs"
    14  )
    15  
    16  func TestStakerDiffIterator(t *testing.T) {
    17  	require := require.New(t)
    18  	currentStakers := []*Staker{
    19  		{
    20  			TxID:     ids.GenerateTestID(),
    21  			EndTime:  time.Unix(10, 0),
    22  			NextTime: time.Unix(10, 0),
    23  			Priority: txs.PrimaryNetworkValidatorCurrentPriority,
    24  		},
    25  	}
    26  	pendingStakers := []*Staker{
    27  		{
    28  			TxID:      ids.GenerateTestID(),
    29  			StartTime: time.Unix(0, 0),
    30  			EndTime:   time.Unix(5, 0),
    31  			NextTime:  time.Unix(0, 0),
    32  			Priority:  txs.PrimaryNetworkDelegatorApricotPendingPriority,
    33  		},
    34  		{
    35  			TxID:      ids.GenerateTestID(),
    36  			StartTime: time.Unix(5, 0),
    37  			EndTime:   time.Unix(10, 0),
    38  			NextTime:  time.Unix(5, 0),
    39  			Priority:  txs.PrimaryNetworkDelegatorApricotPendingPriority,
    40  		},
    41  		{
    42  			TxID:      ids.GenerateTestID(),
    43  			StartTime: time.Unix(11, 0),
    44  			EndTime:   time.Unix(20, 0),
    45  			NextTime:  time.Unix(11, 0),
    46  			Priority:  txs.PrimaryNetworkValidatorPendingPriority,
    47  		},
    48  		{
    49  			TxID:      ids.GenerateTestID(),
    50  			StartTime: time.Unix(11, 0),
    51  			EndTime:   time.Unix(20, 0),
    52  			NextTime:  time.Unix(11, 0),
    53  			Priority:  txs.PrimaryNetworkDelegatorApricotPendingPriority,
    54  		},
    55  	}
    56  
    57  	stakerDiffs := []struct {
    58  		txID    ids.ID
    59  		isAdded bool
    60  	}{
    61  		{
    62  			txID:    pendingStakers[0].TxID,
    63  			isAdded: true,
    64  		},
    65  		{
    66  			txID:    pendingStakers[1].TxID,
    67  			isAdded: true,
    68  		},
    69  		{
    70  			txID:    pendingStakers[0].TxID,
    71  			isAdded: false,
    72  		},
    73  		{
    74  			txID:    pendingStakers[1].TxID,
    75  			isAdded: false,
    76  		},
    77  		{
    78  			txID:    currentStakers[0].TxID,
    79  			isAdded: false,
    80  		},
    81  		{
    82  			txID:    pendingStakers[2].TxID,
    83  			isAdded: true,
    84  		},
    85  		{
    86  			txID:    pendingStakers[3].TxID,
    87  			isAdded: true,
    88  		},
    89  		{
    90  			txID:    pendingStakers[3].TxID,
    91  			isAdded: false,
    92  		},
    93  		{
    94  			txID:    pendingStakers[2].TxID,
    95  			isAdded: false,
    96  		},
    97  	}
    98  
    99  	it := NewStakerDiffIterator(
   100  		NewSliceIterator(currentStakers...),
   101  		NewSliceIterator(pendingStakers...),
   102  	)
   103  	for _, expectedStaker := range stakerDiffs {
   104  		require.True(it.Next())
   105  		staker, isAdded := it.Value()
   106  		require.Equal(expectedStaker.txID, staker.TxID)
   107  		require.Equal(expectedStaker.isAdded, isAdded)
   108  	}
   109  	require.False(it.Next())
   110  	it.Release()
   111  	require.False(it.Next())
   112  }
   113  
   114  func TestMutableStakerIterator(t *testing.T) {
   115  	require := require.New(t)
   116  	initialStakers := []*Staker{
   117  		{
   118  			TxID:     ids.GenerateTestID(),
   119  			EndTime:  time.Unix(10, 0),
   120  			NextTime: time.Unix(10, 0),
   121  			Priority: txs.PrimaryNetworkValidatorCurrentPriority,
   122  		},
   123  		{
   124  			TxID:     ids.GenerateTestID(),
   125  			EndTime:  time.Unix(20, 0),
   126  			NextTime: time.Unix(20, 0),
   127  			Priority: txs.PrimaryNetworkValidatorCurrentPriority,
   128  		},
   129  		{
   130  			TxID:     ids.GenerateTestID(),
   131  			EndTime:  time.Unix(30, 0),
   132  			NextTime: time.Unix(30, 0),
   133  			Priority: txs.PrimaryNetworkValidatorCurrentPriority,
   134  		},
   135  	}
   136  
   137  	it := newMutableStakerIterator(NewSliceIterator(initialStakers...))
   138  
   139  	addedStakers := []*Staker{
   140  		{
   141  			TxID:     ids.GenerateTestID(),
   142  			EndTime:  time.Unix(5, 0),
   143  			NextTime: time.Unix(5, 0),
   144  			Priority: txs.PrimaryNetworkValidatorCurrentPriority,
   145  		},
   146  		{
   147  			TxID:     ids.GenerateTestID(),
   148  			EndTime:  time.Unix(15, 0),
   149  			NextTime: time.Unix(15, 0),
   150  			Priority: txs.PrimaryNetworkValidatorCurrentPriority,
   151  		},
   152  		{
   153  			TxID:     ids.GenerateTestID(),
   154  			EndTime:  time.Unix(25, 0),
   155  			NextTime: time.Unix(25, 0),
   156  			Priority: txs.PrimaryNetworkValidatorCurrentPriority,
   157  		},
   158  	}
   159  
   160  	// Next must be called before Add.
   161  	hasNext := it.Next()
   162  	require.True(hasNext)
   163  
   164  	for _, staker := range addedStakers {
   165  		it.Add(staker)
   166  	}
   167  
   168  	stakerDiffs := []ids.ID{
   169  		addedStakers[0].TxID,
   170  		initialStakers[0].TxID,
   171  		addedStakers[1].TxID,
   172  		initialStakers[1].TxID,
   173  		addedStakers[2].TxID,
   174  		initialStakers[2].TxID,
   175  	}
   176  
   177  	for _, expectedStakerTxID := range stakerDiffs {
   178  		require.True(hasNext)
   179  		staker := it.Value()
   180  		require.Equal(expectedStakerTxID, staker.TxID)
   181  		hasNext = it.Next()
   182  	}
   183  	require.False(hasNext)
   184  	it.Release()
   185  	require.False(it.Next())
   186  }