github.com/MetalBlockchain/metalgo@v1.11.9/vms/platformvm/state/staker_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 "errors" 8 "testing" 9 "time" 10 11 "github.com/stretchr/testify/require" 12 "go.uber.org/mock/gomock" 13 14 "github.com/MetalBlockchain/metalgo/ids" 15 "github.com/MetalBlockchain/metalgo/utils/crypto/bls" 16 "github.com/MetalBlockchain/metalgo/vms/platformvm/txs" 17 ) 18 19 var errCustom = errors.New("custom") 20 21 func TestStakerLess(t *testing.T) { 22 tests := []struct { 23 name string 24 left *Staker 25 right *Staker 26 less bool 27 }{ 28 { 29 name: "left time < right time", 30 left: &Staker{ 31 TxID: ids.ID([32]byte{}), 32 NextTime: time.Unix(0, 0), 33 Priority: txs.PrimaryNetworkValidatorCurrentPriority, 34 }, 35 right: &Staker{ 36 TxID: ids.ID([32]byte{}), 37 NextTime: time.Unix(1, 0), 38 Priority: txs.PrimaryNetworkValidatorCurrentPriority, 39 }, 40 less: true, 41 }, 42 { 43 name: "left time > right time", 44 left: &Staker{ 45 TxID: ids.ID([32]byte{}), 46 NextTime: time.Unix(1, 0), 47 Priority: txs.PrimaryNetworkValidatorCurrentPriority, 48 }, 49 right: &Staker{ 50 TxID: ids.ID([32]byte{}), 51 NextTime: time.Unix(0, 0), 52 Priority: txs.PrimaryNetworkValidatorCurrentPriority, 53 }, 54 less: false, 55 }, 56 { 57 name: "left priority < right priority", 58 left: &Staker{ 59 TxID: ids.ID([32]byte{}), 60 NextTime: time.Unix(0, 0), 61 Priority: txs.PrimaryNetworkDelegatorApricotPendingPriority, 62 }, 63 right: &Staker{ 64 TxID: ids.ID([32]byte{}), 65 NextTime: time.Unix(0, 0), 66 Priority: txs.PrimaryNetworkValidatorPendingPriority, 67 }, 68 less: true, 69 }, 70 { 71 name: "left priority > right priority", 72 left: &Staker{ 73 TxID: ids.ID([32]byte{}), 74 NextTime: time.Unix(0, 0), 75 Priority: txs.PrimaryNetworkValidatorPendingPriority, 76 }, 77 right: &Staker{ 78 TxID: ids.ID([32]byte{}), 79 NextTime: time.Unix(0, 0), 80 Priority: txs.PrimaryNetworkDelegatorApricotPendingPriority, 81 }, 82 less: false, 83 }, 84 { 85 name: "left txID < right txID", 86 left: &Staker{ 87 TxID: ids.ID([32]byte{0}), 88 NextTime: time.Unix(0, 0), 89 Priority: txs.PrimaryNetworkValidatorPendingPriority, 90 }, 91 right: &Staker{ 92 TxID: ids.ID([32]byte{1}), 93 NextTime: time.Unix(0, 0), 94 Priority: txs.PrimaryNetworkValidatorPendingPriority, 95 }, 96 less: true, 97 }, 98 { 99 name: "left txID > right txID", 100 left: &Staker{ 101 TxID: ids.ID([32]byte{1}), 102 NextTime: time.Unix(0, 0), 103 Priority: txs.PrimaryNetworkValidatorPendingPriority, 104 }, 105 right: &Staker{ 106 TxID: ids.ID([32]byte{0}), 107 NextTime: time.Unix(0, 0), 108 Priority: txs.PrimaryNetworkValidatorPendingPriority, 109 }, 110 less: false, 111 }, 112 { 113 name: "equal", 114 left: &Staker{ 115 TxID: ids.ID([32]byte{}), 116 NextTime: time.Unix(0, 0), 117 Priority: txs.PrimaryNetworkValidatorCurrentPriority, 118 }, 119 right: &Staker{ 120 TxID: ids.ID([32]byte{}), 121 NextTime: time.Unix(0, 0), 122 Priority: txs.PrimaryNetworkValidatorCurrentPriority, 123 }, 124 less: false, 125 }, 126 } 127 for _, test := range tests { 128 t.Run(test.name, func(t *testing.T) { 129 require.Equal(t, test.less, test.left.Less(test.right)) 130 }) 131 } 132 } 133 134 func TestNewCurrentStaker(t *testing.T) { 135 require := require.New(t) 136 ctrl := gomock.NewController(t) 137 138 txID := ids.GenerateTestID() 139 nodeID := ids.GenerateTestNodeID() 140 sk, err := bls.NewSecretKey() 141 require.NoError(err) 142 publicKey := bls.PublicFromSecretKey(sk) 143 subnetID := ids.GenerateTestID() 144 weight := uint64(12345) 145 startTime := time.Now() 146 endTime := startTime.Add(time.Hour) 147 potentialReward := uint64(54321) 148 currentPriority := txs.SubnetPermissionedValidatorCurrentPriority 149 150 stakerTx := txs.NewMockStaker(ctrl) 151 stakerTx.EXPECT().EndTime().Return(endTime) 152 stakerTx.EXPECT().NodeID().Return(nodeID) 153 stakerTx.EXPECT().PublicKey().Return(publicKey, true, nil) 154 stakerTx.EXPECT().SubnetID().Return(subnetID) 155 stakerTx.EXPECT().Weight().Return(weight) 156 stakerTx.EXPECT().CurrentPriority().Return(currentPriority) 157 158 staker, err := NewCurrentStaker(txID, stakerTx, startTime, potentialReward) 159 require.NotNil(staker) 160 require.NoError(err) 161 require.Equal(txID, staker.TxID) 162 require.Equal(nodeID, staker.NodeID) 163 require.Equal(publicKey, staker.PublicKey) 164 require.Equal(subnetID, staker.SubnetID) 165 require.Equal(weight, staker.Weight) 166 require.Equal(startTime, staker.StartTime) 167 require.Equal(endTime, staker.EndTime) 168 require.Equal(potentialReward, staker.PotentialReward) 169 require.Equal(endTime, staker.NextTime) 170 require.Equal(currentPriority, staker.Priority) 171 172 stakerTx.EXPECT().PublicKey().Return(nil, false, errCustom) 173 174 _, err = NewCurrentStaker(txID, stakerTx, startTime, potentialReward) 175 require.ErrorIs(err, errCustom) 176 } 177 178 func TestNewPendingStaker(t *testing.T) { 179 require := require.New(t) 180 ctrl := gomock.NewController(t) 181 182 txID := ids.GenerateTestID() 183 nodeID := ids.GenerateTestNodeID() 184 sk, err := bls.NewSecretKey() 185 require.NoError(err) 186 publicKey := bls.PublicFromSecretKey(sk) 187 subnetID := ids.GenerateTestID() 188 weight := uint64(12345) 189 startTime := time.Now() 190 endTime := time.Now() 191 pendingPriority := txs.SubnetPermissionedValidatorPendingPriority 192 193 stakerTx := txs.NewMockScheduledStaker(ctrl) 194 stakerTx.EXPECT().NodeID().Return(nodeID) 195 stakerTx.EXPECT().PublicKey().Return(publicKey, true, nil) 196 stakerTx.EXPECT().SubnetID().Return(subnetID) 197 stakerTx.EXPECT().Weight().Return(weight) 198 stakerTx.EXPECT().StartTime().Return(startTime) 199 stakerTx.EXPECT().EndTime().Return(endTime) 200 stakerTx.EXPECT().PendingPriority().Return(pendingPriority) 201 202 staker, err := NewPendingStaker(txID, stakerTx) 203 require.NotNil(staker) 204 require.NoError(err) 205 require.Equal(txID, staker.TxID) 206 require.Equal(nodeID, staker.NodeID) 207 require.Equal(publicKey, staker.PublicKey) 208 require.Equal(subnetID, staker.SubnetID) 209 require.Equal(weight, staker.Weight) 210 require.Equal(startTime, staker.StartTime) 211 require.Equal(endTime, staker.EndTime) 212 require.Zero(staker.PotentialReward) 213 require.Equal(startTime, staker.NextTime) 214 require.Equal(pendingPriority, staker.Priority) 215 216 stakerTx.EXPECT().PublicKey().Return(nil, false, errCustom) 217 218 _, err = NewPendingStaker(txID, stakerTx) 219 require.ErrorIs(err, errCustom) 220 }