icinga2/test/base-timer.cpp
Johannes Schmidt 1430e63e72 Give timer tests more leeway for inaccurate implementations
On Windows, waiting on system timers is notoriously inaccurate, with
short sleeps taking tens of milliseconds longer than specified.

This led to these tests to sporadically fail on the Windows GHAs with
`check 5 == counter has failed [5 != 4]`, because it couldn't get the
expected five invokations within the given tolerance of 50ms.

Currently on master, the tests check if a timer triggers five times
in 550ms with a 100ms interval, only leaving those 50ms to spare.
This commit extends the tolerance of to 75ms. This is a pretty
conservative increase (when we could have gone to 99ms), but it
might be enough to satisfy the windows GHAs.
2026-03-03 14:10:33 +01:00

62 lines
1.6 KiB
C++

// SPDX-FileCopyrightText: 2012 Icinga GmbH <https://icinga.com>
// SPDX-License-Identifier: GPL-2.0-or-later
#include "base/timer.hpp"
#include "base/utility.hpp"
#include "base/application.hpp"
#include <BoostTestTargetConfig.h>
using namespace icinga;
BOOST_AUTO_TEST_SUITE(base_timer)
BOOST_AUTO_TEST_CASE(construct)
{
Timer::Ptr timer = Timer::Create();
BOOST_CHECK(timer);
}
BOOST_AUTO_TEST_CASE(interval)
{
Timer::Ptr timer = Timer::Create();
timer->SetInterval(1.5);
BOOST_CHECK(timer->GetInterval() == 1.5);
}
BOOST_AUTO_TEST_CASE(invoke)
{
int counter = 0;
Timer::Ptr timer = Timer::Create();
timer->OnTimerExpired.connect([&counter](const Timer* const&) { counter++; });
timer->SetInterval(.1);
timer->Start();
Utility::Sleep(.575);
timer->Stop();
// At this point, the timer should have fired exactly 5 times (0.5 / 0.1) and the sixth time
// should not have fired yet as we stopped the timer after 0.55 seconds (0.6 would be needed).
BOOST_CHECK_EQUAL(5, counter);
}
BOOST_AUTO_TEST_CASE(scope)
{
int counter = 0;
Timer::Ptr timer = Timer::Create();
timer->OnTimerExpired.connect([&counter](const Timer* const&) { counter++; });
timer->SetInterval(.1);
timer->Start();
Utility::Sleep(.575);
timer.reset();
Utility::Sleep(.1);
// At this point, the timer should have fired exactly 5 times (0.5 / 0.1) and the sixth time
// should not have fired yet as we destroyed the timer after 0.55 seconds (0.6 would be needed),
// and even if we wait another 0.1 seconds after its destruction, it should not fire again.
BOOST_CHECK_EQUAL(5, counter);
}
BOOST_AUTO_TEST_SUITE_END()