[test] Move some tests from qt -> wallet
After previous refactoring, the tests make more sense here.
This commit is contained in:
parent
d944bd7a27
commit
429aa9eb51
2 changed files with 101 additions and 117 deletions
|
@ -1,6 +1,5 @@
|
||||||
#include "wallettests.h"
|
#include "wallettests.h"
|
||||||
|
|
||||||
#include "consensus/validation.h"
|
|
||||||
#include "qt/bitcoinamountfield.h"
|
#include "qt/bitcoinamountfield.h"
|
||||||
#include "qt/callback.h"
|
#include "qt/callback.h"
|
||||||
#include "qt/optionsmodel.h"
|
#include "qt/optionsmodel.h"
|
||||||
|
@ -12,8 +11,6 @@
|
||||||
#include "qt/walletmodel.h"
|
#include "qt/walletmodel.h"
|
||||||
#include "test/test_bitcoin.h"
|
#include "test/test_bitcoin.h"
|
||||||
#include "validation.h"
|
#include "validation.h"
|
||||||
#include "wallet/test/wallet_test_fixture.h"
|
|
||||||
#include "wallet/coincontrol.h"
|
|
||||||
#include "wallet/wallet.h"
|
#include "wallet/wallet.h"
|
||||||
|
|
||||||
#include <QAbstractButton>
|
#include <QAbstractButton>
|
||||||
|
@ -23,118 +20,6 @@
|
||||||
|
|
||||||
namespace
|
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.
|
//! Press "Yes" button in modal send confirmation dialog.
|
||||||
void ConfirmSend()
|
void ConfirmSend()
|
||||||
{
|
{
|
||||||
|
@ -236,7 +121,5 @@ void TestSendCoins()
|
||||||
|
|
||||||
void WalletTests::walletTests()
|
void WalletTests::walletTests()
|
||||||
{
|
{
|
||||||
TestLoadReceiveRequests();
|
|
||||||
TestListCoins();
|
|
||||||
TestSendCoins();
|
TestSendCoins();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "consensus/validation.h"
|
||||||
#include "rpc/server.h"
|
#include "rpc/server.h"
|
||||||
#include "test/test_bitcoin.h"
|
#include "test/test_bitcoin.h"
|
||||||
#include "validation.h"
|
#include "validation.h"
|
||||||
|
@ -515,4 +516,104 @@ BOOST_AUTO_TEST_CASE(ComputeTimeSmart)
|
||||||
SetMockTime(0);
|
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()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
Loading…
Reference in a new issue