timer: add unit tests for DeferReactivation

Create a unit test for systemd timer DeferReactivation config option.
The test works by creating a timer which fires every 5 seconds and
starts an unit which runs for 5 seconds.
With DeferReactivation=true, the timer must fire every 5+5 seconds,
instead of the 5 it fires normally.

As we need at least two timer runs to check if the delta is correct,
the test duration on success will be at least 20 seconds.
To be safe, the test script waits 35 seconds: this is enough to get
at least three runs but low enough to avoid clogging the CI.
This commit is contained in:
Matteo Croce
2024-10-05 01:39:37 +02:00
parent cc0ab8c810
commit 9784ed760e
4 changed files with 41 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
[Unit]
Description=Testing systemd timers
[Service]
Type=simple
ExecStart=sh -c 'date +%%s >>/tmp/realtime-test.log ; sleep 5'

View File

@@ -0,0 +1,10 @@
[Unit]
Description=Testing systemd timers
[Timer]
OnCalendar=*:*:0/5
AccuracySec=1us
DeferReactivation=true
[Install]
WantedBy=timers.target

View File

@@ -7,3 +7,5 @@ integration_tests += [
'vm' : true,
},
]
testdata_subdirs += [meson.current_source_dir() / 'TEST-74-AUX-UTILS.units']

View File

@@ -0,0 +1,23 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -eux
set -o pipefail
systemctl start realtime-test.timer
sleep 35
mindelta=10
last=
while read -r time; do
if [ -n "$last" ]; then
delta=$((time - last))
if [ "$delta" -lt $mindelta ]; then
echo "Timer fired too early: $delta < $mindelta" >/failed
break
fi
fi
last=$time
done </tmp/realtime-test.log
test ! -s /failed