diff --git a/src/init.cpp b/src/init.cpp index a741a669b06..470c91498d0 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/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. 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() }, }, }; 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();