1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2012 Lennart Poettering
7 Copyright 2013 Zbigniew Jędrzejewski-Szmek
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
30 #include "install-printf.h"
31 #include "specifier.h"
35 #include "load-fragment.h"
39 static void test_unit_file_get_set(void) {
45 h = hashmap_new(string_hash_func, string_compare_func);
48 r = unit_file_get_list(UNIT_FILE_SYSTEM, NULL, h);
49 log_info("unit_file_get_list: %s", strerror(-r));
52 HASHMAP_FOREACH(p, h, i)
53 printf("%s = %s\n", p->path, unit_file_state_to_string(p->state));
55 unit_file_list_free(h);
58 static void check_execcommand(ExecCommand *c,
64 log_info("%s %s %s %s",
65 c->path, c->argv[0], c->argv[1], c->argv[2]);
66 assert_se(streq(c->path, path));
67 assert_se(streq(c->argv[0], argv0));
68 assert_se(streq(c->argv[1], argv1));
69 assert_se(c->argv[2] == NULL);
70 assert_se(c->ignore == ignore);
73 static void test_config_parse_exec(void) {
74 /* int config_parse_exec( */
75 /* const char *filename, */
77 /* const char *section, */
78 /* const char *lvalue, */
80 /* const char *rvalue, */
85 ExecCommand *c = NULL, *c1;
88 r = config_parse_exec(NULL, "fake", 1, "section",
89 "LValue", 0, "/RValue r1",
92 check_execcommand(c, "/RValue", "/RValue", "r1", false);
94 r = config_parse_exec(NULL, "fake", 2, "section",
95 "LValue", 0, "/RValue///slashes/// r1",
100 check_execcommand(c1, "/RValue/slashes", "/RValue///slashes///",
104 r = config_parse_exec(NULL, "fake", 3, "section",
105 "LValue", 0, "@/RValue///slashes2/// argv0 r1",
108 c1 = c1->command_next;
109 check_execcommand(c1, "/RValue/slashes2", "argv0", "r1", false);
111 /* ignore && honour_argv0 */
112 r = config_parse_exec(NULL, "fake", 4, "section",
113 "LValue", 0, "-@/RValue///slashes3/// argv0a r1",
116 c1 = c1->command_next;
117 check_execcommand(c1,
118 "/RValue/slashes3", "argv0a", "r1", true);
120 /* ignore && honour_argv0 */
121 r = config_parse_exec(NULL, "fake", 4, "section",
122 "LValue", 0, "@-/RValue///slashes4/// argv0b r1",
125 c1 = c1->command_next;
126 check_execcommand(c1,
127 "/RValue/slashes4", "argv0b", "r1", true);
129 /* ignore && ignore */
130 r = config_parse_exec(NULL, "fake", 4, "section",
131 "LValue", 0, "--/RValue argv0 r1",
134 assert_se(c1->command_next == NULL);
136 /* ignore && ignore */
137 r = config_parse_exec(NULL, "fake", 4, "section",
138 "LValue", 0, "-@-/RValue argv0 r1",
141 assert_se(c1->command_next == NULL);
144 r = config_parse_exec(NULL, "fake", 5, "section",
146 "-@/RValue argv0 r1 ; "
150 c1 = c1->command_next;
151 check_execcommand(c1,
152 "/RValue", "argv0", "r1", true);
154 c1 = c1->command_next;
155 check_execcommand(c1,
156 "/goo/goo", "/goo/goo", "boo", false);
158 /* trailing semicolon */
159 r = config_parse_exec(NULL, "fake", 5, "section",
161 "-@/RValue argv0 r1 ; ",
164 c1 = c1->command_next;
165 check_execcommand(c1,
166 "/RValue", "argv0", "r1", true);
168 assert_se(c1->command_next == NULL);
170 /* escaped semicolon */
171 r = config_parse_exec(NULL, "fake", 5, "section",
176 c1 = c1->command_next;
177 check_execcommand(c1,
178 "/usr/bin/find", "/usr/bin/find", ";", false);
180 exec_command_free_list(c);
198 "#SPAMD_ARGS=\"-d --socketpath=/var/lib/bulwark/spamd \\\n" \
199 "#--nouser-config \\\n" \
205 "HWMON_MODULES=\"coretemp f71882fg\"\n" \
207 "# For compatibility reasons\n" \
209 "MODULE_0=coretemp\n" \
213 static void test_load_env_file_1(void) {
214 _cleanup_strv_free_ char **data = NULL;
217 char name[] = "/tmp/test-load-env-file.XXXXXX";
218 _cleanup_close_ int fd = mkstemp(name);
220 assert_se(write(fd, env_file_1, sizeof(env_file_1)) == sizeof(env_file_1));
222 r = load_env_file(name, NULL, &data);
224 assert(streq(data[0], "a=a"));
225 assert(streq(data[1], "b=bc"));
226 assert(streq(data[2], "d=def"));
227 assert(streq(data[3], "g=g "));
228 assert(streq(data[4], "h=h"));
229 assert(streq(data[5], "i=i"));
230 assert(data[6] == NULL);
234 static void test_load_env_file_2(void) {
235 _cleanup_strv_free_ char **data = NULL;
238 char name[] = "/tmp/test-load-env-file.XXXXXX";
239 _cleanup_close_ int fd = mkstemp(name);
241 assert_se(write(fd, env_file_2, sizeof(env_file_2)) == sizeof(env_file_2));
243 r = load_env_file(name, NULL, &data);
245 assert(streq(data[0], "a=a"));
246 assert(data[1] == NULL);
250 static void test_load_env_file_3(void) {
251 _cleanup_strv_free_ char **data = NULL;
254 char name[] = "/tmp/test-load-env-file.XXXXXX";
255 _cleanup_close_ int fd = mkstemp(name);
257 assert_se(write(fd, env_file_3, sizeof(env_file_3)) == sizeof(env_file_3));
259 r = load_env_file(name, NULL, &data);
261 assert(data == NULL);
265 static void test_load_env_file_4(void) {
266 _cleanup_strv_free_ char **data = NULL;
269 char name[] = "/tmp/test-load-env-file.XXXXXX";
270 _cleanup_close_ int fd = mkstemp(name);
272 assert_se(write(fd, env_file_4, sizeof(env_file_4)) == sizeof(env_file_4));
274 r = load_env_file(name, NULL, &data);
276 assert(streq(data[0], "HWMON_MODULES=coretemp f71882fg"));
277 assert(streq(data[1], "MODULE_0=coretemp"));
278 assert(streq(data[2], "MODULE_1=f71882fg"));
279 assert(data[3] == NULL);
284 #pragma GCC diagnostic push
285 #pragma GCC diagnostic ignored "-Wnonnull"
287 static void test_install_printf(void) {
288 char name[] = "name.service",
289 path[] = "/run/systemd/system/name.service",
290 user[] = "xxxx-no-such-user";
291 InstallInfo i = {name, path, user};
292 InstallInfo i2 = {name, path, NULL};
293 char name3[] = "name@inst.service",
294 path3[] = "/run/systemd/system/name.service";
295 InstallInfo i3 = {name3, path3, user};
296 InstallInfo i4 = {name3, path3, NULL};
298 _cleanup_free_ char *mid, *bid, *host;
300 assert_se((mid = specifier_machine_id('m', NULL, NULL)));
301 assert_se((bid = specifier_boot_id('b', NULL, NULL)));
302 assert_se((host = gethostname_malloc()));
304 #define expect(src, pattern, result) \
306 _cleanup_free_ char *t = install_full_printf(&src, pattern); \
307 _cleanup_free_ char \
308 *d1 = strdup(i.name), \
309 *d2 = strdup(i.path), \
310 *d3 = strdup(i.user); \
311 memzero(i.name, strlen(i.name)); \
312 memzero(i.path, strlen(i.path)); \
313 memzero(i.user, strlen(i.user)); \
314 assert(d1 && d2 && d3); \
317 assert(streq(t, result)); \
318 } else assert(t == NULL); \
319 strcpy(i.name, d1); \
320 strcpy(i.path, d2); \
321 strcpy(i.user, d3); \
324 assert_se(setenv("USER", "root", 1) == 0);
326 expect(i, "%n", "name.service");
327 expect(i, "%N", "name");
328 expect(i, "%p", "name");
330 expect(i, "%u", "xxxx-no-such-user");
331 expect(i, "%U", NULL);
332 expect(i, "%m", mid);
333 expect(i, "%b", bid);
334 expect(i, "%H", host);
336 expect(i2, "%u", "root");
337 expect(i2, "%U", "0");
339 expect(i3, "%n", "name@inst.service");
340 expect(i3, "%N", "name@inst");
341 expect(i3, "%p", "name");
342 expect(i3, "%u", "xxxx-no-such-user");
343 expect(i3, "%U", NULL);
344 expect(i3, "%m", mid);
345 expect(i3, "%b", bid);
346 expect(i3, "%H", host);
348 expect(i4, "%u", "root");
349 expect(i4, "%U", "0");
351 #pragma GCC diagnostic pop
353 int main(int argc, char *argv[]) {
355 log_parse_environment();
358 test_unit_file_get_set();
359 test_config_parse_exec();
360 test_load_env_file_1();
361 test_load_env_file_2();
362 test_load_env_file_3();
363 test_load_env_file_4();
364 test_install_printf();