Commit b9ca5eef authored by Jeffrey Wilcke's avatar Jeffrey Wilcke

Merge pull request #579 from tgerring/rpcargs

RPC Args
parents 696ff43d 43d521e9
...@@ -12,17 +12,6 @@ type AccountChange struct { ...@@ -12,17 +12,6 @@ type AccountChange struct {
Address, StateAddress []byte Address, StateAddress []byte
} }
type FilterOptions struct {
Earliest int64
Latest int64
Address []common.Address
Topics [][]common.Hash
Skip int
Max int
}
// Filtering interface // Filtering interface
type Filter struct { type Filter struct {
eth Backend eth Backend
...@@ -44,18 +33,6 @@ func NewFilter(eth Backend) *Filter { ...@@ -44,18 +33,6 @@ func NewFilter(eth Backend) *Filter {
return &Filter{eth: eth} return &Filter{eth: eth}
} }
// SetOptions copies the filter options to the filter it self. The reason for this "silly" copy
// is simply because named arguments in this case is extremely nice and readable.
func (self *Filter) SetOptions(options *FilterOptions) {
self.earliest = options.Earliest
self.latest = options.Latest
self.skip = options.Skip
self.max = options.Max
self.address = options.Address
self.topics = options.Topics
}
// Set the earliest and latest block for filtering. // Set the earliest and latest block for filtering.
// -1 = latest block (i.e., the current block) // -1 = latest block (i.e., the current block)
// hash = particular hash from-to // hash = particular hash from-to
......
...@@ -6,7 +6,6 @@ import ( ...@@ -6,7 +6,6 @@ import (
"sync" "sync"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/xeth" "github.com/ethereum/go-ethereum/xeth"
) )
...@@ -82,10 +81,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -82,10 +81,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
return err return err
} }
if err := args.requirements(); err != nil {
return err
}
v := api.xethAtStateNum(args.BlockNumber).State().SafeGet(args.Address).Balance() v := api.xethAtStateNum(args.BlockNumber).State().SafeGet(args.Address).Balance()
*reply = common.ToHex(v.Bytes()) *reply = common.ToHex(v.Bytes())
case "eth_getStorage", "eth_storageAt": case "eth_getStorage", "eth_storageAt":
...@@ -94,19 +89,12 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -94,19 +89,12 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
return err return err
} }
if err := args.requirements(); err != nil {
return err
}
*reply = api.xethAtStateNum(args.BlockNumber).State().SafeGet(args.Address).Storage() *reply = api.xethAtStateNum(args.BlockNumber).State().SafeGet(args.Address).Storage()
case "eth_getStorageAt": case "eth_getStorageAt":
args := new(GetStorageAtArgs) args := new(GetStorageAtArgs)
if err := json.Unmarshal(req.Params, &args); err != nil { if err := json.Unmarshal(req.Params, &args); err != nil {
return err return err
} }
if err := args.requirements(); err != nil {
return err
}
state := api.xethAtStateNum(args.BlockNumber).State().SafeGet(args.Address) state := api.xethAtStateNum(args.BlockNumber).State().SafeGet(args.Address)
value := state.StorageString(args.Key) value := state.StorageString(args.Key)
...@@ -118,11 +106,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -118,11 +106,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
return err return err
} }
err := args.requirements()
if err != nil {
return err
}
*reply = api.xethAtStateNum(args.BlockNumber).TxCountAt(args.Address) *reply = api.xethAtStateNum(args.BlockNumber).TxCountAt(args.Address)
case "eth_getBlockTransactionCountByHash": case "eth_getBlockTransactionCountByHash":
args := new(GetBlockByHashArgs) args := new(GetBlockByHashArgs)
...@@ -163,9 +146,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -163,9 +146,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
if err := json.Unmarshal(req.Params, &args); err != nil { if err := json.Unmarshal(req.Params, &args); err != nil {
return err return err
} }
if err := args.requirements(); err != nil {
return err
}
*reply = api.xethAtStateNum(args.BlockNumber).CodeAt(args.Address) *reply = api.xethAtStateNum(args.BlockNumber).CodeAt(args.Address)
case "eth_sendTransaction", "eth_transact": case "eth_sendTransaction", "eth_transact":
args := new(NewTxArgs) args := new(NewTxArgs)
...@@ -173,10 +153,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -173,10 +153,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
return err return err
} }
if err := args.requirements(); err != nil {
return err
}
v, err := api.xeth().Transact(args.From, args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data) v, err := api.xeth().Transact(args.From, args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data)
if err != nil { if err != nil {
return err return err
...@@ -267,8 +243,8 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -267,8 +243,8 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
return NewValidationError("Index", "does not exist") return NewValidationError("Index", "does not exist")
} }
uhash := br.Uncles[args.Index].Hex() uhash := br.Uncles[args.Index]
uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash)) uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash.Hex()))
*reply = uncle *reply = uncle
case "eth_getUncleByBlockNumberAndIndex": case "eth_getUncleByBlockNumberAndIndex":
...@@ -285,8 +261,8 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -285,8 +261,8 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
return NewValidationError("Index", "does not exist") return NewValidationError("Index", "does not exist")
} }
uhash := v.Uncles[args.Index].Hex() uhash := v.Uncles[args.Index]
uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash)) uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash.Hex()))
*reply = uncle *reply = uncle
case "eth_getCompilers": case "eth_getCompilers":
...@@ -300,18 +276,13 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -300,18 +276,13 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
return err return err
} }
opts := toFilterOptions(args) id := api.xeth().RegisterFilter(args.Earliest, args.Latest, args.Skip, args.Max, args.Address, args.Topics)
id := api.xeth().RegisterFilter(opts)
*reply = common.ToHex(big.NewInt(int64(id)).Bytes()) *reply = common.ToHex(big.NewInt(int64(id)).Bytes())
case "eth_newBlockFilter": case "eth_newBlockFilter":
args := new(FilterStringArgs) args := new(FilterStringArgs)
if err := json.Unmarshal(req.Params, &args); err != nil { if err := json.Unmarshal(req.Params, &args); err != nil {
return err return err
} }
if err := args.requirements(); err != nil {
return err
}
id := api.xeth().NewFilterString(args.Word) id := api.xeth().NewFilterString(args.Word)
*reply = common.ToHex(big.NewInt(int64(id)).Bytes()) *reply = common.ToHex(big.NewInt(int64(id)).Bytes())
case "eth_uninstallFilter": case "eth_uninstallFilter":
...@@ -337,8 +308,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -337,8 +308,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
if err := json.Unmarshal(req.Params, &args); err != nil { if err := json.Unmarshal(req.Params, &args); err != nil {
return err return err
} }
opts := toFilterOptions(args) *reply = NewLogsRes(api.xeth().AllLogs(args.Earliest, args.Latest, args.Skip, args.Max, args.Address, args.Topics))
*reply = NewLogsRes(api.xeth().AllLogs(opts))
case "eth_getWork": case "eth_getWork":
api.xeth().SetMining(true) api.xeth().SetMining(true)
*reply = api.xeth().RemoteMining().GetWork() *reply = api.xeth().RemoteMining().GetWork()
...@@ -347,7 +317,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -347,7 +317,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
if err := json.Unmarshal(req.Params, &args); err != nil { if err := json.Unmarshal(req.Params, &args); err != nil {
return err return err
} }
*reply = api.xeth().RemoteMining().SubmitWork(args.Nonce, args.Digest, args.Header) *reply = api.xeth().RemoteMining().SubmitWork(args.Nonce, common.HexToHash(args.Digest), common.HexToHash(args.Header))
case "db_putString": case "db_putString":
args := new(DbArgs) args := new(DbArgs)
if err := json.Unmarshal(req.Params, &args); err != nil { if err := json.Unmarshal(req.Params, &args); err != nil {
...@@ -433,7 +403,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -433,7 +403,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
return err return err
} }
opts := new(xeth.Options) opts := new(xeth.Options)
opts.From = args.From // opts.From = args.From
opts.To = args.To opts.To = args.To
opts.Topics = args.Topics opts.Topics = args.Topics
id := api.xeth().NewWhisperFilter(opts) id := api.xeth().NewWhisperFilter(opts)
...@@ -483,46 +453,3 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err ...@@ -483,46 +453,3 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
rpclogger.DebugDetailf("Reply: %T %s", reply, reply) rpclogger.DebugDetailf("Reply: %T %s", reply, reply)
return nil return nil
} }
func toFilterOptions(options *BlockFilterArgs) *core.FilterOptions {
var opts core.FilterOptions
// Convert optional address slice/string to byte slice
if str, ok := options.Address.(string); ok {
opts.Address = []common.Address{common.HexToAddress(str)}
} else if slice, ok := options.Address.([]interface{}); ok {
bslice := make([]common.Address, len(slice))
for i, addr := range slice {
if saddr, ok := addr.(string); ok {
bslice[i] = common.HexToAddress(saddr)
}
}
opts.Address = bslice
}
opts.Earliest = options.Earliest
opts.Latest = options.Latest
topics := make([][]common.Hash, len(options.Topics))
for i, topicDat := range options.Topics {
if slice, ok := topicDat.([]interface{}); ok {
topics[i] = make([]common.Hash, len(slice))
for j, topic := range slice {
topics[i][j] = common.HexToHash(topic.(string))
}
} else if str, ok := topicDat.(string); ok {
topics[i] = []common.Hash{common.HexToHash(str)}
}
}
opts.Topics = topics
return &opts
}
/*
Work() chan<- *types.Block
SetWorkCh(chan<- Work)
Stop()
Start()
Rate() uint64
*/
...@@ -3,14 +3,27 @@ package rpc ...@@ -3,14 +3,27 @@ package rpc
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"errors" // "errors"
"fmt" "fmt"
"math/big" "math/big"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
) )
func blockHeight(raw interface{}, number *int64) (err error) { const (
defaultLogLimit = 100
defaultLogOffset = 0
)
func blockHeightFromJson(msg json.RawMessage, number *int64) error {
var raw interface{}
if err := json.Unmarshal(msg, &raw); err != nil {
return NewDecodeParamError(err.Error())
}
return blockHeight(raw, number)
}
func blockHeight(raw interface{}, number *int64) error {
// Parse as integer // Parse as integer
num, ok := raw.(float64) num, ok := raw.(float64)
if ok { if ok {
...@@ -21,7 +34,7 @@ func blockHeight(raw interface{}, number *int64) (err error) { ...@@ -21,7 +34,7 @@ func blockHeight(raw interface{}, number *int64) (err error) {
// Parse as string/hexstring // Parse as string/hexstring
str, ok := raw.(string) str, ok := raw.(string)
if !ok { if !ok {
return NewDecodeParamError("BlockNumber is not a string") return NewInvalidTypeError("", "not a number or string")
} }
switch str { switch str {
...@@ -36,26 +49,55 @@ func blockHeight(raw interface{}, number *int64) (err error) { ...@@ -36,26 +49,55 @@ func blockHeight(raw interface{}, number *int64) (err error) {
return nil return nil
} }
func toNumber(v interface{}) (int64, error) { func numString(raw interface{}, number *int64) error {
var str string // Parse as integer
if v != nil { num, ok := raw.(float64)
var ok bool if ok {
str, ok = v.(string) *number = int64(num)
if !ok { return nil
return 0, errors.New("is not a string or undefined")
}
} else {
str = "latest"
} }
switch str { // Parse as string/hexstring
case "latest": str, ok := raw.(string)
return -1, nil if !ok {
default: return NewInvalidTypeError("", "not a number or string")
return int64(common.Big(v.(string)).Int64()), nil
} }
*number = common.String2Big(str).Int64()
return nil
} }
// func toNumber(v interface{}) (int64, error) {
// var str string
// if v != nil {
// var ok bool
// str, ok = v.(string)
// if !ok {
// return 0, errors.New("is not a string or undefined")
// }
// } else {
// str = "latest"
// }
// switch str {
// case "latest":
// return -1, nil
// default:
// return int64(common.Big(v.(string)).Int64()), nil
// }
// }
// func hashString(raw interface{}, hash *string) error {
// argstr, ok := raw.(string)
// if !ok {
// return NewInvalidTypeError("", "not a string")
// }
// v := common.IsHex(argstr)
// hash = &argstr
// return nil
// }
type GetBlockByHashArgs struct { type GetBlockByHashArgs struct {
BlockHash string BlockHash string
IncludeTxs bool IncludeTxs bool
...@@ -74,7 +116,7 @@ func (args *GetBlockByHashArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -74,7 +116,7 @@ func (args *GetBlockByHashArgs) UnmarshalJSON(b []byte) (err error) {
argstr, ok := obj[0].(string) argstr, ok := obj[0].(string)
if !ok { if !ok {
return NewDecodeParamError("BlockHash not a string") return NewInvalidTypeError("blockHash", "not a string")
} }
args.BlockHash = argstr args.BlockHash = argstr
...@@ -103,8 +145,10 @@ func (args *GetBlockByNumberArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -103,8 +145,10 @@ func (args *GetBlockByNumberArgs) UnmarshalJSON(b []byte) (err error) {
if v, ok := obj[0].(float64); ok { if v, ok := obj[0].(float64); ok {
args.BlockNumber = int64(v) args.BlockNumber = int64(v)
} else if v, ok := obj[0].(string); ok {
args.BlockNumber = common.Big(v).Int64()
} else { } else {
args.BlockNumber = common.Big(obj[0].(string)).Int64() return NewInvalidTypeError("blockNumber", "not a number or string")
} }
if len(obj) > 1 { if len(obj) > 1 {
...@@ -127,7 +171,14 @@ type NewTxArgs struct { ...@@ -127,7 +171,14 @@ type NewTxArgs struct {
func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
var obj []json.RawMessage var obj []json.RawMessage
var ext struct{ From, To, Value, Gas, GasPrice, Data string } var ext struct {
From string
To string
Value interface{}
Gas interface{}
GasPrice interface{}
Data string
}
// Decode byte slice to array of RawMessages // Decode byte slice to array of RawMessages
if err := json.Unmarshal(b, &obj); err != nil { if err := json.Unmarshal(b, &obj); err != nil {
...@@ -144,33 +195,49 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -144,33 +195,49 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
return NewDecodeParamError(err.Error()) return NewDecodeParamError(err.Error())
} }
// var ok bool if len(ext.From) == 0 {
return NewValidationError("from", "is required")
}
args.From = ext.From args.From = ext.From
args.To = ext.To args.To = ext.To
args.Value = common.String2Big(ext.Value)
args.Gas = common.String2Big(ext.Gas)
args.GasPrice = common.String2Big(ext.GasPrice)
args.Data = ext.Data args.Data = ext.Data
// Check for optional BlockNumber param var num int64
if len(obj) > 1 { if ext.Value == nil {
var raw interface{} return NewValidationError("value", "is required")
if err = json.Unmarshal(obj[1], &raw); err != nil { } else {
return NewDecodeParamError(err.Error()) if err := numString(ext.Value, &num); err != nil {
return err
} }
}
args.Value = big.NewInt(num)
if err := blockHeight(raw, &args.BlockNumber); err != nil { if ext.Gas == nil {
return NewValidationError("gas", "is required")
} else {
if err := numString(ext.Gas, &num); err != nil {
return err return err
} }
} }
args.Gas = big.NewInt(num)
return nil if ext.GasPrice == nil {
} return NewValidationError("gasprice", "is required")
} else {
if err := numString(ext.GasPrice, &num); err != nil {
return err
}
}
args.GasPrice = big.NewInt(num)
func (args *NewTxArgs) requirements() error { // Check for optional BlockNumber param
if len(args.From) == 0 { if len(obj) > 1 {
return NewValidationError("From", "Is required") if err := blockHeightFromJson(obj[1], &args.BlockNumber); err != nil {
return err
}
} }
return nil return nil
} }
...@@ -191,7 +258,7 @@ func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -191,7 +258,7 @@ func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) {
addstr, ok := obj[0].(string) addstr, ok := obj[0].(string)
if !ok { if !ok {
return NewDecodeParamError("Address is not a string") return NewInvalidTypeError("address", "not a string")
} }
args.Address = addstr args.Address = addstr
...@@ -204,13 +271,6 @@ func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -204,13 +271,6 @@ func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) {
return nil return nil
} }
func (args *GetStorageArgs) requirements() error {
if len(args.Address) == 0 {
return NewValidationError("Address", "cannot be blank")
}
return nil
}
type GetStorageAtArgs struct { type GetStorageAtArgs struct {
Address string Address string
Key string Key string
...@@ -229,13 +289,13 @@ func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -229,13 +289,13 @@ func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) {
addstr, ok := obj[0].(string) addstr, ok := obj[0].(string)
if !ok { if !ok {
return NewDecodeParamError("Address is not a string") return NewInvalidTypeError("address", "not a string")
} }
args.Address = addstr args.Address = addstr
keystr, ok := obj[1].(string) keystr, ok := obj[1].(string)
if !ok { if !ok {
return NewDecodeParamError("Key is not a string") return NewInvalidTypeError("key", "not a string")
} }
args.Key = keystr args.Key = keystr
...@@ -248,17 +308,6 @@ func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -248,17 +308,6 @@ func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) {
return nil return nil
} }
func (args *GetStorageAtArgs) requirements() error {
if len(args.Address) == 0 {
return NewValidationError("Address", "cannot be blank")
}
if len(args.Key) == 0 {
return NewValidationError("Key", "cannot be blank")
}
return nil
}
type GetTxCountArgs struct { type GetTxCountArgs struct {
Address string Address string
BlockNumber int64 BlockNumber int64
...@@ -276,7 +325,7 @@ func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -276,7 +325,7 @@ func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) {
addstr, ok := obj[0].(string) addstr, ok := obj[0].(string)
if !ok { if !ok {
return NewDecodeParamError("Address is not a string") return NewInvalidTypeError("address", "not a string")
} }
args.Address = addstr args.Address = addstr
...@@ -289,13 +338,6 @@ func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -289,13 +338,6 @@ func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) {
return nil return nil
} }
func (args *GetTxCountArgs) requirements() error {
if len(args.Address) == 0 {
return NewValidationError("Address", "cannot be blank")
}
return nil
}
type GetBalanceArgs struct { type GetBalanceArgs struct {
Address string Address string
BlockNumber int64 BlockNumber int64
...@@ -313,7 +355,7 @@ func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -313,7 +355,7 @@ func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) {
addstr, ok := obj[0].(string) addstr, ok := obj[0].(string)
if !ok { if !ok {
return NewDecodeParamError("Address is not a string") return NewInvalidTypeError("address", "not a string")
} }
args.Address = addstr args.Address = addstr
...@@ -326,13 +368,6 @@ func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -326,13 +368,6 @@ func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) {
return nil return nil
} }
func (args *GetBalanceArgs) requirements() error {
if len(args.Address) == 0 {
return NewValidationError("Address", "cannot be blank")
}
return nil
}
type GetDataArgs struct { type GetDataArgs struct {
Address string Address string
BlockNumber int64 BlockNumber int64
...@@ -350,7 +385,7 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -350,7 +385,7 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) {
addstr, ok := obj[0].(string) addstr, ok := obj[0].(string)
if !ok { if !ok {
return NewDecodeParamError("Address is not a string") return NewInvalidTypeError("address", "not a string")
} }
args.Address = addstr args.Address = addstr
...@@ -363,13 +398,6 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -363,13 +398,6 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) {
return nil return nil
} }
func (args *GetDataArgs) requirements() error {
if len(args.Address) == 0 {
return NewValidationError("Address", "cannot be blank")
}
return nil
}
type BlockNumIndexArgs struct { type BlockNumIndexArgs struct {
BlockNumber int64 BlockNumber int64
Index int64 Index int64
...@@ -386,16 +414,14 @@ func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -386,16 +414,14 @@ func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) {
return NewInsufficientParamsError(len(obj), 1) return NewInsufficientParamsError(len(obj), 1)
} }
arg0, ok := obj[0].(string) if err := blockHeight(obj[0], &args.BlockNumber); err != nil {
if !ok { return err
return NewDecodeParamError("BlockNumber is not string")
} }
args.BlockNumber = common.Big(arg0).Int64()
if len(obj) > 1 { if len(obj) > 1 {
arg1, ok := obj[1].(string) arg1, ok := obj[1].(string)
if !ok { if !ok {
return NewDecodeParamError("Index not a string") return NewInvalidTypeError("index", "not a string")
} }
args.Index = common.Big(arg1).Int64() args.Index = common.Big(arg1).Int64()
} }
...@@ -421,14 +447,14 @@ func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -421,14 +447,14 @@ func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) {
arg0, ok := obj[0].(string) arg0, ok := obj[0].(string)
if !ok { if !ok {
return NewDecodeParamError("Hash not a string") return NewInvalidTypeError("hash", "not a string")
} }
args.Hash = arg0 args.Hash = arg0
if len(obj) > 1 { if len(obj) > 1 {
arg1, ok := obj[1].(string) arg1, ok := obj[1].(string)
if !ok { if !ok {
return NewDecodeParamError("Index not a string") return NewInvalidTypeError("index", "not a string")
} }
args.Index = common.Big(arg1).Int64() args.Index = common.Big(arg1).Int64()
} }
...@@ -450,28 +476,32 @@ func (args *Sha3Args) UnmarshalJSON(b []byte) (err error) { ...@@ -450,28 +476,32 @@ func (args *Sha3Args) UnmarshalJSON(b []byte) (err error) {
if len(obj) < 1 { if len(obj) < 1 {
return NewInsufficientParamsError(len(obj), 1) return NewInsufficientParamsError(len(obj), 1)
} }
args.Data = obj[0].(string)
argstr, ok := obj[0].(string)
if !ok {
return NewInvalidTypeError("data", "is not a string")
}
args.Data = argstr
return nil return nil
} }
type BlockFilterArgs struct { type BlockFilterArgs struct {
Earliest int64 Earliest int64
Latest int64 Latest int64
Address interface{} Address []string
Topics []interface{} Topics [][]string
Skip int Skip int
Max int Max int
} }
func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) { func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) {
var obj []struct { var obj []struct {
FromBlock interface{} `json:"fromBlock"` FromBlock interface{} `json:"fromBlock"`
ToBlock interface{} `json:"toBlock"` ToBlock interface{} `json:"toBlock"`
Limit string `json:"limit"` Limit interface{} `json:"limit"`
Offset string `json:"offset"` Offset interface{} `json:"offset"`
Address string `json:"address"` Address interface{} `json:"address"`
Topics []interface{} `json:"topics"` Topics interface{} `json:"topics"`
} }
if err = json.Unmarshal(b, &obj); err != nil { if err = json.Unmarshal(b, &obj); err != nil {
...@@ -482,19 +512,113 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -482,19 +512,113 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) {
return NewInsufficientParamsError(len(obj), 1) return NewInsufficientParamsError(len(obj), 1)
} }
args.Earliest, err = toNumber(obj[0].ToBlock) // args.Earliest, err = toNumber(obj[0].ToBlock)
if err != nil { // if err != nil {
return NewDecodeParamError(fmt.Sprintf("FromBlock %v", err)) // return NewDecodeParamError(fmt.Sprintf("FromBlock %v", err))
// }
// args.Latest, err = toNumber(obj[0].FromBlock)
// if err != nil {
// return NewDecodeParamError(fmt.Sprintf("ToBlock %v", err))
var num int64
// if blank then latest
if obj[0].FromBlock == nil {
num = -1
} else {
if err := blockHeight(obj[0].FromBlock, &num); err != nil {
return err
}
} }
args.Latest, err = toNumber(obj[0].FromBlock) // if -2 or other "silly" number, use latest
if err != nil { if num < 0 {
return NewDecodeParamError(fmt.Sprintf("ToBlock %v", err)) args.Earliest = -1 //latest block
} else {
args.Earliest = num
} }
args.Max = int(common.Big(obj[0].Limit).Int64()) // if blank than latest
args.Skip = int(common.Big(obj[0].Offset).Int64()) if obj[0].ToBlock == nil {
args.Address = obj[0].Address num = -1
args.Topics = obj[0].Topics } else {
if err := blockHeight(obj[0].ToBlock, &num); err != nil {
return err
}
}
args.Latest = num
if obj[0].Limit == nil {
num = defaultLogLimit
} else {
if err := numString(obj[0].Limit, &num); err != nil {
return err
}
}
args.Max = int(num)
if obj[0].Offset == nil {
num = defaultLogOffset
} else {
if err := numString(obj[0].Offset, &num); err != nil {
return err
}
}
args.Skip = int(num)
if obj[0].Address != nil {
marg, ok := obj[0].Address.([]interface{})
if ok {
v := make([]string, len(marg))
for i, arg := range marg {
argstr, ok := arg.(string)
if !ok {
return NewInvalidTypeError(fmt.Sprintf("address[%d]", i), "is not a string")
}
v[i] = argstr
}
args.Address = v
} else {
argstr, ok := obj[0].Address.(string)
if ok {
v := make([]string, 1)
v[0] = argstr
args.Address = v
} else {
return NewInvalidTypeError("address", "is not a string or array")
}
}
}
if obj[0].Topics != nil {
other, ok := obj[0].Topics.([]interface{})
if ok {
topicdbl := make([][]string, len(other))
for i, iv := range other {
if argstr, ok := iv.(string); ok {
// Found a string, push into first element of array
topicsgl := make([]string, 1)
topicsgl[0] = argstr
topicdbl[i] = topicsgl
} else if argarray, ok := iv.([]interface{}); ok {
// Found an array of other
topicdbl[i] = make([]string, len(argarray))
for j, jv := range argarray {
if v, ok := jv.(string); ok {
topicdbl[i][j] = v
} else {
return NewInvalidTypeError(fmt.Sprintf("topic[%d][%d]", i, j), "is not a string")
}
}
} else {
return NewInvalidTypeError(fmt.Sprintf("topic[%d]", i), "not a string or array")
}
}
args.Topics = topicdbl
return nil
} else {
return NewInvalidTypeError("topic", "is not a string or array")
}
}
return nil return nil
} }
...@@ -519,19 +643,19 @@ func (args *DbArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -519,19 +643,19 @@ func (args *DbArgs) UnmarshalJSON(b []byte) (err error) {
var ok bool var ok bool
if objstr, ok = obj[0].(string); !ok { if objstr, ok = obj[0].(string); !ok {
return NewDecodeParamError("Database is not a string") return NewInvalidTypeError("database", "not a string")
} }
args.Database = objstr args.Database = objstr
if objstr, ok = obj[1].(string); !ok { if objstr, ok = obj[1].(string); !ok {
return NewDecodeParamError("Key is not a string") return NewInvalidTypeError("key", "not a string")
} }
args.Key = objstr args.Key = objstr
if len(obj) > 2 { if len(obj) > 2 {
objstr, ok = obj[2].(string) objstr, ok = obj[2].(string)
if !ok { if !ok {
return NewDecodeParamError("Value is not a string") return NewInvalidTypeError("value", "not a string")
} }
args.Value = []byte(objstr) args.Value = []byte(objstr)
...@@ -570,19 +694,19 @@ func (args *DbHexArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -570,19 +694,19 @@ func (args *DbHexArgs) UnmarshalJSON(b []byte) (err error) {
var ok bool var ok bool
if objstr, ok = obj[0].(string); !ok { if objstr, ok = obj[0].(string); !ok {
return NewDecodeParamError("Database is not a string") return NewInvalidTypeError("database", "not a string")
} }
args.Database = objstr args.Database = objstr
if objstr, ok = obj[1].(string); !ok { if objstr, ok = obj[1].(string); !ok {
return NewDecodeParamError("Key is not a string") return NewInvalidTypeError("key", "not a string")
} }
args.Key = objstr args.Key = objstr
if len(obj) > 2 { if len(obj) > 2 {
objstr, ok = obj[2].(string) objstr, ok = obj[2].(string)
if !ok { if !ok {
return NewDecodeParamError("Value is not a string") return NewInvalidTypeError("value", "not a string")
} }
args.Value = common.FromHex(objstr) args.Value = common.FromHex(objstr)
...@@ -616,8 +740,8 @@ func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -616,8 +740,8 @@ func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) {
To string To string
From string From string
Topics []string Topics []string
Priority string Priority interface{}
Ttl string Ttl interface{}
} }
if err = json.Unmarshal(b, &obj); err != nil { if err = json.Unmarshal(b, &obj); err != nil {
...@@ -631,8 +755,17 @@ func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -631,8 +755,17 @@ func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) {
args.To = obj[0].To args.To = obj[0].To
args.From = obj[0].From args.From = obj[0].From
args.Topics = obj[0].Topics args.Topics = obj[0].Topics
args.Priority = uint32(common.Big(obj[0].Priority).Int64())
args.Ttl = uint32(common.Big(obj[0].Ttl).Int64()) var num int64
if err := numString(obj[0].Priority, &num); err != nil {
return err
}
args.Priority = uint32(num)
if err := numString(obj[0].Ttl, &num); err != nil {
return err
}
args.Ttl = uint32(num)
return nil return nil
} }
...@@ -643,14 +776,18 @@ type CompileArgs struct { ...@@ -643,14 +776,18 @@ type CompileArgs struct {
func (args *CompileArgs) UnmarshalJSON(b []byte) (err error) { func (args *CompileArgs) UnmarshalJSON(b []byte) (err error) {
var obj []interface{} var obj []interface{}
r := bytes.NewReader(b) if err := json.Unmarshal(b, &obj); err != nil {
if err := json.NewDecoder(r).Decode(&obj); err != nil {
return NewDecodeParamError(err.Error()) return NewDecodeParamError(err.Error())
} }
if len(obj) > 0 { if len(obj) < 1 {
args.Source = obj[0].(string) return NewInsufficientParamsError(len(obj), 1)
} }
argstr, ok := obj[0].(string)
if !ok {
return NewInvalidTypeError("arg0", "is not a string")
}
args.Source = argstr
return nil return nil
} }
...@@ -673,20 +810,15 @@ func (args *FilterStringArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -673,20 +810,15 @@ func (args *FilterStringArgs) UnmarshalJSON(b []byte) (err error) {
var argstr string var argstr string
argstr, ok := obj[0].(string) argstr, ok := obj[0].(string)
if !ok { if !ok {
return NewDecodeParamError("Filter is not a string") return NewInvalidTypeError("filter", "not a string")
} }
args.Word = argstr switch argstr {
return nil
}
func (args *FilterStringArgs) requirements() error {
switch args.Word {
case "latest", "pending": case "latest", "pending":
break break
default: default:
return NewValidationError("Word", "Must be `latest` or `pending`") return NewValidationError("Word", "Must be `latest` or `pending`")
} }
args.Word = argstr
return nil return nil
} }
...@@ -695,9 +827,8 @@ type FilterIdArgs struct { ...@@ -695,9 +827,8 @@ type FilterIdArgs struct {
} }
func (args *FilterIdArgs) UnmarshalJSON(b []byte) (err error) { func (args *FilterIdArgs) UnmarshalJSON(b []byte) (err error) {
var obj []string var obj []interface{}
r := bytes.NewReader(b) if err := json.Unmarshal(b, &obj); err != nil {
if err := json.NewDecoder(r).Decode(&obj); err != nil {
return NewDecodeParamError(err.Error()) return NewDecodeParamError(err.Error())
} }
...@@ -705,7 +836,11 @@ func (args *FilterIdArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -705,7 +836,11 @@ func (args *FilterIdArgs) UnmarshalJSON(b []byte) (err error) {
return NewInsufficientParamsError(len(obj), 1) return NewInsufficientParamsError(len(obj), 1)
} }
args.Id = int(common.Big(obj[0]).Int64()) var num int64
if err := numString(obj[0], &num); err != nil {
return err
}
args.Id = int(num)
return nil return nil
} }
...@@ -715,9 +850,8 @@ type WhisperIdentityArgs struct { ...@@ -715,9 +850,8 @@ type WhisperIdentityArgs struct {
} }
func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) { func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) {
var obj []string var obj []interface{}
r := bytes.NewReader(b) if err := json.Unmarshal(b, &obj); err != nil {
if err := json.NewDecoder(r).Decode(&obj); err != nil {
return NewDecodeParamError(err.Error()) return NewDecodeParamError(err.Error())
} }
...@@ -725,7 +859,14 @@ func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -725,7 +859,14 @@ func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) {
return NewInsufficientParamsError(len(obj), 1) return NewInsufficientParamsError(len(obj), 1)
} }
args.Identity = obj[0] argstr, ok := obj[0].(string)
if !ok {
return NewInvalidTypeError("arg0", "not a string")
}
// if !common.IsHex(argstr) {
// return NewValidationError("arg0", "not a hexstring")
// }
args.Identity = argstr
return nil return nil
} }
...@@ -738,9 +879,8 @@ type WhisperFilterArgs struct { ...@@ -738,9 +879,8 @@ type WhisperFilterArgs struct {
func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) { func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) {
var obj []struct { var obj []struct {
To string To interface{}
From string Topics []interface{}
Topics []string
} }
if err = json.Unmarshal(b, &obj); err != nil { if err = json.Unmarshal(b, &obj); err != nil {
...@@ -751,17 +891,30 @@ func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -751,17 +891,30 @@ func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) {
return NewInsufficientParamsError(len(obj), 1) return NewInsufficientParamsError(len(obj), 1)
} }
args.To = obj[0].To var argstr string
args.From = obj[0].From argstr, ok := obj[0].To.(string)
args.Topics = obj[0].Topics if !ok {
return NewInvalidTypeError("to", "is not a string")
}
args.To = argstr
t := make([]string, len(obj[0].Topics))
for i, j := range obj[0].Topics {
argstr, ok := j.(string)
if !ok {
return NewInvalidTypeError("topics["+string(i)+"]", "is not a string")
}
t[i] = argstr
}
args.Topics = t
return nil return nil
} }
type SubmitWorkArgs struct { type SubmitWorkArgs struct {
Nonce uint64 Nonce uint64
Header common.Hash Header string
Digest common.Hash Digest string
} }
func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) { func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) {
...@@ -777,21 +930,21 @@ func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) { ...@@ -777,21 +930,21 @@ func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) {
var objstr string var objstr string
var ok bool var ok bool
if objstr, ok = obj[0].(string); !ok { if objstr, ok = obj[0].(string); !ok {
return NewDecodeParamError("Nonce is not a string") return NewInvalidTypeError("nonce", "not a string")
} }
args.Nonce = common.String2Big(objstr).Uint64() args.Nonce = common.String2Big(objstr).Uint64()
if objstr, ok = obj[1].(string); !ok { if objstr, ok = obj[1].(string); !ok {
return NewDecodeParamError("Header is not a string") return NewInvalidTypeError("header", "not a string")
} }
args.Header = common.HexToHash(objstr) args.Header = objstr
if objstr, ok = obj[2].(string); !ok { if objstr, ok = obj[2].(string); !ok {
return NewDecodeParamError("Digest is not a string") return NewInvalidTypeError("digest", "not a string")
} }
args.Digest = common.HexToHash(objstr) args.Digest = objstr
return nil return nil
} }
...@@ -3,12 +3,63 @@ package rpc ...@@ -3,12 +3,63 @@ package rpc
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt"
"math/big" "math/big"
"testing" "testing"
"github.com/ethereum/go-ethereum/common"
) )
func ExpectValidationError(err error) string {
var str string
switch err.(type) {
case nil:
str = "Expected error but didn't get one"
case *ValidationError:
break
default:
str = fmt.Sprintf("Expected *rpc.ValidationError but got %T with message `%s`", err, err.Error())
}
return str
}
func ExpectInvalidTypeError(err error) string {
var str string
switch err.(type) {
case nil:
str = "Expected error but didn't get one"
case *InvalidTypeError:
break
default:
str = fmt.Sprintf("Expected *rpc.InvalidTypeError but got %T with message `%s`", err, err.Error())
}
return str
}
func ExpectInsufficientParamsError(err error) string {
var str string
switch err.(type) {
case nil:
str = "Expected error but didn't get one"
case *InsufficientParamsError:
break
default:
str = fmt.Sprintf("Expected *rpc.InsufficientParamsError but got %T with message %s", err, err.Error())
}
return str
}
func ExpectDecodeParamError(err error) string {
var str string
switch err.(type) {
case nil:
str = "Expected error but didn't get one"
case *DecodeParamError:
break
default:
str = fmt.Sprintf("Expected *rpc.DecodeParamError but got %T with message `%s`", err, err.Error())
}
return str
}
func TestSha3(t *testing.T) { func TestSha3(t *testing.T) {
input := `["0x68656c6c6f20776f726c64"]` input := `["0x68656c6c6f20776f726c64"]`
expected := "0x68656c6c6f20776f726c64" expected := "0x68656c6c6f20776f726c64"
...@@ -21,6 +72,35 @@ func TestSha3(t *testing.T) { ...@@ -21,6 +72,35 @@ func TestSha3(t *testing.T) {
} }
} }
func TestSha3ArgsInvalid(t *testing.T) {
input := `{}`
args := new(Sha3Args)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestSha3ArgsEmpty(t *testing.T) {
input := `[]`
args := new(Sha3Args)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestSha3ArgsDataInvalid(t *testing.T) {
input := `[4]`
args := new(Sha3Args)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetBalanceArgs(t *testing.T) { func TestGetBalanceArgs(t *testing.T) {
input := `["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "0x1f"]` input := `["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "0x1f"]`
expected := new(GetBalanceArgs) expected := new(GetBalanceArgs)
...@@ -32,10 +112,6 @@ func TestGetBalanceArgs(t *testing.T) { ...@@ -32,10 +112,6 @@ func TestGetBalanceArgs(t *testing.T) {
t.Error(err) t.Error(err)
} }
if err := args.requirements(); err != nil {
t.Error(err)
}
if args.Address != expected.Address { if args.Address != expected.Address {
t.Errorf("Address should be %v but is %v", expected.Address, args.Address) t.Errorf("Address should be %v but is %v", expected.Address, args.Address)
} }
...@@ -56,10 +132,6 @@ func TestGetBalanceArgsLatest(t *testing.T) { ...@@ -56,10 +132,6 @@ func TestGetBalanceArgsLatest(t *testing.T) {
t.Error(err) t.Error(err)
} }
if err := args.requirements(); err != nil {
t.Error(err)
}
if args.Address != expected.Address { if args.Address != expected.Address {
t.Errorf("Address should be %v but is %v", expected.Address, args.Address) t.Errorf("Address should be %v but is %v", expected.Address, args.Address)
} }
...@@ -69,15 +141,44 @@ func TestGetBalanceArgsLatest(t *testing.T) { ...@@ -69,15 +141,44 @@ func TestGetBalanceArgsLatest(t *testing.T) {
} }
} }
func TestGetBalanceEmptyArgs(t *testing.T) { func TestGetBalanceArgsEmpty(t *testing.T) {
input := `[]` input := `[]`
args := new(GetBalanceArgs) args := new(GetBalanceArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if err == nil { if len(str) > 0 {
t.Error("Expected error but didn't get one") t.Error(str)
}
}
func TestGetBalanceArgsInvalid(t *testing.T) {
input := `6`
args := new(GetBalanceArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetBalanceArgsBlockInvalid(t *testing.T) {
input := `["0x407d73d8a49eeb85d32cf465507dd71d507100c1", false]`
args := new(GetBalanceArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
} }
}
func TestGetBalanceArgsAddressInvalid(t *testing.T) {
input := `[-9, "latest"]`
args := new(GetBalanceArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
} }
func TestGetBlockByHashArgs(t *testing.T) { func TestGetBlockByHashArgs(t *testing.T) {
...@@ -100,17 +201,57 @@ func TestGetBlockByHashArgs(t *testing.T) { ...@@ -100,17 +201,57 @@ func TestGetBlockByHashArgs(t *testing.T) {
} }
} }
func TestGetBlockByHashEmpty(t *testing.T) { func TestGetBlockByHashArgsEmpty(t *testing.T) {
input := `[]` input := `[]`
args := new(GetBlockByHashArgs) args := new(GetBlockByHashArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if err == nil { if len(str) > 0 {
t.Error("Expected error but didn't get one") t.Error(str)
}
}
func TestGetBlockByHashArgsInvalid(t *testing.T) {
input := `{}`
args := new(GetBlockByHashArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetBlockByHashArgsHashInt(t *testing.T) {
input := `[8]`
args := new(GetBlockByHashArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetBlockByNumberArgsBlockNum(t *testing.T) {
input := `[436, false]`
expected := new(GetBlockByNumberArgs)
expected.BlockNumber = 436
expected.IncludeTxs = false
args := new(GetBlockByNumberArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err)
}
if args.BlockNumber != expected.BlockNumber {
t.Errorf("BlockNumber should be %v but is %v", expected.BlockNumber, args.BlockNumber)
}
if args.IncludeTxs != expected.IncludeTxs {
t.Errorf("IncludeTxs should be %v but is %v", expected.IncludeTxs, args.IncludeTxs)
} }
} }
func TestGetBlockByNumberArgs(t *testing.T) { func TestGetBlockByNumberArgsBlockHex(t *testing.T) {
input := `["0x1b4", false]` input := `["0x1b4", false]`
expected := new(GetBlockByNumberArgs) expected := new(GetBlockByNumberArgs)
expected.BlockNumber = 436 expected.BlockNumber = 436
...@@ -122,7 +263,7 @@ func TestGetBlockByNumberArgs(t *testing.T) { ...@@ -122,7 +263,7 @@ func TestGetBlockByNumberArgs(t *testing.T) {
} }
if args.BlockNumber != expected.BlockNumber { if args.BlockNumber != expected.BlockNumber {
t.Errorf("BlockHash should be %v but is %v", expected.BlockNumber, args.BlockNumber) t.Errorf("BlockNumber should be %v but is %v", expected.BlockNumber, args.BlockNumber)
} }
if args.IncludeTxs != expected.IncludeTxs { if args.IncludeTxs != expected.IncludeTxs {
...@@ -134,9 +275,28 @@ func TestGetBlockByNumberEmpty(t *testing.T) { ...@@ -134,9 +275,28 @@ func TestGetBlockByNumberEmpty(t *testing.T) {
input := `[]` input := `[]`
args := new(GetBlockByNumberArgs) args := new(GetBlockByNumberArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if err == nil { if len(str) > 0 {
t.Error("Expected error but didn't get one") t.Error(str)
}
}
func TestGetBlockByNumberBool(t *testing.T) {
input := `[true, true]`
args := new(GetBlockByNumberArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetBlockByNumberBlockObject(t *testing.T) {
input := `{}`
args := new(GetBlockByNumberArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
} }
} }
...@@ -191,23 +351,150 @@ func TestNewTxArgs(t *testing.T) { ...@@ -191,23 +351,150 @@ func TestNewTxArgs(t *testing.T) {
} }
} }
func TestNewTxArgsBlockInt(t *testing.T) { func TestNewTxArgsInt(t *testing.T) {
input := `[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155"}, 5]` input := `[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": 100,
"gasPrice": 50,
"value": 8765456789,
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"},
5]`
expected := new(NewTxArgs) expected := new(NewTxArgs)
expected.From = "0xb60e8dd61c5d32be8058bb8eb970870f07233155" expected.Gas = big.NewInt(100)
expected.BlockNumber = big.NewInt(5).Int64() expected.GasPrice = big.NewInt(50)
expected.Value = big.NewInt(8765456789)
expected.BlockNumber = int64(5)
args := new(NewTxArgs) args := new(NewTxArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil { if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err) t.Error(err)
} }
if expected.From != args.From { if bytes.Compare(expected.Gas.Bytes(), args.Gas.Bytes()) != 0 {
t.Errorf("From shoud be %#v but is %#v", expected.From, args.From) t.Errorf("Gas shoud be %v but is %v", expected.Gas, args.Gas)
}
if bytes.Compare(expected.GasPrice.Bytes(), args.GasPrice.Bytes()) != 0 {
t.Errorf("GasPrice shoud be %v but is %v", expected.GasPrice, args.GasPrice)
}
if bytes.Compare(expected.Value.Bytes(), args.Value.Bytes()) != 0 {
t.Errorf("Value shoud be %v but is %v", expected.Value, args.Value)
} }
if expected.BlockNumber != args.BlockNumber { if expected.BlockNumber != args.BlockNumber {
t.Errorf("BlockNumber shoud be %#v but is %#v", expected.BlockNumber, args.BlockNumber) t.Errorf("BlockNumber shoud be %v but is %v", expected.BlockNumber, args.BlockNumber)
}
}
func TestNewTxArgsBlockBool(t *testing.T) {
input := `[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"},
false]`
args := new(NewTxArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestNewTxArgsGasInvalid(t *testing.T) {
input := `[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": false,
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args := new(NewTxArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestNewTxArgsGaspriceInvalid(t *testing.T) {
input := `[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": false,
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args := new(NewTxArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestNewTxArgsValueInvalid(t *testing.T) {
input := `[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": false,
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args := new(NewTxArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestNewTxArgsGasMissing(t *testing.T) {
input := `[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args := new(NewTxArgs)
str := ExpectValidationError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestNewTxArgsBlockGaspriceMissing(t *testing.T) {
input := `[{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args := new(NewTxArgs)
str := ExpectValidationError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestNewTxArgsValueMissing(t *testing.T) {
input := `[{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args := new(NewTxArgs)
str := ExpectValidationError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
} }
} }
...@@ -215,37 +502,43 @@ func TestNewTxArgsEmpty(t *testing.T) { ...@@ -215,37 +502,43 @@ func TestNewTxArgsEmpty(t *testing.T) {
input := `[]` input := `[]`
args := new(NewTxArgs) args := new(NewTxArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if err == nil { if len(str) > 0 {
t.Error("Expected error but didn't get one") t.Error(str)
} }
} }
func TestNewTxArgsReqs(t *testing.T) { func TestNewTxArgsInvalid(t *testing.T) {
args := new(NewTxArgs) input := `{}`
args.From = "0xb60e8dd61c5d32be8058bb8eb970870f07233155"
err := args.requirements() args := new(NewTxArgs)
switch err.(type) { str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
case nil: if len(str) > 0 {
break t.Error(str)
default:
t.Errorf("Get %T", err)
} }
} }
func TestNewTxArgsNotStrings(t *testing.T) {
input := `[{"from":6}]`
func TestNewTxArgsReqsFromBlank(t *testing.T) {
args := new(NewTxArgs) args := new(NewTxArgs)
args.From = "" str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestNewTxArgsFromEmpty(t *testing.T) {
input := `[{"to": "0xb60e8dd61c5d32be8058bb8eb970870f07233155"}]`
err := args.requirements() args := new(NewTxArgs)
err := json.Unmarshal([]byte(input), &args)
switch err.(type) { switch err.(type) {
case nil: case nil:
t.Error("Expected error but didn't get one") t.Error("Expected error but didn't get one")
case *ValidationError: case *ValidationError:
break break
default: default:
t.Error("Wrong type of error") t.Errorf("Expected *rpc.ValidationError, but got %T with message `%s`", err, err.Error())
} }
} }
...@@ -260,10 +553,6 @@ func TestGetStorageArgs(t *testing.T) { ...@@ -260,10 +553,6 @@ func TestGetStorageArgs(t *testing.T) {
t.Error(err) t.Error(err)
} }
if err := args.requirements(); err != nil {
t.Error(err)
}
if expected.Address != args.Address { if expected.Address != args.Address {
t.Errorf("Address shoud be %#v but is %#v", expected.Address, args.Address) t.Errorf("Address shoud be %#v but is %#v", expected.Address, args.Address)
} }
...@@ -273,13 +562,43 @@ func TestGetStorageArgs(t *testing.T) { ...@@ -273,13 +562,43 @@ func TestGetStorageArgs(t *testing.T) {
} }
} }
func TestGetStorageInvalidArgs(t *testing.T) {
input := `{}`
args := new(GetStorageArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetStorageInvalidBlockheight(t *testing.T) {
input := `["0x407d73d8a49eeb85d32cf465507dd71d507100c1", {}]`
args := new(GetStorageArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetStorageEmptyArgs(t *testing.T) { func TestGetStorageEmptyArgs(t *testing.T) {
input := `[]` input := `[]`
args := new(GetStorageArgs) args := new(GetStorageArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if err == nil { if len(str) > 0 {
t.Error("Expected error but didn't get one") t.Error(str)
}
}
func TestGetStorageAddressInt(t *testing.T) {
input := `[32456785432456, "latest"]`
args := new(GetStorageArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
} }
} }
...@@ -295,10 +614,6 @@ func TestGetStorageAtArgs(t *testing.T) { ...@@ -295,10 +614,6 @@ func TestGetStorageAtArgs(t *testing.T) {
t.Error(err) t.Error(err)
} }
if err := args.requirements(); err != nil {
t.Error(err)
}
if expected.Address != args.Address { if expected.Address != args.Address {
t.Errorf("Address shoud be %#v but is %#v", expected.Address, args.Address) t.Errorf("Address shoud be %#v but is %#v", expected.Address, args.Address)
} }
...@@ -316,25 +631,61 @@ func TestGetStorageAtEmptyArgs(t *testing.T) { ...@@ -316,25 +631,61 @@ func TestGetStorageAtEmptyArgs(t *testing.T) {
input := `[]` input := `[]`
args := new(GetStorageAtArgs) args := new(GetStorageAtArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if err == nil { if len(str) > 0 {
t.Error("Expected error but didn't get one") t.Error(str)
} }
} }
func TestGetTxCountArgs(t *testing.T) { func TestGetStorageAtArgsInvalid(t *testing.T) {
input := `["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]` input := `{}`
expected := new(GetTxCountArgs)
expected.Address = "0x407d73d8a49eeb85d32cf465507dd71d507100c1"
expected.BlockNumber = -1
args := new(GetTxCountArgs) args := new(GetStorageAtArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil { str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
t.Error(err) if len(str) > 0 {
t.Error(str)
} }
}
if err := args.requirements(); err != nil { func TestGetStorageAtArgsAddressNotString(t *testing.T) {
t.Error(err) input := `[true, "0x0", "0x2"]`
args := new(GetStorageAtArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetStorageAtArgsKeyNotString(t *testing.T) {
input := `["0x407d73d8a49eeb85d32cf465507dd71d507100c1", true, "0x2"]`
args := new(GetStorageAtArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetStorageAtArgsValueNotString(t *testing.T) {
input := `["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "0x1", true]`
args := new(GetStorageAtArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetTxCountArgs(t *testing.T) {
input := `["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "pending"]`
expected := new(GetTxCountArgs)
expected.Address = "0x407d73d8a49eeb85d32cf465507dd71d507100c1"
expected.BlockNumber = -2
args := new(GetTxCountArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err)
} }
if expected.Address != args.Address { if expected.Address != args.Address {
...@@ -350,9 +701,39 @@ func TestGetTxCountEmptyArgs(t *testing.T) { ...@@ -350,9 +701,39 @@ func TestGetTxCountEmptyArgs(t *testing.T) {
input := `[]` input := `[]`
args := new(GetTxCountArgs) args := new(GetTxCountArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if err == nil { if len(str) > 0 {
t.Error("Expected error but didn't get one") t.Error(str)
}
}
func TestGetTxCountEmptyArgsInvalid(t *testing.T) {
input := `false`
args := new(GetTxCountArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetTxCountAddressNotString(t *testing.T) {
input := `[false, "pending"]`
args := new(GetTxCountArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetTxCountBlockheightInvalid(t *testing.T) {
input := `["0x407d73d8a49eeb85d32cf465507dd71d507100c1", {}]`
args := new(GetTxCountArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
} }
} }
...@@ -367,10 +748,6 @@ func TestGetDataArgs(t *testing.T) { ...@@ -367,10 +748,6 @@ func TestGetDataArgs(t *testing.T) {
t.Error(err) t.Error(err)
} }
if err := args.requirements(); err != nil {
t.Error(err)
}
if expected.Address != args.Address { if expected.Address != args.Address {
t.Errorf("Address shoud be %#v but is %#v", expected.Address, args.Address) t.Errorf("Address shoud be %#v but is %#v", expected.Address, args.Address)
} }
...@@ -380,13 +757,43 @@ func TestGetDataArgs(t *testing.T) { ...@@ -380,13 +757,43 @@ func TestGetDataArgs(t *testing.T) {
} }
} }
func TestGetDataEmptyArgs(t *testing.T) { func TestGetDataArgsEmpty(t *testing.T) {
input := `[]` input := `[]`
args := new(GetDataArgs) args := new(GetDataArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if err == nil { if len(str) > 0 {
t.Error("Expected error but didn't get one") t.Error(str)
}
}
func TestGetDataArgsInvalid(t *testing.T) {
input := `{}`
args := new(GetDataArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetDataArgsAddressNotString(t *testing.T) {
input := `[12, "latest"]`
args := new(GetDataArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestGetDataArgsBlocknumberNotString(t *testing.T) {
input := `["0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", false]`
args := new(GetDataArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
} }
} }
...@@ -397,14 +804,23 @@ func TestBlockFilterArgs(t *testing.T) { ...@@ -397,14 +804,23 @@ func TestBlockFilterArgs(t *testing.T) {
"limit": "0x3", "limit": "0x3",
"offset": "0x0", "offset": "0x0",
"address": "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", "address": "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8",
"topics": ["0x12341234"]}]` "topics":
[
["0xAA", "0xBB"],
["0xCC", "0xDD"]
]
}]`
expected := new(BlockFilterArgs) expected := new(BlockFilterArgs)
expected.Earliest = 1 expected.Earliest = 1
expected.Latest = 2 expected.Latest = 2
expected.Max = 3 expected.Max = 3
expected.Skip = 0 expected.Skip = 0
expected.Address = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8" expected.Address = []string{"0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"}
// expected.Topics = []string{"0x12341234"} expected.Topics = [][]string{
[]string{"0xAA", "0xBB"},
[]string{"0xCC", "0xDD"},
}
args := new(BlockFilterArgs) args := new(BlockFilterArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil { if err := json.Unmarshal([]byte(input), &args); err != nil {
...@@ -427,13 +843,70 @@ func TestBlockFilterArgs(t *testing.T) { ...@@ -427,13 +843,70 @@ func TestBlockFilterArgs(t *testing.T) {
t.Errorf("Skip shoud be %#v but is %#v", expected.Skip, args.Skip) t.Errorf("Skip shoud be %#v but is %#v", expected.Skip, args.Skip)
} }
if expected.Address != args.Address { if expected.Address[0] != args.Address[0] {
t.Errorf("Address shoud be %#v but is %#v", expected.Address, args.Address) t.Errorf("Address shoud be %#v but is %#v", expected.Address, args.Address)
} }
// if expected.Topics != args.Topics { if expected.Topics[0][0] != args.Topics[0][0] {
// t.Errorf("Topic shoud be %#v but is %#v", expected.Topic, args.Topic) t.Errorf("Topics shoud be %#v but is %#v", expected.Topics, args.Topics)
// } }
if expected.Topics[0][1] != args.Topics[0][1] {
t.Errorf("Topics shoud be %#v but is %#v", expected.Topics, args.Topics)
}
if expected.Topics[1][0] != args.Topics[1][0] {
t.Errorf("Topics shoud be %#v but is %#v", expected.Topics, args.Topics)
}
if expected.Topics[1][1] != args.Topics[1][1] {
t.Errorf("Topics shoud be %#v but is %#v", expected.Topics, args.Topics)
}
}
func TestBlockFilterArgsDefaults(t *testing.T) {
input := `[{
"address": ["0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"],
"topics": ["0xAA","0xBB"]
}]`
expected := new(BlockFilterArgs)
expected.Earliest = -1
expected.Latest = -1
expected.Max = 100
expected.Skip = 0
expected.Address = []string{"0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"}
expected.Topics = [][]string{[]string{"0xAA"}, []string{"0xBB"}}
args := new(BlockFilterArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err)
}
if expected.Earliest != args.Earliest {
t.Errorf("Earliest shoud be %#v but is %#v", expected.Earliest, args.Earliest)
}
if expected.Latest != args.Latest {
t.Errorf("Latest shoud be %#v but is %#v", expected.Latest, args.Latest)
}
if expected.Max != args.Max {
t.Errorf("Max shoud be %#v but is %#v", expected.Max, args.Max)
}
if expected.Skip != args.Skip {
t.Errorf("Skip shoud be %#v but is %#v", expected.Skip, args.Skip)
}
if expected.Address[0] != args.Address[0] {
t.Errorf("Address shoud be %#v but is %#v", expected.Address, args.Address)
}
if expected.Topics[0][0] != args.Topics[0][0] {
t.Errorf("Topics shoud be %#v but is %#v", expected.Topics, args.Topics)
}
if expected.Topics[1][0] != args.Topics[1][0] {
t.Errorf("Topics shoud be %#v but is %#v", expected.Topics, args.Topics)
}
} }
func TestBlockFilterArgsWords(t *testing.T) { func TestBlockFilterArgsWords(t *testing.T) {
...@@ -459,21 +932,40 @@ func TestBlockFilterArgsWords(t *testing.T) { ...@@ -459,21 +932,40 @@ func TestBlockFilterArgsWords(t *testing.T) {
} }
} }
func TestBlockFilterArgsNums(t *testing.T) { func TestBlockFilterArgsInvalid(t *testing.T) {
input := `{}`
args := new(BlockFilterArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockFilterArgsFromBool(t *testing.T) {
input := `[{ input := `[{
"fromBlock": 2, "fromBlock": true,
"toBlock": 3 "toBlock": "pending"
}]` }]`
args := new(BlockFilterArgs) args := new(BlockFilterArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
switch err.(type) { if len(str) > 0 {
case *DecodeParamError: t.Error(str)
break
default:
t.Errorf("Should have *DecodeParamError but instead have %T", err)
} }
}
func TestBlockFilterArgsToBool(t *testing.T) {
input := `[{
"fromBlock": "pending",
"toBlock": true
}]`
args := new(BlockFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
} }
func TestBlockFilterArgsEmptyArgs(t *testing.T) { func TestBlockFilterArgsEmptyArgs(t *testing.T) {
...@@ -486,6 +978,112 @@ func TestBlockFilterArgsEmptyArgs(t *testing.T) { ...@@ -486,6 +978,112 @@ func TestBlockFilterArgsEmptyArgs(t *testing.T) {
} }
} }
func TestBlockFilterArgsLimitInvalid(t *testing.T) {
input := `[{"limit": false}]`
args := new(BlockFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockFilterArgsOffsetInvalid(t *testing.T) {
input := `[{"offset": true}]`
args := new(BlockFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockFilterArgsAddressInt(t *testing.T) {
input := `[{
"address": 1,
"topics": "0x12341234"}]`
args := new(BlockFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockFilterArgsAddressSliceInt(t *testing.T) {
input := `[{
"address": [1],
"topics": "0x12341234"}]`
args := new(BlockFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockFilterArgsTopicInt(t *testing.T) {
input := `[{
"address": ["0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"],
"topics": 1}]`
args := new(BlockFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockFilterArgsTopicSliceInt(t *testing.T) {
input := `[{
"address": "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8",
"topics": [1]}]`
args := new(BlockFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockFilterArgsTopicSliceInt2(t *testing.T) {
input := `[{
"address": "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8",
"topics": ["0xAA", [1]]}]`
args := new(BlockFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockFilterArgsTopicComplex(t *testing.T) {
input := `[{
"address": "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8",
"topics": ["0xAA", ["0xBB", "0xCC"]]
}]`
args := new(BlockFilterArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err)
fmt.Printf("%v\n", args)
return
}
if args.Topics[0][0] != "0xAA" {
t.Errorf("Topic should be %s but is %s", "0xAA", args.Topics[0][0])
}
if args.Topics[1][0] != "0xBB" {
t.Errorf("Topic should be %s but is %s", "0xBB", args.Topics[0][0])
}
if args.Topics[1][1] != "0xCC" {
t.Errorf("Topic should be %s but is %s", "0xCC", args.Topics[0][0])
}
}
func TestDbArgs(t *testing.T) { func TestDbArgs(t *testing.T) {
input := `["testDB","myKey","0xbeef"]` input := `["testDB","myKey","0xbeef"]`
expected := new(DbArgs) expected := new(DbArgs)
...@@ -515,6 +1113,84 @@ func TestDbArgs(t *testing.T) { ...@@ -515,6 +1113,84 @@ func TestDbArgs(t *testing.T) {
} }
} }
func TestDbArgsInvalid(t *testing.T) {
input := `{}`
args := new(DbArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbArgsEmpty(t *testing.T) {
input := `[]`
args := new(DbArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbArgsDatabaseType(t *testing.T) {
input := `[true, "keyval", "valval"]`
args := new(DbArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbArgsKeyType(t *testing.T) {
input := `["dbval", 3, "valval"]`
args := new(DbArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbArgsValType(t *testing.T) {
input := `["dbval", "keyval", {}]`
args := new(DbArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbArgsDatabaseEmpty(t *testing.T) {
input := `["", "keyval", "valval"]`
args := new(DbArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err.Error())
}
str := ExpectValidationError(args.requirements())
if len(str) > 0 {
t.Error(str)
}
}
func TestDbArgsKeyEmpty(t *testing.T) {
input := `["dbval", "", "valval"]`
args := new(DbArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err.Error())
}
str := ExpectValidationError(args.requirements())
if len(str) > 0 {
t.Error(str)
}
}
func TestDbHexArgs(t *testing.T) { func TestDbHexArgs(t *testing.T) {
input := `["testDB","myKey","0xbeef"]` input := `["testDB","myKey","0xbeef"]`
expected := new(DbHexArgs) expected := new(DbHexArgs)
...@@ -544,6 +1220,84 @@ func TestDbHexArgs(t *testing.T) { ...@@ -544,6 +1220,84 @@ func TestDbHexArgs(t *testing.T) {
} }
} }
func TestDbHexArgsInvalid(t *testing.T) {
input := `{}`
args := new(DbHexArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbHexArgsEmpty(t *testing.T) {
input := `[]`
args := new(DbHexArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbHexArgsDatabaseType(t *testing.T) {
input := `[true, "keyval", "valval"]`
args := new(DbHexArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbHexArgsKeyType(t *testing.T) {
input := `["dbval", 3, "valval"]`
args := new(DbHexArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbHexArgsValType(t *testing.T) {
input := `["dbval", "keyval", {}]`
args := new(DbHexArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestDbHexArgsDatabaseEmpty(t *testing.T) {
input := `["", "keyval", "valval"]`
args := new(DbHexArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err.Error())
}
str := ExpectValidationError(args.requirements())
if len(str) > 0 {
t.Error(str)
}
}
func TestDbHexArgsKeyEmpty(t *testing.T) {
input := `["dbval", "", "valval"]`
args := new(DbHexArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err.Error())
}
str := ExpectValidationError(args.requirements())
if len(str) > 0 {
t.Error(str)
}
}
func TestWhisperMessageArgs(t *testing.T) { func TestWhisperMessageArgs(t *testing.T) {
input := `[{"from":"0xc931d93e97ab07fe42d923478ba2465f2", input := `[{"from":"0xc931d93e97ab07fe42d923478ba2465f2",
"topics": ["0x68656c6c6f20776f726c64"], "topics": ["0x68656c6c6f20776f726c64"],
...@@ -556,7 +1310,7 @@ func TestWhisperMessageArgs(t *testing.T) { ...@@ -556,7 +1310,7 @@ func TestWhisperMessageArgs(t *testing.T) {
expected.Payload = "0x68656c6c6f20776f726c64" expected.Payload = "0x68656c6c6f20776f726c64"
expected.Priority = 100 expected.Priority = 100
expected.Ttl = 100 expected.Ttl = 100
expected.Topics = []string{"0x68656c6c6f20776f726c64"} // expected.Topics = []string{"0x68656c6c6f20776f726c64"}
args := new(WhisperMessageArgs) args := new(WhisperMessageArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil { if err := json.Unmarshal([]byte(input), &args); err != nil {
...@@ -588,6 +1342,96 @@ func TestWhisperMessageArgs(t *testing.T) { ...@@ -588,6 +1342,96 @@ func TestWhisperMessageArgs(t *testing.T) {
// } // }
} }
func TestWhisperMessageArgsInt(t *testing.T) {
input := `[{"from":"0xc931d93e97ab07fe42d923478ba2465f2",
"topics": ["0x68656c6c6f20776f726c64"],
"payload":"0x68656c6c6f20776f726c64",
"ttl": 12,
"priority": 16}]`
expected := new(WhisperMessageArgs)
expected.From = "0xc931d93e97ab07fe42d923478ba2465f2"
expected.To = ""
expected.Payload = "0x68656c6c6f20776f726c64"
expected.Priority = 16
expected.Ttl = 12
// expected.Topics = []string{"0x68656c6c6f20776f726c64"}
args := new(WhisperMessageArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {
t.Error(err)
}
if expected.From != args.From {
t.Errorf("From shoud be %#v but is %#v", expected.From, args.From)
}
if expected.To != args.To {
t.Errorf("To shoud be %#v but is %#v", expected.To, args.To)
}
if expected.Payload != args.Payload {
t.Errorf("Value shoud be %#v but is %#v", expected.Payload, args.Payload)
}
if expected.Ttl != args.Ttl {
t.Errorf("Ttl shoud be %v but is %v", expected.Ttl, args.Ttl)
}
if expected.Priority != args.Priority {
t.Errorf("Priority shoud be %v but is %v", expected.Priority, args.Priority)
}
// if expected.Topics != args.Topics {
// t.Errorf("Topic shoud be %#v but is %#v", expected.Topic, args.Topic)
// }
}
func TestWhisperMessageArgsInvalid(t *testing.T) {
input := `{}`
args := new(WhisperMessageArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestWhisperMessageArgsEmpty(t *testing.T) {
input := `[]`
args := new(WhisperMessageArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestWhisperMessageArgsTtlBool(t *testing.T) {
input := `[{"from":"0xc931d93e97ab07fe42d923478ba2465f2",
"topics": ["0x68656c6c6f20776f726c64"],
"payload":"0x68656c6c6f20776f726c64",
"ttl": true,
"priority": "0x64"}]`
args := new(WhisperMessageArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestWhisperMessageArgsPriorityBool(t *testing.T) {
input := `[{"from":"0xc931d93e97ab07fe42d923478ba2465f2",
"topics": ["0x68656c6c6f20776f726c64"],
"payload":"0x68656c6c6f20776f726c64",
"ttl": "0x12",
"priority": true}]`
args := new(WhisperMessageArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestFilterIdArgs(t *testing.T) { func TestFilterIdArgs(t *testing.T) {
input := `["0x7"]` input := `["0x7"]`
expected := new(FilterIdArgs) expected := new(FilterIdArgs)
...@@ -603,10 +1447,39 @@ func TestFilterIdArgs(t *testing.T) { ...@@ -603,10 +1447,39 @@ func TestFilterIdArgs(t *testing.T) {
} }
} }
func TestWhsiperFilterArgs(t *testing.T) { func TestFilterIdArgsInvalid(t *testing.T) {
input := `{}`
args := new(FilterIdArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Errorf(str)
}
}
func TestFilterIdArgsEmpty(t *testing.T) {
input := `[]`
args := new(FilterIdArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Errorf(str)
}
}
func TestFilterIdArgsBool(t *testing.T) {
input := `[true]`
args := new(FilterIdArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Errorf(str)
}
}
func TestWhisperFilterArgs(t *testing.T) {
input := `[{"topics": ["0x68656c6c6f20776f726c64"], "to": "0x34ag445g3455b34"}]` input := `[{"topics": ["0x68656c6c6f20776f726c64"], "to": "0x34ag445g3455b34"}]`
expected := new(WhisperFilterArgs) expected := new(WhisperFilterArgs)
expected.From = ""
expected.To = "0x34ag445g3455b34" expected.To = "0x34ag445g3455b34"
expected.Topics = []string{"0x68656c6c6f20776f726c64"} expected.Topics = []string{"0x68656c6c6f20776f726c64"}
...@@ -615,10 +1488,6 @@ func TestWhsiperFilterArgs(t *testing.T) { ...@@ -615,10 +1488,6 @@ func TestWhsiperFilterArgs(t *testing.T) {
t.Error(err) t.Error(err)
} }
if expected.From != args.From {
t.Errorf("From shoud be %#v but is %#v", expected.From, args.From)
}
if expected.To != args.To { if expected.To != args.To {
t.Errorf("To shoud be %#v but is %#v", expected.To, args.To) t.Errorf("To shoud be %#v but is %#v", expected.To, args.To)
} }
...@@ -628,6 +1497,46 @@ func TestWhsiperFilterArgs(t *testing.T) { ...@@ -628,6 +1497,46 @@ func TestWhsiperFilterArgs(t *testing.T) {
// } // }
} }
func TestWhisperFilterArgsInvalid(t *testing.T) {
input := `{}`
args := new(WhisperFilterArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestWhisperFilterArgsEmpty(t *testing.T) {
input := `[]`
args := new(WhisperFilterArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestWhisperFilterArgsToBool(t *testing.T) {
input := `[{"topics": ["0x68656c6c6f20776f726c64"], "to": false}]`
args := new(WhisperFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestWhisperFilterArgsTopicInt(t *testing.T) {
input := `[{"topics": [6], "to": "0x34ag445g3455b34"}]`
args := new(WhisperFilterArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestCompileArgs(t *testing.T) { func TestCompileArgs(t *testing.T) {
input := `["contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"]` input := `["contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"]`
expected := new(CompileArgs) expected := new(CompileArgs)
...@@ -643,6 +1552,36 @@ func TestCompileArgs(t *testing.T) { ...@@ -643,6 +1552,36 @@ func TestCompileArgs(t *testing.T) {
} }
} }
func TestCompileArgsInvalid(t *testing.T) {
input := `{}`
args := new(CompileArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestCompileArgsEmpty(t *testing.T) {
input := `[]`
args := new(CompileArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestCompileArgsBool(t *testing.T) {
input := `[false]`
args := new(CompileArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestFilterStringArgs(t *testing.T) { func TestFilterStringArgs(t *testing.T) {
input := `["pending"]` input := `["pending"]`
expected := new(FilterStringArgs) expected := new(FilterStringArgs)
...@@ -653,10 +1592,6 @@ func TestFilterStringArgs(t *testing.T) { ...@@ -653,10 +1592,6 @@ func TestFilterStringArgs(t *testing.T) {
t.Error(err) t.Error(err)
} }
if err := args.requirements(); err != nil {
t.Error(err)
}
if expected.Word != args.Word { if expected.Word != args.Word {
t.Errorf("Word shoud be %#v but is %#v", expected.Word, args.Word) t.Errorf("Word shoud be %#v but is %#v", expected.Word, args.Word)
} }
...@@ -666,9 +1601,39 @@ func TestFilterStringEmptyArgs(t *testing.T) { ...@@ -666,9 +1601,39 @@ func TestFilterStringEmptyArgs(t *testing.T) {
input := `[]` input := `[]`
args := new(FilterStringArgs) args := new(FilterStringArgs)
err := json.Unmarshal([]byte(input), &args) str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if err == nil { if len(str) > 0 {
t.Error("Expected error but didn't get one") t.Errorf(str)
}
}
func TestFilterStringInvalidArgs(t *testing.T) {
input := `{}`
args := new(FilterStringArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Errorf(str)
}
}
func TestFilterStringWordInt(t *testing.T) {
input := `[7]`
args := new(FilterStringArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Errorf(str)
}
}
func TestFilterStringWordWrong(t *testing.T) {
input := `["foo"]`
args := new(FilterStringArgs)
str := ExpectValidationError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Errorf(str)
} }
} }
...@@ -687,6 +1652,36 @@ func TestWhisperIdentityArgs(t *testing.T) { ...@@ -687,6 +1652,36 @@ func TestWhisperIdentityArgs(t *testing.T) {
} }
} }
func TestWhisperIdentityArgsInvalid(t *testing.T) {
input := `{}`
args := new(WhisperIdentityArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Errorf(str)
}
}
func TestWhisperIdentityArgsEmpty(t *testing.T) {
input := `[]`
args := new(WhisperIdentityArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Errorf(str)
}
}
func TestWhisperIdentityArgsInt(t *testing.T) {
input := `[4]`
args := new(WhisperIdentityArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Errorf(str)
}
}
func TestBlockNumIndexArgs(t *testing.T) { func TestBlockNumIndexArgs(t *testing.T) {
input := `["0x29a", "0x0"]` input := `["0x29a", "0x0"]`
expected := new(BlockNumIndexArgs) expected := new(BlockNumIndexArgs)
...@@ -707,6 +1702,46 @@ func TestBlockNumIndexArgs(t *testing.T) { ...@@ -707,6 +1702,46 @@ func TestBlockNumIndexArgs(t *testing.T) {
} }
} }
func TestBlockNumIndexArgsEmpty(t *testing.T) {
input := `[]`
args := new(BlockNumIndexArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockNumIndexArgsInvalid(t *testing.T) {
input := `"foo"`
args := new(BlockNumIndexArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockNumIndexArgsBlocknumInvalid(t *testing.T) {
input := `[{}, "0x1"]`
args := new(BlockNumIndexArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockNumIndexArgsIndexInvalid(t *testing.T) {
input := `["0x29a", 1]`
args := new(BlockNumIndexArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestHashIndexArgs(t *testing.T) { func TestHashIndexArgs(t *testing.T) {
input := `["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "0x1"]` input := `["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "0x1"]`
expected := new(HashIndexArgs) expected := new(HashIndexArgs)
...@@ -727,12 +1762,52 @@ func TestHashIndexArgs(t *testing.T) { ...@@ -727,12 +1762,52 @@ func TestHashIndexArgs(t *testing.T) {
} }
} }
func TestHashIndexArgsEmpty(t *testing.T) {
input := `[]`
args := new(HashIndexArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestHashIndexArgsInvalid(t *testing.T) {
input := `{}`
args := new(HashIndexArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestHashIndexArgsInvalidHash(t *testing.T) {
input := `[7, "0x1"]`
args := new(HashIndexArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestHashIndexArgsInvalidIndex(t *testing.T) {
input := `["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", false]`
args := new(HashIndexArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
if len(str) > 0 {
t.Error(str)
}
}
func TestSubmitWorkArgs(t *testing.T) { func TestSubmitWorkArgs(t *testing.T) {
input := `["0x0000000000000001", "0x1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000"]` input := `["0x0000000000000001", "0x1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000"]`
expected := new(SubmitWorkArgs) expected := new(SubmitWorkArgs)
expected.Nonce = 1 expected.Nonce = 1
expected.Header = common.HexToHash("0x1234567890abcdef1234567890abcdef") expected.Header = "0x1234567890abcdef1234567890abcdef"
expected.Digest = common.HexToHash("0xD1GE5700000000000000000000000000") expected.Digest = "0xD1GE5700000000000000000000000000"
args := new(SubmitWorkArgs) args := new(SubmitWorkArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil { if err := json.Unmarshal([]byte(input), &args); err != nil {
...@@ -751,3 +1826,60 @@ func TestSubmitWorkArgs(t *testing.T) { ...@@ -751,3 +1826,60 @@ func TestSubmitWorkArgs(t *testing.T) {
t.Errorf("Digest shoud be %#v but is %#v", expected.Digest, args.Digest) t.Errorf("Digest shoud be %#v but is %#v", expected.Digest, args.Digest)
} }
} }
func TestSubmitWorkArgsInvalid(t *testing.T) {
input := `{}`
args := new(SubmitWorkArgs)
str := ExpectDecodeParamError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestSubmitWorkArgsEmpty(t *testing.T) {
input := `[]`
args := new(SubmitWorkArgs)
str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestSubmitWorkArgsNonceInt(t *testing.T) {
input := `[1, "0x1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000"]`
args := new(SubmitWorkArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestSubmitWorkArgsHeaderInt(t *testing.T) {
input := `["0x0000000000000001", 1, "0xD1GE5700000000000000000000000000"]`
args := new(SubmitWorkArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestSubmitWorkArgsDigestInt(t *testing.T) {
input := `["0x0000000000000001", "0x1234567890abcdef1234567890abcdef", 1]`
args := new(SubmitWorkArgs)
str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
if len(str) > 0 {
t.Error(str)
}
}
func TestBlockHeightFromJsonInvalid(t *testing.T) {
var num int64
var msg json.RawMessage = []byte(`}{`)
str := ExpectDecodeParamError(blockHeightFromJson(msg, &num))
if len(str) > 0 {
t.Error(str)
}
}
...@@ -21,6 +21,22 @@ import ( ...@@ -21,6 +21,22 @@ import (
"fmt" "fmt"
) )
type InvalidTypeError struct {
method string
msg string
}
func (e *InvalidTypeError) Error() string {
return fmt.Sprintf("invalid type on field %s: %s", e.method, e.msg)
}
func NewInvalidTypeError(method, msg string) *InvalidTypeError {
return &InvalidTypeError{
method: method,
msg: msg,
}
}
type InsufficientParamsError struct { type InsufficientParamsError struct {
have int have int
want int want int
......
...@@ -4,6 +4,15 @@ import ( ...@@ -4,6 +4,15 @@ import (
"testing" "testing"
) )
func TestInvalidTypeError(t *testing.T) {
err := NewInvalidTypeError("testField", "not string")
expected := "invalid type on field testField: not string"
if err.Error() != expected {
t.Error(err.Error())
}
}
func TestInsufficientParamsError(t *testing.T) { func TestInsufficientParamsError(t *testing.T) {
err := NewInsufficientParamsError(0, 1) err := NewInsufficientParamsError(0, 1)
expected := "insufficient params, want 1 have 0" expected := "insufficient params, want 1 have 0"
......
...@@ -110,6 +110,24 @@ func (self *XEth) stop() { ...@@ -110,6 +110,24 @@ func (self *XEth) stop() {
close(self.quit) close(self.quit)
} }
func cAddress(a []string) []common.Address {
bslice := make([]common.Address, len(a))
for i, addr := range a {
bslice[i] = common.HexToAddress(addr)
}
return bslice
}
func cTopics(t [][]string) [][]common.Hash {
topics := make([][]common.Hash, len(t))
for i, iv := range t {
for j, jv := range iv {
topics[i][j] = common.HexToHash(jv)
}
}
return topics
}
func (self *XEth) DefaultGas() *big.Int { return defaultGas } func (self *XEth) DefaultGas() *big.Int { return defaultGas }
func (self *XEth) DefaultGasPrice() *big.Int { return defaultGasPrice } func (self *XEth) DefaultGasPrice() *big.Int { return defaultGasPrice }
...@@ -228,15 +246,15 @@ func (self *XEth) IsMining() bool { ...@@ -228,15 +246,15 @@ func (self *XEth) IsMining() bool {
} }
func (self *XEth) EthVersion() string { func (self *XEth) EthVersion() string {
return string(self.backend.EthVersion()) return fmt.Sprintf("%d", self.backend.EthVersion())
} }
func (self *XEth) NetworkVersion() string { func (self *XEth) NetworkVersion() string {
return string(self.backend.NetVersion()) return fmt.Sprintf("%d", self.backend.NetVersion())
} }
func (self *XEth) WhisperVersion() string { func (self *XEth) WhisperVersion() string {
return string(self.backend.ShhVersion()) return fmt.Sprintf("%d", self.backend.ShhVersion())
} }
func (self *XEth) ClientVersion() string { func (self *XEth) ClientVersion() string {
...@@ -301,10 +319,15 @@ func (self *XEth) SecretToAddress(key string) string { ...@@ -301,10 +319,15 @@ func (self *XEth) SecretToAddress(key string) string {
return common.ToHex(pair.Address()) return common.ToHex(pair.Address())
} }
func (self *XEth) RegisterFilter(args *core.FilterOptions) int { func (self *XEth) RegisterFilter(earliest, latest int64, skip, max int, address []string, topics [][]string) int {
var id int var id int
filter := core.NewFilter(self.backend) filter := core.NewFilter(self.backend)
filter.SetOptions(args) filter.SetEarliestBlock(earliest)
filter.SetLatestBlock(latest)
filter.SetSkip(skip)
filter.SetMax(max)
filter.SetAddress(cAddress(address))
filter.SetTopics(cTopics(topics))
filter.LogsCallback = func(logs state.Logs) { filter.LogsCallback = func(logs state.Logs) {
self.logMut.Lock() self.logMut.Lock()
defer self.logMut.Unlock() defer self.logMut.Unlock()
...@@ -380,9 +403,14 @@ func (self *XEth) Logs(id int) state.Logs { ...@@ -380,9 +403,14 @@ func (self *XEth) Logs(id int) state.Logs {
return nil return nil
} }
func (self *XEth) AllLogs(args *core.FilterOptions) state.Logs { func (self *XEth) AllLogs(earliest, latest int64, skip, max int, address []string, topics [][]string) state.Logs {
filter := core.NewFilter(self.backend) filter := core.NewFilter(self.backend)
filter.SetOptions(args) filter.SetEarliestBlock(earliest)
filter.SetLatestBlock(latest)
filter.SetSkip(skip)
filter.SetMax(max)
filter.SetAddress(cAddress(address))
filter.SetTopics(cTopics(topics))
return filter.Find() return filter.Find()
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment