Feathercoin  0.5.0
P2P Digital Currency
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
rpc_tests.cpp
Go to the documentation of this file.
1 #include <boost/algorithm/string.hpp>
2 #include <boost/foreach.hpp>
3 #include <boost/test/unit_test.hpp>
4 
5 #include "base58.h"
6 #include "util.h"
7 #include "bitcoinrpc.h"
8 
9 using namespace std;
10 using namespace json_spirit;
11 
12 BOOST_AUTO_TEST_SUITE(rpc_tests)
13 
14 static Array
15 createArgs(int nRequired, const char* address1=NULL, const char* address2=NULL)
16 {
17  Array result;
18  result.push_back(nRequired);
19  Array addresses;
20  if (address1) addresses.push_back(address1);
21  if (address2) addresses.push_back(address2);
22  result.push_back(addresses);
23  return result;
24 }
25 
26 BOOST_AUTO_TEST_CASE(rpc_addmultisig)
27 {
28  rpcfn_type addmultisig = tableRPC["addmultisigaddress"]->actor;
29 
30  // old, 65-byte-long:
31  const char address1Hex[] = "0434e3e09f49ea168c5bbf53f877ff4206923858aab7c7e1df25bc263978107c95e35065a27ef6f1b27222db0ec97e0e895eaca603d3ee0d4c060ce3d8a00286c8";
32  // new, compressed:
33  const char address2Hex[] = "0388c2037017c62240b6b72ac1a2a5f94da790596ebd06177c8572752922165cb4";
34 
35  Value v;
36  CBitcoinAddress address;
37  BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex), false));
38  address.SetString(v.get_str());
39  BOOST_CHECK(address.IsValid() && address.IsScript());
40 
41  BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex, address2Hex), false));
42  address.SetString(v.get_str());
43  BOOST_CHECK(address.IsValid() && address.IsScript());
44 
45  BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(2, address1Hex, address2Hex), false));
46  address.SetString(v.get_str());
47  BOOST_CHECK(address.IsValid() && address.IsScript());
48 
49  BOOST_CHECK_THROW(addmultisig(createArgs(0), false), runtime_error);
50  BOOST_CHECK_THROW(addmultisig(createArgs(1), false), runtime_error);
51  BOOST_CHECK_THROW(addmultisig(createArgs(2, address1Hex), false), runtime_error);
52 
53  BOOST_CHECK_THROW(addmultisig(createArgs(1, ""), false), runtime_error);
54  BOOST_CHECK_THROW(addmultisig(createArgs(1, "NotAValidPubkey"), false), runtime_error);
55 
56  string short1(address1Hex, address1Hex+sizeof(address1Hex)-2); // last byte missing
57  BOOST_CHECK_THROW(addmultisig(createArgs(2, short1.c_str()), false), runtime_error);
58 
59  string short2(address1Hex+1, address1Hex+sizeof(address1Hex)); // first byte missing
60  BOOST_CHECK_THROW(addmultisig(createArgs(2, short2.c_str()), false), runtime_error);
61 }
62 
63 static Value CallRPC(string args)
64 {
65  vector<string> vArgs;
66  boost::split(vArgs, args, boost::is_any_of(" \t"));
67  string strMethod = vArgs[0];
68  vArgs.erase(vArgs.begin());
69  Array params = RPCConvertValues(strMethod, vArgs);
70 
71  rpcfn_type method = tableRPC[strMethod]->actor;
72  try {
73  Value result = (*method)(params, false);
74  return result;
75  }
76  catch (Object& objError)
77  {
78  throw runtime_error(find_value(objError, "message").get_str());
79  }
80 }
81 
83 {
84  // Test RPC calls for various wallet statistics
85  Value r;
86 
87  BOOST_CHECK_NO_THROW(CallRPC("listunspent"));
88  BOOST_CHECK_THROW(CallRPC("listunspent string"), runtime_error);
89  BOOST_CHECK_THROW(CallRPC("listunspent 0 string"), runtime_error);
90  BOOST_CHECK_THROW(CallRPC("listunspent 0 1 not_array"), runtime_error);
91  BOOST_CHECK_THROW(CallRPC("listunspent 0 1 [] extra"), runtime_error);
92  BOOST_CHECK_NO_THROW(r=CallRPC("listunspent 0 1 []"));
93  BOOST_CHECK(r.get_array().empty());
94 
95  BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress"));
96  BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress 0"));
97  BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress not_int"), runtime_error);
98  BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress 0 not_bool"), runtime_error);
99  BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress 0 true"));
100  BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress 0 true extra"), runtime_error);
101 
102  BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount"));
103  BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount 0"));
104  BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount not_int"), runtime_error);
105  BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount 0 not_bool"), runtime_error);
106  BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount 0 true"));
107  BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount 0 true extra"), runtime_error);
108 }
109 
110 
111 BOOST_AUTO_TEST_CASE(rpc_rawparams)
112 {
113  // Test raw transaction API argument handling
114  Value r;
115 
116  BOOST_CHECK_THROW(CallRPC("getrawtransaction"), runtime_error);
117  BOOST_CHECK_THROW(CallRPC("getrawtransaction not_hex"), runtime_error);
118  BOOST_CHECK_THROW(CallRPC("getrawtransaction a3b807410df0b60fcb9736768df5823938b2f838694939ba45f3c0a1bff150ed not_int"), runtime_error);
119 
120  BOOST_CHECK_THROW(CallRPC("createrawtransaction"), runtime_error);
121  BOOST_CHECK_THROW(CallRPC("createrawtransaction null null"), runtime_error);
122  BOOST_CHECK_THROW(CallRPC("createrawtransaction not_array"), runtime_error);
123  BOOST_CHECK_THROW(CallRPC("createrawtransaction [] []"), runtime_error);
124  BOOST_CHECK_THROW(CallRPC("createrawtransaction {} {}"), runtime_error);
125  BOOST_CHECK_NO_THROW(CallRPC("createrawtransaction [] {}"));
126  BOOST_CHECK_THROW(CallRPC("createrawtransaction [] {} extra"), runtime_error);
127 
128  BOOST_CHECK_THROW(CallRPC("decoderawtransaction"), runtime_error);
129  BOOST_CHECK_THROW(CallRPC("decoderawtransaction null"), runtime_error);
130  BOOST_CHECK_THROW(CallRPC("decoderawtransaction DEADBEEF"), runtime_error);
131  string rawtx = "0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000";
132  BOOST_CHECK_NO_THROW(r = CallRPC(string("decoderawtransaction ")+rawtx));
133  BOOST_CHECK_EQUAL(find_value(r.get_obj(), "version").get_int(), 1);
134  BOOST_CHECK_EQUAL(find_value(r.get_obj(), "locktime").get_int(), 0);
135  BOOST_CHECK_THROW(r = CallRPC(string("decoderawtransaction ")+rawtx+" extra"), runtime_error);
136 
137  BOOST_CHECK_THROW(CallRPC("signrawtransaction"), runtime_error);
138  BOOST_CHECK_THROW(CallRPC("signrawtransaction null"), runtime_error);
139  BOOST_CHECK_THROW(CallRPC("signrawtransaction ff00"), runtime_error);
140  BOOST_CHECK_NO_THROW(CallRPC(string("signrawtransaction ")+rawtx));
141  BOOST_CHECK_NO_THROW(CallRPC(string("signrawtransaction ")+rawtx+" null null NONE|ANYONECANPAY"));
142  BOOST_CHECK_NO_THROW(CallRPC(string("signrawtransaction ")+rawtx+" [] [] NONE|ANYONECANPAY"));
143  BOOST_CHECK_THROW(CallRPC(string("signrawtransaction ")+rawtx+" null null badenum"), runtime_error);
144 
145  // Only check failure cases for sendrawtransaction, there's no network to send to...
146  BOOST_CHECK_THROW(CallRPC("sendrawtransaction"), runtime_error);
147  BOOST_CHECK_THROW(CallRPC("sendrawtransaction null"), runtime_error);
148  BOOST_CHECK_THROW(CallRPC("sendrawtransaction DEADBEEF"), runtime_error);
149  BOOST_CHECK_THROW(CallRPC(string("sendrawtransaction ")+rawtx+" extra"), runtime_error);
150 }
151 
153 {
154  Value r;
155  // input is a 1-of-2 multisig (so is output):
156  string prevout =
157  "[{\"txid\":\"b4cc287e58f87cdae59417329f710f3ecd75a4ee1d2872b7248f50977c8493f3\","
158  "\"vout\":1,\"scriptPubKey\":\"a914b10c9df5f7edf436c697f02f1efdba4cf399615187\","
159  "\"redeemScript\":\"512103debedc17b3df2badbcdd86d5feb4562b86fe182e5998abd8bcd4f122c6155b1b21027e940bb73ab8732bfdf7f9216ecefca5b94d6df834e77e108f68e66f126044c052ae\"}]";
160  r = CallRPC(string("createrawtransaction ")+prevout+" "+
161  "{\"3HqAe9LtNBjnsfM4CyYaWTnvCaUYT7v4oZ\":11}");
162  string notsigned = r.get_str();
163  string privkey1 = "\"T6hoRM7L8u4f9vHd4eGMAmwV6AMCE11PvYi7YjrdegG223kw64r1\"";
164  string privkey2 = "\"T5Xu6pe5iqQYqXGxhcY2QEFr7NNoVQ5R6A4abpswunCTF9w85g8V\"";
165  r = CallRPC(string("signrawtransaction ")+notsigned+" "+prevout+" "+"[]");
166  BOOST_CHECK(find_value(r.get_obj(), "complete").get_bool() == false);
167  r = CallRPC(string("signrawtransaction ")+notsigned+" "+prevout+" "+"["+privkey1+","+privkey2+"]");
168  BOOST_CHECK(find_value(r.get_obj(), "complete").get_bool() == true);
169 }
170 
171 BOOST_AUTO_TEST_SUITE_END()
const Object & get_obj() const
bool IsValid() const
Definition: base58.h:296
bool IsScript() const
Definition: base58.h:380
Config::Object_type Object
const Array & get_array() const
Array RPCConvertValues(const std::string &strMethod, const std::vector< std::string > &strParams)
Convert parameter values for RPC call from strings to command-specific JSON objects.
Object CallRPC(const string &strMethod, const Array &params)
const Object_type::value_type::Value_type & find_value(const Object_type &obj, const String_type &name)
Config::Array_type Array
const String_type & get_str() const
json_spirit::Value(* rpcfn_type)(const json_spirit::Array &params, bool fHelp)
Definition: bitcoinrpc.h:93
BOOST_AUTO_TEST_CASE(rpc_addmultisig)
Definition: rpc_tests.cpp:26
bool SetString(const char *psz)
Definition: base58.h:206
const CRPCTable tableRPC
std::string get_str(std::string::const_iterator begin, std::string::const_iterator end)