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 }