Skip to content

Commit

Permalink
[test] Move some tests from qt -> wallet
Browse files Browse the repository at this point in the history
After previous refactoring, the tests make more sense here.
  • Loading branch information
ryanofsky committed May 17, 2017
1 parent d944bd7 commit 429aa9e
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 117 deletions.
117 changes: 0 additions & 117 deletions 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"
Expand All @@ -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>
Expand All @@ -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()
{
Expand Down Expand Up @@ -236,7 +121,5 @@ void TestSendCoins()

void WalletTests::walletTests()
{
TestLoadReceiveRequests();
TestListCoins();
TestSendCoins();
}
101 changes: 101 additions & 0 deletions src/wallet/test/wallet_tests.cpp
Expand Up @@ -9,6 +9,7 @@
#include <utility>
#include <vector>

#include "consensus/validation.h"
#include "rpc/server.h"
#include "test/test_bitcoin.h"
#include "validation.h"
Expand Down Expand Up @@ -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()

0 comments on commit 429aa9e

Please sign in to comment.