]> git.ipfire.org Git - thirdparty/systemd.git/blob - test/units/testsuite-17.03.sh
d19d85074f51e1bae00825fb9d241b5f72df4b1f
[thirdparty/systemd.git] / test / units / testsuite-17.03.sh
1 #!/usr/bin/env bash
2 # SPDX-License-Identifier: LGPL-2.1-or-later
3 set -eux
4
5 TMPDIR=
6 TEST_RULE="/run/udev/rules.d/49-test.rules"
7 KILL_PID=
8
9 setup() {
10 mkdir -p "${TEST_RULE%/*}"
11 [[ -e /etc/udev/udev.conf ]] && cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bak
12
13 cat >"${TEST_RULE}" <<EOF
14 ACTION!="add", GOTO="test_end"
15 SUBSYSTEM!="mem", GOTO="test_end"
16 KERNEL!="null", GOTO="test_end"
17
18 OPTIONS="log_level=debug"
19 PROGRAM=="/bin/touch /tmp/test-udev-marker"
20 PROGRAM!="/bin/sleep 60", ENV{PROGRAM_RESULT}="KILLED"
21
22 LABEL="test_end"
23 EOF
24 cat >/etc/udev/udev.conf <<EOF
25 event_timeout=10
26 timeout_signal=SIGABRT
27 EOF
28
29 systemctl restart systemd-udevd.service
30 }
31
32 # shellcheck disable=SC2317
33 teardown() {
34 set +e
35
36 if [[ -n "$KILL_PID" ]]; then
37 kill "$KILL_PID"
38 fi
39
40 rm -rf "$TMPDIR"
41 rm -f "$TEST_RULE"
42 [[ -e /etc/udev/udev.conf.bak ]] && mv -f /etc/udev/udev.conf.bak /etc/udev/udev.conf
43 systemctl restart systemd-udevd.service
44 }
45
46 run_test_timeout() {
47 TMPDIR=$(mktemp -d -p /tmp udev-tests.XXXXXX)
48 udevadm monitor --udev --property --subsystem-match=mem >"$TMPDIR"/monitor.txt &
49 KILL_PID="$!"
50
51 SYSTEMD_LOG_LEVEL=debug udevadm trigger --verbose --action add /dev/null
52
53 for _ in {1..40}; do
54 if grep -q 'PROGRAM_RESULT=KILLED' "$TMPDIR"/monitor.txt; then
55 sleep .5
56 kill "$KILL_PID"
57 KILL_PID=
58
59 cat "$TMPDIR"/monitor.txt
60 (! grep -q 'UDEV_WORKER_FAILED=1' "$TMPDIR"/monitor.txt)
61 (! grep -q 'UDEV_WORKER_SIGNAL=6' "$TMPDIR"/monitor.txt)
62 (! grep -q 'UDEV_WORKER_SIGNAL_NAME=ABRT' "$TMPDIR"/monitor.txt)
63 grep -q 'PROGRAM_RESULT=KILLED' "$TMPDIR"/monitor.txt
64 rm -rf "$TMPDIR"
65 return 0
66 fi
67 sleep .5
68 done
69
70 return 1
71 }
72
73 run_test_killed() {
74 local killed=
75
76 TMPDIR=$(mktemp -d -p /tmp udev-tests.XXXXXX)
77 udevadm monitor --udev --property --subsystem-match=mem >"$TMPDIR"/monitor.txt &
78 KILL_PID="$!"
79
80 rm -f /tmp/test-udev-marker
81 SYSTEMD_LOG_LEVEL=debug udevadm trigger --verbose --action add /dev/null
82
83 for _ in {1..40}; do
84 if [[ -z "$killed" ]]; then
85 if [[ -e /tmp/test-udev-marker ]]; then
86 killall --signal ABRT --regexp udev-worker
87 killed=1
88 fi
89 elif grep -q 'UDEV_WORKER_FAILED=1' "$TMPDIR"/monitor.txt; then
90 sleep .5
91 kill "$KILL_PID"
92 KILL_PID=
93
94 cat "$TMPDIR"/monitor.txt
95 grep -q 'UDEV_WORKER_FAILED=1' "$TMPDIR"/monitor.txt
96 grep -q 'UDEV_WORKER_SIGNAL=6' "$TMPDIR"/monitor.txt
97 grep -q 'UDEV_WORKER_SIGNAL_NAME=ABRT' "$TMPDIR"/monitor.txt
98 (! grep -q 'PROGRAM_RESULT=KILLED' "$TMPDIR"/monitor.txt)
99 rm -rf "$TMPDIR"
100 return 0
101 fi
102 sleep .5
103 done
104
105 return 1
106 }
107
108 trap teardown EXIT
109
110 setup
111 run_test_timeout
112 run_test_killed
113
114 exit 0