]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: add test for OnSuccess= + Uphold= + PropagatesStopTo= + BindsTo= 19322/head
authorLennart Poettering <lennart@poettering.net>
Wed, 14 Apr 2021 15:34:25 +0000 (17:34 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 25 May 2021 14:06:30 +0000 (16:06 +0200)
13 files changed:
test/TEST-57-ONSUCCESS-UPHOLD/Makefile [new symlink]
test/TEST-57-ONSUCCESS-UPHOLD/test.sh [new file with mode: 0755]
test/units/testsuite-57-binds-to.service [new file with mode: 0644]
test/units/testsuite-57-bound-by.service [new file with mode: 0644]
test/units/testsuite-57-fail.service [new file with mode: 0644]
test/units/testsuite-57-prop-stop-one.service [new file with mode: 0644]
test/units/testsuite-57-prop-stop-two.service [new file with mode: 0644]
test/units/testsuite-57-short-lived.service [new file with mode: 0644]
test/units/testsuite-57-short-lived.sh [new file with mode: 0755]
test/units/testsuite-57-success.service [new file with mode: 0644]
test/units/testsuite-57-uphold.service [new file with mode: 0644]
test/units/testsuite-57.service [new file with mode: 0644]
test/units/testsuite-57.sh [new file with mode: 0755]

diff --git a/test/TEST-57-ONSUCCESS-UPHOLD/Makefile b/test/TEST-57-ONSUCCESS-UPHOLD/Makefile
new file mode 120000 (symlink)
index 0000000..e9f93b1
--- /dev/null
@@ -0,0 +1 @@
+../TEST-01-BASIC/Makefile
\ No newline at end of file
diff --git a/test/TEST-57-ONSUCCESS-UPHOLD/test.sh b/test/TEST-57-ONSUCCESS-UPHOLD/test.sh
new file mode 100755 (executable)
index 0000000..145c88f
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -e
+
+TEST_DESCRIPTION="test OnSuccess= + Uphold= + PropagatesStopTo= + BindsTo="
+. $TEST_BASE_DIR/test-functions
+
+do_test "$@" 57
diff --git a/test/units/testsuite-57-binds-to.service b/test/units/testsuite-57-binds-to.service
new file mode 100644 (file)
index 0000000..e4b6ee3
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+Description=Unit with BindsTo=
+BindsTo=testsuite-57-bound-by.service
+After=testsuite-57-bound-by.service
+
+[Service]
+ExecStart=/bin/sleep infinity
+ExecStopPost=systemctl kill --kill-who=main -sRTMIN+1 testsuite-57.service
diff --git a/test/units/testsuite-57-bound-by.service b/test/units/testsuite-57-bound-by.service
new file mode 100644 (file)
index 0000000..df66a8f
--- /dev/null
@@ -0,0 +1,5 @@
+[Unit]
+Description=Unit with BoundBy=
+
+[Service]
+ExecStart=/bin/sleep 0.7
diff --git a/test/units/testsuite-57-fail.service b/test/units/testsuite-57-fail.service
new file mode 100644 (file)
index 0000000..07d8ddd
--- /dev/null
@@ -0,0 +1,6 @@
+[Unit]
+Description=Failing unit
+OnFailure=testsuite-57-uphold.service
+
+[Service]
+ExecStart=/bin/false
diff --git a/test/units/testsuite-57-prop-stop-one.service b/test/units/testsuite-57-prop-stop-one.service
new file mode 100644 (file)
index 0000000..cdca7d4
--- /dev/null
@@ -0,0 +1,9 @@
+[Unit]
+Description=Stop Propagation Receiver
+Wants=testsuite-57-prop-stop-two.service
+After=testsuite-57-prop-stop-two.service
+StopPropagatedFrom=testsuite-57-prop-stop-two.service
+
+[Service]
+ExecStart=/bin/sleep infinity
+ExecStopPost=systemctl kill --kill-who=main -sUSR2 testsuite-57.service
diff --git a/test/units/testsuite-57-prop-stop-two.service b/test/units/testsuite-57-prop-stop-two.service
new file mode 100644 (file)
index 0000000..a462faf
--- /dev/null
@@ -0,0 +1,5 @@
+[Unit]
+Description=Stop Propagation Sender
+
+[Service]
+ExecStart=/bin/sleep 1.5
diff --git a/test/units/testsuite-57-short-lived.service b/test/units/testsuite-57-short-lived.service
new file mode 100644 (file)
index 0000000..7fa2682
--- /dev/null
@@ -0,0 +1,10 @@
+[Unit]
+Description=Shortlived Unit
+StopWhenUnneeded=yes
+
+# Bump up the start limit logic, so that we can be restarted frequently enough
+StartLimitBurst=15
+StartLimitIntervalSec=1h
+
+[Service]
+ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-57-short-lived.sh
diff --git a/test/units/testsuite-57-short-lived.sh b/test/units/testsuite-57-short-lived.sh
new file mode 100755 (executable)
index 0000000..8c48d3a
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+set -ex
+
+if [ -f /tmp/testsuite-57.counter ] ; then
+    read -r counter < /tmp/testsuite-57.counter
+    counter=$(("$counter" + 1))
+else
+    counter=0
+fi
+
+echo "$counter" > /tmp/testsuite-57.counter
+
+if [ "$counter" -eq 5 ] ; then
+    systemctl kill --kill-who=main -sUSR1 testsuite-57.service
+fi
+
+exec sleep 1.5
diff --git a/test/units/testsuite-57-success.service b/test/units/testsuite-57-success.service
new file mode 100644 (file)
index 0000000..ac1071f
--- /dev/null
@@ -0,0 +1,6 @@
+[Unit]
+Description=Succeeding unit
+OnSuccess=testsuite-57-fail.service
+
+[Service]
+ExecStart=/bin/true
diff --git a/test/units/testsuite-57-uphold.service b/test/units/testsuite-57-uphold.service
new file mode 100644 (file)
index 0000000..d2b3828
--- /dev/null
@@ -0,0 +1,6 @@
+[Unit]
+Description=Upholding Unit
+Upholds=testsuite-57-short-lived.service
+
+[Service]
+ExecStart=/bin/sleep infinity
diff --git a/test/units/testsuite-57.service b/test/units/testsuite-57.service
new file mode 100644 (file)
index 0000000..cab23af
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=TEST-57-ONSUCCESS-UPHOLD
+
+[Service]
+ExecStartPre=rm -f /failed /testok
+ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
+Type=oneshot
diff --git a/test/units/testsuite-57.sh b/test/units/testsuite-57.sh
new file mode 100755 (executable)
index 0000000..5db82b8
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+
+set -eux
+set -o pipefail
+
+systemd-analyze log-level debug
+systemd-analyze log-target journal
+
+# Idea is this:
+#    1. we start testsuite-57-success.service
+#    2. which through OnSuccess= starts testsuite-57-fail.service,
+#    3. which through OnFailure= starts testsuite-57-uphold.service,
+#    4. which through Uphold= starts/keeps testsuite-57-short-lived.service running,
+#    5. which will sleep 1s when invoked, and on the 5th invocation send us a SIGUSR1
+#    6. once we got that we finish cleanly
+
+sigusr1=0
+trap sigusr1=1 SIGUSR1
+
+systemctl start testsuite-57-success.service
+
+while [ "$sigusr1" -eq 0 ] ; do
+    sleep .5
+done
+
+systemctl stop testsuite-57-uphold.service
+
+# Idea is this:
+#    1. we start testsuite-57-prop-stop-one.service
+#    2. which through Wants=/After= pulls in testsuite-57-prop-stop-two.service as well
+#    3. testsuite-57-prop-stop-one.service then sleeps indefinitely
+#    4. testsuite-57-prop-stop-two.service sleeps a short time and exits
+#    5. the StopPropagatedFrom= dependency between the two should ensure *both* will exit as result
+#    6. an ExecStopPost= line on testsuite-57-prop-stop-one.service will send us a SIGUSR2
+#    7. once we got that we finish cleanly
+
+sigusr2=0
+trap sigusr2=1 SIGUSR2
+
+systemctl start testsuite-57-prop-stop-one.service
+
+while [ "$sigusr2" -eq 0 ] ; do
+    sleep .5
+done
+
+
+# Idea is this:
+#    1. we start testsuite-57-binds-to.service
+#    2. which through BindsTo=/After= pulls in testsuite-57-bound-by.service as well
+#    3. testsuite-57-bound-by.service suddenly dies
+#    4. testsuite-57-binds-to.service should then also be pulled down (it otherwise just hangs)
+#    6. an ExecStopPost= line on testsuite-57-binds-to.service will send us a SIGRTMIN1+1
+#    7. once we got that we finish cleanly
+
+sigrtmin1=0
+trap sigrtmin1=1 SIGRTMIN+1
+
+systemctl start testsuite-57-binds-to.service
+
+while [ "$sigrtmin1" -eq 0 ] ; do
+    sleep .5
+done
+
+systemd-analyze log-level info
+
+echo OK >/testok
+
+exit 0