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  }