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