Line data Source code
1 : // Copyright (c) 2013-2014 The Bitcoin Core developers
2 : // Distributed under the MIT software license, see the accompanying
3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 :
5 : #include "rpcserver.h"
6 : #include "rpcclient.h"
7 :
8 : #include "base58.h"
9 : #include "main.h"
10 : #include "wallet/wallet.h"
11 :
12 : #include "test/test_bitcoin.h"
13 :
14 : #include <boost/algorithm/string.hpp>
15 : #include <boost/test/unit_test.hpp>
16 :
17 : #include <univalue.h>
18 :
19 : using namespace std;
20 :
21 : extern UniValue createArgs(int nRequired, const char* address1 = NULL, const char* address2 = NULL);
22 : extern UniValue CallRPC(string args);
23 :
24 : extern CWallet* pwalletMain;
25 :
26 1 : BOOST_FIXTURE_TEST_SUITE(rpc_wallet_tests, TestingSetup)
27 :
28 6 : BOOST_AUTO_TEST_CASE(rpc_addmultisig)
29 : {
30 3 : rpcfn_type addmultisig = tableRPC["addmultisigaddress"]->actor;
31 :
32 : // old, 65-byte-long:
33 1 : const char address1Hex[] = "0434e3e09f49ea168c5bbf53f877ff4206923858aab7c7e1df25bc263978107c95e35065a27ef6f1b27222db0ec97e0e895eaca603d3ee0d4c060ce3d8a00286c8";
34 : // new, compressed:
35 1 : const char address2Hex[] = "0388c2037017c62240b6b72ac1a2a5f94da790596ebd06177c8572752922165cb4";
36 :
37 : UniValue v;
38 : CBitcoinAddress address;
39 7 : BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex), false));
40 2 : address.SetString(v.get_str());
41 8 : BOOST_CHECK(address.IsValid() && address.IsScript());
42 :
43 7 : BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex, address2Hex), false));
44 2 : address.SetString(v.get_str());
45 8 : BOOST_CHECK(address.IsValid() && address.IsScript());
46 :
47 7 : BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(2, address1Hex, address2Hex), false));
48 2 : address.SetString(v.get_str());
49 8 : BOOST_CHECK(address.IsValid() && address.IsScript());
50 :
51 9 : BOOST_CHECK_THROW(addmultisig(createArgs(0), false), runtime_error);
52 9 : BOOST_CHECK_THROW(addmultisig(createArgs(1), false), runtime_error);
53 9 : BOOST_CHECK_THROW(addmultisig(createArgs(2, address1Hex), false), runtime_error);
54 :
55 9 : BOOST_CHECK_THROW(addmultisig(createArgs(1, ""), false), runtime_error);
56 9 : BOOST_CHECK_THROW(addmultisig(createArgs(1, "NotAValidPubkey"), false), runtime_error);
57 :
58 2 : string short1(address1Hex, address1Hex + sizeof(address1Hex) - 2); // last byte missing
59 9 : BOOST_CHECK_THROW(addmultisig(createArgs(2, short1.c_str()), false), runtime_error);
60 :
61 2 : string short2(address1Hex + 1, address1Hex + sizeof(address1Hex)); // first byte missing
62 10 : BOOST_CHECK_THROW(addmultisig(createArgs(2, short2.c_str()), false), runtime_error);
63 1 : }
64 :
65 6 : BOOST_AUTO_TEST_CASE(rpc_wallet)
66 : {
67 : // Test RPC calls for various wallet statistics
68 : UniValue r;
69 : CPubKey demoPubkey;
70 : CBitcoinAddress demoAddress;
71 1 : UniValue retValue;
72 2 : string strAccount = "walletDemoAccount";
73 : CBitcoinAddress setaccountDemoAddress;
74 : {
75 1 : LOCK(pwalletMain->cs_wallet);
76 :
77 1 : demoPubkey = pwalletMain->GenerateNewKey();
78 4 : demoAddress = CBitcoinAddress(CTxDestination(demoPubkey.GetID()));
79 2 : string strPurpose = "receive";
80 10 : BOOST_CHECK_NO_THROW({ /*Initialize Wallet with an account */
81 : CWalletDB walletdb(pwalletMain->strWalletFile);
82 : CAccount account;
83 : account.vchPubKey = demoPubkey;
84 : pwalletMain->SetAddressBook(account.vchPubKey.GetID(), strAccount, strPurpose);
85 : walletdb.WriteAccount(strAccount, account);
86 : });
87 :
88 1 : CPubKey setaccountDemoPubkey = pwalletMain->GenerateNewKey();
89 4 : setaccountDemoAddress = CBitcoinAddress(CTxDestination(setaccountDemoPubkey.GetID()));
90 : }
91 : /*********************************
92 : * setaccount
93 : *********************************/
94 10 : BOOST_CHECK_NO_THROW(CallRPC("setaccount " + setaccountDemoAddress.ToString() + " nullaccount"));
95 : /* 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ is not owned by the test wallet. */
96 10 : BOOST_CHECK_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ nullaccount"), runtime_error);
97 10 : BOOST_CHECK_THROW(CallRPC("setaccount"), runtime_error);
98 : /* 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X (33 chars) is an illegal address (should be 34 chars) */
99 10 : BOOST_CHECK_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X nullaccount"), runtime_error);
100 :
101 :
102 : /*********************************
103 : * getbalance
104 : *********************************/
105 9 : BOOST_CHECK_NO_THROW(CallRPC("getbalance"));
106 9 : BOOST_CHECK_NO_THROW(CallRPC("getbalance " + demoAddress.ToString()));
107 :
108 : /*********************************
109 : * listunspent
110 : *********************************/
111 9 : BOOST_CHECK_NO_THROW(CallRPC("listunspent"));
112 10 : BOOST_CHECK_THROW(CallRPC("listunspent string"), runtime_error);
113 10 : BOOST_CHECK_THROW(CallRPC("listunspent 0 string"), runtime_error);
114 9 : BOOST_CHECK_THROW(CallRPC("listunspent 0 1 not_array"), runtime_error);
115 10 : BOOST_CHECK_THROW(CallRPC("listunspent 0 1 [] extra"), runtime_error);
116 9 : BOOST_CHECK_NO_THROW(r = CallRPC("listunspent 0 1 []"));
117 9 : BOOST_CHECK(r.get_array().empty());
118 :
119 : /*********************************
120 : * listreceivedbyaddress
121 : *********************************/
122 9 : BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress"));
123 9 : BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress 0"));
124 10 : BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress not_int"), runtime_error);
125 10 : BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress 0 not_bool"), runtime_error);
126 9 : BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress 0 true"));
127 10 : BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress 0 true extra"), runtime_error);
128 :
129 : /*********************************
130 : * listreceivedbyaccount
131 : *********************************/
132 9 : BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount"));
133 9 : BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount 0"));
134 10 : BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount not_int"), runtime_error);
135 10 : BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount 0 not_bool"), runtime_error);
136 9 : BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount 0 true"));
137 10 : BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount 0 true extra"), runtime_error);
138 :
139 : /*********************************
140 : * listsinceblock
141 : *********************************/
142 9 : BOOST_CHECK_NO_THROW(CallRPC("listsinceblock"));
143 :
144 : /*********************************
145 : * listtransactions
146 : *********************************/
147 9 : BOOST_CHECK_NO_THROW(CallRPC("listtransactions"));
148 9 : BOOST_CHECK_NO_THROW(CallRPC("listtransactions " + demoAddress.ToString()));
149 10 : BOOST_CHECK_NO_THROW(CallRPC("listtransactions " + demoAddress.ToString() + " 20"));
150 10 : BOOST_CHECK_NO_THROW(CallRPC("listtransactions " + demoAddress.ToString() + " 20 0"));
151 11 : BOOST_CHECK_THROW(CallRPC("listtransactions " + demoAddress.ToString() + " not_int"), runtime_error);
152 :
153 : /*********************************
154 : * listlockunspent
155 : *********************************/
156 9 : BOOST_CHECK_NO_THROW(CallRPC("listlockunspent"));
157 :
158 : /*********************************
159 : * listaccounts
160 : *********************************/
161 9 : BOOST_CHECK_NO_THROW(CallRPC("listaccounts"));
162 :
163 : /*********************************
164 : * listaddressgroupings
165 : *********************************/
166 9 : BOOST_CHECK_NO_THROW(CallRPC("listaddressgroupings"));
167 :
168 : /*********************************
169 : * getrawchangeaddress
170 : *********************************/
171 9 : BOOST_CHECK_NO_THROW(CallRPC("getrawchangeaddress"));
172 :
173 : /*********************************
174 : * getnewaddress
175 : *********************************/
176 9 : BOOST_CHECK_NO_THROW(CallRPC("getnewaddress"));
177 9 : BOOST_CHECK_NO_THROW(CallRPC("getnewaddress getnewaddress_demoaccount"));
178 :
179 : /*********************************
180 : * getaccountaddress
181 : *********************************/
182 9 : BOOST_CHECK_NO_THROW(CallRPC("getaccountaddress \"\""));
183 9 : BOOST_CHECK_NO_THROW(CallRPC("getaccountaddress accountThatDoesntExists")); // Should generate a new account
184 8 : BOOST_CHECK_NO_THROW(retValue = CallRPC("getaccountaddress " + strAccount));
185 12 : BOOST_CHECK(CBitcoinAddress(retValue.get_str()).Get() == demoAddress.Get());
186 :
187 : /*********************************
188 : * getaccount
189 : *********************************/
190 10 : BOOST_CHECK_THROW(CallRPC("getaccount"), runtime_error);
191 7 : BOOST_CHECK_NO_THROW(CallRPC("getaccount " + demoAddress.ToString()));
192 :
193 : /*********************************
194 : * signmessage + verifymessage
195 : *********************************/
196 10 : BOOST_CHECK_NO_THROW(retValue = CallRPC("signmessage " + demoAddress.ToString() + " mymessage"));
197 10 : BOOST_CHECK_THROW(CallRPC("signmessage"), runtime_error);
198 : /* Should throw error because this address is not loaded in the wallet */
199 10 : BOOST_CHECK_THROW(CallRPC("signmessage 1QFqqMUD55ZV3PJEJZtaKCsQmjLT6JkjvJ mymessage"), runtime_error);
200 :
201 : /* missing arguments */
202 10 : BOOST_CHECK_THROW(CallRPC("verifymessage " + demoAddress.ToString()), runtime_error);
203 13 : BOOST_CHECK_THROW(CallRPC("verifymessage " + demoAddress.ToString() + " " + retValue.get_str()), runtime_error);
204 : /* Illegal address */
205 11 : BOOST_CHECK_THROW(CallRPC("verifymessage 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X " + retValue.get_str() + " mymessage"), runtime_error);
206 : /* wrong address */
207 11 : BOOST_CHECK(CallRPC("verifymessage 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ " + retValue.get_str() + " mymessage").get_bool() == false);
208 : /* Correct address and signature but wrong message */
209 14 : BOOST_CHECK(CallRPC("verifymessage " + demoAddress.ToString() + " " + retValue.get_str() + " wrongmessage").get_bool() == false);
210 : /* Correct address, message and signature*/
211 14 : BOOST_CHECK(CallRPC("verifymessage " + demoAddress.ToString() + " " + retValue.get_str() + " mymessage").get_bool() == true);
212 :
213 : /*********************************
214 : * getaddressesbyaccount
215 : *********************************/
216 10 : BOOST_CHECK_THROW(CallRPC("getaddressesbyaccount"), runtime_error);
217 8 : BOOST_CHECK_NO_THROW(retValue = CallRPC("getaddressesbyaccount " + strAccount));
218 2 : UniValue arr = retValue.get_array();
219 8 : BOOST_CHECK(arr.size() > 0);
220 12 : BOOST_CHECK(CBitcoinAddress(arr[0].get_str()).Get() == demoAddress.Get());
221 :
222 : /*********************************
223 : * fundrawtransaction
224 : *********************************/
225 10 : BOOST_CHECK_THROW(CallRPC("fundrawtransaction 28z"), runtime_error);
226 11 : BOOST_CHECK_THROW(CallRPC("fundrawtransaction 01000000000180969800000000001976a91450ce0a4b0ee0ddeb633da85199728b940ac3fe9488ac00000000"), runtime_error);
227 1 : }
228 :
229 3 : BOOST_AUTO_TEST_SUITE_END()
|