803fb7
From f35b737bdd6e508cf73f43a1beb3f5cb8c1ebb07 Mon Sep 17 00:00:00 2001
803fb7
From: Filipe Brandenburger <filbranden@google.com>
803fb7
Date: Sun, 8 Nov 2015 10:37:05 -0800
803fb7
Subject: [PATCH] test-execute: Add tests for new PassEnvironment= directive
803fb7
803fb7
Check the base case, plus erasing the list, listing the same variable
803fb7
name more than once and when variables are absent from the manager
803fb7
execution environment.
803fb7
803fb7
Confirmed that `sudo ./test-execute` passes and that modifying the test
803fb7
cases (or the values of the set variables in test-execute.c) is enough
803fb7
to make the test cases fail.
803fb7
803fb7
(cherry picked from commit 4c80d201ace0377312c27143afab04e9c9f1ee64)
803fb7
803fb7
Related: #1426214
803fb7
---
803fb7
 Makefile.am                                |  4 ++++
803fb7
 src/test/test-execute.c                    | 14 ++++++++++++++
803fb7
 test/exec-passenvironment-absent.service   |  7 +++++++
803fb7
 test/exec-passenvironment-empty.service    |  8 ++++++++
803fb7
 test/exec-passenvironment-repeated.service |  8 ++++++++
803fb7
 test/exec-passenvironment.service          |  7 +++++++
803fb7
 6 files changed, 48 insertions(+)
803fb7
 create mode 100644 test/exec-passenvironment-absent.service
803fb7
 create mode 100644 test/exec-passenvironment-empty.service
803fb7
 create mode 100644 test/exec-passenvironment-repeated.service
803fb7
 create mode 100644 test/exec-passenvironment.service
803fb7
803fb7
diff --git a/Makefile.am b/Makefile.am
803fb7
index 924b34b69..e9ceac98a 100644
803fb7
--- a/Makefile.am
803fb7
+++ b/Makefile.am
803fb7
@@ -1477,6 +1477,10 @@ EXTRA_DIST += \
803fb7
 	test/exec-environment-empty.service \
803fb7
 	test/exec-environment-multiple.service \
803fb7
 	test/exec-environment.service \
803fb7
+	test/exec-passenvironment-absent.service \
803fb7
+	test/exec-passenvironment-empty.service \
803fb7
+	test/exec-passenvironment-repeated.service \
803fb7
+	test/exec-passenvironment.service \
803fb7
 	test/exec-group.service \
803fb7
 	test/exec-ignoresigpipe-no.service \
803fb7
 	test/exec-ignoresigpipe-yes.service \
803fb7
diff --git a/src/test/test-execute.c b/src/test/test-execute.c
803fb7
index 5a02960e7..8def1946d 100644
803fb7
--- a/src/test/test-execute.c
803fb7
+++ b/src/test/test-execute.c
803fb7
@@ -142,6 +142,19 @@ static void test_exec_environment(Manager *m) {
803fb7
         test(m, "exec-environment-empty.service", 0, CLD_EXITED);
803fb7
 }
803fb7
 
