test: integration test for PassFileDescriptorsToExec= option
authorJakub Sitnicki <jakub@cloudflare.com>
Thu, 14 Mar 2024 10:20:50 +0000 (11:20 +0100)
committerMike Yuan <me@yhndnzj.com>
Tue, 26 Mar 2024 17:41:26 +0000 (01:41 +0800)
Check if socket file descriptors are passed to ExecXYZ= commands from the
socket unit depending on whether PassFileDescriptorsToExec= option is set.

test/testsuite-07.units/pass-fds-to-exec-no.socket [new file with mode: 0644]
test/testsuite-07.units/pass-fds-to-exec-yes.socket [new file with mode: 0644]
test/units/testsuite-07.socket-pass-fds.sh [new file with mode: 0755]

diff --git a/test/testsuite-07.units/pass-fds-to-exec-no.socket b/test/testsuite-07.units/pass-fds-to-exec-no.socket
new file mode 100644 (file)
index 0000000..8b7964b
--- /dev/null
@@ -0,0 +1,35 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Unit]
+Description=Test if ExecXYZ= commands don't inherit listen FDs when PassFileDescriptorsToExec= is unset
+
+[Socket]
+# With Accept= set we don't need a corresponding service unit
+Accept=yes
+FileDescriptorName=foo
+ListenStream=127.0.0.1:1234
+ListenStream=[::1]:1234
+PassFileDescriptorsToExec=no
+ExecStartPre=\
+        test ExecStartPre -a \
+             -z ${LISTEN_FDS} -a \
+             -z ${LISTEN_FDNAMES} -a \
+             ! -e /dev/fd/3 -a \
+             ! -e /dev/fd/4
+ExecStartPost=\
+        test ExecStartPost -a \
+             -z ${LISTEN_FDS} -a \
+             -z ${LISTEN_FDNAMES} -a \
+             ! -e /dev/fd/3 -a \
+             ! -e /dev/fd/4
+ExecStopPre=\
+        test ExecStopPre -a \
+             -z ${LISTEN_FDS} -a \
+             -z ${LISTEN_FDNAMES} -a \
+             ! -e /dev/fd/3 -a \
+             ! -e /dev/fd/4
+ExecStopPost=\
+        test ExecStopPost -a \
+             -z ${LISTEN_FDS} -a \
+             -z ${LISTEN_FDNAMES} -a \
+             ! -e /dev/fd/3 -a \
+             ! -e /dev/fd/4
diff --git a/test/testsuite-07.units/pass-fds-to-exec-yes.socket b/test/testsuite-07.units/pass-fds-to-exec-yes.socket
new file mode 100644 (file)
index 0000000..bff192d
--- /dev/null
@@ -0,0 +1,36 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Unit]
+Description=Test if ExecXYZ= commands inherit listen FDs when PassFileDescriptorsToExec= is set
+
+[Socket]
+# With Accept= set we don't need a corresponding service unit
+Accept=yes
+FileDescriptorName=foo
+ListenStream=127.0.0.1:1234
+ListenStream=[::1]:1234
+PassFileDescriptorsToExec=yes
+# ExecStartPre runs before we create sockets. Nothing to pass.
+ExecStartPre=\
+        test ExecStartPre -a \
+             -z ${LISTEN_FDS} -a \
+             -z ${LISTEN_FDNAMES} -a \
+             ! -e /dev/fd/3 -a \
+             ! -e /dev/fd/4
+ExecStartPost=\
+        test ExecStartPost -a \
+             ${LISTEN_FDS} = 2 -a \
+             ${LISTEN_FDNAMES} = foo:foo -a \
+             -S /dev/fd/3 -a \
+             -S /dev/fd/4
+ExecStopPre=\
+        test "ExecStopPre" -a \
+             ${LISTEN_FDS} = 2 -a \
+             ${LISTEN_FDNAMES} = foo:foo -a \
+             -S /dev/fd/3 -a \
+             -S /dev/fd/4
+ExecStopPost=\
+        test "ExecStopPost" -a \
+             ${LISTEN_FDS} = 2 -a \
+             ${LISTEN_FDNAMES} = foo:foo -a \
+             -S /dev/fd/3 -a \
+             -S /dev/fd/4
diff --git a/test/units/testsuite-07.socket-pass-fds.sh b/test/units/testsuite-07.socket-pass-fds.sh
new file mode 100755 (executable)
index 0000000..a61b1c0
--- /dev/null
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eux
+set -o pipefail
+
+# Test PassFileDescriptorsToExec= option in socket units
+
+for u in pass-fds-to-exec-{no,yes}.socket; do
+    systemctl start "$u"
+    systemctl stop "$u"
+done