summaryrefslogtreecommitdiffstats
path: root/debian/tests/timedated
blob: 0a69b67e52e8de763339f0222047fc7151e62964 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#!/bin/sh
set -e

. `dirname $0`/assert.sh

ORIG_TZ=`readlink /etc/localtime | sed 's#^.*zoneinfo/##'`
echo "original tz: $ORIG_TZ"

echo 'timedatectl works'
assert_in "Local time:" "`timedatectl --no-pager`"

echo 'change timezone'
assert_eq "`timedatectl --no-pager set-timezone Europe/Moscow 2>&1`" ""
assert_eq "`readlink /etc/localtime | sed 's#^.*zoneinfo/##'`" "Europe/Moscow"
assert_in "Time.*zone: Europe/Moscow (MSK, +" "`timedatectl --no-pager`"

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"

# test setting UTC vs. LOCAL in /etc/adjtime
if [ -e /etc/adjtime ]; then
    ORIG_ADJTIME=`cat /etc/adjtime`
    trap "echo '$ORIG_ADJTIME' > /etc/adjtime" EXIT INT QUIT PIPE
else
    trap "rm -f /etc/adjtime" EXIT INT QUIT PIPE
fi

echo 'no adjtime file'
rm -f /etc/adjtime
timedatectl set-local-rtc 0
assert_true '[ ! -e /etc/adjtime ]'
timedatectl set-local-rtc 1
assert_eq "`cat /etc/adjtime`" "0.0 0 0
0
LOCAL"
timedatectl set-local-rtc 0
assert_true '[ ! -e /etc/adjtime ]'

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
assert_true '[ ! -e /etc/adjtime ]'
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
assert_true '[ ! -e /etc/adjtime ]'
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
assert_true '[ ! -e /etc/adjtime ]'
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
assert_true '[ ! -e /etc/adjtime ]'
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
assert_true '[ ! -e /etc/adjtime ]'
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
assert_true '[ ! -e /etc/adjtime ]'
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"

# 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
    printf '[Unit]\nConditionVirtualization=\n[Service]\nType=simple\nAmbientCapabilities=\nExecStart=\nExecStart=/bin/sleep infinity' > /run/systemd/system/systemd-timesyncd.service.d/container.conf
    systemctl daemon-reload
fi

mon=$(mktemp -t dbusmon.XXXXXX)
trap "rm -f $mon" EXIT INT QUIT PIPE

assert_ntp() {
    V=$(busctl get-property org.freedesktop.timedate1 /org/freedesktop/timedate1 org.freedesktop.timedate1 NTP)
    assert_eq "$V" "b $1"
}

start_mon() {
    dbus-monitor --system "type='signal', member='PropertiesChanged', path='/org/freedesktop/timedate1'" > $mon &
    MONPID=$!
}

wait_mon() {
    for retry in $(seq 10); do
        grep -q "$1" $mon && break
        sleep 1
    done
    assert_in "$2" "$(cat $mon)"
    kill $MONPID
    wait $MONPID 2>/dev/null || true
}

echo 'disable NTP'
timedatectl set-ntp false
while [ "$(systemctl --no-pager show systemd-timesyncd --property ActiveState)" != "ActiveState=inactive" ]; do sleep 1; done
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
while [ "$(systemctl --no-pager show systemd-timesyncd --property ActiveState)" != "ActiveState=active" ]; do sleep 1; done
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