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