lbcd/cmds_test.go
Dave Collins bfcd7f6790 Update for latest btcjson.RawCmd changes.
This commit modifies all of the commands and notifications to work
properly with the latest btcjson.RawCmd Params field changes.

This new approach is superior to the old method of using a []interface{}
because it means that each parameter is now unmarshalled into the expected
concrete type directly instead of whatever it happens to be in the JSON.

Since it is now preferred to use full blown structs for individual
parameters, the RescanCmd type has been changed to use a new OutPoint
that can be used directly for marshalling and unmarshalling instead of a
*btcwire.OutPoint.

Also, all of the MarshalJSON functions now make use of the new
btcjson.NewRawCmd function rather than repeating the same common field
over and over and all of the MarshalJSON, UnmarshalJSON, and parseX
functions have been made more consistent.

ok @jrick
2014-04-10 21:10:16 -05:00

356 lines
7.5 KiB
Go

// 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 package so we can mock up structs
package btcws
import (
"github.com/conformal/btcdb"
"github.com/conformal/btcjson"
"github.com/davecgh/go-spew/spew"
"reflect"
"testing"
)
var cmdtests = []struct {
name string
f func() (btcjson.Cmd, error)
result btcjson.Cmd // after marshal and unmarshal
}{
{
name: "createencryptedwallet",
f: func() (btcjson.Cmd, error) {
return NewCreateEncryptedWalletCmd(
float64(1),
"banana"), nil
},
result: &CreateEncryptedWalletCmd{
id: float64(1),
Passphrase: "banana",
},
},
{
name: "getaddressbalance no optargs",
f: func() (btcjson.Cmd, error) {
return NewGetAddressBalanceCmd(
float64(1),
"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH")
},
result: &GetAddressBalanceCmd{
id: float64(1),
Address: "17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH",
Minconf: 1,
},
},
{
name: "getaddressbalance one optarg",
f: func() (btcjson.Cmd, error) {
return NewGetAddressBalanceCmd(
float64(1),
"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH",
0)
},
result: &GetAddressBalanceCmd{
id: float64(1),
Address: "17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH",
Minconf: 0,
},
},
{
name: "getbestblock",
f: func() (btcjson.Cmd, error) {
return NewGetBestBlockCmd(float64(1)), nil
},
result: &GetBestBlockCmd{
id: float64(1),
},
},
{
name: "getcurrentnet",
f: func() (btcjson.Cmd, error) {
return NewGetCurrentNetCmd(float64(1)), nil
},
result: &GetCurrentNetCmd{
id: float64(1),
},
},
{
name: "getunconfirmedbalance no optargs",
f: func() (btcjson.Cmd, error) {
return NewGetUnconfirmedBalanceCmd(float64(1))
},
result: &GetUnconfirmedBalanceCmd{
id: float64(1),
Account: "",
},
},
{
name: "getunconfirmedbalance one optarg",
f: func() (btcjson.Cmd, error) {
return NewGetUnconfirmedBalanceCmd(float64(1),
"abcde")
},
result: &GetUnconfirmedBalanceCmd{
id: float64(1),
Account: "abcde",
},
},
{
name: "listaddresstransactions no optargs",
f: func() (btcjson.Cmd, error) {
addrs := []string{
"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH",
}
return NewListAddressTransactionsCmd(
float64(1),
addrs)
},
result: &ListAddressTransactionsCmd{
id: float64(1),
Account: "",
Addresses: []string{
"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH",
},
},
},
{
name: "listaddresstransactions one optarg",
f: func() (btcjson.Cmd, error) {
addrs := []string{
"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH",
}
return NewListAddressTransactionsCmd(
float64(1),
addrs,
"abcde")
},
result: &ListAddressTransactionsCmd{
id: float64(1),
Account: "abcde",
Addresses: []string{
"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH",
},
},
},
{
name: "listalltransactions no optargs",
f: func() (btcjson.Cmd, error) {
return NewListAllTransactionsCmd(float64(1))
},
result: &ListAllTransactionsCmd{
id: float64(1),
Account: "",
},
},
{
name: "listalltransactions one optarg",
f: func() (btcjson.Cmd, error) {
return NewListAllTransactionsCmd(
float64(1),
"abcde")
},
result: &ListAllTransactionsCmd{
id: float64(1),
Account: "abcde",
},
},
{
name: "notifynewtxs",
f: func() (btcjson.Cmd, error) {
addrs := []string{
"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH",
}
return NewNotifyNewTXsCmd(
float64(1),
addrs), nil
},
result: &NotifyNewTXsCmd{
id: float64(1),
Addresses: []string{
"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH",
},
},
},
{
name: "notifyallnewtxs",
f: func() (btcjson.Cmd, error) {
return NewNotifyAllNewTXsCmd(
float64(1),
true)
},
result: &NotifyAllNewTXsCmd{
id: float64(1),
Verbose: true,
},
},
{
name: "notifyspent",
f: func() (btcjson.Cmd, error) {
op := &OutPoint{
Hash: "000102030405060708091011121314" +
"1516171819202122232425262728" +
"293031",
Index: 1,
}
return NewNotifySpentCmd(float64(1), op), nil
},
result: &NotifySpentCmd{
id: float64(1),
OutPoint: &OutPoint{
Hash: "000102030405060708091011121314" +
"1516171819202122232425262728" +
"293031",
Index: 1,
},
},
},
{
name: "rescan no optargs",
f: func() (btcjson.Cmd, error) {
addrs := []string{"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH"}
ops := []OutPoint{
{
Hash: "000102030405060708091011121314" +
"1516171819202122232425262728" +
"293031",
Index: 1,
},
}
return NewRescanCmd(
float64(1),
270000,
addrs,
ops)
},
result: &RescanCmd{
id: float64(1),
BeginBlock: 270000,
Addresses: []string{"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH"},
OutPoints: []OutPoint{
{
Hash: "000102030405060708091011121314" +
"1516171819202122232425262728" +
"293031",
Index: 1,
},
},
EndBlock: btcdb.AllShas,
},
},
{
name: "rescan one optarg",
f: func() (btcjson.Cmd, error) {
addrs := []string{"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH"}
ops := []OutPoint{
{
Hash: "000102030405060708091011121314" +
"1516171819202122232425262728" +
"293031",
Index: 1,
},
}
return NewRescanCmd(
float64(1),
270000,
addrs,
ops,
280000)
},
result: &RescanCmd{
id: float64(1),
BeginBlock: 270000,
Addresses: []string{"17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH"},
OutPoints: []OutPoint{
{
Hash: "000102030405060708091011121314" +
"1516171819202122232425262728" +
"293031",
Index: 1,
},
},
EndBlock: 280000,
},
},
{
name: "walletislocked no optargs",
f: func() (btcjson.Cmd, error) {
return NewWalletIsLockedCmd(float64(1))
},
result: &WalletIsLockedCmd{
id: float64(1),
Account: "",
},
},
{
name: "walletislocked one optarg",
f: func() (btcjson.Cmd, error) {
return NewWalletIsLockedCmd(
float64(1),
"abcde")
},
result: &WalletIsLockedCmd{
id: float64(1),
Account: "abcde",
},
},
}
func TestCmds(t *testing.T) {
for _, test := range cmdtests {
c, err := test.f()
if err != nil {
t.Errorf("%s: failed to run func: %v",
test.name, err)
continue
}
mc, err := c.MarshalJSON()
if err != nil {
t.Errorf("%s: failed to marshal cmd: %v",
test.name, err)
continue
}
c2, err := btcjson.ParseMarshaledCmd(mc)
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))
}
// id from Id func must match result.
if c.Id() != test.result.Id() {
t.Errorf("%s: Id returned incorrect id. "+
"got %v wanted %v", test.name, c.Id(),
test.result.Id())
}
// method from Method func must match result.
if c.Method() != test.result.Method() {
t.Errorf("%s: Method returned incorrect method. "+
"got %v wanted %v", test.name, c.Method(),
test.result.Method())
}
// Read marshaled command back into c. Should still
// match result.
c.UnmarshalJSON(mc)
if !reflect.DeepEqual(test.result, c) {
t.Errorf("%s: unmarshal not as expected. "+
"got %v wanted %v", test.name, spew.Sdump(c),
spew.Sdump(test.result))
}
}
}