github.com/ava-labs/avalanchego@v1.11.11/vms/platformvm/stakeable/stakeable_lock_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 stakeable
     5  
     6  import (
     7  	"errors"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  	"go.uber.org/mock/gomock"
    12  
    13  	"github.com/ava-labs/avalanchego/vms/components/avax"
    14  	"github.com/ava-labs/avalanchego/vms/components/avax/avaxmock"
    15  )
    16  
    17  var errTest = errors.New("hi mom")
    18  
    19  func TestLockOutVerify(t *testing.T) {
    20  	tests := []struct {
    21  		name             string
    22  		locktime         uint64
    23  		transferableOutF func(*gomock.Controller) avax.TransferableOut
    24  		expectedErr      error
    25  	}{
    26  		{
    27  			name:     "happy path",
    28  			locktime: 1,
    29  			transferableOutF: func(ctrl *gomock.Controller) avax.TransferableOut {
    30  				o := avaxmock.NewTransferableOut(ctrl)
    31  				o.EXPECT().Verify().Return(nil)
    32  				return o
    33  			},
    34  			expectedErr: nil,
    35  		},
    36  		{
    37  			name:     "invalid locktime",
    38  			locktime: 0,
    39  			transferableOutF: func(*gomock.Controller) avax.TransferableOut {
    40  				return nil
    41  			},
    42  			expectedErr: errInvalidLocktime,
    43  		},
    44  		{
    45  			name:     "nested",
    46  			locktime: 1,
    47  			transferableOutF: func(*gomock.Controller) avax.TransferableOut {
    48  				return &LockOut{}
    49  			},
    50  			expectedErr: errNestedStakeableLocks,
    51  		},
    52  		{
    53  			name:     "inner output fails verification",
    54  			locktime: 1,
    55  			transferableOutF: func(ctrl *gomock.Controller) avax.TransferableOut {
    56  				o := avaxmock.NewTransferableOut(ctrl)
    57  				o.EXPECT().Verify().Return(errTest)
    58  				return o
    59  			},
    60  			expectedErr: errTest,
    61  		},
    62  	}
    63  
    64  	for _, tt := range tests {
    65  		t.Run(tt.name, func(t *testing.T) {
    66  			ctrl := gomock.NewController(t)
    67  
    68  			lockOut := &LockOut{
    69  				Locktime:        tt.locktime,
    70  				TransferableOut: tt.transferableOutF(ctrl),
    71  			}
    72  			require.Equal(t, tt.expectedErr, lockOut.Verify())
    73  		})
    74  	}
    75  }
    76  
    77  func TestLockInVerify(t *testing.T) {
    78  	tests := []struct {
    79  		name            string
    80  		locktime        uint64
    81  		transferableInF func(*gomock.Controller) avax.TransferableIn
    82  		expectedErr     error
    83  	}{
    84  		{
    85  			name:     "happy path",
    86  			locktime: 1,
    87  			transferableInF: func(ctrl *gomock.Controller) avax.TransferableIn {
    88  				o := avaxmock.NewTransferableIn(ctrl)
    89  				o.EXPECT().Verify().Return(nil)
    90  				return o
    91  			},
    92  			expectedErr: nil,
    93  		},
    94  		{
    95  			name:     "invalid locktime",
    96  			locktime: 0,
    97  			transferableInF: func(*gomock.Controller) avax.TransferableIn {
    98  				return nil
    99  			},
   100  			expectedErr: errInvalidLocktime,
   101  		},
   102  		{
   103  			name:     "nested",
   104  			locktime: 1,
   105  			transferableInF: func(*gomock.Controller) avax.TransferableIn {
   106  				return &LockIn{}
   107  			},
   108  			expectedErr: errNestedStakeableLocks,
   109  		},
   110  		{
   111  			name:     "inner input fails verification",
   112  			locktime: 1,
   113  			transferableInF: func(ctrl *gomock.Controller) avax.TransferableIn {
   114  				o := avaxmock.NewTransferableIn(ctrl)
   115  				o.EXPECT().Verify().Return(errTest)
   116  				return o
   117  			},
   118  			expectedErr: errTest,
   119  		},
   120  	}
   121  
   122  	for _, tt := range tests {
   123  		t.Run(tt.name, func(t *testing.T) {
   124  			ctrl := gomock.NewController(t)
   125  
   126  			lockOut := &LockIn{
   127  				Locktime:       tt.locktime,
   128  				TransferableIn: tt.transferableInF(ctrl),
   129  			}
   130  			require.Equal(t, tt.expectedErr, lockOut.Verify())
   131  		})
   132  	}
   133  }