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  }