1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
33 static void test_parse_env_file(void) {
34 char t[] = "/tmp/test-fileio-in-XXXXXX",
35 p[] = "/tmp/test-fileio-out-XXXXXX";
38 _cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL,
39 *six = NULL, *seven = NULL, *eight = NULL, *nine = NULL, *ten = NULL;
40 _cleanup_strv_free_ char **a = NULL, **b = NULL;
44 fd = mkostemp_safe(p, O_RDWR|O_CLOEXEC);
48 fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC);
60 "invalid line #comment\n"
63 "four = \'44\\\"44\'\n"
64 "five = \'55\\\'55\' \"FIVE\" cinco \n"
65 "six = seis sechs\\\n"
67 "seven=\"sevenval\" #nocomment\n"
68 "eight=eightval #nocomment\n"
69 "export nine=nineval\n"
75 r = load_env_file(NULL, t, NULL, &a);
79 log_info("Got: <%s>", *i);
81 assert_se(streq_ptr(a[0], "one=BAR"));
82 assert_se(streq_ptr(a[1], "two=bar"));
83 assert_se(streq_ptr(a[2], "three=333\nxxxx"));
84 assert_se(streq_ptr(a[3], "four=44\"44"));
85 assert_se(streq_ptr(a[4], "five=55\'55FIVEcinco"));
86 assert_se(streq_ptr(a[5], "six=seis sechs sis"));
87 assert_se(streq_ptr(a[6], "seven=sevenval#nocomment"));
88 assert_se(streq_ptr(a[7], "eight=eightval #nocomment"));
89 assert_se(streq_ptr(a[8], "export nine=nineval"));
90 assert_se(streq_ptr(a[9], "ten="));
91 assert_se(a[10] == NULL);
93 strv_env_clean_log(a, NULL, "test");
97 log_info("Got2: <%s>", *i);
98 assert_se(streq(*i, a[k++]));
111 "export nine", &nine,
117 log_info("one=[%s]", strna(one));
118 log_info("two=[%s]", strna(two));
119 log_info("three=[%s]", strna(three));
120 log_info("four=[%s]", strna(four));
121 log_info("five=[%s]", strna(five));
122 log_info("six=[%s]", strna(six));
123 log_info("seven=[%s]", strna(seven));
124 log_info("eight=[%s]", strna(eight));
125 log_info("export nine=[%s]", strna(nine));
126 log_info("ten=[%s]", strna(nine));
128 assert_se(streq(one, "BAR"));
129 assert_se(streq(two, "bar"));
130 assert_se(streq(three, "333\nxxxx"));
131 assert_se(streq(four, "44\"44"));
132 assert_se(streq(five, "55\'55FIVEcinco"));
133 assert_se(streq(six, "seis sechs sis"));
134 assert_se(streq(seven, "sevenval#nocomment"));
135 assert_se(streq(eight, "eightval #nocomment"));
136 assert_se(streq(nine, "nineval"));
137 assert_se(ten == NULL);
139 r = write_env_file(p, a);
142 r = load_env_file(NULL, p, NULL, &b);
149 static void test_parse_multiline_env_file(void) {
150 char t[] = "/tmp/test-fileio-in-XXXXXX",
151 p[] = "/tmp/test-fileio-out-XXXXXX";
154 _cleanup_strv_free_ char **a = NULL, **b = NULL;
157 fd = mkostemp_safe(p, O_RDWR|O_CLOEXEC);
161 fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC);
182 r = load_env_file(NULL, t, NULL, &a);
186 log_info("Got: <%s>", *i);
188 assert_se(streq_ptr(a[0], "one=BAR VAR\tGAR"));
189 assert_se(streq_ptr(a[1], "two=bar var\tgar"));
190 assert_se(streq_ptr(a[2], "tri=bar var \tgar "));
191 assert_se(a[3] == NULL);
193 r = write_env_file(p, a);
196 r = load_env_file(NULL, p, NULL, &b);
204 static void test_executable_is_script(void) {
205 char t[] = "/tmp/test-executable-XXXXXX";
210 fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC);
216 fputs("#! /bin/script -a -b \ngoo goo", f);
219 r = executable_is_script(t, &command);
221 assert_se(streq(command, "/bin/script"));
224 r = executable_is_script("/bin/sh", &command);
227 r = executable_is_script("/usr/bin/yum", &command);
228 assert_se(r > 0 || r == -ENOENT);
230 assert_se(startswith(command, "/"));
238 static void test_status_field(void) {
239 _cleanup_free_ char *t = NULL, *p = NULL, *s = NULL, *z = NULL;
240 unsigned long long total = 0, buffers = 0;
243 assert_se(get_status_field("/proc/self/status", "\nThreads:", &t) == 0);
245 assert_se(streq(t, "1"));
247 r = get_status_field("/proc/meminfo", "MemTotal:", &p);
251 assert_se(safe_atollu(p, &total) == 0);
254 r = get_status_field("/proc/meminfo", "\nBuffers:", &s);
258 assert_se(safe_atollu(s, &buffers) == 0);
262 assert_se(buffers < total);
264 /* Seccomp should be a good test for field full of zeros. */
265 r = get_status_field("/proc/meminfo", "\nSeccomp:", &z);
269 assert_se(safe_atollu(z, &buffers) == 0);
273 static void test_capeff(void) {
276 for (pid = 0; pid < 2; pid++) {
277 _cleanup_free_ char *capeff = NULL;
280 r = get_process_capeff(0, &capeff);
281 log_info("capeff: '%s' (r=%d)", capeff, r);
283 if (r == -ENOENT || r == -EPERM)
288 p = capeff[strspn(capeff, DIGITS "abcdefABCDEF")];
289 assert_se(!p || isspace(p));
293 static void test_write_string_stream(void) {
294 char fn[] = "/tmp/test-write_string_stream-XXXXXX";
295 _cleanup_fclose_ FILE *f = NULL;
299 fd = mkostemp_safe(fn, O_RDWR);
304 assert_se(write_string_stream(f, "boohoo") < 0);
306 f = freopen(fn, "r+", f);
309 assert_se(write_string_stream(f, "boohoo") == 0);
312 assert_se(fgets(buf, sizeof(buf), f));
313 assert_se(streq(buf, "boohoo\n"));
318 static void test_write_string_file(void) {
319 char fn[] = "/tmp/test-write_string_file-XXXXXX";
321 _cleanup_close_ int fd;
323 fd = mkostemp_safe(fn, O_RDWR);
326 assert_se(write_string_file(fn, "boohoo") == 0);
328 assert_se(read(fd, buf, sizeof(buf)) == 7);
329 assert_se(streq(buf, "boohoo\n"));
334 static void test_write_string_file_no_create(void) {
335 char fn[] = "/tmp/test-write_string_file_no_create-XXXXXX";
336 _cleanup_close_ int fd;
339 fd = mkostemp_safe(fn, O_RDWR);
342 assert_se(write_string_file_no_create("/a/file/which/does/not/exists/i/guess", "boohoo") < 0);
343 assert_se(write_string_file_no_create(fn, "boohoo") == 0);
345 assert_se(read(fd, buf, sizeof(buf)));
346 assert_se(streq(buf, "boohoo\n"));
351 static void test_sendfile_full(void) {
352 char in_fn[] = "/tmp/test-sendfile_full-XXXXXX";
353 char out_fn[] = "/tmp/test-sendfile_full-XXXXXX";
354 _cleanup_close_ int in_fd, out_fd;
355 char text[] = "boohoo\nfoo\n\tbar\n";
358 in_fd = mkostemp_safe(in_fn, O_RDWR);
359 assert_se(in_fd >= 0);
360 out_fd = mkostemp_safe(out_fn, O_RDWR);
361 assert_se(out_fd >= 0);
363 assert_se(write_string_file(in_fn, text) == 0);
364 assert_se(sendfile_full(out_fd, "/a/file/which/does/not/exist/i/guess") < 0);
365 assert_se(sendfile_full(out_fd, in_fn) == sizeof(text) - 1);
366 assert_se(lseek(out_fd, SEEK_SET, 0) == 0);
368 assert_se(read(out_fd, buf, sizeof(buf)) == sizeof(text) - 1);
369 assert_se(streq(buf, text));
375 static void test_load_env_file_pairs(void) {
376 char fn[] = "/tmp/test-load_env_file_pairs-XXXXXX";
379 _cleanup_fclose_ FILE *f = NULL;
380 _cleanup_strv_free_ char **l = NULL;
383 fd = mkostemp_safe(fn, O_RDWR);
386 r = write_string_file(fn,
387 "NAME=\"Arch Linux\"\n"
389 "PRETTY_NAME=\"Arch Linux\"\n"
390 "ANSI_COLOR=\"0;36\"\n"
391 "HOME_URL=\"https://www.archlinux.org/\"\n"
392 "SUPPORT_URL=\"https://bbs.archlinux.org/\"\n"
393 "BUG_REPORT_URL=\"https://bugs.archlinux.org/\"\n"
400 r = load_env_file_pairs(f, fn, NULL, &l);
403 assert_se(strv_length(l) == 14);
404 STRV_FOREACH_PAIR(k, v, l) {
405 assert_se(STR_IN_SET(*k, "NAME", "ID", "PRETTY_NAME", "ANSI_COLOR", "HOME_URL", "SUPPORT_URL", "BUG_REPORT_URL"));
406 printf("%s=%s\n", *k, *v);
407 if (streq(*k, "NAME")) assert_se(streq(*v, "Arch Linux"));
408 if (streq(*k, "ID")) assert_se(streq(*v, "arch"));
409 if (streq(*k, "PRETTY_NAME")) assert_se(streq(*v, "Arch Linux"));
410 if (streq(*k, "ANSI_COLOR")) assert_se(streq(*v, "0;36"));
411 if (streq(*k, "HOME_URL")) assert_se(streq(*v, "https://www.archlinux.org/"));
412 if (streq(*k, "SUPPORT_URL")) assert_se(streq(*v, "https://bbs.archlinux.org/"));
413 if (streq(*k, "BUG_REPORT_URL")) assert_se(streq(*v, "https://bugs.archlinux.org/"));
419 int main(int argc, char *argv[]) {
420 log_parse_environment();
423 test_parse_env_file();
424 test_parse_multiline_env_file();
425 test_executable_is_script();
428 test_write_string_stream();
429 test_write_string_file();
430 test_write_string_file_no_create();
431 test_sendfile_full();
432 test_load_env_file_pairs();