From 7b379fdffe6a3aa318e3575da076f2660a560880 Mon Sep 17 00:00:00 2001 From: Will Hoy Date: Fri, 10 Oct 2025 11:03:13 +0100 Subject: [PATCH] bring boost timers up to date following deadline_timer deprecation --- src/rmq/rmqio/rmqio_asiotimer.cpp | 11 +++ src/rmq/rmqio/rmqio_asiotimer.h | 89 ++++++++++--------- src/tests/integration/requirements.txt | 1 + src/tests/integration/rmqapitests/fixtures.py | 2 +- src/tests/rmqio/rmqio_asiotimer.t.cpp | 10 +-- .../rmqio_backofflevelretrystrategy.t.cpp | 2 +- src/tests/rmqtestutil/CMakeLists.txt | 2 +- ...ride.cpp => rmqtestutil_clockoverride.cpp} | 6 +- ...override.h => rmqtestutil_clockoverride.h} | 32 +++---- 9 files changed, 83 insertions(+), 72 deletions(-) rename src/tests/rmqtestutil/{rmqtestutil_timeoverride.cpp => rmqtestutil_clockoverride.cpp} (84%) rename src/tests/rmqtestutil/{rmqtestutil_timeoverride.h => rmqtestutil_clockoverride.h} (56%) diff --git a/src/rmq/rmqio/rmqio_asiotimer.cpp b/src/rmq/rmqio/rmqio_asiotimer.cpp index 62266f38..b9bea480 100644 --- a/src/rmq/rmqio/rmqio_asiotimer.cpp +++ b/src/rmq/rmqio/rmqio_asiotimer.cpp @@ -14,3 +14,14 @@ // limitations under the License. #include + +namespace { +void instantiateTemplates() +{ + // Instantiate the templates to ensure that they compile. + BloombergLP::rmqio::AsioEventLoop eventLoop; + BloombergLP::rmqio::AsioTimerFactory timerFactory(eventLoop); + BloombergLP::rmqio::AsioTimer timer(eventLoop.context(), + BloombergLP::bsls::TimeInterval(1)); +} +} // namespace \ No newline at end of file diff --git a/src/rmq/rmqio/rmqio_asiotimer.h b/src/rmq/rmqio/rmqio_asiotimer.h index b649b157..765010fb 100644 --- a/src/rmq/rmqio/rmqio_asiotimer.h +++ b/src/rmq/rmqio/rmqio_asiotimer.h @@ -38,12 +38,12 @@ namespace rmqio { // // rmqio::AsioTimer: Provides a class for scheduling a cancellable // callback to be executed after a given timeout +typedef boost::asio::chrono::system_clock DefaultClockType; -template > +template class basic_AsioTimer : public Timer, - public bsl::enable_shared_from_this > { + public bsl::enable_shared_from_this > { public: basic_AsioTimer(boost::asio::io_context& context, const bsls::TimeInterval& timeout); @@ -60,14 +60,14 @@ class basic_AsioTimer basic_AsioTimer& operator=(const basic_AsioTimer&) BSLS_KEYWORD_DELETED; static void - handler_internal(bsl::weak_ptr > timer, + handler_internal(bsl::weak_ptr > timer, const Timer::Callback callback, const boost::system::error_code& error); void handler(const Timer::Callback& callback, const boost::system::error_code& error); void startTimer(); - boost::asio::basic_deadline_timer d_timer; + boost::asio::basic_waitable_timer d_timer; Timer::Callback d_callback; bsls::TimeInterval d_timeout; BALL_LOG_SET_CLASS_CATEGORY("RMQIO.ASIOTIMER"); @@ -75,8 +75,7 @@ class basic_AsioTimer typedef basic_AsioTimer<> AsioTimer; -template > +template class basic_AsioTimerFactory : public TimerFactory { public: basic_AsioTimerFactory(rmqio::AsioEventLoop& eventLoop); @@ -95,9 +94,9 @@ class basic_AsioTimerFactory : public TimerFactory { typedef basic_AsioTimerFactory<> AsioTimerFactory; -template -basic_AsioTimer::basic_AsioTimer(boost::asio::io_context& io_context, - const bsls::TimeInterval& timeout) +template +basic_AsioTimer::basic_AsioTimer(boost::asio::io_context& io_context, + const bsls::TimeInterval& timeout) : Timer() , d_timer(io_context) , d_callback() @@ -105,9 +104,9 @@ basic_AsioTimer::basic_AsioTimer(boost::asio::io_context& io_context, { } -template -basic_AsioTimer::basic_AsioTimer(boost::asio::io_context& io_context, - const Timer::Callback& callback) +template +basic_AsioTimer::basic_AsioTimer(boost::asio::io_context& io_context, + const Timer::Callback& callback) : Timer() , d_timer(io_context) , d_callback(callback) @@ -115,13 +114,13 @@ basic_AsioTimer::basic_AsioTimer(boost::asio::io_context& io_context, { } -template -basic_AsioTimer::~basic_AsioTimer() +template +basic_AsioTimer::~basic_AsioTimer() { } -template -void basic_AsioTimer::reset(const bsls::TimeInterval& timeout) +template +void basic_AsioTimer::reset(const bsls::TimeInterval& timeout) { if (!d_callback) { BALL_LOG_ERROR << "reset() called before start()"; @@ -131,42 +130,42 @@ void basic_AsioTimer::reset(const bsls::TimeInterval& timeout) startTimer(); } -template -void basic_AsioTimer::cancel() +template +void basic_AsioTimer::cancel() { d_timer.cancel(); } -template -void basic_AsioTimer::resetCallback(const Callback& callback) +template +void basic_AsioTimer::resetCallback(const Callback& callback) { d_callback = callback; } -template -void basic_AsioTimer::start(const Timer::Callback& callback) +template +void basic_AsioTimer::start(const Timer::Callback& callback) { d_callback = callback; startTimer(); } -template -void basic_AsioTimer::handler_internal( - bsl::weak_ptr > timer, +template +void basic_AsioTimer::handler_internal( + bsl::weak_ptr > timer, const Timer::Callback callback, const boost::system::error_code& error) { - bsl::shared_ptr > t = timer.lock(); + bsl::shared_ptr > t = timer.lock(); if (t) { t->handler(callback, error); } } -template -void basic_AsioTimer::handler(const Timer::Callback& callback, - const boost::system::error_code& error) +template +void basic_AsioTimer::handler(const Timer::Callback& callback, + const boost::system::error_code& error) { - if (!error && d_timer.expires_at() <= TT::now()) { + if (!error) { callback(Timer::EXPIRE); } else { @@ -178,38 +177,40 @@ void basic_AsioTimer::handler(const Timer::Callback& callback, } } -template -void basic_AsioTimer::startTimer() +template +void basic_AsioTimer::startTimer() { - d_timer.expires_from_now( - boost::posix_time::milliseconds(d_timeout.totalMilliseconds())); + d_timer.expires_after( + boost::asio::chrono::milliseconds(d_timeout.totalMilliseconds())); d_timer.async_wait( - bdlf::BindUtil::bind(&basic_AsioTimer::handler_internal, + bdlf::BindUtil::bind(&basic_AsioTimer::handler_internal, this->weak_from_this(), d_callback, bdlf::PlaceHolders::_1)); } -template -basic_AsioTimerFactory::basic_AsioTimerFactory( +template +basic_AsioTimerFactory::basic_AsioTimerFactory( rmqio::AsioEventLoop& eventLoop) : d_eventLoop(eventLoop) { } -template -bsl::shared_ptr basic_AsioTimerFactory::createWithTimeout( +template +bsl::shared_ptr +basic_AsioTimerFactory::createWithTimeout( const bsls::TimeInterval& timeout) { - return bsl::make_shared >( + return bsl::make_shared >( bsl::ref(d_eventLoop.context()), timeout); } -template -bsl::shared_ptr basic_AsioTimerFactory::createWithCallback( +template +bsl::shared_ptr +basic_AsioTimerFactory::createWithCallback( const Timer::Callback& callback) { - return bsl::make_shared >( + return bsl::make_shared >( bsl::ref(d_eventLoop.context()), callback); } diff --git a/src/tests/integration/requirements.txt b/src/tests/integration/requirements.txt index 2001f3e2..7d3dcd02 100644 --- a/src/tests/integration/requirements.txt +++ b/src/tests/integration/requirements.txt @@ -1,2 +1,3 @@ requests pytest +telnetlib3 diff --git a/src/tests/integration/rmqapitests/fixtures.py b/src/tests/integration/rmqapitests/fixtures.py index d0d8123a..f205d9be 100644 --- a/src/tests/integration/rmqapitests/fixtures.py +++ b/src/tests/integration/rmqapitests/fixtures.py @@ -19,7 +19,7 @@ import requests from requests.auth import HTTPBasicAuth from typing import Any -from telnetlib import Telnet +from telnetlib3 import Telnet from contextlib import contextmanager import logging import re diff --git a/src/tests/rmqio/rmqio_asiotimer.t.cpp b/src/tests/rmqio/rmqio_asiotimer.t.cpp index cfa1bd8a..09f36902 100644 --- a/src/tests/rmqio/rmqio_asiotimer.t.cpp +++ b/src/tests/rmqio/rmqio_asiotimer.t.cpp @@ -17,7 +17,7 @@ #include -#include +#include #include #include @@ -32,9 +32,7 @@ using namespace rmqio; using namespace ::testing; namespace { -typedef rmqio::basic_AsioTimer - FakeAsioTimer; +typedef rmqio::basic_AsioTimer FakeAsioTimer; } // namespace class MockCallback { @@ -70,7 +68,7 @@ TEST_F(AsioTimerTests, CallbackWhenExpires) { EXPECT_CALL(d_mockCallback, callback(Timer::EXPIRE)).Times(1); d_timer->start(d_callback); - rmqtestutil::TimeOverride::step_time(boost::posix_time::seconds(10)); + rmqtestutil::ClockOverride::step_time(boost::asio::chrono::seconds(10)); EXPECT_THAT(d_io.context().run_one(), Eq(1)); } @@ -91,7 +89,7 @@ TEST_F(AsioTimerTests, Reset) } d_timer->start(d_callback); d_timer->reset(bsls::TimeInterval(10)); - rmqtestutil::TimeOverride::step_time(boost::posix_time::seconds(10)); + rmqtestutil::ClockOverride::step_time(boost::asio::chrono::seconds(10)); EXPECT_THAT(d_io.context().run_one(), Eq(1)); EXPECT_THAT(d_io.context().run_one(), Eq(1)); } diff --git a/src/tests/rmqio/rmqio_backofflevelretrystrategy.t.cpp b/src/tests/rmqio/rmqio_backofflevelretrystrategy.t.cpp index 1c90043e..9a841245 100644 --- a/src/tests/rmqio/rmqio_backofflevelretrystrategy.t.cpp +++ b/src/tests/rmqio/rmqio_backofflevelretrystrategy.t.cpp @@ -16,8 +16,8 @@ #include #include +#include #include -#include #include diff --git a/src/tests/rmqtestutil/CMakeLists.txt b/src/tests/rmqtestutil/CMakeLists.txt index 18f90639..783289dc 100644 --- a/src/tests/rmqtestutil/CMakeLists.txt +++ b/src/tests/rmqtestutil/CMakeLists.txt @@ -1,6 +1,7 @@ add_library(rmqtestutil rmqtestutil.m.cpp rmqtestutil_callcount.cpp + rmqtestutil_clockoverride.cpp rmqtestutil_mockchannel.t.cpp rmqtestutil_mockeventloop.t.cpp rmqtestutil_mockmetricpublisher.cpp @@ -10,7 +11,6 @@ add_library(rmqtestutil rmqtestutil_replayframe.cpp rmqtestutil_savethreadid.cpp rmqtestutil_timedmetric.cpp - rmqtestutil_timeoverride.cpp ) target_link_libraries(rmqtestutil PUBLIC diff --git a/src/tests/rmqtestutil/rmqtestutil_timeoverride.cpp b/src/tests/rmqtestutil/rmqtestutil_clockoverride.cpp similarity index 84% rename from src/tests/rmqtestutil/rmqtestutil_timeoverride.cpp rename to src/tests/rmqtestutil/rmqtestutil_clockoverride.cpp index 94885ed0..e52c24e5 100644 --- a/src/tests/rmqtestutil/rmqtestutil_timeoverride.cpp +++ b/src/tests/rmqtestutil/rmqtestutil_clockoverride.cpp @@ -13,13 +13,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include +#include namespace BloombergLP { namespace rmqtestutil { -TimeOverride::duration_type TimeOverride::d_timeOffset = - boost::posix_time::seconds(0); +ClockOverride::duration ClockOverride::d_timeOffset = + boost::asio::chrono::seconds(0); } } // namespace BloombergLP diff --git a/src/tests/rmqtestutil/rmqtestutil_timeoverride.h b/src/tests/rmqtestutil/rmqtestutil_clockoverride.h similarity index 56% rename from src/tests/rmqtestutil/rmqtestutil_timeoverride.h rename to src/tests/rmqtestutil/rmqtestutil_clockoverride.h index b41d0d1a..e68a52bd 100644 --- a/src/tests/rmqtestutil/rmqtestutil_timeoverride.h +++ b/src/tests/rmqtestutil/rmqtestutil_clockoverride.h @@ -13,41 +13,41 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef INCLUDED_RMQTESTUTIL_TIMEOVERRIDE -#define INCLUDED_RMQTESTUTIL_TIMEOVERRIDE +#ifndef INCLUDED_RMQTESTUTIL_CLOCKOVERRIDE +#define INCLUDED_RMQTESTUTIL_CLOCKOVERRIDE #include +#include -//@PURPOSE: Provides TimeOverride class extended from -// boost::asio::deadline_timer::traits_type +//@PURPOSE: Provides ClockOverride class extended from +// rmqio::DefaultClockType // //@CLASSES: -// rmqtestutil::TimeOverride: Steps time in testing to trigger handler waiting -// on deadline_timer +// rmqtestutil::ClockOverride: Steps time in testing to trigger handler waiting +// on timer namespace BloombergLP { namespace rmqtestutil { -class TimeOverride : public boost::asio::deadline_timer::traits_type { +class ClockOverride : public rmqio::DefaultClockType { public: - static time_type now() + static void step_time(duration t) { d_timeOffset += t; } + + static time_point now() { - return add(boost::asio::deadline_timer::traits_type::now(), - d_timeOffset); + return rmqio::DefaultClockType::now() + d_timeOffset; } - static void step_time(duration_type t) { d_timeOffset += t; } - static boost::posix_time::time_duration to_posix_duration(duration_type d) + static duration to_wait_duration(duration d) { // This is the secret sauce to ensure that boost::asio keeps calling // `now()` and responds to our adjustments via `step_time` - return d < boost::posix_time::milliseconds(1) + return d < boost::asio::chrono::milliseconds(1) ? d - : boost::posix_time::milliseconds(1); + : boost::asio::chrono::milliseconds(1); } - static duration_type d_timeOffset; + static duration d_timeOffset; }; - } // namespace rmqtestutil } // namespace BloombergLP