From fa6b45fa8ec8248544d22ba8429be8f6df19024a Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Wed, 7 May 2025 13:11:03 +0200 Subject: [PATCH 1/3] Add SetMockTime for time_point types --- src/util/time.cpp | 1 + src/util/time.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/util/time.cpp b/src/util/time.cpp index 62d2c98debd..68af84a8fcc 100644 --- a/src/util/time.cpp +++ b/src/util/time.cpp @@ -38,6 +38,7 @@ NodeClock::time_point NodeClock::now() noexcept }; void SetMockTime(int64_t nMockTimeIn) { SetMockTime(std::chrono::seconds{nMockTimeIn}); } +void SetMockTime(std::chrono::time_point mock) { SetMockTime(mock.time_since_epoch()); } void SetMockTime(std::chrono::seconds mock_time_in) { Assert(mock_time_in >= 0s); diff --git a/src/util/time.h b/src/util/time.h index 6bfa469a52a..655db4475a5 100644 --- a/src/util/time.h +++ b/src/util/time.h @@ -107,6 +107,7 @@ void SetMockTime(int64_t nMockTimeIn); /** For testing. Set e.g. with the setmocktime rpc, or -mocktime argument */ void SetMockTime(std::chrono::seconds mock_time_in); +void SetMockTime(std::chrono::time_point mock); /** For testing */ std::chrono::seconds GetMockTime(); From fa26bfde988b1940e6b0d21accc60fbc4e45f9b1 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Wed, 7 May 2025 09:42:32 +0200 Subject: [PATCH 2/3] test: Avoid resetting mocktime in testing setup This allows to set the mocktime before the testing setup. Also, in some fuzz tests the mocktime was reset to 0 before this change, so set it. --- src/init.cpp | 4 +++- src/test/fuzz/package_eval.cpp | 1 + src/test/fuzz/process_message.cpp | 1 + src/test/fuzz/process_messages.cpp | 1 + src/test/fuzz/tx_pool.cpp | 1 + src/test/fuzz/utxo_snapshot.cpp | 1 + src/test/fuzz/utxo_total_supply.cpp | 3 +-- 7 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 1f72c22ec2f..a1be6d7ec09 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1052,7 +1052,9 @@ bool AppInitParameterInteraction(const ArgsManager& args) if (!g_wallet_init_interface.ParameterInteraction()) return false; // Option to startup with mocktime set (used for regression testing): - SetMockTime(args.GetIntArg("-mocktime", 0)); // SetMockTime(0) is a no-op + if (const auto mocktime{args.GetIntArg("-mocktime")}) { + SetMockTime(std::chrono::seconds{*mocktime}); + } if (args.GetBoolArg("-peerbloomfilters", DEFAULT_PEERBLOOMFILTERS)) g_local_services = ServiceFlags(g_local_services | NODE_BLOOM); diff --git a/src/test/fuzz/package_eval.cpp b/src/test/fuzz/package_eval.cpp index ff20f12fc73..f263ffb6031 100644 --- a/src/test/fuzz/package_eval.cpp +++ b/src/test/fuzz/package_eval.cpp @@ -42,6 +42,7 @@ void initialize_tx_pool() { static const auto testing_setup = MakeNoLogFileContext(); g_setup = testing_setup.get(); + SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time())); BlockAssembler::Options options; options.coinbase_output_script = P2WSH_EMPTY; diff --git a/src/test/fuzz/process_message.cpp b/src/test/fuzz/process_message.cpp index 4bd38a1ac68..ac521370e8e 100644 --- a/src/test/fuzz/process_message.cpp +++ b/src/test/fuzz/process_message.cpp @@ -44,6 +44,7 @@ void initialize_process_message() /*chain_type=*/ChainType::REGTEST, {.extra_args = {"-txreconciliation"}}); g_setup = testing_setup.get(); + SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time())); for (int i = 0; i < 2 * COINBASE_MATURITY; i++) { MineBlock(g_setup->m_node, {}); } diff --git a/src/test/fuzz/process_messages.cpp b/src/test/fuzz/process_messages.cpp index 0688868c02b..f172b1ad6e1 100644 --- a/src/test/fuzz/process_messages.cpp +++ b/src/test/fuzz/process_messages.cpp @@ -34,6 +34,7 @@ void initialize_process_messages() /*chain_type=*/ChainType::REGTEST, {.extra_args = {"-txreconciliation"}}); g_setup = testing_setup.get(); + SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time())); for (int i = 0; i < 2 * COINBASE_MATURITY; i++) { MineBlock(g_setup->m_node, {}); } diff --git a/src/test/fuzz/tx_pool.cpp b/src/test/fuzz/tx_pool.cpp index a697ee9d838..025e6d51ef6 100644 --- a/src/test/fuzz/tx_pool.cpp +++ b/src/test/fuzz/tx_pool.cpp @@ -44,6 +44,7 @@ void initialize_tx_pool() { static const auto testing_setup = MakeNoLogFileContext(); g_setup = testing_setup.get(); + SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time())); BlockAssembler::Options options; options.coinbase_output_script = P2WSH_OP_TRUE; diff --git a/src/test/fuzz/utxo_snapshot.cpp b/src/test/fuzz/utxo_snapshot.cpp index 0916c6258c7..56d3615570f 100644 --- a/src/test/fuzz/utxo_snapshot.cpp +++ b/src/test/fuzz/utxo_snapshot.cpp @@ -72,6 +72,7 @@ void initialize_chain() const auto params{CreateChainParams(ArgsManager{}, ChainType::REGTEST)}; static const auto chain{CreateBlockChain(2 * COINBASE_MATURITY, *params)}; g_chain = &chain; + SetMockTime(chain.back()->Time()); // Make sure we can generate a valid snapshot. sanity_check_snapshot(); diff --git a/src/test/fuzz/utxo_total_supply.cpp b/src/test/fuzz/utxo_total_supply.cpp index 9be85df99fa..d9382ca8317 100644 --- a/src/test/fuzz/utxo_total_supply.cpp +++ b/src/test/fuzz/utxo_total_supply.cpp @@ -24,14 +24,13 @@ FUZZ_TARGET(utxo_total_supply) { SeedRandomStateForTest(SeedRand::ZEROS); FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); - const auto mock_time{ConsumeTime(fuzzed_data_provider, /*min=*/1296688602)}; // regtest genesis block timestamp + SetMockTime(ConsumeTime(fuzzed_data_provider, /*min=*/1296688602)); // regtest genesis block timestamp /** The testing setup that creates a chainman only (no chainstate) */ ChainTestingSetup test_setup{ ChainType::REGTEST, { .extra_args = { "-testactivationheight=bip34@2", - strprintf("-mocktime=%d", mock_time).c_str() }, }, }; From fa8862723c14cdd471bbffc7a4897ece2e6d8a7f Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Wed, 9 Jul 2025 14:25:07 +0200 Subject: [PATCH 3/3] fuzz: CheckGlobals in init --- src/test/fuzz/fuzz.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/fuzz/fuzz.cpp b/src/test/fuzz/fuzz.cpp index 96ff3b55fac..d4d82a623b4 100644 --- a/src/test/fuzz/fuzz.cpp +++ b/src/test/fuzz/fuzz.cpp @@ -94,6 +94,7 @@ const std::function G_TEST_GET_FULL_NAME{[]{ static void initialize() { + CheckGlobals check{}; // By default, make the RNG deterministic with a fixed seed. This will affect all // randomness during the fuzz test, except: // - GetStrongRandBytes(), which is used for the creation of private key material.