803fb7
+static void test_exec_passenvironment(Manager *m) {
803fb7
+        assert_se(setenv("VAR1", "word1 word2", 1) == 0);
803fb7
+        assert_se(setenv("VAR2", "word3", 1) == 0);
803fb7
+        assert_se(setenv("VAR3", "$word 5 6", 1) == 0);
803fb7
+        test(m, "exec-passenvironment.service", 0, CLD_EXITED);
803fb7
+        test(m, "exec-passenvironment-repeated.service", 0, CLD_EXITED);
803fb7
+        test(m, "exec-passenvironment-empty.service", 0, CLD_EXITED);
803fb7
+        assert_se(unsetenv("VAR1") == 0);
803fb7
+        assert_se(unsetenv("VAR2") == 0);
803fb7
+        assert_se(unsetenv("VAR3") == 0);
803fb7
+        test(m, "exec-passenvironment-absent.service", 0, CLD_EXITED);
803fb7
+}
803fb7
+
803fb7
 static void test_exec_umask(Manager *m) {
803fb7
         test(m, "exec-umask-default.service", 0, CLD_EXITED);
803fb7
         test(m, "exec-umask-0177.service", 0, CLD_EXITED);
803fb7
@@ -165,6 +178,7 @@ int main(int argc, char *argv[]) {
803fb7
                 test_exec_user,
803fb7
                 test_exec_group,
803fb7
                 test_exec_environment,
803fb7
+                test_exec_passenvironment,
803fb7
                 test_exec_umask,
803fb7
                 test_exec_runtimedirectory,
803fb7
                 NULL,
803fb7
diff --git a/test/exec-passenvironment-absent.service b/test/exec-passenvironment-absent.service
803fb7
new file mode 100644
803fb7
index 000000000..7d5e32a4e
803fb7
--- /dev/null
803fb7
+++ b/test/exec-passenvironment-absent.service
803fb7
@@ -0,0 +1,7 @@
803fb7
+[Unit]
803fb7
+Description=Test for PassEnvironment with variables absent from the execution environment
803fb7
+
803fb7
+[Service]
803fb7
+ExecStart=/bin/sh -x -c 'test "$${VAR1-unset}" = "unset" && test "$${VAR2-unset}" = "unset" && test "$${VAR3-unset}" = "unset"'
803fb7
+Type=oneshot
803fb7
+PassEnvironment=VAR1 VAR2 VAR3
803fb7
diff --git a/test/exec-passenvironment-empty.service b/test/exec-passenvironment-empty.service
803fb7
new file mode 100644
803fb7
index 000000000..c93c197c1
803fb7
--- /dev/null
803fb7
+++ b/test/exec-passenvironment-empty.service
803fb7
@@ -0,0 +1,8 @@
803fb7
+[Unit]
803fb7
+Description=Test for PassEnvironment and erasing the variable list
803fb7
+
803fb7
+[Service]
803fb7
+ExecStart=/bin/sh -x -c 'test "$${VAR1-unset}" = "unset" && test "$${VAR2-unset}" = "unset" && test "$${VAR3-unset}" = "unset"'
803fb7
+Type=oneshot
803fb7
+PassEnvironment=VAR1 VAR2 VAR3
803fb7
+PassEnvironment=
803fb7
diff --git a/test/exec-passenvironment-repeated.service b/test/exec-passenvironment-repeated.service
803fb7
new file mode 100644
803fb7
index 000000000..5e8c56f26
803fb7
--- /dev/null
803fb7
+++ b/test/exec-passenvironment-repeated.service
803fb7
@@ -0,0 +1,8 @@
803fb7
+[Unit]
803fb7
+Description=Test for PassEnvironment with a variable name repeated
803fb7
+
803fb7
+[Service]
803fb7
+ExecStart=/bin/sh -x -c 'test "$$VAR1" = "word1 word2" && test "$$VAR2" = word3 && test "$$VAR3" = "\\$$word 5 6"'
803fb7
+Type=oneshot
803fb7
+PassEnvironment=VAR1 VAR2
803fb7
+PassEnvironment=VAR1 VAR3
803fb7
diff --git a/test/exec-passenvironment.service b/test/exec-passenvironment.service
803fb7
new file mode 100644
803fb7
index 000000000..b4a990968
803fb7
--- /dev/null
803fb7
+++ b/test/exec-passenvironment.service
803fb7
@@ -0,0 +1,7 @@
803fb7
+[Unit]
803fb7
+Description=Test for PassEnvironment
803fb7
+
803fb7
+[Service]
803fb7
+ExecStart=/bin/sh -x -c 'test "$$VAR1" = "word1 word2" && test "$$VAR2" = word3 && test "$$VAR3" = "\\$$word 5 6"'
803fb7
+Type=oneshot
803fb7
+PassEnvironment=VAR1 VAR2 VAR3