Merge pull request #23689 from yuwata/test-timedate

test: import timedated test from debian/ubuntu test suite
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2022-06-10 13:56:48 +02:00 committed by GitHub
commit 02bf03405b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 311 additions and 3 deletions

View file

@ -4,7 +4,6 @@ set -e
TEST_DESCRIPTION="Job-related tests"
TEST_NO_QEMU=1
IMAGE_NAME="default"
# shellcheck source=test/test-functions
. "${TEST_BASE_DIR:?}/test-functions"

View file

@ -3,7 +3,6 @@
set -e
TEST_DESCRIPTION="UDEV"
IMAGE_NAME="default"
TEST_NO_NSPAWN=1
# shellcheck source=test/test-functions

View file

@ -0,0 +1 @@
../TEST-01-BASIC/Makefile

10
test/TEST-45-TIMEDATE/test.sh Executable file
View file

@ -0,0 +1,10 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e
TEST_DESCRIPTION="test timedated"
# shellcheck source=test/test-functions
. "${TEST_BASE_DIR:?}/test-functions"
do_test "$@"

View file

@ -9,7 +9,6 @@
set -e
TEST_DESCRIPTION="systemd-udev storage tests"
IMAGE_NAME="default"
TEST_NO_NSPAWN=1
# Save only journals of failing test cases by default (to conserve space)
TEST_SAVE_JOURNAL="${TEST_SAVE_JOURNAL:-fail}"

44
test/units/assert.sh Normal file
View file

@ -0,0 +1,44 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
# utility functions for shell tests
assert_true() {
local rc
set +e
"$@"
rc=$?
set -e
if [[ "$rc" != "0" ]]; then
echo "FAIL: command '$*' failed with exit code $rc" >&2
exit 1
fi
}
assert_eq() {
if [[ "$1" != "$2" ]]; then
echo "FAIL: expected: '$2' actual: '$1'" >&2
exit 1
fi
}
assert_in() {
if ! echo "$2" | grep -q "$1"; then
echo "FAIL: '$1' not found in:" >&2
echo "$2" >&2
exit 1
fi
}
assert_rc() {
local exp=$1
local rc
shift
set +e
"$@"
rc=$?
set -e
assert_eq "$rc" "$exp"
}

View file

@ -0,0 +1,10 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Unit]
Description=TEST-45-TIMEDATE
[Service]
ExecStartPre=rm -f /failed /testok
ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
StandardOutput=journal+console
StandardError=journal+console
Type=oneshot

246
test/units/testsuite-45.sh Executable file
View file

