mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-16 13:01:19 +02:00
files share the same purpose, and we shouldn't have wallet code inside the test directory. This later is needed to use wallet util functions in the bench and test binaries without be forced to duplicate them.
65 lines
2.6 KiB
C++
65 lines
2.6 KiB
C++
// Copyright (c) 2012-2021 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <bench/bench.h>
|
|
#include <interfaces/chain.h>
|
|
#include <node/context.h>
|
|
#include <test/util/mining.h>
|
|
#include <test/util/setup_common.h>
|
|
#include <wallet/test/util.h>
|
|
#include <validationinterface.h>
|
|
#include <wallet/receive.h>
|
|
#include <wallet/wallet.h>
|
|
|
|
#include <optional>
|
|
|
|
using wallet::CWallet;
|
|
using wallet::CreateMockWalletDatabase;
|
|
using wallet::DBErrors;
|
|
using wallet::GetBalance;
|
|
using wallet::WALLET_FLAG_DESCRIPTORS;
|
|
|
|
const std::string ADDRESS_BCRT1_UNSPENDABLE = "bcrt1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3xueyj";
|
|
|
|
static void WalletBalance(benchmark::Bench& bench, const bool set_dirty, const bool add_mine)
|
|
{
|
|
const auto test_setup = MakeNoLogFileContext<const TestingSetup>();
|
|
|
|
const auto& ADDRESS_WATCHONLY = ADDRESS_BCRT1_UNSPENDABLE;
|
|
|
|
CWallet wallet{test_setup->m_node.chain.get(), "", gArgs, CreateMockWalletDatabase()};
|
|
{
|
|
LOCK(wallet.cs_wallet);
|
|
wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
|
|
wallet.SetupDescriptorScriptPubKeyMans();
|
|
if (wallet.LoadWallet() != DBErrors::LOAD_OK) assert(false);
|
|
}
|
|
auto handler = test_setup->m_node.chain->handleNotifications({&wallet, [](CWallet*) {}});
|
|
|
|
const std::optional<std::string> address_mine{add_mine ? std::optional<std::string>{getnewaddress(wallet)} : std::nullopt};
|
|
|
|
for (int i = 0; i < 100; ++i) {
|
|
generatetoaddress(test_setup->m_node, address_mine.value_or(ADDRESS_WATCHONLY));
|
|
generatetoaddress(test_setup->m_node, ADDRESS_WATCHONLY);
|
|
}
|
|
SyncWithValidationInterfaceQueue();
|
|
|
|
auto bal = GetBalance(wallet); // Cache
|
|
|
|
bench.run([&] {
|
|
if (set_dirty) wallet.MarkDirty();
|
|
bal = GetBalance(wallet);
|
|
if (add_mine) assert(bal.m_mine_trusted > 0);
|
|
});
|
|
}
|
|
|
|
static void WalletBalanceDirty(benchmark::Bench& bench) { WalletBalance(bench, /*set_dirty=*/true, /*add_mine=*/true); }
|
|
static void WalletBalanceClean(benchmark::Bench& bench) { WalletBalance(bench, /*set_dirty=*/false, /*add_mine=*/true); }
|
|
static void WalletBalanceMine(benchmark::Bench& bench) { WalletBalance(bench, /*set_dirty=*/false, /*add_mine=*/true); }
|
|
static void WalletBalanceWatch(benchmark::Bench& bench) { WalletBalance(bench, /*set_dirty=*/false, /*add_mine=*/false); }
|
|
|
|
BENCHMARK(WalletBalanceDirty, benchmark::PriorityLevel::HIGH);
|
|
BENCHMARK(WalletBalanceClean, benchmark::PriorityLevel::HIGH);
|
|
BENCHMARK(WalletBalanceMine, benchmark::PriorityLevel::HIGH);
|
|
BENCHMARK(WalletBalanceWatch, benchmark::PriorityLevel::HIGH);
|