diff --git a/src/test/fuzz/p2p_headers_presync.cpp b/src/test/fuzz/p2p_headers_presync.cpp index d587137413c..e9de1850f5a 100644 --- a/src/test/fuzz/p2p_headers_presync.cpp +++ b/src/test/fuzz/p2p_headers_presync.cpp @@ -172,7 +172,7 @@ FUZZ_TARGET(p2p_headers_presync, .init = initialize) FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; // The steady clock is currently only used for logging, so a constant // time-point seems acceptable for now. - ElapseSteady elapse_steady{}; + SteadyClockContext steady_ctx{}; ChainstateManager& chainman = *g_testing_setup->m_node.chainman; CBlockHeader base{chainman.GetParams().GenesisBlock()}; diff --git a/src/test/util/time.h b/src/test/util/time.h index 4e5d760bf3c..bcb97eb4e14 100644 --- a/src/test/util/time.h +++ b/src/test/util/time.h @@ -5,16 +5,30 @@ #ifndef BITCOIN_TEST_UTIL_TIME_H #define BITCOIN_TEST_UTIL_TIME_H +#include #include -struct ElapseSteady { + +/// Helper to initialize the global MockableSteadyClock, let a duration elapse, +/// and reset it after use in a test. +class SteadyClockContext +{ MockableSteadyClock::mock_time_point::duration t{MockableSteadyClock::INITIAL_MOCK_TIME}; - ElapseSteady() - { - (*this)(0s); // init - } - void operator()(std::chrono::milliseconds d) + +public: + /** Initialize with INITIAL_MOCK_TIME. */ + explicit SteadyClockContext() { (*this) += 0s; } + + /** Unset mocktime */ + ~SteadyClockContext() { MockableSteadyClock::ClearMockTime(); } + + SteadyClockContext(const SteadyClockContext&) = delete; + SteadyClockContext& operator=(const SteadyClockContext&) = delete; + + /** Change mocktime by the given duration delta */ + void operator+=(std::chrono::milliseconds d) { + Assert(d >= 0s); // Steady time can only increase monotonically. t += d; MockableSteadyClock::SetMockTime(t); }