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 }