mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-22 13:33:56 +03:00
test: import timedated test from debian/ubuntu test suite
This commit is contained in:
parent
3d52219390
commit
759ed0a253
1
test/TEST-45-TIMEDATE/Makefile
Symbolic link
1
test/TEST-45-TIMEDATE/Makefile
Symbolic link
@ -0,0 +1 @@
|
||||
../TEST-01-BASIC/Makefile
|
10
test/TEST-45-TIMEDATE/test.sh
Executable file
10
test/TEST-45-TIMEDATE/test.sh
Executable 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 "$@"
|
44
test/units/assert.sh
Normal file
44
test/units/assert.sh
Normal 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"
|
||||
}
|
10
test/units/testsuite-45.service
Normal file
10
test/units/testsuite-45.service
Normal 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
246
test/units/testsuite-45.sh
Executable 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
|
Loading…
Reference in New Issue
Block a user