PageRenderTime 26ms CodeModel.GetById 6ms RepoModel.GetById 0ms app.codeStats 0ms

/src/test/rpc_wallet_tests.cpp

https://gitlab.com/Ltaimao/bitcoin
C++ | 183 lines | 105 code | 34 blank | 44 comment | 8 complexity | 2eef683b4dcc37ac77cdd20a2c3581fb MD5 | raw file
  1. // Copyright (c) 2013-2014 The Bitcoin Core developers
  2. // Distributed under the MIT/X11 software license, see the accompanying
  3. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  4. #include "rpcserver.h"
  5. #include "rpcclient.h"
  6. #include "base58.h"
  7. #include "wallet.h"
  8. #include <boost/algorithm/string.hpp>
  9. #include <boost/test/unit_test.hpp>
  10. using namespace std;
  11. using namespace json_spirit;
  12. extern Array createArgs(int nRequired, const char* address1 = NULL, const char* address2 = NULL);
  13. extern Value CallRPC(string args);
  14. extern CWallet* pwalletMain;
  15. BOOST_AUTO_TEST_SUITE(rpc_wallet_tests)
  16. BOOST_AUTO_TEST_CASE(rpc_addmultisig)
  17. {
  18. LOCK(pwalletMain->cs_wallet);
  19. rpcfn_type addmultisig = tableRPC["addmultisigaddress"]->actor;
  20. // old, 65-byte-long:
  21. const char address1Hex[] = "0434e3e09f49ea168c5bbf53f877ff4206923858aab7c7e1df25bc263978107c95e35065a27ef6f1b27222db0ec97e0e895eaca603d3ee0d4c060ce3d8a00286c8";
  22. // new, compressed:
  23. const char address2Hex[] = "0388c2037017c62240b6b72ac1a2a5f94da790596ebd06177c8572752922165cb4";
  24. Value v;
  25. CBitcoinAddress address;
  26. BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex), false));
  27. address.SetString(v.get_str());
  28. BOOST_CHECK(address.IsValid() && address.IsScript());
  29. BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex, address2Hex), false));
  30. address.SetString(v.get_str());
  31. BOOST_CHECK(address.IsValid() && address.IsScript());
  32. BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(2, address1Hex, address2Hex), false));
  33. address.SetString(v.get_str());
  34. BOOST_CHECK(address.IsValid() && address.IsScript());
  35. BOOST_CHECK_THROW(addmultisig(createArgs(0), false), runtime_error);
  36. BOOST_CHECK_THROW(addmultisig(createArgs(1), false), runtime_error);
  37. BOOST_CHECK_THROW(addmultisig(createArgs(2, address1Hex), false), runtime_error);
  38. BOOST_CHECK_THROW(addmultisig(createArgs(1, ""), false), runtime_error);
  39. BOOST_CHECK_THROW(addmultisig(createArgs(1, "NotAValidPubkey"), false), runtime_error);
  40. string short1(address1Hex, address1Hex + sizeof(address1Hex) - 2); // last byte missing
  41. BOOST_CHECK_THROW(addmultisig(createArgs(2, short1.c_str()), false), runtime_error);
  42. string short2(address1Hex + 1, address1Hex + sizeof(address1Hex)); // first byte missing
  43. BOOST_CHECK_THROW(addmultisig(createArgs(2, short2.c_str()), false), runtime_error);
  44. }
  45. BOOST_AUTO_TEST_CASE(rpc_wallet)
  46. {
  47. // Test RPC calls for various wallet statistics
  48. Value r;
  49. LOCK2(cs_main, pwalletMain->cs_wallet);
  50. CPubKey demoPubkey = pwalletMain->GenerateNewKey();
  51. CBitcoinAddress demoAddress = CBitcoinAddress(CTxDestination(demoPubkey.GetID()));
  52. Value retValue;
  53. string strAccount = "walletDemoAccount";
  54. string strPurpose = "receive";
  55. BOOST_CHECK_NO_THROW({ /*Initialize Wallet with an account */
  56. CWalletDB walletdb(pwalletMain->strWalletFile);
  57. CAccount account;
  58. account.vchPubKey = demoPubkey;
  59. pwalletMain->SetAddressBook(account.vchPubKey.GetID(), strAccount, strPurpose);
  60. walletdb.WriteAccount(strAccount, account);
  61. });
  62. CPubKey setaccountDemoPubkey = pwalletMain->GenerateNewKey();
  63. CBitcoinAddress setaccountDemoAddress = CBitcoinAddress(CTxDestination(setaccountDemoPubkey.GetID()));
  64. /*********************************
  65. * setaccount
  66. *********************************/
  67. BOOST_CHECK_NO_THROW(CallRPC("setaccount " + setaccountDemoAddress.ToString() + " nullaccount"));
  68. /* 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ is not owned by the test wallet. */
  69. BOOST_CHECK_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ nullaccount"), runtime_error);
  70. BOOST_CHECK_THROW(CallRPC("setaccount"), runtime_error);
  71. /* 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X (33 chars) is an illegal address (should be 34 chars) */
  72. BOOST_CHECK_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X nullaccount"), runtime_error);
  73. /*********************************
  74. * listunspent
  75. *********************************/
  76. BOOST_CHECK_NO_THROW(CallRPC("listunspent"));
  77. BOOST_CHECK_THROW(CallRPC("listunspent string"), runtime_error);
  78. BOOST_CHECK_THROW(CallRPC("listunspent 0 string"), runtime_error);
  79. BOOST_CHECK_THROW(CallRPC("listunspent 0 1 not_array"), runtime_error);
  80. BOOST_CHECK_THROW(CallRPC("listunspent 0 1 [] extra"), runtime_error);
  81. BOOST_CHECK_NO_THROW(r = CallRPC("listunspent 0 1 []"));
  82. BOOST_CHECK(r.get_array().empty());
  83. /*********************************
  84. * listreceivedbyaddress
  85. *********************************/
  86. BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress"));
  87. BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress 0"));
  88. BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress not_int"), runtime_error);
  89. BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress 0 not_bool"), runtime_error);
  90. BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress 0 true"));
  91. BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress 0 true extra"), runtime_error);
  92. /*********************************
  93. * listreceivedbyaccount
  94. *********************************/
  95. BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount"));
  96. BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount 0"));
  97. BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount not_int"), runtime_error);
  98. BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount 0 not_bool"), runtime_error);
  99. BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount 0 true"));
  100. BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount 0 true extra"), runtime_error);
  101. /*********************************
  102. * getrawchangeaddress
  103. *********************************/
  104. BOOST_CHECK_NO_THROW(CallRPC("getrawchangeaddress"));
  105. /*********************************
  106. * getnewaddress
  107. *********************************/
  108. BOOST_CHECK_NO_THROW(CallRPC("getnewaddress"));
  109. BOOST_CHECK_NO_THROW(CallRPC("getnewaddress getnewaddress_demoaccount"));
  110. /*********************************
  111. * getaccountaddress
  112. *********************************/
  113. BOOST_CHECK_NO_THROW(CallRPC("getaccountaddress \"\""));
  114. BOOST_CHECK_NO_THROW(CallRPC("getaccountaddress accountThatDoesntExists")); // Should generate a new account
  115. BOOST_CHECK_NO_THROW(retValue = CallRPC("getaccountaddress " + strAccount));
  116. BOOST_CHECK(CBitcoinAddress(retValue.get_str()).Get() == demoAddress.Get());
  117. /*********************************
  118. * getaccount
  119. *********************************/
  120. BOOST_CHECK_THROW(CallRPC("getaccount"), runtime_error);
  121. BOOST_CHECK_NO_THROW(CallRPC("getaccount " + demoAddress.ToString()));
  122. /*********************************
  123. * signmessage + verifymessage
  124. *********************************/
  125. BOOST_CHECK_NO_THROW(retValue = CallRPC("signmessage " + demoAddress.ToString() + " mymessage"));
  126. BOOST_CHECK_THROW(CallRPC("signmessage"), runtime_error);
  127. /* Should throw error because this address is not loaded in the wallet */
  128. BOOST_CHECK_THROW(CallRPC("signmessage 1QFqqMUD55ZV3PJEJZtaKCsQmjLT6JkjvJ mymessage"), runtime_error);
  129. /* missing arguments */
  130. BOOST_CHECK_THROW(CallRPC("verifymessage " + demoAddress.ToString()), runtime_error);
  131. BOOST_CHECK_THROW(CallRPC("verifymessage " + demoAddress.ToString() + " " + retValue.get_str()), runtime_error);
  132. /* Illegal address */
  133. BOOST_CHECK_THROW(CallRPC("verifymessage 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X " + retValue.get_str() + " mymessage"), runtime_error);
  134. /* wrong address */
  135. BOOST_CHECK(CallRPC("verifymessage 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ " + retValue.get_str() + " mymessage").get_bool() == false);
  136. /* Correct address and signature but wrong message */
  137. BOOST_CHECK(CallRPC("verifymessage " + demoAddress.ToString() + " " + retValue.get_str() + " wrongmessage").get_bool() == false);
  138. /* Correct address, message and signature*/
  139. BOOST_CHECK(CallRPC("verifymessage " + demoAddress.ToString() + " " + retValue.get_str() + " mymessage").get_bool() == true);
  140. /*********************************
  141. * getaddressesbyaccount
  142. *********************************/
  143. BOOST_CHECK_THROW(CallRPC("getaddressesbyaccount"), runtime_error);
  144. BOOST_CHECK_NO_THROW(retValue = CallRPC("getaddressesbyaccount " + strAccount));
  145. Array arr = retValue.get_array();
  146. BOOST_CHECK(arr.size() > 0);
  147. BOOST_CHECK(CBitcoinAddress(arr[0].get_str()).Get() == demoAddress.Get());
  148. }
  149. BOOST_AUTO_TEST_SUITE_END()