diff --git a/nano/core_test/testutil.hpp b/nano/core_test/testutil.hpp index 348e88cc..612f207e 100644 --- a/nano/core_test/testutil.hpp +++ b/nano/core_test/testutil.hpp @@ -32,6 +32,14 @@ GTEST_TEST_ERROR_CODE ((condition.value () > 0), #condition, "An error was expected", "", \ GTEST_FATAL_FAILURE_) +/** Asserts that the condition becomes true within the deadline */ +#define ASSERT_TIMELY(time, condition) \ + system.deadline_set (time); \ + while (!(condition)) \ + { \ + ASSERT_NO_ERROR (system.poll ()); \ + } + /* Convenience globals for core_test */ namespace nano { diff --git a/nano/node/testing.cpp b/nano/node/testing.cpp index 45c6e092..d4c86a26 100644 --- a/nano/node/testing.cpp +++ b/nano/node/testing.cpp @@ -178,6 +178,17 @@ std::error_code nano::system::poll (std::chrono::nanoseconds const & wait_time) return ec; } +std::error_code nano::system::poll_until_true (std::chrono::nanoseconds deadline_a, std::function predicate_a) +{ + std::error_code ec; + deadline_set (deadline_a); + while (!ec && !predicate_a ()) + { + ec = poll (); + } + return ec; +} + namespace { class traffic_generator : public std::enable_shared_from_this diff --git a/nano/node/testing.hpp b/nano/node/testing.hpp index 59d74afc..4b1a860d 100644 --- a/nano/node/testing.hpp +++ b/nano/node/testing.hpp @@ -38,6 +38,7 @@ public: * @returns 0 or nano::deadline_expired */ std::error_code poll (const std::chrono::nanoseconds & sleep_time = std::chrono::milliseconds (50)); + std::error_code poll_until_true (std::chrono::nanoseconds deadline, std::function); void stop (); void deadline_set (const std::chrono::duration & delta); std::shared_ptr add_node (nano::node_flags = nano::node_flags (), nano::transport::transport_type = nano::transport::transport_type::tcp);