github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/neorpc/result/invoke_test.go (about) 1 package result 2 3 import ( 4 "encoding/base64" 5 "encoding/json" 6 "errors" 7 "math/big" 8 "testing" 9 10 "github.com/google/uuid" 11 "github.com/nspcc-dev/neo-go/pkg/core/state" 12 "github.com/nspcc-dev/neo-go/pkg/core/transaction" 13 "github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger" 14 "github.com/nspcc-dev/neo-go/pkg/util" 15 "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" 16 "github.com/nspcc-dev/neo-go/pkg/vm/vmstate" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func TestInvoke_MarshalJSON(t *testing.T) { 21 tx := transaction.New([]byte{1, 2, 3, 4}, 0) 22 tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3}}} 23 tx.Scripts = []transaction.Witness{{InvocationScript: []byte{}, VerificationScript: []byte{}}} 24 _ = tx.Size() 25 tx.Hash() 26 27 result := &Invoke{ 28 State: "HALT", 29 GasConsumed: 237626000, 30 Script: []byte{10}, 31 Stack: []stackitem.Item{stackitem.NewBigInteger(big.NewInt(1))}, 32 FaultException: "", 33 Notifications: []state.NotificationEvent{}, 34 Transaction: tx, 35 } 36 37 data, err := json.Marshal(result) 38 require.NoError(t, err) 39 expected := `{ 40 "state":"HALT", 41 "gasconsumed":"237626000", 42 "script":"` + base64.StdEncoding.EncodeToString(result.Script) + `", 43 "stack":[ 44 {"type":"Integer","value":"1"} 45 ], 46 "notifications":[], 47 "exception": null, 48 "tx":"` + base64.StdEncoding.EncodeToString(tx.Bytes()) + `" 49 }` 50 require.JSONEq(t, expected, string(data)) 51 52 actual := new(Invoke) 53 require.NoError(t, json.Unmarshal(data, actual)) 54 require.Equal(t, result, actual) 55 } 56 57 func TestAppExecToInvocation(t *testing.T) { 58 // With error. 59 someErr := errors.New("some err") 60 _, err := AppExecToInvocation(nil, someErr) 61 require.ErrorIs(t, err, someErr) 62 63 // Good. 64 h := util.Uint256{1, 2, 3} 65 ex := state.Execution{ 66 Trigger: trigger.Application, 67 VMState: vmstate.Fault, 68 GasConsumed: 123, 69 Stack: []stackitem.Item{stackitem.NewBigInteger(big.NewInt(123))}, 70 Events: []state.NotificationEvent{{ 71 ScriptHash: util.Uint160{3, 2, 1}, 72 Name: "Notification", 73 Item: stackitem.NewArray([]stackitem.Item{stackitem.Null{}}), 74 }}, 75 FaultException: "some fault exception", 76 } 77 inv, err := AppExecToInvocation(&state.AppExecResult{ 78 Container: h, 79 Execution: ex, 80 }, nil) 81 require.NoError(t, err) 82 require.Equal(t, ex.VMState.String(), inv.State) 83 require.Equal(t, ex.GasConsumed, inv.GasConsumed) 84 require.Nil(t, inv.Script) 85 require.Equal(t, ex.Stack, inv.Stack) 86 require.Equal(t, ex.FaultException, inv.FaultException) 87 require.Equal(t, ex.Events, inv.Notifications) 88 require.Nil(t, inv.Transaction) 89 require.Nil(t, inv.Diagnostics) 90 require.Equal(t, uuid.UUID{}, inv.Session) 91 }