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  }