mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-08 10:31:50 -05:00
test: move coins result test to wallet_tests.cpp
The class `AvailableCoinsTestingSetup` inside `availablecoins_tests.cpp` is a plain copy of `ListCoinsTestingSetup` that is inside wallet_tests.cpp.
This commit is contained in:
parent
f69347d058
commit
9622fe64b8
3 changed files with 40 additions and 100 deletions
|
@ -174,7 +174,6 @@ BITCOIN_TESTS += \
|
||||||
wallet/test/wallet_crypto_tests.cpp \
|
wallet/test/wallet_crypto_tests.cpp \
|
||||||
wallet/test/wallet_transaction_tests.cpp \
|
wallet/test/wallet_transaction_tests.cpp \
|
||||||
wallet/test/coinselector_tests.cpp \
|
wallet/test/coinselector_tests.cpp \
|
||||||
wallet/test/availablecoins_tests.cpp \
|
|
||||||
wallet/test/init_tests.cpp \
|
wallet/test/init_tests.cpp \
|
||||||
wallet/test/ismine_tests.cpp \
|
wallet/test/ismine_tests.cpp \
|
||||||
wallet/test/rpc_util_tests.cpp \
|
wallet/test/rpc_util_tests.cpp \
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
// Copyright (c) 2022 The Bitcoin Core developers
|
|
||||||
// Distributed under the MIT software license, see the accompanying
|
|
||||||
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
|
|
||||||
|
|
||||||
#include <validation.h>
|
|
||||||
#include <wallet/coincontrol.h>
|
|
||||||
#include <wallet/spend.h>
|
|
||||||
#include <wallet/test/util.h>
|
|
||||||
#include <wallet/test/wallet_test_fixture.h>
|
|
||||||
|
|
||||||
#include <boost/test/unit_test.hpp>
|
|
||||||
|
|
||||||
namespace wallet {
|
|
||||||
BOOST_FIXTURE_TEST_SUITE(availablecoins_tests, WalletTestingSetup)
|
|
||||||
class AvailableCoinsTestingSetup : public TestChain100Setup
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AvailableCoinsTestingSetup()
|
|
||||||
{
|
|
||||||
CreateAndProcessBlock({}, {});
|
|
||||||
wallet = CreateSyncedWallet(*m_node.chain, m_node.chainman->ActiveChain(), m_args, coinbaseKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
~AvailableCoinsTestingSetup()
|
|
||||||
{
|
|
||||||
wallet.reset();
|
|
||||||
}
|
|
||||||
CWalletTx& AddTx(CRecipient recipient)
|
|
||||||
{
|
|
||||||
CTransactionRef tx;
|
|
||||||
CCoinControl dummy;
|
|
||||||
{
|
|
||||||
constexpr int RANDOM_CHANGE_POSITION = -1;
|
|
||||||
auto res = CreateTransaction(*wallet, {recipient}, RANDOM_CHANGE_POSITION, dummy);
|
|
||||||
BOOST_CHECK(res);
|
|
||||||
tx = res->tx;
|
|
||||||
}
|
|
||||||
wallet->CommitTransaction(tx, {}, {});
|
|
||||||
CMutableTransaction blocktx;
|
|
||||||
{
|
|
||||||
LOCK(wallet->cs_wallet);
|
|
||||||
blocktx = CMutableTransaction(*wallet->mapWallet.at(tx->GetHash()).tx);
|
|
||||||
}
|
|
||||||
CreateAndProcessBlock({CMutableTransaction(blocktx)}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
|
|
||||||
|
|
||||||
LOCK(wallet->cs_wallet);
|
|
||||||
LOCK(m_node.chainman->GetMutex());
|
|
||||||
wallet->SetLastBlockProcessed(wallet->GetLastBlockHeight() + 1, m_node.chainman->ActiveChain().Tip()->GetBlockHash());
|
|
||||||
auto it = wallet->mapWallet.find(tx->GetHash());
|
|
||||||
BOOST_CHECK(it != wallet->mapWallet.end());
|
|
||||||
it->second.m_state = TxStateConfirmed{m_node.chainman->ActiveChain().Tip()->GetBlockHash(), m_node.chainman->ActiveChain().Height(), /*index=*/1};
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<CWallet> wallet;
|
|
||||||
};
|
|
||||||
|
|
||||||
void TestCoinsResult(AvailableCoinsTestingSetup& context, OutputType out_type, CAmount amount,
|
|
||||||
std::map<OutputType, size_t>& expected_coins_sizes)
|
|
||||||
{
|
|
||||||
LOCK(context.wallet->cs_wallet);
|
|
||||||
util::Result<CTxDestination> dest = Assert(context.wallet->GetNewDestination(out_type, ""));
|
|
||||||
CWalletTx& wtx = context.AddTx(CRecipient{{GetScriptForDestination(*dest)}, amount, /*fSubtractFeeFromAmount=*/true});
|
|
||||||
CoinFilterParams filter;
|
|
||||||
filter.skip_locked = false;
|
|
||||||
CoinsResult available_coins = AvailableCoins(*context.wallet, nullptr, std::nullopt, filter);
|
|
||||||
// Lock outputs so they are not spent in follow-up transactions
|
|
||||||
for (uint32_t i = 0; i < wtx.tx->vout.size(); i++) context.wallet->LockCoin({wtx.GetHash(), i});
|
|
||||||
for (const auto& [type, size] : expected_coins_sizes) BOOST_CHECK_EQUAL(size, available_coins.coins[type].size());
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(BasicOutputTypesTest, AvailableCoinsTestingSetup)
|
|
||||||
{
|
|
||||||
std::map<OutputType, size_t> expected_coins_sizes;
|
|
||||||
for (const auto& out_type : OUTPUT_TYPES) { expected_coins_sizes[out_type] = 0U; }
|
|
||||||
|
|
||||||
// Verify our wallet has one usable coinbase UTXO before starting
|
|
||||||
// This UTXO is a P2PK, so it should show up in the Other bucket
|
|
||||||
expected_coins_sizes[OutputType::UNKNOWN] = 1U;
|
|
||||||
CoinsResult available_coins = WITH_LOCK(wallet->cs_wallet, return AvailableCoins(*wallet));
|
|
||||||
BOOST_CHECK_EQUAL(available_coins.Size(), expected_coins_sizes[OutputType::UNKNOWN]);
|
|
||||||
BOOST_CHECK_EQUAL(available_coins.coins[OutputType::UNKNOWN].size(), expected_coins_sizes[OutputType::UNKNOWN]);
|
|
||||||
|
|
||||||
// We will create a self transfer for each of the OutputTypes and
|
|
||||||
// verify it is put in the correct bucket after running GetAvailablecoins
|
|
||||||
//
|
|
||||||
// For each OutputType, We expect 2 UTXOs in our wallet following the self transfer:
|
|
||||||
// 1. One UTXO as the recipient
|
|
||||||
// 2. One UTXO from the change, due to payment address matching logic
|
|
||||||
|
|
||||||
for (const auto& out_type : OUTPUT_TYPES) {
|
|
||||||
if (out_type == OutputType::UNKNOWN) continue;
|
|
||||||
expected_coins_sizes[out_type] = 2U;
|
|
||||||
TestCoinsResult(*this, out_type, 1 * COIN, expected_coins_sizes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
|
||||||
} // namespace wallet
|
|
|
@ -622,6 +622,46 @@ BOOST_FIXTURE_TEST_CASE(ListCoinsTest, ListCoinsTestingSetup)
|
||||||
BOOST_CHECK_EQUAL(list.begin()->second.size(), 2U);
|
BOOST_CHECK_EQUAL(list.begin()->second.size(), 2U);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TestCoinsResult(ListCoinsTest& context, OutputType out_type, CAmount amount,
|
||||||
|
std::map<OutputType, size_t>& expected_coins_sizes)
|
||||||
|
{
|
||||||
|
LOCK(context.wallet->cs_wallet);
|
||||||
|
util::Result<CTxDestination> dest = Assert(context.wallet->GetNewDestination(out_type, ""));
|
||||||
|
CWalletTx& wtx = context.AddTx(CRecipient{{GetScriptForDestination(*dest)}, amount, /*fSubtractFeeFromAmount=*/true});
|
||||||
|
CoinFilterParams filter;
|
||||||
|
filter.skip_locked = false;
|
||||||
|
CoinsResult available_coins = AvailableCoins(*context.wallet, nullptr, std::nullopt, filter);
|
||||||
|
// Lock outputs so they are not spent in follow-up transactions
|
||||||
|
for (uint32_t i = 0; i < wtx.tx->vout.size(); i++) context.wallet->LockCoin({wtx.GetHash(), i});
|
||||||
|
for (const auto& [type, size] : expected_coins_sizes) BOOST_CHECK_EQUAL(size, available_coins.coins[type].size());
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_FIXTURE_TEST_CASE(BasicOutputTypesTest, ListCoinsTest)
|
||||||
|
{
|
||||||
|
std::map<OutputType, size_t> expected_coins_sizes;
|
||||||
|
for (const auto& out_type : OUTPUT_TYPES) { expected_coins_sizes[out_type] = 0U; }
|
||||||
|
|
||||||
|
// Verify our wallet has one usable coinbase UTXO before starting
|
||||||
|
// This UTXO is a P2PK, so it should show up in the Other bucket
|
||||||
|
expected_coins_sizes[OutputType::UNKNOWN] = 1U;
|
||||||
|
CoinsResult available_coins = WITH_LOCK(wallet->cs_wallet, return AvailableCoins(*wallet));
|
||||||
|
BOOST_CHECK_EQUAL(available_coins.Size(), expected_coins_sizes[OutputType::UNKNOWN]);
|
||||||
|
BOOST_CHECK_EQUAL(available_coins.coins[OutputType::UNKNOWN].size(), expected_coins_sizes[OutputType::UNKNOWN]);
|
||||||
|
|
||||||
|
// We will create a self transfer for each of the OutputTypes and
|
||||||
|
// verify it is put in the correct bucket after running GetAvailablecoins
|
||||||
|
//
|
||||||
|
// For each OutputType, We expect 2 UTXOs in our wallet following the self transfer:
|
||||||
|
// 1. One UTXO as the recipient
|
||||||
|
// 2. One UTXO from the change, due to payment address matching logic
|
||||||
|
|
||||||
|
for (const auto& out_type : OUTPUT_TYPES) {
|
||||||
|
if (out_type == OutputType::UNKNOWN) continue;
|
||||||
|
expected_coins_sizes[out_type] = 2U;
|
||||||
|
TestCoinsResult(*this, out_type, 1 * COIN, expected_coins_sizes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(wallet_disableprivkeys, TestChain100Setup)
|
BOOST_FIXTURE_TEST_CASE(wallet_disableprivkeys, TestChain100Setup)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue