6f08ca8a8a
The unmarshaller for the GetAddressBalanceCmd was calling the wrong parse function. It wasn't caught by the tests because the error on UnmarshalJSON was being ignored, so this commit also updates the tests to check the error.
359 lines
7.6 KiB
Go
359 lines
7.6 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.
|
|
if err := c.UnmarshalJSON(mc); err != nil {
|
|
t.Errorf("%s: error while unmarshalling: %v", test.name,
|
|
err)
|
|
}
|
|
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))
|
|
}
|
|
}
|
|
}
|