]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-execute: add test for NetworkNamespacePath= 26662/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 3 Mar 2023 17:43:02 +0000 (02:43 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 3 Mar 2023 17:50:15 +0000 (02:50 +0900)
Prompted by https://github.com/systemd/systemd/issues/26422#issuecomment-1435772839.

src/test/test-execute.c
test/test-execute/exec-networknamespacepath-privatemounts-no.service [new file with mode: 0644]
test/test-execute/exec-networknamespacepath-privatemounts-yes.service [new file with mode: 0644]

index 7df3be4a7c026066f045c2fcb8b4001273d289ed..641cc5c65a145d1a9a93db4fa840c746fc2548ba 100644 (file)
@@ -1065,6 +1065,19 @@ static void test_exec_privatenetwork(Manager *m) {
         test(m, "exec-privatenetwork-yes-privatemounts-yes.service", status, CLD_EXITED);
 }
 
+static void test_exec_networknamespacepath(Manager *m) {
+        int r;
+
+        r = find_executable("ip", NULL);
+        if (r < 0) {
+                log_notice_errno(r, "Skipping %s, could not find ip binary: %m", __func__);
+                return;
+        }
+
+        test(m, "exec-networknamespacepath-privatemounts-no.service", MANAGER_IS_SYSTEM(m) ? EXIT_SUCCESS : EXIT_FAILURE, CLD_EXITED);
+        test(m, "exec-networknamespacepath-privatemounts-yes.service", can_unshare ? EXIT_SUCCESS : EXIT_FAILURE, CLD_EXITED);
+}
+
 static void test_exec_oomscoreadjust(Manager *m) {
         test(m, "exec-oomscoreadjust-positive.service", 0, CLD_EXITED);
 
@@ -1168,6 +1181,7 @@ static void run_tests(LookupScope scope, char **patterns) {
                 entry(test_exec_inaccessiblepaths),
                 entry(test_exec_ioschedulingclass),
                 entry(test_exec_mount_apivfs),
+                entry(test_exec_networknamespacepath),
                 entry(test_exec_noexecpaths),
                 entry(test_exec_oomscoreadjust),
                 entry(test_exec_passenvironment),
@@ -1378,11 +1392,16 @@ static int intro(void) {
         /* Create dummy network interface for testing PrivateNetwork=yes */
         (void) system("ip link add dummy-test-exec type dummy");
 
+        /* Create a network namespace and a dummy interface in it for NetworkNamespacePath= */
+        (void) system("ip netns add test-execute-netns");
+        (void) system("ip netns exec test-execute-netns ip link add dummy-test-ns type dummy");
+
         return EXIT_SUCCESS;
 }
 
 static int outro(void) {
         (void) system("ip link del dummy-test-exec");
+        (void) system("ip netns del test-execute-netns");
         (void) rmdir(PRIVATE_UNIT_DIR);
 
         return EXIT_SUCCESS;
diff --git a/test/test-execute/exec-networknamespacepath-privatemounts-no.service b/test/test-execute/exec-networknamespacepath-privatemounts-no.service
new file mode 100644 (file)
index 0000000..49277e3
--- /dev/null
@@ -0,0 +1,16 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Unit]
+Description=Test for NetworkNamespacePath= without mount namespacing
+
+[Service]
+ExecStart=/bin/sh -x -c '! ip link show dummy-test-exec'
+ExecStart=/bin/sh -x -c 'test ! -e /proc/sys/net/ipv4/conf/dummy-test-exec'
+# Without mount namespacing, we can access the dummy-test-exec interface through sysfs.
+ExecStart=/bin/sh -x -c 'test -e /sys/class/net/dummy-test-exec'
+ExecStart=/bin/sh -x -c 'ip link show dummy-test-ns'
+ExecStart=/bin/sh -x -c 'test -e /proc/sys/net/ipv4/conf/dummy-test-ns'
+# Without mount namespacing, we cannot access the dummy-test-ns interface through sysfs.
+ExecStart=/bin/sh -x -c 'test ! -e /sys/class/net/dummy-test-ns'
+Type=oneshot
+NetworkNamespacePath=/run/netns/test-execute-netns
+PrivateMounts=no
diff --git a/test/test-execute/exec-networknamespacepath-privatemounts-yes.service b/test/test-execute/exec-networknamespacepath-privatemounts-yes.service
new file mode 100644 (file)
index 0000000..078fba8
--- /dev/null
@@ -0,0 +1,16 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Unit]
+Description=Test for NetworkNamespacePath= with mount namespacing
+
+[Service]
+ExecStart=/bin/sh -x -c '! ip link show dummy-test-exec'
+ExecStart=/bin/sh -x -c 'test ! -e /proc/sys/net/ipv4/conf/dummy-test-exec'
+# With mount namespacing, we cannot access the dummy-test-exec interface through sysfs.
+ExecStart=/bin/sh -x -c 'test ! -e /sys/class/net/dummy-test-exec'
+ExecStart=/bin/sh -x -c 'ip link show dummy-test-ns'
+ExecStart=/bin/sh -x -c 'test -e /proc/sys/net/ipv4/conf/dummy-test-ns'
+# With mount namespacing, we can access the dummy-test-ns interface through sysfs.
+ExecStart=/bin/sh -x -c 'test -e /sys/class/net/dummy-test-ns'
+Type=oneshot
+NetworkNamespacePath=/run/netns/test-execute-netns
+# NetworkNamespacePath= implies PrivateMounts=yes