github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/smartcontract/manifest/method_test.go (about) 1 package manifest 2 3 import ( 4 "math/big" 5 "testing" 6 7 "github.com/nspcc-dev/neo-go/pkg/crypto/keys" 8 "github.com/nspcc-dev/neo-go/pkg/smartcontract" 9 "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestMethodIsValid(t *testing.T) { 14 m := &Method{} 15 require.Error(t, m.IsValid()) // No name. 16 17 m.Name = "qwerty" 18 require.NoError(t, m.IsValid()) 19 20 m.Offset = -100 21 require.Error(t, m.IsValid()) 22 23 m.Offset = 100 24 m.ReturnType = 0x42 // Invalid type. 25 require.Error(t, m.IsValid()) 26 27 m.ReturnType = smartcontract.BoolType 28 require.NoError(t, m.IsValid()) 29 30 m.Parameters = append(m.Parameters, NewParameter("param", smartcontract.BoolType), NewParameter("param", smartcontract.BoolType)) 31 require.Error(t, m.IsValid()) 32 } 33 34 func TestMethod_ToStackItemFromStackItem(t *testing.T) { 35 m := &Method{ 36 Name: "mur", 37 Offset: 5, 38 Parameters: []Parameter{{Name: "p1", Type: smartcontract.BoolType}}, 39 ReturnType: smartcontract.StringType, 40 Safe: true, 41 } 42 expected := stackitem.NewStruct([]stackitem.Item{ 43 stackitem.NewByteArray([]byte(m.Name)), 44 stackitem.NewArray([]stackitem.Item{ 45 stackitem.NewStruct([]stackitem.Item{ 46 stackitem.NewByteArray([]byte(m.Parameters[0].Name)), 47 stackitem.NewBigInteger(big.NewInt(int64(m.Parameters[0].Type))), 48 }), 49 }), 50 stackitem.NewBigInteger(big.NewInt(int64(m.ReturnType))), 51 stackitem.NewBigInteger(big.NewInt(int64(m.Offset))), 52 stackitem.NewBool(m.Safe), 53 }) 54 CheckToFromStackItem(t, m, expected) 55 } 56 57 func TestMethod_FromStackItemErrors(t *testing.T) { 58 errCases := map[string]stackitem.Item{ 59 "not a struct": stackitem.NewArray([]stackitem.Item{}), 60 "invalid length": stackitem.NewStruct([]stackitem.Item{}), 61 "invalid name type": stackitem.NewStruct([]stackitem.Item{stackitem.NewInterop(nil), stackitem.Null{}, stackitem.Null{}, stackitem.Null{}, stackitem.Null{}}), 62 "invalid parameters type": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.Null{}, stackitem.Null{}, stackitem.Null{}, stackitem.Null{}}), 63 "invalid parameter": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.NewArray([]stackitem.Item{stackitem.NewStruct([]stackitem.Item{})}), stackitem.Null{}, stackitem.Null{}, stackitem.Null{}}), 64 "invalid return type": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.NewArray([]stackitem.Item{}), stackitem.Null{}, stackitem.Null{}, stackitem.Null{}}), 65 "invalid offset": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.NewArray([]stackitem.Item{}), stackitem.NewBigInteger(big.NewInt(1)), stackitem.NewInterop(nil), stackitem.Null{}}), 66 "invalid safe": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.NewArray([]stackitem.Item{}), stackitem.NewBigInteger(big.NewInt(1)), stackitem.NewBigInteger(big.NewInt(5)), stackitem.NewInterop(nil)}), 67 } 68 for name, errCase := range errCases { 69 t.Run(name, func(t *testing.T) { 70 p := new(Method) 71 require.Error(t, p.FromStackItem(errCase)) 72 }) 73 } 74 } 75 76 func TestGroup_ToStackItemFromStackItem(t *testing.T) { 77 pk, _ := keys.NewPrivateKey() 78 g := &Group{ 79 PublicKey: pk.PublicKey(), 80 Signature: make([]byte, keys.SignatureLen), 81 } 82 expected := stackitem.NewStruct([]stackitem.Item{ 83 stackitem.NewByteArray(pk.PublicKey().Bytes()), 84 stackitem.NewByteArray(make([]byte, keys.SignatureLen)), 85 }) 86 CheckToFromStackItem(t, g, expected) 87 } 88 89 func TestGroup_FromStackItemErrors(t *testing.T) { 90 pk, _ := keys.NewPrivateKey() 91 errCases := map[string]stackitem.Item{ 92 "not a struct": stackitem.NewArray([]stackitem.Item{}), 93 "invalid length": stackitem.NewStruct([]stackitem.Item{}), 94 "invalid pub type": stackitem.NewStruct([]stackitem.Item{stackitem.NewInterop(nil), stackitem.Null{}}), 95 "invalid pub bytes": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{1}), stackitem.Null{}}), 96 "invalid sig type": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray(pk.Bytes()), stackitem.NewInterop(nil)}), 97 "invalid sig len": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray(pk.Bytes()), stackitem.NewByteArray([]byte{1})}), 98 } 99 for name, errCase := range errCases { 100 t.Run(name, func(t *testing.T) { 101 p := new(Group) 102 require.Error(t, p.FromStackItem(errCase)) 103 }) 104 } 105 }