You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
363 lines
9.6 KiB
363 lines
9.6 KiB
From 014a660c937c1c5ebfc05667466a16b44e446c60 Mon Sep 17 00:00:00 2001 |
|
From: Yu Watanabe <watanabe.yu+github@gmail.com> |
|
Date: Fri, 10 Jun 2022 13:55:54 +0900 |
|
Subject: [PATCH] test: import timedated test from debian/ubuntu test suite |
|
|
|
(cherry picked from commit 759ed0a2533da8840dea315d07f92e6bb0272cdd) |
|
|
|
Related: #2087652 |
|
--- |
|
test/TEST-45-TIMEDATE/Makefile | 1 + |
|
test/TEST-45-TIMEDATE/test.sh | 10 ++ |
|
test/units/assert.sh | 44 ++++++ |
|
test/units/testsuite-45.service | 10 ++ |
|
test/units/testsuite-45.sh | 246 ++++++++++++++++++++++++++++++++ |
|
5 files changed, 311 insertions(+) |
|
create mode 120000 test/TEST-45-TIMEDATE/Makefile |
|
create mode 100755 test/TEST-45-TIMEDATE/test.sh |
|
create mode 100644 test/units/assert.sh |
|
create mode 100644 test/units/testsuite-45.service |
|
create mode 100755 test/units/testsuite-45.sh |
|
|
|
diff --git a/test/TEST-45-TIMEDATE/Makefile b/test/TEST-45-TIMEDATE/Makefile |
|
new file mode 120000 |
|
index 0000000000..e9f93b1104 |
|
--- /dev/null |
|
+++ b/test/TEST-45-TIMEDATE/Makefile |
|
@@ -0,0 +1 @@ |
|
+../TEST-01-BASIC/Makefile |
|
\ No newline at end of file |
|
diff --git a/test/TEST-45-TIMEDATE/test.sh b/test/TEST-45-TIMEDATE/test.sh |
|
new file mode 100755 |
|
index 0000000000..27edf4a3b9 |
|
--- /dev/null |
|
+++ b/test/TEST-45-TIMEDATE/test.sh |
|
@@ -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 "$@" |
|
diff --git a/test/units/assert.sh b/test/units/assert.sh |
|
new file mode 100644 |
|
index 0000000000..db67dad268 |
|
--- /dev/null |
|
+++ b/test/units/assert.sh |
|
@@ -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" |
|
+} |
|
diff --git a/test/units/testsuite-45.service b/test/units/testsuite-45.service |
|
new file mode 100644 |
|
index 0000000000..79c0a6f117 |
|
--- /dev/null |
|
+++ b/test/units/testsuite-45.service |
|
@@ -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 |
|
diff --git a/test/units/testsuite-45.sh b/test/units/testsuite-45.sh |
|
new file mode 100755 |
|
index 0000000000..ac7860dccd |
|
--- /dev/null |
|
+++ b/test/units/testsuite-45.sh |
|
@@ -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
|
|
|