Add a framewowrk for parsing and creating json commands.

Initial prototype for one command mostly from jrick, with discussion
with me and jcv.  Other commands mocked up in a couple of long boring days by
yours truly.

Code isn't fully tested yet so may well still be buggy in the type conversions.
Test will be added over the next few days to get this up to snuff.
This commit is contained in:
Owain G. Ainsworth 2013-10-22 15:12:12 +01:00
parent cbd3d730a9
commit 6227c446d3
2 changed files with 6657 additions and 0 deletions

6464
jsoncmd.go Normal file

File diff suppressed because it is too large Load diff

193
jsoncmd_test.go Normal file
View file

@ -0,0 +1,193 @@
// Copyright (c) 2013 Conformal Systems LLC.
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.
// this has to be in the real json subpackage so we can mock up structs
package btcjson
import (
"encoding/json"
"github.com/davecgh/go-spew/spew"
"reflect"
"testing"
)
var jsoncmdtests = []struct {
name string
f func() (Cmd, error)
result Cmd // after marshal and unmarshal
}{
{
name: "basic addmultisigaddress",
f: func() (Cmd, error) {
return NewAddMultisigAddressCmd(float64(1), 1,
[]string{"foo", "bar"})
},
result: &AddMultisigAddressCmd{
id: float64(1),
NRequired: 1,
Keys: []string{"foo", "bar"},
Account: "",
},
},
{
name: "addmultisigaddress + optional",
f: func() (Cmd, error) {
return NewAddMultisigAddressCmd(float64(1), 1,
[]string{"foo", "bar"}, "address")
},
result: &AddMultisigAddressCmd{
id: float64(1),
NRequired: 1,
Keys: []string{"foo", "bar"},
Account: "address",
},
},
// TODO(oga) Too many arguments to newaddmultisigaddress
{
name: "basic addnode add",
f: func() (Cmd, error) {
return NewAddNodeCmd(float64(1), "address",
"add")
},
result: &AddNodeCmd{
id: float64(1),
Addr: "address",
SubCmd: "add",
},
},
{
name: "basic addnode remoe",
f: func() (Cmd, error) {
return NewAddNodeCmd(float64(1), "address",
"remove")
},
result: &AddNodeCmd{
id: float64(1),
Addr: "address",
SubCmd: "remove",
},
},
{
name: "basic addnode onetry",
f: func() (Cmd, error) {
return NewAddNodeCmd(float64(1), "address",
"onetry")
},
result: &AddNodeCmd{
id: float64(1),
Addr: "address",
SubCmd: "onetry",
},
},
// TODO(oga) try invalid subcmds
{
name: "basic backupwallet",
f: func() (Cmd, error) {
return NewBackupWalletCmd(float64(1), "destination")
},
result: &BackupWalletCmd{
id: float64(1),
Destination: "destination",
},
},
{
name: "basic createmultisig",
f: func() (Cmd, error) {
return NewCreateMultisigCmd(float64(1), 1,
[]string{"key1", "key2", "key3"})
},
result: &CreateMultisigCmd{
id: float64(1),
NRequired: 1,
Keys: []string{"key1", "key2", "key3"},
},
},
{
name: "basic createrawtransaction",
f: func() (Cmd, error) {
return NewCreateRawTransactionCmd(float64(1),
[]TransactionInput{
TransactionInput{Txid: "tx1", Vout: 1},
TransactionInput{Txid: "tx2", Vout: 3}},
map[string]int64{"bob": 1, "bill": 2})
},
result: &CreateRawTransactionCmd{
id: float64(1),
Inputs: []TransactionInput{
TransactionInput{Txid: "tx1", Vout: 1},
TransactionInput{Txid: "tx2", Vout: 3},
},
Amounts: map[string]int64{
"bob": 1,
"bill": 2,
},
},
},
{
name: "basic ping",
f: func() (Cmd, error) {
return NewPingCmd(float64(1))
},
result: &PingCmd{
id: float64(1),
},
},
{
name: "basic getblockcount",
f: func() (Cmd, error) {
return NewGetBlockCountCmd(float64(1))
},
result: &GetBlockCountCmd{
id: float64(1),
},
},
{
name: "basic getblock",
f: func() (Cmd, error) {
return NewGetBlockCmd(float64(1),
"somehash")
},
result: &GetBlockCmd{
id: float64(1),
Hash: "somehash",
},
},
}
func TestCmds(t *testing.T) {
for _, test := range jsoncmdtests {
c, err := test.f()
if err != nil {
t.Errorf("%s: failed to run func: %v",
test.name, err)
continue
}
msg, err := json.Marshal(c)
if err != nil {
t.Errorf("%s: failed to marshal cmd: %v",
test.name, err)
continue
}
c2, err := ParseMarshaledCmd(msg)
if err != nil {
t.Errorf("%s: failed to ummarshal cmd: %v",
test.name, err)
continue
}
if !reflect.DeepEqual(test.result, c2) {
t.Errorf("%s: unmarshal not as expected. "+
"got %v wanted %v", test.name, spew.Sdump(c2),
spew.Sdump(test.result))
}
if !reflect.DeepEqual(c, c2) {
t.Errorf("%s: unmarshal not as we started with. "+
"got %v wanted %v", test.name, spew.Sdump(c2),
spew.Sdump(c))
}
}
}