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("fake", 1, "section",
89 "LValue", 0, "/RValue r1",
92 check_execcommand(c, "/RValue", "/RValue", "r1", false);
94 r = config_parse_exec("fake", 2, "section",
95 "LValue", 0, "/RValue///slashes/// r1",
100 check_execcommand(c1, "/RValue/slashes", "/RValue///slashes///",
104 r = config_parse_exec("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("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("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("fake", 4, "section",
131 "LValue", 0, "--/RValue argv0 r1",
134 assert_se(c1->command_next == NULL);
136 /* ignore && ignore */
137 r = config_parse_exec("fake", 4, "section",
138 "LValue", 0, "-@-/RValue argv0 r1",
141 assert_se(c1->command_next == NULL);
144 r = config_parse_exec("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("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("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" \
202 static void test_load_env_file_1(void) {
203 char _cleanup_strv_free_ **data = NULL;
206 char name[] = "/tmp/test-load-env-file.XXXXXX";
207 int _cleanup_close_ fd = mkstemp(name);
209 assert_se(write(fd, env_file_1, sizeof(env_file_1)) == sizeof(env_file_1));
211 r = load_env_file(name, &data);
213 assert(streq(data[0], "a"));
214 assert(streq(data[1], "bc"));
215 assert(streq(data[2], "def"));
216 assert(streq(data[3], "g\\"));
217 assert(streq(data[4], "h"));
218 assert(streq(data[5], "i\\"));
219 assert(data[6] == NULL);
223 static void test_load_env_file_2(void) {
224 char _cleanup_strv_free_ **data = NULL;
227 char name[] = "/tmp/test-load-env-file.XXXXXX";
228 int _cleanup_close_ fd = mkstemp(name);
230 assert_se(write(fd, env_file_2, sizeof(env_file_2)) == sizeof(env_file_2));
232 r = load_env_file(name, &data);
234 assert(streq(data[0], "a"));
235 assert(data[1] == NULL);
239 static void test_load_env_file_3(void) {
240 char _cleanup_strv_free_ **data = NULL;
243 char name[] = "/tmp/test-load-env-file.XXXXXX";
244 int _cleanup_close_ fd = mkstemp(name);
246 assert_se(write(fd, env_file_3, sizeof(env_file_3)) == sizeof(env_file_3));
248 r = load_env_file(name, &data);
250 assert(data == NULL);
254 #pragma GCC diagnostic push
255 #pragma GCC diagnostic ignored "-Wnonnull"
257 static void test_install_printf(void) {
258 char name[] = "name.service",
259 path[] = "/run/systemd/system/name.service",
260 user[] = "xxxx-no-such-user";
261 InstallInfo i = {name, path, user};
262 InstallInfo i2 = {name, path, NULL};
263 char name3[] = "name@inst.service",
264 path3[] = "/run/systemd/system/name.service";
265 InstallInfo i3 = {name3, path3, user};
266 InstallInfo i4 = {name3, path3, NULL};
268 char _cleanup_free_ *mid, *bid, *host;
270 assert_se((mid = specifier_machine_id('m', NULL, NULL)));
271 assert_se((bid = specifier_boot_id('b', NULL, NULL)));
272 assert_se((host = gethostname_malloc()));
274 #define expect(src, pattern, result) \
276 char _cleanup_free_ *t = install_full_printf(&src, pattern); \
277 char _cleanup_free_ \
278 *d1 = strdup(i.name), \
279 *d2 = strdup(i.path), \
280 *d3 = strdup(i.user); \
281 memzero(i.name, strlen(i.name)); \
282 memzero(i.path, strlen(i.path)); \
283 memzero(i.user, strlen(i.user)); \
284 assert(d1 && d2 && d3); \
287 assert(streq(t, result)); \
288 } else assert(t == NULL); \
289 strcpy(i.name, d1); \
290 strcpy(i.path, d2); \
291 strcpy(i.user, d3); \
294 assert_se(setenv("USER", "root", 1) == 0);
296 expect(i, "%n", "name.service");
297 expect(i, "%N", "name");
298 expect(i, "%p", "name");
300 expect(i, "%u", "xxxx-no-such-user");
301 expect(i, "%U", NULL);
302 expect(i, "%m", mid);
303 expect(i, "%b", bid);
304 expect(i, "%H", host);
306 expect(i2, "%u", "root");
307 expect(i2, "%U", "0");
309 expect(i3, "%n", "name@inst.service");
310 expect(i3, "%N", "name@inst");
311 expect(i3, "%p", "name");
312 expect(i3, "%u", "xxxx-no-such-user");
313 expect(i3, "%U", NULL);
314 expect(i3, "%m", mid);
315 expect(i3, "%b", bid);
316 expect(i3, "%H", host);
318 expect(i4, "%u", "root");
319 expect(i4, "%U", "0");
321 #pragma GCC diagnostic pop
323 int main(int argc, char *argv[]) {
325 test_unit_file_get_set();
326 test_config_parse_exec();
327 test_load_env_file_1();
328 test_load_env_file_2();
329 test_load_env_file_3();
330 test_install_printf();