]> git.ipfire.org Git - thirdparty/systemd.git/blame - test/units/testsuite-45.sh
test: drop whitespace after shell redirection operators
[thirdparty/systemd.git] / test / units / testsuite-45.sh
CommitLineData
759ed0a2
YW
1#!/usr/bin/env bash
2# SPDX-License-Identifier: LGPL-2.1-or-later
3
4set -eux
5set -o pipefail
6
7# shellcheck source=test/units/assert.sh
8. "$(dirname "$0")"/assert.sh
9
aab61a8c
YW
10restore_timezone() {
11 if [[ -f /tmp/timezone.bak ]]; then
12 mv /tmp/timezone.bak /etc/timezone
13 else
14 rm -f /etc/timezone
15 fi
16}
17
759ed0a2
YW
18test_timezone() {
19 local ORIG_TZ=
20
aab61a8c
YW
21 # Debian/Ubuntu specific file
22 if [[ -f /etc/timezone ]]; then
23 mv /etc/timezone /tmp/timezone.bak
24 fi
25
62430638 26 trap restore_timezone RETURN
aab61a8c 27
759ed0a2
YW
28 if [[ -L /etc/localtime ]]; then
29 ORIG_TZ=$(readlink /etc/localtime | sed 's#^.*zoneinfo/##')
30 echo "original tz: $ORIG_TZ"
31 fi
32
33 echo 'timedatectl works'
34 assert_in "Local time:" "$(timedatectl --no-pager)"
35
36 echo 'change timezone'
37 assert_eq "$(timedatectl --no-pager set-timezone Europe/Kiev 2>&1)" ""
38 assert_eq "$(readlink /etc/localtime | sed 's#^.*zoneinfo/##')" "Europe/Kiev"
aab61a8c
YW
39 if [[ -f /etc/timezone ]]; then
40 assert_eq "$(cat /etc/timezone)" "Europe/Kiev"
41 fi
59ab79a7 42 assert_in "Time zone: Europe/Kiev \(EES*T, \+0[0-9]00\)" "$(timedatectl)"
759ed0a2
YW
43
44 if [[ -n "$ORIG_TZ" ]]; then
45 echo 'reset timezone to original'
8ed21033 46 assert_eq "$(timedatectl set-timezone "$ORIG_TZ" 2>&1)" ""
759ed0a2 47 assert_eq "$(readlink /etc/localtime | sed 's#^.*zoneinfo/##')" "$ORIG_TZ"
aab61a8c
YW
48 if [[ -f /etc/timezone ]]; then
49 assert_eq "$(cat /etc/timezone)" "$ORIG_TZ"
50 fi
759ed0a2
YW
51 fi
52}
53
54restore_adjtime() {
55 if [[ -e /etc/adjtime.bak ]]; then
56 mv /etc/adjtime.bak /etc/adjtime
57 else
58 rm /etc/adjtime
59 fi
60}
61
62check_adjtime_not_exist() {
63 if [[ -e /etc/adjtime ]]; then
64 echo "/etc/adjtime unexpectedly exists." >&2
65 exit 1
66 fi
67}
68
69test_adjtime() {
70 # test setting UTC vs. LOCAL in /etc/adjtime
71 if [[ -e /etc/adjtime ]]; then
72 mv /etc/adjtime /etc/adjtime.bak
73 fi
74
62430638 75 trap restore_adjtime RETURN
759ed0a2
YW
76
77 echo 'no adjtime file'
78 rm -f /etc/adjtime
79 timedatectl set-local-rtc 0
80 check_adjtime_not_exist
81 timedatectl set-local-rtc 1
82 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
830
84LOCAL"
85 timedatectl set-local-rtc 0
86 check_adjtime_not_exist
87
88 echo 'UTC set in adjtime file'
7a17e41d 89 printf '0.0 0 0\n0\nUTC\n' >/etc/adjtime
759ed0a2
YW
90 timedatectl set-local-rtc 0
91 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
920
93UTC"
94 timedatectl set-local-rtc 1
95 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
960
97LOCAL"
98
99 echo 'non-zero values in adjtime file'
7a17e41d 100 printf '0.1 123 0\n0\nLOCAL\n' >/etc/adjtime
759ed0a2
YW
101 timedatectl set-local-rtc 0
102 assert_eq "$(cat /etc/adjtime)" "0.1 123 0
1030
104UTC"
105 timedatectl set-local-rtc 1
106 assert_eq "$(cat /etc/adjtime)" "0.1 123 0
1070
108LOCAL"
109
110 echo 'fourth line adjtime file'
7a17e41d 111 printf '0.0 0 0\n0\nLOCAL\nsomethingelse\n' >/etc/adjtime
759ed0a2
YW
112 timedatectl set-local-rtc 0
113 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
1140
115UTC
116somethingelse"
117 timedatectl set-local-rtc 1
118 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
1190
120LOCAL
121somethingelse"
122
123 echo 'no final newline in adjtime file'
7a17e41d 124 printf '0.0 0 0\n0\nUTC' >/etc/adjtime
759ed0a2
YW
125 timedatectl set-local-rtc 0
126 check_adjtime_not_exist
7a17e41d 127 printf '0.0 0 0\n0\nUTC' >/etc/adjtime
759ed0a2
YW
128 timedatectl set-local-rtc 1
129 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
1300
131LOCAL"
132
133 echo 'only one line in adjtime file'
7a17e41d 134 printf '0.0 0 0\n' >/etc/adjtime
759ed0a2
YW
135 timedatectl set-local-rtc 0
136 check_adjtime_not_exist
7a17e41d 137 printf '0.0 0 0\n' >/etc/adjtime
759ed0a2
YW
138 timedatectl set-local-rtc 1
139 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
1400
141LOCAL"
142
143 echo 'only one line in adjtime file, no final newline'
7a17e41d 144 printf '0.0 0 0' >/etc/adjtime
759ed0a2
YW
145 timedatectl set-local-rtc 0
146 check_adjtime_not_exist
7a17e41d 147 printf '0.0 0 0' >/etc/adjtime
759ed0a2
YW
148 timedatectl set-local-rtc 1
149 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
1500
151LOCAL"
152
153 echo 'only two lines in adjtime file'
7a17e41d 154 printf '0.0 0 0\n0\n' >/etc/adjtime
759ed0a2
YW
155 timedatectl set-local-rtc 0
156 check_adjtime_not_exist
7a17e41d 157 printf '0.0 0 0\n0\n' >/etc/adjtime
759ed0a2
YW
158 timedatectl set-local-rtc 1
159 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
1600
161LOCAL"
162
163 echo 'only two lines in adjtime file, no final newline'
7a17e41d 164 printf '0.0 0 0\n0' >/etc/adjtime
759ed0a2
YW
165 timedatectl set-local-rtc 0
166 check_adjtime_not_exist
7a17e41d 167 printf '0.0 0 0\n0' >/etc/adjtime
759ed0a2
YW
168 timedatectl set-local-rtc 1
169 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
1700
171LOCAL"
172
173 echo 'unknown value in 3rd line of adjtime file'
7a17e41d 174 printf '0.0 0 0\n0\nFOO\n' >/etc/adjtime
759ed0a2
YW
175 timedatectl set-local-rtc 0
176 check_adjtime_not_exist
7a17e41d 177 printf '0.0 0 0\n0\nFOO\n' >/etc/adjtime
759ed0a2
YW
178 timedatectl set-local-rtc 1
179 assert_eq "$(cat /etc/adjtime)" "0.0 0 0
1800
181LOCAL"
759ed0a2
YW
182}
183
184assert_ntp() {
185 assert_eq "$(busctl get-property org.freedesktop.timedate1 /org/freedesktop/timedate1 org.freedesktop.timedate1 NTP)" "b $1"
186}
187
188start_mon() {
189 busctl monitor --match="type='signal',sender=org.freedesktop.timedate1,member='PropertiesChanged',path=/org/freedesktop/timedate1" >"$mon" &
190 MONPID=$!
191}
192
193wait_mon() {
2f34ee33 194 for ((i = 0; i < 10; i++)); do
759ed0a2
YW
195 if (( i != 0 )); then sleep 1; fi
196 if grep -q "$1" "$mon"; then break; fi
197 done
198 assert_in "$2" "$(cat "$mon")"
199 kill "$MONPID"
200 wait "$MONPID" 2>/dev/null || true
201}
202
203test_ntp() {
204 # timesyncd has ConditionVirtualization=!container by default; drop/mock that for testing
205 if systemd-detect-virt --container --quiet; then
206 systemctl disable --quiet --now systemd-timesyncd
207 mkdir -p /run/systemd/system/systemd-timesyncd.service.d
208 cat >/run/systemd/system/systemd-timesyncd.service.d/container.conf <<EOF
209[Unit]
210ConditionVirtualization=
211
212[Service]
213Type=simple
214AmbientCapabilities=
215ExecStart=
216ExecStart=/bin/sleep infinity
217EOF
218 systemctl daemon-reload
219 fi
220
221 mon=$(mktemp -t dbusmon.XXXXXX)
222
223 echo 'disable NTP'
224 timedatectl set-ntp false
2f34ee33 225 for ((i = 0; i < 10; i++)); do
759ed0a2 226 if (( i != 0 )); then sleep 1; fi
8ed21033 227 if [[ "$(systemctl show systemd-timesyncd --property ActiveState)" == "ActiveState=inactive" ]]; then
759ed0a2
YW
228 break;
229 fi
230 done
8ed21033 231 assert_eq "$(systemctl show systemd-timesyncd --property ActiveState)" "ActiveState=inactive"
759ed0a2
YW
232 assert_ntp "false"
233 assert_rc 3 systemctl is-active --quiet systemd-timesyncd
234
235 echo 'enable NTP'
236 start_mon
237 timedatectl set-ntp true
238 wait_mon "NTP" "BOOLEAN true"
239 assert_ntp "true"
2f34ee33 240 for ((i = 0; i < 10; i++)); do
759ed0a2 241 if (( i != 0 )); then sleep 1; fi
8ed21033 242 if [[ "$(systemctl show systemd-timesyncd --property ActiveState)" == "ActiveState=active" ]]; then
759ed0a2
YW
243 break;
244 fi
245 done
8ed21033 246 assert_eq "$(systemctl show systemd-timesyncd --property ActiveState)" "ActiveState=active"
759ed0a2
YW
247 assert_rc 0 systemctl is-active --quiet systemd-timesyncd
248
249 echo 're-disable NTP'
250 start_mon
251 timedatectl set-ntp false
252 wait_mon "NTP" "BOOLEAN false"
253 assert_ntp "false"
254 assert_rc 3 systemctl is-active --quiet systemd-timesyncd
255}
256
257: >/failed
258
259test_timezone
260test_adjtime
261test_ntp
262
263touch /testok
264rm /failed