@ -0,0 +1,246 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -eux
set -o pipefail
# shellcheck source=test/units/assert.sh
. "$(dirname "$0")"/assert.sh
test_timezone() {
local ORIG_TZ=
if [[ -L /etc/localtime ]]; then
ORIG_TZ=$(readlink /etc/localtime | sed 's#^.*zoneinfo/##')
echo "original tz: $ORIG_TZ"
fi
echo 'timedatectl works'
assert_in "Local time:" "$(timedatectl --no-pager)"
echo 'change timezone'
assert_eq "$(timedatectl --no-pager set-timezone Europe/Kiev 2>&1)" ""
assert_eq "$(readlink /etc/localtime | sed 's#^.*zoneinfo/##')" "Europe/Kiev"
assert_in "Time.*zone: Europe/Kiev (EEST, +" "$(timedatectl --no-pager)"
if [[ -n "$ORIG_TZ" ]]; then
echo 'reset timezone to original'
assert_eq "$(timedatectl --no-pager set-timezone "$ORIG_TZ" 2>&1)" ""
assert_eq "$(readlink /etc/localtime | sed 's#^.*zoneinfo/##')" "$ORIG_TZ"
fi
}
restore_adjtime() {
if [[ -e /etc/adjtime.bak ]]; then
mv /etc/adjtime.bak /etc/adjtime
else
rm /etc/adjtime
fi
}
check_adjtime_not_exist() {
if [[ -e /etc/adjtime ]]; then
echo "/etc/adjtime unexpectedly exists." >&2
exit 1
fi
}
test_adjtime() {
# test setting UTC vs. LOCAL in /etc/adjtime
if [[ -e /etc/adjtime ]]; then
mv /etc/adjtime /etc/adjtime.bak
fi
trap restore_adjtime EXIT
echo 'no adjtime file'
rm -f /etc/adjtime
timedatectl set-local-rtc 0
check_adjtime_not_exist
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
LOCAL"
timedatectl set-local-rtc 0
check_adjtime_not_exist
echo 'UTC set in adjtime file'
printf '0.0 0 0\n0\nUTC\n' > /etc/adjtime
timedatectl set-local-rtc 0
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
UTC"
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
LOCAL"
echo 'non-zero values in adjtime file'
printf '0.1 123 0\n0\nLOCAL\n' > /etc/adjtime
timedatectl set-local-rtc 0
assert_eq "$(cat /etc/adjtime)" "0.1 123 0
0
UTC"
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.1 123 0
0
LOCAL"
echo 'fourth line adjtime file'
printf '0.0 0 0\n0\nLOCAL\nsomethingelse\n' > /etc/adjtime
timedatectl set-local-rtc 0
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
UTC
somethingelse"
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
LOCAL
somethingelse"
echo 'no final newline in adjtime file'
printf '0.0 0 0\n0\nUTC' > /etc/adjtime
timedatectl set-local-rtc 0
check_adjtime_not_exist
printf '0.0 0 0\n0\nUTC' > /etc/adjtime
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
LOCAL"
echo 'only one line in adjtime file'
printf '0.0 0 0\n' > /etc/adjtime
timedatectl set-local-rtc 0
check_adjtime_not_exist
printf '0.0 0 0\n' > /etc/adjtime
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
LOCAL"
echo 'only one line in adjtime file, no final newline'
printf '0.0 0 0' > /etc/adjtime
timedatectl set-local-rtc 0
check_adjtime_not_exist
printf '0.0 0 0' > /etc/adjtime
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
LOCAL"
echo 'only two lines in adjtime file'
printf '0.0 0 0\n0\n' > /etc/adjtime
timedatectl set-local-rtc 0
check_adjtime_not_exist
printf '0.0 0 0\n0\n' > /etc/adjtime
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
LOCAL"
echo 'only two lines in adjtime file, no final newline'
printf '0.0 0 0\n0' > /etc/adjtime
timedatectl set-local-rtc 0
check_adjtime_not_exist
printf '0.0 0 0\n0' > /etc/adjtime
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
LOCAL"
echo 'unknown value in 3rd line of adjtime file'
printf '0.0 0 0\n0\nFOO\n' > /etc/adjtime
timedatectl set-local-rtc 0
check_adjtime_not_exist
printf '0.0 0 0\n0\nFOO\n' > /etc/adjtime
timedatectl set-local-rtc 1
assert_eq "$(cat /etc/adjtime)" "0.0 0 0
0
LOCAL"
restore_adjtime
trap - EXIT
}
assert_ntp() {
assert_eq "$(busctl get-property org.freedesktop.timedate1 /org/freedesktop/timedate1 org.freedesktop.timedate1 NTP)" "b $1"
}
start_mon() {
busctl monitor --match="type='signal',sender=org.freedesktop.timedate1,member='PropertiesChanged',path=/org/freedesktop/timedate1" >"$mon" &
MONPID=$!
}
wait_mon() {
for ((i=0;i<10;i++)); do
if (( i != 0 )); then sleep 1; fi
if grep -q "$1" "$mon"; then break; fi
done
assert_in "$2" "$(cat "$mon")"
kill "$MONPID"
wait "$MONPID" 2>/dev/null || true
}
test_ntp() {
# timesyncd has ConditionVirtualization=!container by default; drop/mock that for testing
if systemd-detect-virt --container --quiet; then
systemctl disable --quiet --now systemd-timesyncd
mkdir -p /run/systemd/system/systemd-timesyncd.service.d
cat >/run/systemd/system/systemd-timesyncd.service.d/container.conf <<EOF
[Unit]
ConditionVirtualization=
[Service]
Type=simple
AmbientCapabilities=
ExecStart=
ExecStart=/bin/sleep infinity
EOF
systemctl daemon-reload
fi
mon=$(mktemp -t dbusmon.XXXXXX)
echo 'disable NTP'
timedatectl set-ntp false
for ((i=0;i<10;i++)); do
if (( i != 0 )); then sleep 1; fi
if [[ "$(systemctl --no-pager show systemd-timesyncd --property ActiveState)" == "ActiveState=inactive" ]]; then
break;
fi
done
assert_eq "$(systemctl --no-pager show systemd-timesyncd --property ActiveState)" "ActiveState=inactive"
assert_ntp "false"
assert_rc 3 systemctl is-active --quiet systemd-timesyncd
echo 'enable NTP'
start_mon
timedatectl set-ntp true
wait_mon "NTP" "BOOLEAN true"
assert_ntp "true"
for ((i=0;i<10;i++)); do
if (( i != 0 )); then sleep 1; fi
if [[ "$(systemctl --no-pager show systemd-timesyncd --property ActiveState)" == "ActiveState=active" ]]; then
break;
fi
done
assert_eq "$(systemctl --no-pager show systemd-timesyncd --property ActiveState)" "ActiveState=active"
assert_rc 0 systemctl is-active --quiet systemd-timesyncd
echo 're-disable NTP'
start_mon
timedatectl set-ntp false
wait_mon "NTP" "BOOLEAN false"
assert_ntp "false"
assert_rc 3 systemctl is-active --quiet systemd-timesyncd
}
: >/failed
test_timezone
test_adjtime
test_ntp
touch /testok
rm /failed