24TEST(BoostAsioTimer, TimerFiresWithinReasonableTime) {
25 boost::asio::io_context io;
26 boost::asio::steady_timer timer{io, std::chrono::milliseconds(10)};
28 std::atomic<bool> fired{
false};
29 timer.async_wait([&](
const boost::system::error_code &ec) {
30 EXPECT_FALSE(ec) <<
"steady_timer error: " << ec.message();
34 std::thread t{[&] { io.run(); }};
37 EXPECT_TRUE(fired) <<
"steady_timer handler never fired";
42TEST(BoostAsioTimer, ExpiresAtNowComparison) {
43 boost::asio::io_context io;
44 boost::asio::steady_timer timer{io, std::chrono::milliseconds(5)};
47 auto expires_at = timer.expiry();
48 auto now_before = std::chrono::steady_clock::now();
49 EXPECT_GT(expires_at, now_before);
52 std::atomic<bool> done{
false};
53 timer.async_wait([&](
const boost::system::error_code &) { done =
true; });
54 std::thread t{[&] { io.run(); }};
58 auto now_after = std::chrono::steady_clock::now();
59 EXPECT_GE(now_after, expires_at);
66TEST(BoostAsioTimer, ChronoDurationComposition) {
67 const std::chrono::milliseconds d{250};
68 EXPECT_EQ(d.count(), 250);
69 EXPECT_EQ(std::chrono::duration_cast<std::chrono::seconds>(d).count(), 0);
77TEST(BoostAsioTimer, InitializedWithMaxIsInDistantFuture) {
78 boost::asio::io_context io;
79 boost::asio::steady_timer timer{io, std::chrono::steady_clock::time_point::max()};
80 EXPECT_GT(timer.expiry(), std::chrono::steady_clock::now());
88TEST(BoostAsioTimer, DefaultConstructedExpiryIsInPast) {
89 boost::asio::io_context io;
90 boost::asio::steady_timer timer{io};
91 EXPECT_LE(timer.expiry(), std::chrono::steady_clock::now());
97TEST(BoostAsioTimer, CancelTriggersAbortedError) {
98 boost::asio::io_context io;
99 boost::asio::steady_timer timer{io, std::chrono::seconds(60)};
100 boost::system::error_code captured;
101 std::atomic<bool> fired{
false};
102 timer.async_wait([&](
const boost::system::error_code &ec) {
109 EXPECT_EQ(captured, boost::asio::error::operation_aborted);