mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-21 14:34:49 +01:00
Merge bitcoin/bitcoin#30407: test: [refactor] Pass TestOpts
fa690c8e53
test: [refactor] Pass TestOpts (MarcoFalke) Pull request description: Currently optional test context setup settings are passed by adding a new optional argument to the constructors. For example `extra_args`. This is problematic, because: * Adding more optional settings in the future requires touching all affected constructors, increasing their verbosity. * Setting only a later option requires setting the earlier ones. * Clang-tidy named args passed to `std::make_unique` are not checked. Fix all issues by adding a new struct `TestOpts`, which holds all options. Notes: * The chain type is not an option in the struct for now, because the default values vary. * The struct holds all possible test options globally. Not all fields may be used by all constructors. Albeit harmless, it is up to the test author to not set a field that is unused. ACKs for top commit: kevkevinpal: utACK [fa690c8
](fa690c8e53
) dergoegge: utACKfa690c8e53
TheCharlatan: Nice, ACKfa690c8e53
Tree-SHA512: 8db8efa5dff854a73757d3f454f8f902e41bb4358f5f9bae29dbb3e251e20ee93489605de51d0822ba31d97835cd15526a29c075278dd6a8bbde26134feb4f49
This commit is contained in:
commit
ff827a8f46
13 changed files with 40 additions and 41 deletions
|
@ -20,7 +20,7 @@ static void Logging(benchmark::Bench& bench, const std::vector<const char*>& ext
|
|||
|
||||
TestingSetup test_setup{
|
||||
ChainType::REGTEST,
|
||||
extra_args,
|
||||
{.extra_args = extra_args},
|
||||
};
|
||||
|
||||
bench.run([&] { log(); });
|
||||
|
|
|
@ -106,7 +106,7 @@ static void ComplexMemPool(benchmark::Bench& bench)
|
|||
static void MempoolCheck(benchmark::Bench& bench)
|
||||
{
|
||||
FastRandomContext det_rand{true};
|
||||
auto testing_setup = MakeNoLogFileContext<TestChain100Setup>(ChainType::REGTEST, {"-checkmempool=1"});
|
||||
auto testing_setup = MakeNoLogFileContext<TestChain100Setup>(ChainType::REGTEST, {.extra_args = {"-checkmempool=1"}});
|
||||
CTxMemPool& pool = *testing_setup.get()->m_node.mempool;
|
||||
LOCK2(cs_main, pool.cs);
|
||||
testing_setup->PopulateMempool(det_rand, 400, true);
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
struct NoLockLoggingTestingSetup : public TestingSetup {
|
||||
NoLockLoggingTestingSetup()
|
||||
#ifdef DEBUG_LOCKCONTENTION
|
||||
: TestingSetup{ChainType::MAIN, /*extra_args=*/{"-debugexclude=lock"}} {}
|
||||
: TestingSetup{ChainType::MAIN, {.extra_args = { "-debugexclude=lock" } }} {}
|
||||
#else
|
||||
: TestingSetup{ChainType::MAIN} {}
|
||||
#endif
|
||||
|
|
|
@ -42,7 +42,7 @@ void initialize_process_message()
|
|||
|
||||
static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(
|
||||
/*chain_type=*/ChainType::REGTEST,
|
||||
/*extra_args=*/{"-txreconciliation"});
|
||||
{.extra_args = {"-txreconciliation"}});
|
||||
g_setup = testing_setup.get();
|
||||
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
|
||||
MineBlock(g_setup->m_node, CScript() << OP_TRUE);
|
||||
|
|
|
@ -32,7 +32,7 @@ void initialize_process_messages()
|
|||
{
|
||||
static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(
|
||||
/*chain_type=*/ChainType::REGTEST,
|
||||
/*extra_args=*/{"-txreconciliation"});
|
||||
{.extra_args = {"-txreconciliation"}});
|
||||
g_setup = testing_setup.get();
|
||||
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
|
||||
MineBlock(g_setup->m_node, CScript() << OP_TRUE);
|
||||
|
|
|
@ -41,7 +41,7 @@ using util::ToString;
|
|||
|
||||
namespace {
|
||||
struct RPCFuzzTestingSetup : public TestingSetup {
|
||||
RPCFuzzTestingSetup(const ChainType chain_type, const std::vector<const char*>& extra_args) : TestingSetup{chain_type, extra_args}
|
||||
RPCFuzzTestingSetup(const ChainType chain_type, TestOpts opts) : TestingSetup{chain_type, opts}
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ FUZZ_TARGET(utxo_total_supply)
|
|||
ChainTestingSetup test_setup{
|
||||
ChainType::REGTEST,
|
||||
{
|
||||
"-testactivationheight=bip34@2",
|
||||
.extra_args = {"-testactivationheight=bip34@2"},
|
||||
},
|
||||
};
|
||||
// Create chainstate
|
||||
|
|
|
@ -23,8 +23,8 @@ class EnvTestingSetup : public BasicTestingSetup
|
|||
{
|
||||
public:
|
||||
explicit EnvTestingSetup(const ChainType chainType = ChainType::MAIN,
|
||||
const std::vector<const char*>& extra_args = {})
|
||||
: BasicTestingSetup{chainType, extra_args},
|
||||
TestOpts opts = {})
|
||||
: BasicTestingSetup{chainType, opts},
|
||||
m_prev_log_level{LogInstance().LogLevel()},
|
||||
m_create_sock_orig{CreateSock}
|
||||
{
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
struct LogIPsTestingSetup : public TestingSetup {
|
||||
LogIPsTestingSetup()
|
||||
: TestingSetup{ChainType::MAIN, /*extra_args=*/{"-logips"}} {}
|
||||
: TestingSetup{ChainType::MAIN, {.extra_args = {"-logips"}}} {}
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(net_peer_connection_tests, LogIPsTestingSetup)
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
struct Dersig100Setup : public TestChain100Setup {
|
||||
Dersig100Setup()
|
||||
: TestChain100Setup{ChainType::REGTEST, {"-testactivationheight=dersig@102"}} {}
|
||||
: TestChain100Setup{ChainType::REGTEST, {.extra_args = {"-testactivationheight=dersig@102"}}} {}
|
||||
};
|
||||
|
||||
bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
|
||||
|
|
|
@ -108,7 +108,7 @@ static void ExitFailure(std::string_view str_err)
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vector<const char*>& extra_args)
|
||||
BasicTestingSetup::BasicTestingSetup(const ChainType chainType, TestOpts opts)
|
||||
: m_args{}
|
||||
{
|
||||
m_node.shutdown = &m_interrupt;
|
||||
|
@ -125,7 +125,7 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vecto
|
|||
"-debugexclude=libevent",
|
||||
"-debugexclude=leveldb",
|
||||
},
|
||||
extra_args);
|
||||
opts.extra_args);
|
||||
if (G_TEST_COMMAND_LINE_ARGUMENTS) {
|
||||
arguments = Cat(arguments, G_TEST_COMMAND_LINE_ARGUMENTS());
|
||||
}
|
||||
|
@ -211,8 +211,8 @@ BasicTestingSetup::~BasicTestingSetup()
|
|||
gArgs.ClearArgs();
|
||||
}
|
||||
|
||||
ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vector<const char*>& extra_args)
|
||||
: BasicTestingSetup(chainType, extra_args)
|
||||
ChainTestingSetup::ChainTestingSetup(const ChainType chainType, TestOpts opts)
|
||||
: BasicTestingSetup(chainType, opts)
|
||||
{
|
||||
const CChainParams& chainparams = Params();
|
||||
|
||||
|
@ -295,13 +295,11 @@ void ChainTestingSetup::LoadVerifyActivateChainstate()
|
|||
|
||||
TestingSetup::TestingSetup(
|
||||
const ChainType chainType,
|
||||
const std::vector<const char*>& extra_args,
|
||||
const bool coins_db_in_memory,
|
||||
const bool block_tree_db_in_memory)
|
||||
: ChainTestingSetup(chainType, extra_args)
|
||||
TestOpts opts)
|
||||
: ChainTestingSetup(chainType, opts)
|
||||
{
|
||||
m_coins_db_in_memory = coins_db_in_memory;
|
||||
m_block_tree_db_in_memory = block_tree_db_in_memory;
|
||||
m_coins_db_in_memory = opts.coins_db_in_memory;
|
||||
m_block_tree_db_in_memory = opts.block_tree_db_in_memory;
|
||||
// Ideally we'd move all the RPC tests to the functional testing framework
|
||||
// instead of unit tests, but for now we need these here.
|
||||
RegisterAllCoreRPCCommands(tableRPC);
|
||||
|
@ -330,11 +328,9 @@ TestingSetup::TestingSetup(
|
|||
}
|
||||
|
||||
TestChain100Setup::TestChain100Setup(
|
||||
const ChainType chain_type,
|
||||
const std::vector<const char*>& extra_args,
|
||||
const bool coins_db_in_memory,
|
||||
const bool block_tree_db_in_memory)
|
||||
: TestingSetup{ChainType::REGTEST, extra_args, coins_db_in_memory, block_tree_db_in_memory}
|
||||
const ChainType chain_type,
|
||||
TestOpts opts)
|
||||
: TestingSetup{ChainType::REGTEST, opts}
|
||||
{
|
||||
SetMockTime(1598887952);
|
||||
constexpr std::array<unsigned char, 32> vchKey = {
|
||||
|
|
|
@ -48,6 +48,12 @@ std::ostream& operator<<(typename std::enable_if<std::is_enum<T>::value, std::os
|
|||
|
||||
static constexpr CAmount CENT{1000000};
|
||||
|
||||
struct TestOpts {
|
||||
std::vector<const char*> extra_args{};
|
||||
bool coins_db_in_memory{true};
|
||||
bool block_tree_db_in_memory{true};
|
||||
};
|
||||
|
||||
/** Basic testing setup.
|
||||
* This just configures logging, data dir and chain parameters.
|
||||
*/
|
||||
|
@ -55,7 +61,7 @@ struct BasicTestingSetup {
|
|||
util::SignalInterrupt m_interrupt;
|
||||
node::NodeContext m_node; // keep as first member to be destructed last
|
||||
|
||||
explicit BasicTestingSetup(const ChainType chainType = ChainType::MAIN, const std::vector<const char*>& extra_args = {});
|
||||
explicit BasicTestingSetup(const ChainType chainType = ChainType::MAIN, TestOpts = {});
|
||||
~BasicTestingSetup();
|
||||
|
||||
fs::path m_path_root;
|
||||
|
@ -73,7 +79,7 @@ struct ChainTestingSetup : public BasicTestingSetup {
|
|||
bool m_coins_db_in_memory{true};
|
||||
bool m_block_tree_db_in_memory{true};
|
||||
|
||||
explicit ChainTestingSetup(const ChainType chainType = ChainType::MAIN, const std::vector<const char*>& extra_args = {});
|
||||
explicit ChainTestingSetup(const ChainType chainType = ChainType::MAIN, TestOpts = {});
|
||||
~ChainTestingSetup();
|
||||
|
||||
// Supplies a chainstate, if one is needed
|
||||
|
@ -85,9 +91,7 @@ struct ChainTestingSetup : public BasicTestingSetup {
|
|||
struct TestingSetup : public ChainTestingSetup {
|
||||
explicit TestingSetup(
|
||||
const ChainType chainType = ChainType::MAIN,
|
||||
const std::vector<const char*>& extra_args = {},
|
||||
const bool coins_db_in_memory = true,
|
||||
const bool block_tree_db_in_memory = true);
|
||||
TestOpts = {});
|
||||
};
|
||||
|
||||
/** Identical to TestingSetup, but chain set to regtest */
|
||||
|
@ -106,9 +110,7 @@ class CScript;
|
|||
struct TestChain100Setup : public TestingSetup {
|
||||
TestChain100Setup(
|
||||
const ChainType chain_type = ChainType::REGTEST,
|
||||
const std::vector<const char*>& extra_args = {},
|
||||
const bool coins_db_in_memory = true,
|
||||
const bool block_tree_db_in_memory = true);
|
||||
TestOpts = {});
|
||||
|
||||
/**
|
||||
* Create a new block with just given transactions, coinbase paying to
|
||||
|
@ -220,16 +222,16 @@ struct TestChain100Setup : public TestingSetup {
|
|||
* be used in "hot loops", for example fuzzing or benchmarking.
|
||||
*/
|
||||
template <class T = const BasicTestingSetup>
|
||||
std::unique_ptr<T> MakeNoLogFileContext(const ChainType chain_type = ChainType::REGTEST, const std::vector<const char*>& extra_args = {})
|
||||
std::unique_ptr<T> MakeNoLogFileContext(const ChainType chain_type = ChainType::REGTEST, TestOpts opts = {})
|
||||
{
|
||||
const std::vector<const char*> arguments = Cat(
|
||||
opts.extra_args = Cat(
|
||||
{
|
||||
"-nodebuglogfile",
|
||||
"-nodebug",
|
||||
},
|
||||
extra_args);
|
||||
opts.extra_args);
|
||||
|
||||
return std::make_unique<T>(chain_type, arguments);
|
||||
return std::make_unique<T>(chain_type, opts);
|
||||
}
|
||||
|
||||
CBlock getBlock13b8a();
|
||||
|
|
|
@ -167,9 +167,10 @@ struct SnapshotTestSetup : TestChain100Setup {
|
|||
// destructive filesystem operations.
|
||||
SnapshotTestSetup() : TestChain100Setup{
|
||||
{},
|
||||
{},
|
||||
/*coins_db_in_memory=*/false,
|
||||
/*block_tree_db_in_memory=*/false,
|
||||
{
|
||||
.coins_db_in_memory = false,
|
||||
.block_tree_db_in_memory = false,
|
||||
},
|
||||
}
|
||||
{
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue