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 }