From fa9c38794efb476d2c6e9dcbc9b137b8a1bac64a Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Fri, 28 Mar 2025 10:06:25 +0100 Subject: [PATCH] test: Introduce MockableSteadyClock::mock_time_point and ElapseSteady helper This refactor clarifies that the MockableSteadyClock::mock_time_point has millisecond precision by defining a type an using it. Moreover, a ElapseSteady helper is added which can be re-used easily. --- src/test/util/CMakeLists.txt | 1 + src/test/util/time.cpp | 5 +++++ src/test/util/time.h | 23 +++++++++++++++++++++++ src/util/time.cpp | 4 ++-- src/util/time.h | 5 +++-- 5 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/test/util/time.cpp create mode 100644 src/test/util/time.h diff --git a/src/test/util/CMakeLists.txt b/src/test/util/CMakeLists.txt index cd7c4c0118..3a6e31c720 100644 --- a/src/test/util/CMakeLists.txt +++ b/src/test/util/CMakeLists.txt @@ -15,6 +15,7 @@ add_library(test_util STATIC EXCLUDE_FROM_ALL script.cpp setup_common.cpp str.cpp + time.cpp transaction_utils.cpp txmempool.cpp validation.cpp diff --git a/src/test/util/time.cpp b/src/test/util/time.cpp new file mode 100644 index 0000000000..8c8d98c0ad --- /dev/null +++ b/src/test/util/time.cpp @@ -0,0 +1,5 @@ +// Copyright (c) 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 diff --git a/src/test/util/time.h b/src/test/util/time.h new file mode 100644 index 0000000000..4e5d760bf3 --- /dev/null +++ b/src/test/util/time.h @@ -0,0 +1,23 @@ +// Copyright (c) The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_TEST_UTIL_TIME_H +#define BITCOIN_TEST_UTIL_TIME_H + +#include + +struct ElapseSteady { + MockableSteadyClock::mock_time_point::duration t{MockableSteadyClock::INITIAL_MOCK_TIME}; + ElapseSteady() + { + (*this)(0s); // init + } + void operator()(std::chrono::milliseconds d) + { + t += d; + MockableSteadyClock::SetMockTime(t); + } +}; + +#endif // BITCOIN_TEST_UTIL_TIME_H diff --git a/src/util/time.cpp b/src/util/time.cpp index cafc27e0d0..62d2c98deb 100644 --- a/src/util/time.cpp +++ b/src/util/time.cpp @@ -21,7 +21,7 @@ void UninterruptibleSleep(const std::chrono::microseconds& n) { std::this_thread static std::atomic g_mock_time{}; //!< For testing std::atomic g_used_system_time{false}; -static std::atomic g_mock_steady_time{}; //!< For testing +static std::atomic g_mock_steady_time{}; //!< For testing NodeClock::time_point NodeClock::now() noexcept { @@ -62,7 +62,7 @@ MockableSteadyClock::time_point MockableSteadyClock::now() noexcept return time_point{ret}; }; -void MockableSteadyClock::SetMockTime(std::chrono::milliseconds mock_time_in) +void MockableSteadyClock::SetMockTime(mock_time_point::duration mock_time_in) { Assert(mock_time_in >= 0s); g_mock_steady_time.store(mock_time_in, std::memory_order_relaxed); diff --git a/src/util/time.h b/src/util/time.h index c43b306ff2..6bfa469a52 100644 --- a/src/util/time.h +++ b/src/util/time.h @@ -38,7 +38,8 @@ using SystemClock = std::chrono::system_clock; struct MockableSteadyClock : public std::chrono::steady_clock { using time_point = std::chrono::time_point; - static constexpr std::chrono::milliseconds INITIAL_MOCK_TIME{1}; + using mock_time_point = std::chrono::time_point; + static constexpr mock_time_point::duration INITIAL_MOCK_TIME{1}; /** Return current system time or mocked time, if set */ static time_point now() noexcept; @@ -50,7 +51,7 @@ struct MockableSteadyClock : public std::chrono::steady_clock { * for testing. * To stop mocking, call ClearMockTime(). */ - static void SetMockTime(std::chrono::milliseconds mock_time_in); + static void SetMockTime(mock_time_point::duration mock_time_in); /** Clear mock time, go back to system steady clock. */ static void ClearMockTime();