]>
Commit | Line | Data |
---|---|---|
759ed0a2 YW |
1 | #!/usr/bin/env bash |
2 | # SPDX-License-Identifier: LGPL-2.1-or-later | |
3 | ||
4 | set -eux | |
5 | set -o pipefail | |
6 | ||
7 | # shellcheck source=test/units/assert.sh | |
8 | . "$(dirname "$0")"/assert.sh | |
9 | ||
aab61a8c YW |
10 | restore_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 |
18 | test_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 | ||
54 | restore_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 | ||
62 | check_adjtime_not_exist() { | |
63 | if [[ -e /etc/adjtime ]]; then | |
64 | echo "/etc/adjtime unexpectedly exists." >&2 | |
65 | exit 1 | |
66 | fi | |
67 | } | |
68 | ||
69 | test_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 | |
83 | 0 | |
84 | LOCAL" | |
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 | |
92 | 0 | |
93 | UTC" | |
94 | timedatectl set-local-rtc 1 | |
95 | assert_eq "$(cat /etc/adjtime)" "0.0 0 0 | |
96 | 0 | |
97 | LOCAL" | |
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 | |
103 | 0 | |
104 | UTC" | |
105 | timedatectl set-local-rtc 1 | |
106 | assert_eq "$(cat /etc/adjtime)" "0.1 123 0 | |
107 | 0 | |
108 | LOCAL" | |
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 | |
114 | 0 | |
115 | UTC | |
116 | somethingelse" | |
117 | timedatectl set-local-rtc 1 | |
118 | assert_eq "$(cat /etc/adjtime)" "0.0 0 0 | |
119 | 0 | |
120 | LOCAL | |
121 | somethingelse" | |
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 | |
130 | 0 | |
131 | LOCAL" | |
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 | |
140 | 0 | |
141 | LOCAL" | |
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 | |
150 | 0 | |
151 | LOCAL" | |
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 | |
160 | 0 | |
161 | LOCAL" | |
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 | |
170 | 0 | |
171 | LOCAL" | |
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 | |
180 | 0 | |
181 | LOCAL" | |
759ed0a2 YW |
182 | } |
183 | ||
184 | assert_ntp() { | |
185 | assert_eq "$(busctl get-property org.freedesktop.timedate1 /org/freedesktop/timedate1 org.freedesktop.timedate1 NTP)" "b $1" | |
186 | } | |
187 | ||
188 | start_mon() { | |
189 | busctl monitor --match="type='signal',sender=org.freedesktop.timedate1,member='PropertiesChanged',path=/org/freedesktop/timedate1" >"$mon" & | |
190 | MONPID=$! | |
191 | } | |
192 | ||
193 | wait_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 | ||
203 | test_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] | |
210 | ConditionVirtualization= | |
211 | ||
212 | [Service] | |
213 | Type=simple | |
214 | AmbientCapabilities= | |
215 | ExecStart= | |
216 | ExecStart=/bin/sleep infinity | |
217 | EOF | |
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 | ||
259 | test_timezone | |
260 | test_adjtime | |
261 | test_ntp | |
262 | ||
263 | touch /testok | |
264 | rm /failed |