rpc: add array param type and tests
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
7331127556
commit
c8987eda32
3 changed files with 73 additions and 10 deletions
|
@ -1,6 +1,7 @@
|
||||||
package rpc
|
package rpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
@ -24,6 +25,7 @@ const (
|
||||||
defaultT paramType = iota
|
defaultT paramType = iota
|
||||||
stringT
|
stringT
|
||||||
numberT
|
numberT
|
||||||
|
arrayT
|
||||||
)
|
)
|
||||||
|
|
||||||
func (p Param) String() string {
|
func (p Param) String() string {
|
||||||
|
@ -46,6 +48,17 @@ func (p Param) GetUint256() (util.Uint256, error) {
|
||||||
return util.Uint256DecodeReverseString(s)
|
return util.Uint256DecodeReverseString(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetBytesHex returns []byte value of the parameter if
|
||||||
|
// it is a hex-encoded string.
|
||||||
|
func (p Param) GetBytesHex() ([]byte, error) {
|
||||||
|
s, ok := p.Value.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.New("must be a string")
|
||||||
|
}
|
||||||
|
|
||||||
|
return hex.DecodeString(s)
|
||||||
|
}
|
||||||
|
|
||||||
// UnmarshalJSON implements json.Unmarshaler interface.
|
// UnmarshalJSON implements json.Unmarshaler interface.
|
||||||
func (p *Param) UnmarshalJSON(data []byte) error {
|
func (p *Param) UnmarshalJSON(data []byte) error {
|
||||||
var s string
|
var s string
|
||||||
|
@ -64,5 +77,13 @@ func (p *Param) UnmarshalJSON(data []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ps []Param
|
||||||
|
if err := json.Unmarshal(data, &ps); err == nil {
|
||||||
|
p.Type = arrayT
|
||||||
|
p.Value = ps
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
return errors.New("unknown type")
|
return errors.New("unknown type")
|
||||||
}
|
}
|
||||||
|
|
42
pkg/rpc/param_test.go
Normal file
42
pkg/rpc/param_test.go
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
package rpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestParam_UnmarshalJSON(t *testing.T) {
|
||||||
|
msg := `["str1", 123, ["str2", 3]]`
|
||||||
|
expected := Params{
|
||||||
|
{
|
||||||
|
Type: stringT,
|
||||||
|
Value: "str1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Type: numberT,
|
||||||
|
Value: 123,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Type: arrayT,
|
||||||
|
Value: []Param{
|
||||||
|
{
|
||||||
|
Type: stringT,
|
||||||
|
Value: "str2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Type: numberT,
|
||||||
|
Value: 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var ps Params
|
||||||
|
require.NoError(t, json.Unmarshal([]byte(msg), &ps))
|
||||||
|
require.Equal(t, expected, ps)
|
||||||
|
|
||||||
|
msg = `[{"2": 3}]`
|
||||||
|
require.Error(t, json.Unmarshal([]byte(msg), &ps))
|
||||||
|
}
|
|
@ -322,21 +322,22 @@ func (s *Server) getAccountState(reqParams Params, unspents bool) (interface{},
|
||||||
|
|
||||||
// invokescript implements the `invokescript` RPC call.
|
// invokescript implements the `invokescript` RPC call.
|
||||||
func (s *Server) invokescript(reqParams Params) (interface{}, error) {
|
func (s *Server) invokescript(reqParams Params) (interface{}, error) {
|
||||||
hexScript, ok := reqParams.ValueWithType(0, stringT)
|
if len(reqParams) < 1 {
|
||||||
if !ok {
|
|
||||||
return nil, errInvalidParams
|
return nil, errInvalidParams
|
||||||
}
|
}
|
||||||
script, err := hex.DecodeString(hexScript.GetString())
|
|
||||||
|
script, err := reqParams[0].GetBytesHex()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, errInvalidParams
|
||||||
}
|
}
|
||||||
|
|
||||||
vm, _ := s.chain.GetTestVM()
|
vm, _ := s.chain.GetTestVM()
|
||||||
vm.LoadScript(script)
|
vm.LoadScript(script)
|
||||||
_ = vm.Run()
|
_ = vm.Run()
|
||||||
result := &wrappers.InvokeResult{
|
result := &wrappers.InvokeResult{
|
||||||
State: vm.State(),
|
State: vm.State(),
|
||||||
GasConsumed: "0.1",
|
GasConsumed: "0.1",
|
||||||
Script: hexScript.GetString(),
|
Script: reqParams[0].GetString(),
|
||||||
Stack: vm.Estack(),
|
Stack: vm.Estack(),
|
||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
|
@ -346,11 +347,10 @@ func (s *Server) sendrawtransaction(reqParams Params) (interface{}, error) {
|
||||||
var resultsErr error
|
var resultsErr error
|
||||||
var results interface{}
|
var results interface{}
|
||||||
|
|
||||||
param, ok := reqParams.ValueWithType(0, stringT)
|
if len(reqParams) < 1 {
|
||||||
if !ok {
|
return nil, errInvalidParams
|
||||||
resultsErr = errInvalidParams
|
} else if byteTx, err := reqParams[0].GetBytesHex(); err != nil {
|
||||||
} else if byteTx, err := hex.DecodeString(param.GetString()); err != nil {
|
return nil, errInvalidParams
|
||||||
resultsErr = errInvalidParams
|
|
||||||
} else {
|
} else {
|
||||||
r := io.NewBinReaderFromBuf(byteTx)
|
r := io.NewBinReaderFromBuf(byteTx)
|
||||||
tx := &transaction.Transaction{}
|
tx := &transaction.Transaction{}
|
||||||
|
|
Loading…
Reference in a new issue