]> git.ipfire.org Git - thirdparty/systemd.git/blob - test/units/testsuite-38.sh
Merge pull request #16104 from ssahani/dhcpv6-iaid
[thirdparty/systemd.git] / test / units / testsuite-38.sh
1 #!/usr/bin/env bash
2
3 set -ex
4 set -o pipefail
5
6 systemd-analyze log-level debug
7 systemd-analyze log-target console
8
9 unit=testsuite-38-sleep.service
10
11 start_test_service() {
12 systemctl daemon-reload
13 systemctl start "${unit}"
14 }
15
16 dbus_freeze() {
17 local suffix=
18 suffix="${1##*.}"
19
20 local name="$(echo ${1%.$suffix} | sed s/-/_2d/g)"
21 local object_path="/org/freedesktop/systemd1/unit/${name}_2e${suffix}"
22
23 busctl call \
24 org.freedesktop.systemd1 \
25 "${object_path}" \
26 org.freedesktop.systemd1.Unit \
27 Freeze
28 }
29
30 dbus_thaw() {
31 local suffix=
32 suffix="${1##*.}"
33
34 local name="$(echo ${1%.$suffix} | sed s/-/_2d/g)"
35 local object_path="/org/freedesktop/systemd1/unit/${name}_2e${suffix}"
36
37 busctl call \
38 org.freedesktop.systemd1 \
39 "${object_path}" \
40 org.freedesktop.systemd1.Unit \
41 Thaw
42 }
43
44 dbus_freeze_unit() {
45 busctl call \
46 org.freedesktop.systemd1 \
47 /org/freedesktop/systemd1 \
48 org.freedesktop.systemd1.Manager \
49 FreezeUnit \
50 s \
51 "$1"
52 }
53
54 dbus_thaw_unit() {
55 busctl call \
56 org.freedesktop.systemd1 \
57 /org/freedesktop/systemd1 \
58 org.freedesktop.systemd1.Manager \
59 ThawUnit \
60 s \
61 "$1"
62 }
63
64 dbus_can_freeze() {
65 local suffix=
66 suffix="${1##*.}"
67
68 local name="$(echo ${1%.$suffix} | sed s/-/_2d/g)"
69 local object_path="/org/freedesktop/systemd1/unit/${name}_2e${suffix}"
70
71 busctl get-property \
72 org.freedesktop.systemd1 \
73 "${object_path}" \
74 org.freedesktop.systemd1.Unit \
75 CanFreeze
76 }
77
78 check_freezer_state() {
79 local suffix=
80 suffix="${1##*.}"
81
82 local name="$(echo ${1%.$suffix} | sed s/-/_2d/g)"
83 local object_path="/org/freedesktop/systemd1/unit/${name}_2e${suffix}"
84
85 state=$(busctl get-property \
86 org.freedesktop.systemd1 \
87 "${object_path}" \
88 org.freedesktop.systemd1.Unit \
89 FreezerState | cut -d " " -f2 | tr -d '"')
90
91 [ "$state" = "$2" ] || {
92 echo "error: unexpected freezer state, expected: $2, actual: $state" >&2
93 exit 1
94 }
95 }
96
97 check_cgroup_state() {
98 grep -q "frozen $2" /sys/fs/cgroup/system.slice/"$1"/cgroup.events
99 }
100
101 test_dbus_api() {
102 echo "Test that DBus API works:"
103 echo -n " - Freeze(): "
104 dbus_freeze "${unit}"
105 check_freezer_state "${unit}" "frozen"
106 check_cgroup_state "$unit" 1
107 echo "[ OK ]"
108
109 echo -n " - Thaw(): "
110 dbus_thaw "${unit}"
111 check_freezer_state "${unit}" "running"
112 check_cgroup_state "$unit" 0
113 echo "[ OK ]"
114
115 echo -n " - FreezeUnit(): "
116 dbus_freeze_unit "${unit}"
117 check_freezer_state "${unit}" "frozen"
118 check_cgroup_state "$unit" 1
119 echo "[ OK ]"
120
121 echo -n " - ThawUnit(): "
122 dbus_thaw_unit "${unit}"
123 check_freezer_state "${unit}" "running"
124 check_cgroup_state "$unit" 0
125 echo "[ OK ]"
126
127 echo -n " - CanFreeze(): "
128 output=$(dbus_can_freeze "${unit}")
129 [ "$output" = "b true" ]
130 echo "[ OK ]"
131
132 echo
133 }
134
135 test_jobs() {
136 local pid_before=
137 local pid_after=
138 echo "Test that it is possible to apply jobs on frozen units:"
139
140 systemctl start "${unit}"
141 dbus_freeze "${unit}"
142 check_freezer_state "${unit}" "frozen"
143
144 echo -n " - restart: "
145 pid_before=$(systemctl show -p MainPID "${unit}" --value)
146 systemctl restart "${unit}"
147 pid_after=$(systemctl show -p MainPID "${unit}" --value)
148 [ "$pid_before" != "$pid_after" ] && echo "[ OK ]"
149
150 dbus_freeze "${unit}"
151 check_freezer_state "${unit}" "frozen"
152
153 echo -n " - stop: "
154 timeout 5s systemctl stop "${unit}"
155 echo "[ OK ]"
156
157 echo
158 }
159
160 test_systemctl() {
161 echo "Test that systemctl freeze/thaw verbs:"
162
163 systemctl start "$unit"
164
165 echo -n " - freeze: "
166 systemctl freeze "$unit"
167 check_freezer_state "${unit}" "frozen"
168 check_cgroup_state "$unit" 1
169 # Freezing already frozen unit should be NOP and return quickly
170 timeout 3s systemctl freeze "$unit"
171 echo "[ OK ]"
172
173 echo -n " - thaw: "
174 systemctl thaw "$unit"
175 check_freezer_state "${unit}" "running"
176 check_cgroup_state "$unit" 0
177 # Likewise thawing already running unit shouldn't block
178 timeout 3s systemctl thaw "$unit"
179 echo "[ OK ]"
180
181 systemctl stop "$unit"
182
183 echo
184 }
185
186 test_systemctl_show() {
187 echo "Test systemctl show integration:"
188
189 systemctl start "$unit"
190
191 echo -n " - FreezerState property: "
192 state=$(systemctl show -p FreezerState --value "$unit")
193 [ "$state" = "running" ]
194 systemctl freeze "$unit"
195 state=$(systemctl show -p FreezerState --value "$unit")
196 [ "$state" = "frozen" ]
197 systemctl thaw "$unit"
198 echo "[ OK ]"
199
200 echo -n " - CanFreeze property: "
201 state=$(systemctl show -p CanFreeze --value "$unit")
202 [ "$state" = "yes" ]
203 echo "[ OK ]"
204
205 systemctl stop "$unit"
206 echo
207 }
208
209 test_recursive() {
210 local slice="bar.slice"
211 local unit="baz.service"
212
213 systemd-run --unit "$unit" --slice "$slice" sleep 3600 >/dev/null 2>&1
214
215 echo "Test recursive freezing:"
216
217 echo -n " - freeze: "
218 systemctl freeze "$slice"
219 check_freezer_state "${slice}" "frozen"
220 check_freezer_state "${unit}" "frozen"
221 grep -q "frozen 1" /sys/fs/cgroup/"${slice}"/cgroup.events
222 grep -q "frozen 1" /sys/fs/cgroup/"${slice}"/"${unit}"/cgroup.events
223 echo "[ OK ]"
224
225 echo -n " - thaw: "
226 systemctl thaw "$slice"
227 check_freezer_state "${unit}" "running"
228 check_freezer_state "${slice}" "running"
229 grep -q "frozen 0" /sys/fs/cgroup/"${slice}"/cgroup.events
230 grep -q "frozen 0" /sys/fs/cgroup/"${slice}"/"${unit}"/cgroup.events
231 echo "[ OK ]"
232
233 systemctl stop "$unit"
234 systemctl stop "$slice"
235
236 echo
237 }
238
239 test_preserve_state() {
240 local slice="bar.slice"
241 local unit="baz.service"
242
243 systemd-run --unit "$unit" --slice "$slice" sleep 3600 >/dev/null 2>&1
244
245 echo "Test that freezer state is preserved when recursive freezing is initiated from outside (e.g. by manager up the tree):"
246
247 echo -n " - freeze from outside: "
248 echo 1 > /sys/fs/cgroup/"${slice}"/cgroup.freeze
249 # Give kernel some time to freeze the slice
250 sleep 1
251
252 # Our state should not be affected
253 check_freezer_state "${slice}" "running"
254 check_freezer_state "${unit}" "running"
255
256 # However actual kernel state should be frozen
257 grep -q "frozen 1" /sys/fs/cgroup/"${slice}"/cgroup.events
258 grep -q "frozen 1" /sys/fs/cgroup/"${slice}"/"${unit}"/cgroup.events
259 echo "[ OK ]"
260
261 echo -n " - thaw from outside: "
262 echo 0 > /sys/fs/cgroup/"${slice}"/cgroup.freeze
263 sleep 1
264
265 check_freezer_state "${unit}" "running"
266 check_freezer_state "${slice}" "running"
267 grep -q "frozen 0" /sys/fs/cgroup/"${slice}"/cgroup.events
268 grep -q "frozen 0" /sys/fs/cgroup/"${slice}"/"${unit}"/cgroup.events
269 echo "[ OK ]"
270
271 echo -n " - thaw from outside while inner service is frozen: "
272 systemctl freeze "$unit"
273 check_freezer_state "${unit}" "frozen"
274 echo 1 > /sys/fs/cgroup/"${slice}"/cgroup.freeze
275 echo 0 > /sys/fs/cgroup/"${slice}"/cgroup.freeze
276 check_freezer_state "${slice}" "running"
277 check_freezer_state "${unit}" "frozen"
278 echo "[ OK ]"
279
280 systemctl stop "$unit"
281 systemctl stop "$slice"
282
283 echo
284 }
285
286 test -e /sys/fs/cgroup/system.slice/cgroup.freeze && {
287 start_test_service
288 test_dbus_api
289 test_systemctl
290 test_systemctl_show
291 test_jobs
292 test_recursive
293 test_preserve_state
294 }
295
296 echo OK > /testok
297 exit 0