]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-env-file.c
license: LGPL-2.1+ -> LGPL-2.1-or-later
[thirdparty/systemd.git] / src / test / test-env-file.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "env-file.h"
4 #include "fd-util.h"
5 #include "fileio.h"
6 #include "fs-util.h"
7 #include "macro.h"
8 #include "strv.h"
9 #include "tests.h"
10 #include "tmpfile-util.h"
11
12 #define env_file_1 \
13 "a=a\n" \
14 "b=b\\\n" \
15 "c\n" \
16 "d=d\\\n" \
17 "e\\\n" \
18 "f\n" \
19 "g=g\\ \n" \
20 "h=h\n" \
21 "i=i\\"
22
23 #define env_file_2 \
24 "a=a\\\n"
25
26 #define env_file_3 \
27 "#SPAMD_ARGS=\"-d --socketpath=/var/lib/bulwark/spamd \\\n" \
28 "#--nouser-config \\\n" \
29 "normal=line"
30
31 #define env_file_4 \
32 "# Generated\n" \
33 "\n" \
34 "HWMON_MODULES=\"coretemp f71882fg\"\n" \
35 "\n" \
36 "# For compatibility reasons\n" \
37 "\n" \
38 "MODULE_0=coretemp\n" \
39 "MODULE_1=f71882fg"
40
41 #define env_file_5 \
42 "a=\n" \
43 "b="
44
45 static void test_load_env_file_1(void) {
46 _cleanup_strv_free_ char **data = NULL;
47 int r;
48
49 _cleanup_(unlink_tempfilep) char name[] = "/tmp/test-load-env-file.XXXXXX";
50 _cleanup_close_ int fd;
51
52 fd = mkostemp_safe(name);
53 assert_se(fd >= 0);
54 assert_se(write(fd, env_file_1, strlen(env_file_1)) == strlen(env_file_1));
55
56 r = load_env_file(NULL, name, &data);
57 assert_se(r == 0);
58 assert_se(streq(data[0], "a=a"));
59 assert_se(streq(data[1], "b=bc"));
60 assert_se(streq(data[2], "d=def"));
61 assert_se(streq(data[3], "g=g "));
62 assert_se(streq(data[4], "h=h"));
63 assert_se(streq(data[5], "i=i"));
64 assert_se(data[6] == NULL);
65 }
66
67 static void test_load_env_file_2(void) {
68 _cleanup_strv_free_ char **data = NULL;
69 int r;
70
71 _cleanup_(unlink_tempfilep) char name[] = "/tmp/test-load-env-file.XXXXXX";
72 _cleanup_close_ int fd;
73
74 fd = mkostemp_safe(name);
75 assert_se(fd >= 0);
76 assert_se(write(fd, env_file_2, strlen(env_file_2)) == strlen(env_file_2));
77
78 r = load_env_file(NULL, name, &data);
79 assert_se(r == 0);
80 assert_se(streq(data[0], "a=a"));
81 assert_se(data[1] == NULL);
82 }
83
84 static void test_load_env_file_3(void) {
85 _cleanup_strv_free_ char **data = NULL;
86 int r;
87
88 _cleanup_(unlink_tempfilep) char name[] = "/tmp/test-load-env-file.XXXXXX";
89 _cleanup_close_ int fd;
90
91 fd = mkostemp_safe(name);
92 assert_se(fd >= 0);
93 assert_se(write(fd, env_file_3, strlen(env_file_3)) == strlen(env_file_3));
94
95 r = load_env_file(NULL, name, &data);
96 assert_se(r == 0);
97 assert_se(data == NULL);
98 }
99
100 static void test_load_env_file_4(void) {
101 _cleanup_strv_free_ char **data = NULL;
102 _cleanup_(unlink_tempfilep) char name[] = "/tmp/test-load-env-file.XXXXXX";
103 _cleanup_close_ int fd;
104 int r;
105
106 fd = mkostemp_safe(name);
107 assert_se(fd >= 0);
108 assert_se(write(fd, env_file_4, strlen(env_file_4)) == strlen(env_file_4));
109
110 r = load_env_file(NULL, name, &data);
111 assert_se(r == 0);
112 assert_se(streq(data[0], "HWMON_MODULES=coretemp f71882fg"));
113 assert_se(streq(data[1], "MODULE_0=coretemp"));
114 assert_se(streq(data[2], "MODULE_1=f71882fg"));
115 assert_se(data[3] == NULL);
116 }
117
118 static void test_load_env_file_5(void) {
119 _cleanup_strv_free_ char **data = NULL;
120 int r;
121
122 _cleanup_(unlink_tempfilep) char name[] = "/tmp/test-load-env-file.XXXXXX";
123 _cleanup_close_ int fd;
124
125 fd = mkostemp_safe(name);
126 assert_se(fd >= 0);
127 assert_se(write(fd, env_file_5, strlen(env_file_5)) == strlen(env_file_5));
128
129 r = load_env_file(NULL, name, &data);
130 assert_se(r == 0);
131 assert_se(streq(data[0], "a="));
132 assert_se(streq(data[1], "b="));
133 assert_se(data[2] == NULL);
134 }
135
136 static void test_write_and_load_env_file(void) {
137 const char *v;
138
139 /* Make sure that our writer, parser and the shell agree on what our env var files mean */
140
141 FOREACH_STRING(v,
142 "obbardc-laptop",
143 "obbardc\\-laptop",
144 "obbardc-lap\\top",
145 "obbardc-lap\\top",
146 "obbardc-lap\\\\top",
147 "double\"quote",
148 "single\'quote",
149 "dollar$dollar",
150 "newline\nnewline") {
151 _cleanup_(unlink_and_freep) char *p = NULL;
152 _cleanup_strv_free_ char **l = NULL;
153 _cleanup_free_ char *j = NULL, *w = NULL, *cmd = NULL, *from_shell = NULL;
154 _cleanup_pclose_ FILE *f = NULL;
155 size_t sz;
156
157 assert_se(tempfn_random_child(NULL, NULL, &p) >= 0);
158
159 assert_se(j = strjoin("TEST=", v));
160 assert_se(write_env_file(p, STRV_MAKE(j)) >= 0);
161
162 assert_se(cmd = strjoin(". ", p, " && /bin/echo -n \"$TEST\""));
163 assert_se(f = popen(cmd, "re"));
164 assert_se(read_full_stream(f, &from_shell, &sz) >= 0);
165 assert_se(sz == strlen(v));
166 assert_se(streq(from_shell, v));
167
168 assert_se(load_env_file(NULL, p, &l) >= 0);
169 assert_se(strv_equal(l, STRV_MAKE(j)));
170
171 assert_se(parse_env_file(NULL, p, "TEST", &w) >= 0);
172 assert_se(streq_ptr(w, v));
173 }
174 }
175
176 int main(int argc, char *argv[]) {
177 test_setup_logging(LOG_INFO);
178
179 test_load_env_file_1();
180 test_load_env_file_2();
181 test_load_env_file_3();
182 test_load_env_file_4();
183 test_load_env_file_5();
184
185 test_write_and_load_env_file();
186
187 return 0;
188 }