icinga2/test/base-io-engine.cpp

161 lines
3.9 KiB
C++
Raw Permalink Normal View History

Replace all existing copyright headers with `SPDX` headers I've used the following command to replace the original copyright header lines in a C-style comment block: ``` $ find . \( -type d \( -name '\..*' -o -name third-party -o -name scripts -o -name prefix -o -name malloc -o -name server -o -name docker -o -name build -o -name doc \) -prune \) -o -type f -exec perl -pi -e 's{/\*[^*]*\(\s*c\s*\)\s*(\d{4})\s*Icinga\s+GmbH[^*]*\*/}{// SPDX-FileCopyrightText: \1 Icinga GmbH <https://icinga.com>\n// SPDX-License-Identifier: GPL-2.0-or-later}gi' {} + ``` For files that use shell-style comments (#) like CMakeLists.txt, I've used this command: ``` $ find . \( -type d \( -name '\..*' -o -name third-party -o -name scripts -o -name prefix -o -name malloc -o -name server -o -name docker -o -name build -o -name doc \) -prune \) -o -type f -exec perl -pi -e 's{#.*\(\s*c\s*\)\s(\d{4})\sIcinga\s+GmbH.*}{# SPDX-FileCopyrightText: \1 Icinga GmbH <https://icinga.com>\n# SPDX-License-Identifier: GPL-2.0-or-later}gi' {} + ``` And for SQL files: ``` $ find . \( -type d \( -name '\..*' -o -name third-party -o -name scripts -o -name prefix -o -name malloc -o -name server -o -name docker -o -name build -o -name doc \) -prune \) -o -type f \( -name '*.sql' \) -exec perl -pi -e 's{--.*\(c\)\s(\d{4})\sIcinga\sGmbH.*}{-- SPDX-FileCopyrightText: \1 Icinga GmbH <https://icinga.com>\n-- SPDX-License-Identifier: GPL-2.0-or-later}gi' {} + $ find . \( -type d \( -name '\..*' -o -name third-party -o -name scripts -o -name prefix -o -name malloc -o -name server -o -name docker -o -name build -o -name doc \) -prune \) -o -type f \( -name '*.sql' \) -exec perl -pi -e 's{-- Copyright \(c\)\s(\d{4})\sIcinga\s+Development\sTeam.*}{-- SPDX-FileCopyrightText: \1 Icinga GmbH <https://icinga.com>\n-- SPDX-License-Identifier: GPL-2.0-or-later}gi' {} + ```
2026-01-27 09:06:40 -05:00
// SPDX-FileCopyrightText: 2024 Icinga GmbH <https://icinga.com>
// SPDX-License-Identifier: GPL-2.0-or-later
2024-11-26 09:30:06 -05:00
#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>
#include <thread>
2024-11-26 09:30:06 -05:00
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;
IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
2024-11-26 09:30:06 -05:00
boost::asio::deadline_timer timer (io);
Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; });
2024-11-26 09:30:06 -05:00
BOOST_CHECK_EQUAL(called, 0);
timer.expires_from_now(boost::posix_time::millisec(200));
timer.async_wait(yc);
BOOST_CHECK_EQUAL(called, 0);
timer.expires_from_now(boost::posix_time::millisec(200));
timer.async_wait(yc);
});
std::thread eventLoop ([&io] { io.run(); });
2024-11-26 09:30:06 -05:00
io.run();
eventLoop.join();
2024-11-26 09:30:06 -05:00
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;
IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
2024-11-26 09:30:06 -05:00
boost::asio::deadline_timer timer (io);
Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; });
2024-11-26 09:30:06 -05:00
timer.expires_from_now(boost::posix_time::millisec(200));
timer.async_wait(yc);
timeout.Cancel();
2024-11-26 09:30:06 -05:00
BOOST_CHECK_EQUAL(called, 0);
timer.expires_from_now(boost::posix_time::millisec(200));
timer.async_wait(yc);
});
std::thread eventLoop ([&io] { io.run(); });
2024-11-26 09:30:06 -05:00
io.run();
eventLoop.join();
2024-11-26 09:30:06 -05:00
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;
IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
2024-11-26 09:30:06 -05:00
boost::asio::deadline_timer timer (io);
{
Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; });
2024-11-26 09:30:06 -05:00
timer.expires_from_now(boost::posix_time::millisec(200));
timer.async_wait(yc);
}
BOOST_CHECK_EQUAL(called, 0);
timer.expires_from_now(boost::posix_time::millisec(200));
timer.async_wait(yc);
});
std::thread eventLoop ([&io] { io.run(); });
2024-11-26 09:30:06 -05:00
io.run();
eventLoop.join();
2024-11-26 09:30:06 -05:00
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;
IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
2024-11-26 09:30:06 -05:00
boost::asio::deadline_timer timer (io);
Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; });
2024-11-26 09:30:06 -05:00
// Give the timeout enough time to become due while blocking its strand to prevent it from actually running...
Utility::Sleep(0.4);
BOOST_CHECK_EQUAL(called, 0);
// ... so that this shall still work:
timeout.Cancel();
2024-11-26 09:30:06 -05:00
BOOST_CHECK_EQUAL(called, 0);
timer.expires_from_now(boost::posix_time::millisec(100));
timer.async_wait(yc);
});
std::thread eventLoop ([&io] { io.run(); });
2024-11-26 09:30:06 -05:00
io.run();
eventLoop.join();
2024-11-26 09:30:06 -05:00
BOOST_CHECK_EQUAL(called, 0);
}
BOOST_AUTO_TEST_CASE(timeout_due_scope)
{
boost::asio::io_context io;
boost::asio::io_context::strand strand (io);
int called = 0;
IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
2024-11-26 09:30:06 -05:00
boost::asio::deadline_timer timer (io);
{
Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; });
2024-11-26 09:30:06 -05:00
// Give the timeout enough time to become due while blocking its strand to prevent it from actually running...
Utility::Sleep(0.4);
BOOST_CHECK_EQUAL(called, 0);
} // ... so that Timeout#~Timeout() shall still work here.
BOOST_CHECK_EQUAL(called, 0);
timer.expires_from_now(boost::posix_time::millisec(100));
timer.async_wait(yc);
});
std::thread eventLoop ([&io] { io.run(); });
2024-11-26 09:30:06 -05:00
io.run();
eventLoop.join();
2024-11-26 09:30:06 -05:00
BOOST_CHECK_EQUAL(called, 0);
}
BOOST_AUTO_TEST_SUITE_END()