aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qt/test/wallettests.cpp117
-rw-r--r--src/wallet/test/wallet_tests.cpp101
2 files changed, 101 insertions, 117 deletions
diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp
index 867711309e..798d333d63 100644
--- a/src/qt/test/wallettests.cpp
+++ b/src/qt/test/wallettests.cpp
@@ -1,6 +1,5 @@
#include "wallettests.h"
-#include "consensus/validation.h"
#include "qt/bitcoinamountfield.h"
#include "qt/callback.h"
#include "qt/optionsmodel.h"
@@ -12,8 +11,6 @@
#include "qt/walletmodel.h"
#include "test/test_bitcoin.h"
#include "validation.h"
-#include "wallet/test/wallet_test_fixture.h"
-#include "wallet/coincontrol.h"
#include "wallet/wallet.h"
#include <QAbstractButton>
@@ -23,118 +20,6 @@
namespace
{
-
-void TestLoadReceiveRequests()
-{
- WalletTestingSetup test;
- OptionsModel optionsModel;
- WalletModel walletModel(nullptr, pwalletMain, &optionsModel);
-
- CTxDestination dest = CKeyID();
- pwalletMain->AddDestData(dest, "misc", "val_misc");
- pwalletMain->AddDestData(dest, "rr0", "val_rr0");
- pwalletMain->AddDestData(dest, "rr1", "val_rr1");
-
- std::vector<std::string> values;
- walletModel.loadReceiveRequests(values);
- QCOMPARE((int)values.size(), 2);
- QCOMPARE(QString::fromStdString(values[0]), QString("val_rr0"));
- QCOMPARE(QString::fromStdString(values[1]), QString("val_rr1"));
-}
-
-class ListCoinsTestingSetup : public TestChain100Setup
-{
-public:
- ListCoinsTestingSetup()
- {
- CreateAndProcessBlock({}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
- ::bitdb.MakeMock();
- wallet.reset(new CWallet(std::unique_ptr<CWalletDBWrapper>(new CWalletDBWrapper(&bitdb, "wallet_test.dat"))));
- bool firstRun;
- wallet->LoadWallet(firstRun);
- LOCK(wallet->cs_wallet);
- wallet->AddKeyPubKey(coinbaseKey, coinbaseKey.GetPubKey());
- wallet->ScanForWalletTransactions(chainActive.Genesis());
- }
-
- ~ListCoinsTestingSetup()
- {
- ::bitdb.Flush(true);
- ::bitdb.Reset();
- }
-
- CWalletTx& AddTx(CRecipient recipient)
- {
- CWalletTx wtx;
- CReserveKey reservekey(wallet.get());
- CAmount fee;
- int changePos = -1;
- std::string error;
- wallet->CreateTransaction({recipient}, wtx, reservekey, fee, changePos, error);
- CValidationState state;
- wallet->CommitTransaction(wtx, reservekey, nullptr, state);
- auto it = wallet->mapWallet.find(wtx.GetHash());
- CreateAndProcessBlock({CMutableTransaction(*it->second.tx)}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
- it->second.SetMerkleBranch(chainActive.Tip(), 1);
- return it->second;
- }
-
- std::unique_ptr<CWallet> wallet;
-};
-
-void TestListCoins()
-{
- ListCoinsTestingSetup test;
- OptionsModel optionsModel;
- WalletModel walletModel(nullptr, test.wallet.get(), &optionsModel);
- QString coinbaseAddress = QString::fromStdString(CBitcoinAddress(test.coinbaseKey.GetPubKey().GetID()).ToString());
-
- LOCK(test.wallet->cs_wallet);
-
- // Confirm ListCoins initially returns 1 coin grouped under coinbaseKey
- // address.
- std::map<QString, std::vector<COutput>> list;
- walletModel.listCoins(list);
- QCOMPARE((int)list.size(), 1);
- QCOMPARE(list.begin()->first, coinbaseAddress);
- QCOMPARE((int)list.begin()->second.size(), 1);
-
- // Check initial balance from one mature coinbase transaction.
- CCoinControl coinControl;
- QCOMPARE(50 * COIN, walletModel.getBalance(&coinControl));
-
- // Add a transaction creating a change address, and confirm ListCoins still
- // returns the coin associated with the change address underneath the
- // coinbaseKey pubkey, even though the change address has a different
- // pubkey.
- test.AddTx(CRecipient{GetScriptForRawPubKey({}), 1 * COIN, false /* subtract fee */});
- list.clear();
- walletModel.listCoins(list);
- QCOMPARE((int)list.size(), 1);
- QCOMPARE(list.begin()->first, coinbaseAddress);
- QCOMPARE((int)list.begin()->second.size(), 2);
-
- // Lock both coins. Confirm number of available coins drops to 0.
- std::vector<COutput> available;
- test.wallet->AvailableCoins(available);
- QCOMPARE((int)available.size(), 2);
- for (const auto& group : list) {
- for (const auto& coin : group.second) {
- test.wallet->LockCoin(COutPoint(coin.tx->GetHash(), coin.i));
- }
- }
- test.wallet->AvailableCoins(available);
- QCOMPARE((int)available.size(), 0);
-
- // Confirm ListCoins still returns same result as before, despite coins
- // being locked.
- list.clear();
- walletModel.listCoins(list);
- QCOMPARE((int)list.size(), 1);
- QCOMPARE(list.begin()->first, coinbaseAddress);
- QCOMPARE((int)list.begin()->second.size(), 2);
-}
-
//! Press "Yes" button in modal send confirmation dialog.
void ConfirmSend()
{
@@ -236,7 +121,5 @@ void TestSendCoins()
void WalletTests::walletTests()
{
- TestLoadReceiveRequests();
- TestListCoins();
TestSendCoins();
}
diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp
index 8eeba72a06..8e56f1efeb 100644
--- a/src/wallet/test/wallet_tests.cpp
+++ b/src/wallet/test/wallet_tests.cpp
@@ -9,6 +9,7 @@
#include <utility>
#include <vector>
+#include "consensus/validation.h"
#include "rpc/server.h"
#include "test/test_bitcoin.h"
#include "validation.h"
@@ -515,4 +516,104 @@ BOOST_AUTO_TEST_CASE(ComputeTimeSmart)
SetMockTime(0);
}
+BOOST_AUTO_TEST_CASE(LoadReceiveRequests)
+{
+ CTxDestination dest = CKeyID();
+ pwalletMain->AddDestData(dest, "misc", "val_misc");
+ pwalletMain->AddDestData(dest, "rr0", "val_rr0");
+ pwalletMain->AddDestData(dest, "rr1", "val_rr1");
+
+ auto values = pwalletMain->GetDestValues("rr");
+ BOOST_CHECK_EQUAL(values.size(), 2);
+ BOOST_CHECK_EQUAL(values[0], "val_rr0");
+ BOOST_CHECK_EQUAL(values[1], "val_rr1");
+}
+
+class ListCoinsTestingSetup : public TestChain100Setup
+{
+public:
+ ListCoinsTestingSetup()
+ {
+ CreateAndProcessBlock({}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
+ ::bitdb.MakeMock();
+ wallet.reset(new CWallet(std::unique_ptr<CWalletDBWrapper>(new CWalletDBWrapper(&bitdb, "wallet_test.dat"))));
+ bool firstRun;
+ wallet->LoadWallet(firstRun);
+ LOCK(wallet->cs_wallet);
+ wallet->AddKeyPubKey(coinbaseKey, coinbaseKey.GetPubKey());
+ wallet->ScanForWalletTransactions(chainActive.Genesis());
+ }
+
+ ~ListCoinsTestingSetup()
+ {
+ wallet.reset();
+ ::bitdb.Flush(true);
+ ::bitdb.Reset();
+ }
+
+ CWalletTx& AddTx(CRecipient recipient)
+ {
+ CWalletTx wtx;
+ CReserveKey reservekey(wallet.get());
+ CAmount fee;
+ int changePos = -1;
+ std::string error;
+ BOOST_CHECK(wallet->CreateTransaction({recipient}, wtx, reservekey, fee, changePos, error));
+ CValidationState state;
+ BOOST_CHECK(wallet->CommitTransaction(wtx, reservekey, nullptr, state));
+ auto it = wallet->mapWallet.find(wtx.GetHash());
+ BOOST_CHECK(it != wallet->mapWallet.end());
+ CreateAndProcessBlock({CMutableTransaction(*it->second.tx)}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
+ it->second.SetMerkleBranch(chainActive.Tip(), 1);
+ return it->second;
+ }
+
+ std::unique_ptr<CWallet> wallet;
+};
+
+BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
+{
+ std::string coinbaseAddress = coinbaseKey.GetPubKey().GetID().ToString();
+ LOCK(wallet->cs_wallet);
+
+ // Confirm ListCoins initially returns 1 coin grouped under coinbaseKey
+ // address.
+ auto list = wallet->ListCoins();
+ BOOST_CHECK_EQUAL(list.size(), 1);
+ BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
+ BOOST_CHECK_EQUAL(list.begin()->second.size(), 1);
+
+ // Check initial balance from one mature coinbase transaction.
+ BOOST_CHECK_EQUAL(50 * COIN, wallet->GetAvailableBalance());
+
+ // Add a transaction creating a change address, and confirm ListCoins still
+ // returns the coin associated with the change address underneath the
+ // coinbaseKey pubkey, even though the change address has a different
+ // pubkey.
+ AddTx(CRecipient{GetScriptForRawPubKey({}), 1 * COIN, false /* subtract fee */});
+ list = wallet->ListCoins();
+ BOOST_CHECK_EQUAL(list.size(), 1);
+ BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
+ BOOST_CHECK_EQUAL(list.begin()->second.size(), 2);
+
+ // Lock both coins. Confirm number of available coins drops to 0.
+ std::vector<COutput> available;
+ wallet->AvailableCoins(available);
+ BOOST_CHECK_EQUAL(available.size(), 2);
+ for (const auto& group : list) {
+ for (const auto& coin : group.second) {
+ wallet->LockCoin(COutPoint(coin.tx->GetHash(), coin.i));
+ }
+ }
+ wallet->AvailableCoins(available);
+ BOOST_CHECK_EQUAL(available.size(), 0);
+
+ // Confirm ListCoins still returns same result as before, despite coins
+ // being locked.
+ list = wallet->ListCoins();
+ BOOST_CHECK_EQUAL(list.size(), 1);
+ BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
+ BOOST_CHECK_EQUAL(list.begin()->second.size(), 2);
+}
+
BOOST_AUTO_TEST_SUITE_END()