Skip to content

Commit

Permalink
Test Timeout
Browse files Browse the repository at this point in the history
  • Loading branch information
Al2Klimov committed Nov 26, 2024
1 parent 21fc946 commit 144abb1
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 0 deletions.
5 changes: 5 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ set(base_test_SOURCES
base-convert.cpp
base-dictionary.cpp
base-fifo.cpp
base-io-engine.cpp
base-json.cpp
base-match.cpp
base-netstring.cpp
Expand Down Expand Up @@ -128,6 +129,10 @@ add_boost_test(base
base_dictionary/keys_ordered
base_fifo/construct
base_fifo/io
base_io_engine/timeout_run
base_io_engine/timeout_cancelled
base_io_engine/timeout_scope
base_io_engine/timeout_due_cancelled
base_json/encode
base_json/decode
base_json/invalid1
Expand Down
115 changes: 115 additions & 0 deletions test/base-io-engine.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
/* Icinga 2 | (c) 2024 Icinga GmbH | GPLv2+ */

#include "base/io-engine.hpp"
#include "base/utility.hpp"
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <BoostTestTargetConfig.h>

using namespace icinga;

BOOST_AUTO_TEST_SUITE(base_io_engine)

BOOST_AUTO_TEST_CASE(timeout_run)
{
boost::asio::io_context io;
boost::asio::io_context::strand strand (io);
int called = 0;

boost::asio::spawn(strand, [&](boost::asio::yield_context yc) {
boost::asio::deadline_timer timer (io);

Timeout::Ptr timeout = new Timeout(io, strand, boost::posix_time::seconds(3), [&called] { ++called; });
BOOST_CHECK_EQUAL(called, 0);

timer.expires_from_now(boost::posix_time::seconds(2));
timer.async_wait(yc);
BOOST_CHECK_EQUAL(called, 0);

timer.expires_from_now(boost::posix_time::seconds(2));
timer.async_wait(yc);
});

io.run();
BOOST_CHECK_EQUAL(called, 1);
}

BOOST_AUTO_TEST_CASE(timeout_cancelled)
{
boost::asio::io_context io;
boost::asio::io_context::strand strand (io);
int called = 0;

boost::asio::spawn(strand, [&](boost::asio::yield_context yc) {
boost::asio::deadline_timer timer (io);
Timeout::Ptr timeout = new Timeout(io, strand, boost::posix_time::seconds(3), [&called] { ++called; });

timer.expires_from_now(boost::posix_time::seconds(2));
timer.async_wait(yc);

timeout->Cancel();
BOOST_CHECK_EQUAL(called, 0);

timer.expires_from_now(boost::posix_time::seconds(2));
timer.async_wait(yc);
});

io.run();
BOOST_CHECK_EQUAL(called, 0);
}

BOOST_AUTO_TEST_CASE(timeout_scope)
{
boost::asio::io_context io;
boost::asio::io_context::strand strand (io);
int called = 0;

boost::asio::spawn(strand, [&](boost::asio::yield_context yc) {
boost::asio::deadline_timer timer (io);

{
Timeout::Ptr timeout = new Timeout(io, strand, boost::posix_time::seconds(3), [&called] { ++called; });

timer.expires_from_now(boost::posix_time::seconds(2));
timer.async_wait(yc);
}

BOOST_CHECK_EQUAL(called, 0);

timer.expires_from_now(boost::posix_time::seconds(2));
timer.async_wait(yc);
});

io.run();
BOOST_CHECK_EQUAL(called, 0);
}

BOOST_AUTO_TEST_CASE(timeout_due_cancelled)
{
boost::asio::io_context io;
boost::asio::io_context::strand strand (io);
int called = 0;

boost::asio::spawn(strand, [&](boost::asio::yield_context yc) {
boost::asio::deadline_timer timer (io);
Timeout::Ptr timeout = new Timeout(io, strand, boost::posix_time::seconds(3), [&called] { ++called; });

// Give the timeout enough time to become due while blocking its strand to prevent it from actually running...
Utility::Sleep(4);

BOOST_CHECK_EQUAL(called, 0);

// ... so that this shall still work:
timeout->Cancel();

BOOST_CHECK_EQUAL(called, 0);

timer.expires_from_now(boost::posix_time::seconds(1));
timer.async_wait(yc);
});

io.run();
BOOST_CHECK_EQUAL(called, 0);
}

BOOST_AUTO_TEST_SUITE_END()

0 comments on commit 144abb1

Please sign in to comment.