LCOV - code coverage report
Current view: top level - src/test - rpc_wallet_tests.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 95 95 100.0 %
Date: 2015-10-12 22:39:14 Functions: 6 10 60.0 %
Legend: Lines: hit not hit

          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()

Generated by: LCOV version 1.11