1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
7 Copyright 2013 Thomas H.P. Andersen
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/>.
37 #include "conf-parser.h"
39 static void test_streq_ptr(void) {
40 assert_se(streq_ptr(NULL, NULL));
41 assert_se(!streq_ptr("abc", "cdef"));
44 static void test_align_power2(void) {
47 assert_se(ALIGN_POWER2(0) == 0);
48 assert_se(ALIGN_POWER2(1) == 1);
49 assert_se(ALIGN_POWER2(2) == 2);
50 assert_se(ALIGN_POWER2(3) == 4);
51 assert_se(ALIGN_POWER2(12) == 16);
53 assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
54 assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
55 assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
56 assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
57 assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
59 for (i = 1; i < 131071; ++i) {
60 for (p2 = 1; p2 < i; p2 <<= 1)
63 assert_se(ALIGN_POWER2(i) == p2);
66 for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
67 for (p2 = 1; p2 && p2 < i; p2 <<= 1)
70 assert_se(ALIGN_POWER2(i) == p2);
74 static void test_max(void) {
77 int b[CONST_MAX(10, 100)];
79 .a = CONST_MAX(10, 100),
83 assert_cc(sizeof(val1.b) == sizeof(int) * 100);
85 /* CONST_MAX returns (void) instead of a value if the passed arguments
86 * are not of the same type or not constant expressions. */
87 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
88 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
90 assert_se(val1.a == 100);
91 assert_se(MAX(++d, 0) == 1);
94 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
95 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
96 assert_cc(MAXSIZE(char, long) == sizeof(long));
99 static void test_container_of(void) {
105 } _packed_ myval = { };
107 assert_cc(sizeof(myval) == 17);
108 assert_se(container_of(&myval.v1, struct mytype, v1) == &myval);
109 assert_se(container_of(&myval.v2, struct mytype, v2) == &myval);
110 assert_se(container_of(&container_of(&myval.v2,
117 static void test_first_word(void) {
118 assert_se(first_word("Hello", ""));
119 assert_se(first_word("Hello", "Hello"));
120 assert_se(first_word("Hello world", "Hello"));
121 assert_se(first_word("Hello\tworld", "Hello"));
122 assert_se(first_word("Hello\nworld", "Hello"));
123 assert_se(first_word("Hello\rworld", "Hello"));
124 assert_se(first_word("Hello ", "Hello"));
126 assert_se(!first_word("Hello", "Hellooo"));
127 assert_se(!first_word("Hello", "xxxxx"));
128 assert_se(!first_word("Hellooo", "Hello"));
131 static void test_close_many(void) {
133 char name0[] = "/tmp/test-close-many.XXXXXX";
134 char name1[] = "/tmp/test-close-many.XXXXXX";
135 char name2[] = "/tmp/test-close-many.XXXXXX";
137 fds[0] = mkostemp_safe(name0, O_RDWR|O_CLOEXEC);
138 fds[1] = mkostemp_safe(name1, O_RDWR|O_CLOEXEC);
139 fds[2] = mkostemp_safe(name2, O_RDWR|O_CLOEXEC);
143 assert_se(fcntl(fds[0], F_GETFD) == -1);
144 assert_se(fcntl(fds[1], F_GETFD) == -1);
145 assert_se(fcntl(fds[2], F_GETFD) >= 0);
154 static void test_parse_boolean(void) {
155 assert_se(parse_boolean("1") == 1);
156 assert_se(parse_boolean("y") == 1);
157 assert_se(parse_boolean("Y") == 1);
158 assert_se(parse_boolean("yes") == 1);
159 assert_se(parse_boolean("YES") == 1);
160 assert_se(parse_boolean("true") == 1);
161 assert_se(parse_boolean("TRUE") == 1);
162 assert_se(parse_boolean("on") == 1);
163 assert_se(parse_boolean("ON") == 1);
165 assert_se(parse_boolean("0") == 0);
166 assert_se(parse_boolean("n") == 0);
167 assert_se(parse_boolean("N") == 0);
168 assert_se(parse_boolean("no") == 0);
169 assert_se(parse_boolean("NO") == 0);
170 assert_se(parse_boolean("false") == 0);
171 assert_se(parse_boolean("FALSE") == 0);
172 assert_se(parse_boolean("off") == 0);
173 assert_se(parse_boolean("OFF") == 0);
175 assert_se(parse_boolean("garbage") < 0);
176 assert_se(parse_boolean("") < 0);
177 assert_se(parse_boolean("full") < 0);
180 static void test_parse_pid(void) {
184 r = parse_pid("100", &pid);
186 assert_se(pid == 100);
188 r = parse_pid("0x7FFFFFFF", &pid);
190 assert_se(pid == 2147483647);
192 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
193 r = parse_pid("0", &pid);
194 assert_se(r == -ERANGE);
195 assert_se(pid == 65);
197 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
198 r = parse_pid("-100", &pid);
199 assert_se(r == -ERANGE);
200 assert_se(pid == 65);
202 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
203 r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
204 assert(r == -ERANGE);
205 assert_se(pid == 65);
208 static void test_parse_uid(void) {
212 r = parse_uid("100", &uid);
214 assert_se(uid == 100);
217 static void test_safe_atolli(void) {
221 r = safe_atolli("12345", &l);
223 assert_se(l == 12345);
225 r = safe_atolli("junk", &l);
226 assert_se(r == -EINVAL);
229 static void test_safe_atod(void) {
234 r = safe_atod("junk", &d);
235 assert_se(r == -EINVAL);
237 r = safe_atod("0.2244", &d);
239 assert_se(fabs(d - 0.2244) < 0.000001);
241 r = safe_atod("0,5", &d);
242 assert_se(r == -EINVAL);
246 assert_se(*e == ',');
248 /* Check if this really is locale independent */
249 if (setlocale(LC_NUMERIC, "de_DE.utf8")) {
251 r = safe_atod("0.2244", &d);
253 assert_se(fabs(d - 0.2244) < 0.000001);
255 r = safe_atod("0,5", &d);
256 assert_se(r == -EINVAL);
259 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
262 /* And check again, reset */
263 assert_se(setlocale(LC_NUMERIC, "C"));
265 r = safe_atod("0.2244", &d);
267 assert_se(fabs(d - 0.2244) < 0.000001);
269 r = safe_atod("0,5", &d);
270 assert_se(r == -EINVAL);
274 assert_se(*e == ',');
277 static void test_strappend(void) {
278 _cleanup_free_ char *t1, *t2, *t3, *t4;
280 t1 = strappend(NULL, NULL);
281 assert_se(streq(t1, ""));
283 t2 = strappend(NULL, "suf");
284 assert_se(streq(t2, "suf"));
286 t3 = strappend("pre", NULL);
287 assert_se(streq(t3, "pre"));
289 t4 = strappend("pre", "suf");
290 assert_se(streq(t4, "presuf"));
293 static void test_strstrip(void) {
295 char input[] = " hello, waldo. ";
298 assert_se(streq(r, "hello, waldo."));
301 static void test_delete_chars(void) {
303 char input[] = " hello, waldo. abc";
305 r = delete_chars(input, WHITESPACE);
306 assert_se(streq(r, "hello,waldo.abc"));
309 static void test_in_charset(void) {
310 assert_se(in_charset("dddaaabbbcccc", "abcd"));
311 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
314 static void test_hexchar(void) {
315 assert_se(hexchar(0xa) == 'a');
316 assert_se(hexchar(0x0) == '0');
319 static void test_unhexchar(void) {
320 assert_se(unhexchar('a') == 0xA);
321 assert_se(unhexchar('A') == 0xA);
322 assert_se(unhexchar('0') == 0x0);
325 static void test_octchar(void) {
326 assert_se(octchar(00) == '0');
327 assert_se(octchar(07) == '7');
330 static void test_unoctchar(void) {
331 assert_se(unoctchar('0') == 00);
332 assert_se(unoctchar('7') == 07);
335 static void test_decchar(void) {
336 assert_se(decchar(0) == '0');
337 assert_se(decchar(9) == '9');
340 static void test_undecchar(void) {
341 assert_se(undecchar('0') == 0);
342 assert_se(undecchar('9') == 9);
345 static void test_cescape(void) {
346 _cleanup_free_ char *escaped;
348 assert_se(escaped = cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
349 assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
352 static void test_cunescape(void) {
353 _cleanup_free_ char *unescaped;
355 assert_se(unescaped = cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00"));
356 assert_se(streq(unescaped, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
359 static void test_foreach_word(void) {
360 const char *word, *state;
363 const char test[] = "test abc d\te f ";
364 const char * const expected[] = {
374 FOREACH_WORD(word, l, test, state)
375 assert_se(strneq(expected[i++], word, l));
378 static void test_foreach_word_quoted(void) {
379 const char *word, *state;
382 const char test[] = "test a b c 'd' e '' '' hhh '' '' \"a b c\"";
383 const char * const expected[] = {
399 printf("<%s>\n", test);
400 FOREACH_WORD_QUOTED(word, l, test, state) {
401 _cleanup_free_ char *t = NULL;
403 assert_se(t = strndup(word, l));
404 assert_se(strneq(expected[i++], word, l));
407 assert(isempty(state));
410 static void test_default_term_for_tty(void) {
411 puts(default_term_for_tty("/dev/tty23"));
412 puts(default_term_for_tty("/dev/ttyS23"));
413 puts(default_term_for_tty("/dev/tty0"));
414 puts(default_term_for_tty("/dev/pty0"));
415 puts(default_term_for_tty("/dev/pts/0"));
416 puts(default_term_for_tty("/dev/console"));
417 puts(default_term_for_tty("tty23"));
418 puts(default_term_for_tty("ttyS23"));
419 puts(default_term_for_tty("tty0"));
420 puts(default_term_for_tty("pty0"));
421 puts(default_term_for_tty("pts/0"));
422 puts(default_term_for_tty("console"));
425 static void test_memdup_multiply(void) {
426 int org[] = {1, 2, 3};
429 dup = (int*)memdup_multiply(org, sizeof(int), 3);
432 assert_se(dup[0] == 1);
433 assert_se(dup[1] == 2);
434 assert_se(dup[2] == 3);
438 static void test_hostname_is_valid(void) {
439 assert(hostname_is_valid("foobar"));
440 assert(hostname_is_valid("foobar.com"));
441 assert(!hostname_is_valid("fööbar"));
442 assert(!hostname_is_valid(""));
443 assert(!hostname_is_valid("."));
444 assert(!hostname_is_valid(".."));
445 assert(!hostname_is_valid("foobar."));
446 assert(!hostname_is_valid(".foobar"));
447 assert(!hostname_is_valid("foo..bar"));
448 assert(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
451 static void test_u64log2(void) {
452 assert(u64log2(0) == 0);
453 assert(u64log2(8) == 3);
454 assert(u64log2(9) == 3);
455 assert(u64log2(15) == 3);
456 assert(u64log2(16) == 4);
457 assert(u64log2(1024*1024) == 20);
458 assert(u64log2(1024*1024+5) == 20);
461 static void test_get_process_comm(void) {
463 _cleanup_free_ char *a = NULL, *c = NULL, *d = NULL, *f = NULL, *i = NULL;
464 unsigned long long b;
471 if (stat("/proc/1/comm", &st) == 0) {
472 assert_se(get_process_comm(1, &a) >= 0);
473 log_info("pid1 comm: '%s'", a);
475 log_warning("/proc/1/comm does not exist.");
478 assert_se(get_starttime_of_pid(1, &b) >= 0);
479 log_info("pid1 starttime: '%llu'", b);
481 assert_se(get_process_cmdline(1, 0, true, &c) >= 0);
482 log_info("pid1 cmdline: '%s'", c);
484 assert_se(get_process_cmdline(1, 8, false, &d) >= 0);
485 log_info("pid1 cmdline truncated: '%s'", d);
487 assert_se(get_parent_of_pid(1, &e) >= 0);
488 log_info("pid1 ppid: "PID_FMT, e);
491 assert_se(is_kernel_thread(1) == 0);
493 r = get_process_exe(1, &f);
494 assert_se(r >= 0 || r == -EACCES);
495 log_info("pid1 exe: '%s'", strna(f));
497 assert_se(get_process_uid(1, &u) == 0);
498 log_info("pid1 uid: "UID_FMT, u);
501 assert_se(get_process_gid(1, &g) == 0);
502 log_info("pid1 gid: "GID_FMT, g);
505 assert(get_ctty_devnr(1, &h) == -ENOENT);
507 getenv_for_pid(1, "PATH", &i);
508 log_info("pid1 $PATH: '%s'", strna(i));
511 static void test_protect_errno(void) {
520 static void test_parse_size(void) {
523 assert_se(parse_size("111", 1024, &bytes) == 0);
524 assert_se(bytes == 111);
526 assert_se(parse_size("111.4", 1024, &bytes) == 0);
527 assert_se(bytes == 111);
529 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
530 assert_se(bytes == 112);
532 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
533 assert_se(bytes == 112);
535 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
536 assert_se(bytes == 3*1024 + 512);
538 assert_se(parse_size("3. K", 1024, &bytes) == 0);
539 assert_se(bytes == 3*1024);
541 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
542 assert_se(bytes == 3*1024);
544 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
546 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
547 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
549 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
551 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
552 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
554 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
555 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
557 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
559 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
560 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
562 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
563 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
565 assert_se(parse_size("12P", 1024, &bytes) == 0);
566 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
568 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
570 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
571 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
573 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
575 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
577 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
579 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
580 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
581 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
583 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
585 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
588 static void test_config_parse_iec_off(void) {
590 assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset, NULL) == 0);
591 assert_se(offset == 4 * 1024 * 1024);
593 assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset, NULL) == 0);
596 static void test_strextend(void) {
597 _cleanup_free_ char *str = strdup("0123");
598 strextend(&str, "456", "78", "9", NULL);
599 assert_se(streq(str, "0123456789"));
602 static void test_strrep(void) {
603 _cleanup_free_ char *one, *three, *zero;
604 one = strrep("waldo", 1);
605 three = strrep("waldo", 3);
606 zero = strrep("waldo", 0);
608 assert_se(streq(one, "waldo"));
609 assert_se(streq(three, "waldowaldowaldo"));
610 assert_se(streq(zero, ""));
613 static void test_split_pair(void) {
614 _cleanup_free_ char *a = NULL, *b = NULL;
616 assert_se(split_pair("", "", &a, &b) == -EINVAL);
617 assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
618 assert_se(split_pair("", "=", &a, &b) == -EINVAL);
619 assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
620 assert_se(streq(a, "foo"));
621 assert_se(streq(b, "bar"));
624 assert_se(split_pair("==", "==", &a, &b) >= 0);
625 assert_se(streq(a, ""));
626 assert_se(streq(b, ""));
630 assert_se(split_pair("===", "==", &a, &b) >= 0);
631 assert_se(streq(a, ""));
632 assert_se(streq(b, "="));
635 static void test_fstab_node_to_udev_node(void) {
638 n = fstab_node_to_udev_node("LABEL=applé/jack");
640 assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack"));
643 n = fstab_node_to_udev_node("PARTLABEL=pinkié pie");
645 assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie"));
648 n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
650 assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
653 n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
655 assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
658 n = fstab_node_to_udev_node("PONIES=awesome");
660 assert_se(streq(n, "PONIES=awesome"));
663 n = fstab_node_to_udev_node("/dev/xda1");
665 assert_se(streq(n, "/dev/xda1"));
669 static void test_get_files_in_directory(void) {
670 _cleanup_strv_free_ char **l = NULL, **t = NULL;
672 assert_se(get_files_in_directory("/tmp", &l) >= 0);
673 assert_se(get_files_in_directory(".", &t) >= 0);
674 assert_se(get_files_in_directory(".", NULL) >= 0);
677 static void test_in_set(void) {
678 assert_se(IN_SET(1, 1));
679 assert_se(IN_SET(1, 1, 2, 3, 4));
680 assert_se(IN_SET(2, 1, 2, 3, 4));
681 assert_se(IN_SET(3, 1, 2, 3, 4));
682 assert_se(IN_SET(4, 1, 2, 3, 4));
683 assert_se(!IN_SET(0, 1));
684 assert_se(!IN_SET(0, 1, 2, 3, 4));
687 static void test_writing_tmpfile(void) {
688 char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
689 _cleanup_free_ char *contents = NULL;
694 IOVEC_SET_STRING(iov[0], "abc\n");
695 IOVEC_SET_STRING(iov[1], ALPHANUMERICAL "\n");
696 IOVEC_SET_STRING(iov[2], "");
698 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
699 printf("tmpfile: %s", name);
701 r = writev(fd, iov, 3);
704 r = read_full_file(name, &contents, &size);
706 printf("contents: %s", contents);
707 assert(streq(contents, "abc\n" ALPHANUMERICAL "\n"));
712 static void test_hexdump(void) {
716 hexdump(stdout, NULL, 0);
717 hexdump(stdout, "", 0);
718 hexdump(stdout, "", 1);
719 hexdump(stdout, "x", 1);
720 hexdump(stdout, "x", 2);
721 hexdump(stdout, "foobar", 7);
722 hexdump(stdout, "f\nobar", 7);
723 hexdump(stdout, "xxxxxxxxxxxxxxxxxxxxyz", 23);
725 for (i = 0; i < ELEMENTSOF(data); i++)
728 hexdump(stdout, data, sizeof(data));
731 static void test_log2i(void) {
732 assert_se(log2i(1) == 0);
733 assert_se(log2i(2) == 1);
734 assert_se(log2i(3) == 1);
735 assert_se(log2i(4) == 2);
736 assert_se(log2i(32) == 5);
737 assert_se(log2i(33) == 5);
738 assert_se(log2i(63) == 5);
739 assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
742 static void test_foreach_string(void) {
743 const char * const t[] = {
752 FOREACH_STRING(x, "foo", "bar", "waldo")
753 assert_se(streq_ptr(t[i++], x));
757 FOREACH_STRING(x, "zzz")
758 assert_se(streq(x, "zzz"));
761 static void test_filename_is_safe(void) {
762 char foo[FILENAME_MAX+2];
765 assert_se(!filename_is_safe(""));
766 assert_se(!filename_is_safe("/bar/foo"));
767 assert_se(!filename_is_safe("/"));
768 assert_se(!filename_is_safe("."));
769 assert_se(!filename_is_safe(".."));
771 for (i=0; i<FILENAME_MAX+1; i++)
773 foo[FILENAME_MAX+1] = '\0';
775 assert_se(!filename_is_safe(foo));
777 assert_se(filename_is_safe("foo_bar-333"));
778 assert_se(filename_is_safe("o.o"));
781 static void test_string_has_cc(void) {
782 assert_se(string_has_cc("abc\1", NULL));
783 assert_se(string_has_cc("abc\x7f", NULL));
784 assert_se(string_has_cc("abc\x7f", NULL));
785 assert_se(string_has_cc("abc\t\x7f", "\t"));
786 assert_se(string_has_cc("abc\t\x7f", "\t"));
787 assert_se(string_has_cc("\x7f", "\t"));
788 assert_se(string_has_cc("\x7f", "\t\a"));
790 assert_se(!string_has_cc("abc\t\t", "\t"));
791 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
792 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
795 static void test_ascii_strlower(void) {
796 char a[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
797 assert_se(streq(ascii_strlower(a), "aabbcc jk ii od lkjjj kkd lk"));
800 static void test_files_same(void) {
801 _cleanup_close_ int fd = -1;
802 char name[] = "/tmp/test-files_same.XXXXXX";
803 char name_alias[] = "/tmp/test-files_same.alias";
805 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
807 assert_se(symlink(name, name_alias) >= 0);
809 assert_se(files_same(name, name));
810 assert_se(files_same(name, name_alias));
816 static void test_is_valid_documentation_url(void) {
817 assert_se(is_valid_documentation_url("http://www.freedesktop.org/wiki/Software/systemd"));
818 assert_se(is_valid_documentation_url("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
819 assert_se(is_valid_documentation_url("file:foo"));
820 assert_se(is_valid_documentation_url("man:systemd.special(7)"));
821 assert_se(is_valid_documentation_url("info:bar"));
823 assert_se(!is_valid_documentation_url("foo:"));
824 assert_se(!is_valid_documentation_url("info:"));
825 assert_se(!is_valid_documentation_url(""));
828 static void test_file_in_same_dir(void) {
829 assert_se(streq(file_in_same_dir("/", "a"), "/a"));
830 assert_se(streq(file_in_same_dir("/", "/a"), "/a"));
831 assert_se(streq(file_in_same_dir("", "a"), "a"));
832 assert_se(streq(file_in_same_dir("a/", "a"), "a/a"));
833 assert_se(streq(file_in_same_dir("bar/foo", "bar"), "bar/bar"));
836 static void test_endswith(void) {
837 assert_se(endswith("foobar", "bar"));
838 assert_se(endswith("foobar", ""));
839 assert_se(endswith("foobar", "foobar"));
840 assert_se(endswith("", ""));
842 assert_se(!endswith("foobar", "foo"));
843 assert_se(!endswith("foobar", "foobarfoofoo"));
846 static void test_close_nointr(void) {
847 char name[] = "/tmp/test-test-close_nointr.XXXXXX";
850 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
852 assert_se(close_nointr(fd) >= 0);
853 assert_se(close_nointr(fd) < 0);
859 static void test_unlink_noerrno(void) {
860 char name[] = "/tmp/test-close_nointr.XXXXXX";
863 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
865 assert_se(close_nointr(fd) >= 0);
870 assert_se(unlink_noerrno(name) >= 0);
871 assert_se(errno == -42);
872 assert_se(unlink_noerrno(name) < 0);
873 assert_se(errno == -42);
877 static void test_readlink_and_make_absolute(void) {
878 char tempdir[] = "/tmp/test-readlink_and_make_absolute";
879 char name[] = "/tmp/test-readlink_and_make_absolute/original";
880 char name2[] = "test-readlink_and_make_absolute/original";
881 char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
884 assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
885 assert_se(touch(name) >= 0);
887 assert_se(symlink(name, name_alias) >= 0);
888 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
889 assert_se(streq(r, name));
891 assert_se(unlink(name_alias) >= 0);
893 assert_se(chdir(tempdir) >= 0);
894 assert_se(symlink(name2, name_alias) >= 0);
895 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
896 assert_se(streq(r, name));
898 assert_se(unlink(name_alias) >= 0);
900 assert_se(rm_rf_dangerous(tempdir, false, true, false) >= 0);
903 static void test_read_one_char(void) {
906 char name[] = "/tmp/test-read_one_char.XXXXXX";
907 _cleanup_close_ int fd = -1;
910 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
912 file = fdopen(fd, "r+");
914 assert_se(fputs("c\n", file) >= 0);
917 assert_se(read_one_char(file, &r, 1000000, &need_nl) >= 0);
920 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
923 assert_se(fputs("foobar\n", file) >= 0);
925 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
928 assert_se(fputs("\n", file) >= 0);
930 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
935 static void test_ignore_signals(void) {
936 assert_se(ignore_signals(SIGINT, -1) >= 0);
937 assert_se(kill(getpid(), SIGINT) >= 0);
938 assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
939 assert_se(kill(getpid(), SIGUSR1) >= 0);
940 assert_se(kill(getpid(), SIGUSR2) >= 0);
941 assert_se(kill(getpid(), SIGTERM) >= 0);
942 assert_se(kill(getpid(), SIGPIPE) >= 0);
943 assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
946 static void test_strshorten(void) {
949 assert_se(strlen(strshorten(s, 6)) == 6);
950 assert_se(strlen(strshorten(s, 12)) == 6);
951 assert_se(strlen(strshorten(s, 2)) == 2);
952 assert_se(strlen(strshorten(s, 0)) == 0);
955 static void test_strappenda(void) {
958 actual = strappenda("", "foo", "bar");
959 assert_se(streq(actual, "foobar"));
961 actual = strappenda("foo", "bar", "baz");
962 assert_se(streq(actual, "foobarbaz"));
964 actual = strappenda("foo", "", "bar", "baz");
965 assert_se(streq(actual, "foobarbaz"));
968 static void test_is_symlink(void) {
969 char name[] = "/tmp/test-is_symlink.XXXXXX";
970 char name_link[] = "/tmp/test-is_symlink.link";
971 _cleanup_close_ int fd = -1;
973 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
975 assert_se(symlink(name, name_link) >= 0);
977 assert_se(is_symlink(name) == 0);
978 assert_se(is_symlink(name_link) == 1);
979 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
986 static void test_pid_is_unwaited(void) {
996 waitpid(pid, &status, 0);
997 assert_se(!pid_is_unwaited(pid));
999 assert_se(pid_is_unwaited(getpid()));
1000 assert_se(!pid_is_unwaited(-1));
1003 static void test_pid_is_alive(void) {
1007 assert_se(pid >= 0);
1009 _exit(EXIT_SUCCESS);
1013 waitpid(pid, &status, 0);
1014 assert_se(!pid_is_alive(pid));
1016 assert_se(pid_is_alive(getpid()));
1017 assert_se(!pid_is_alive(-1));
1020 static void test_search_and_fopen(void) {
1021 const char *dirs[] = {"/tmp/foo/bar", "/tmp", NULL};
1022 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
1027 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1031 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
1035 r = search_and_fopen(name, "r", NULL, dirs, &f);
1039 r = search_and_fopen(basename(name), "r", "/", dirs, &f);
1043 r = search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
1045 r = search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
1051 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
1056 static void test_search_and_fopen_nulstr(void) {
1057 const char dirs[] = "/tmp/foo/bar\0/tmp\0";
1058 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
1063 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1067 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
1071 r = search_and_fopen_nulstr(name, "r", NULL, dirs, &f);
1075 r = search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
1077 r = search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
1083 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
1087 static void test_glob_exists(void) {
1088 char name[] = "/tmp/test-glob_exists.XXXXXX";
1092 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1096 r = glob_exists("/tmp/test-glob_exists*");
1101 r = glob_exists("/tmp/test-glob_exists*");
1105 static void test_execute_directory(void) {
1106 char name[] = "/tmp/test-execute_directory/script1";
1107 char name2[] = "/tmp/test-execute_directory/script2";
1108 char name3[] = "/tmp/test-execute_directory/useless";
1109 char tempdir[] = "/tmp/test-execute_directory/";
1111 assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
1112 assert_se(write_string_file(name, "#!/bin/sh\necho 'Executing '$0\ntouch /tmp/test-execute_directory/it_works") == 0);
1113 assert_se(write_string_file(name2, "#!/bin/sh\necho 'Executing '$0\ntouch /tmp/test-execute_directory/it_works2") == 0);
1114 assert_se(chmod(name, 0755) == 0);
1115 assert_se(chmod(name2, 0755) == 0);
1116 assert_se(touch(name3) >= 0);
1118 execute_directory(tempdir, NULL, DEFAULT_TIMEOUT_USEC, NULL);
1119 assert_se(access("/tmp/test-execute_directory/it_works", F_OK) >= 0);
1120 assert_se(access("/tmp/test-execute_directory/it_works2", F_OK) >= 0);
1122 rm_rf_dangerous(tempdir, false, true, false);
1125 static void test_unquote_first_word(void) {
1126 const char *p, *original;
1129 p = original = "foobar waldo";
1130 assert_se(unquote_first_word(&p, &t) > 0);
1131 assert_se(streq(t, "foobar"));
1133 assert_se(p == original + 7);
1135 assert_se(unquote_first_word(&p, &t) > 0);
1136 assert_se(streq(t, "waldo"));
1138 assert_se(p == original + 12);
1140 assert_se(unquote_first_word(&p, &t) == 0);
1142 assert_se(p == original + 12);
1144 p = original = "\"foobar\" \'waldo\'";
1145 assert_se(unquote_first_word(&p, &t) > 0);
1146 assert_se(streq(t, "foobar"));
1148 assert_se(p == original + 9);
1150 assert_se(unquote_first_word(&p, &t) > 0);
1151 assert_se(streq(t, "waldo"));
1153 assert_se(p == original + 16);
1155 assert_se(unquote_first_word(&p, &t) == 0);
1157 assert_se(p == original + 16);
1159 p = original = "\"";
1160 assert_se(unquote_first_word(&p, &t) == -EINVAL);
1161 assert_se(p == original + 1);
1163 p = original = "\'";
1164 assert_se(unquote_first_word(&p, &t) == -EINVAL);
1165 assert_se(p == original + 1);
1167 p = original = "yay\'foo\'bar";
1168 assert_se(unquote_first_word(&p, &t) > 0);
1169 assert_se(streq(t, "yayfoobar"));
1171 assert_se(p == original + 11);
1173 p = original = " foobar ";
1174 assert_se(unquote_first_word(&p, &t) > 0);
1175 assert_se(streq(t, "foobar"));
1177 assert_se(p == original + 12);
1180 static void test_unquote_many_words(void) {
1181 const char *p, *original;
1184 p = original = "foobar waldi piep";
1185 assert_se(unquote_many_words(&p, &a, &b, &c, NULL) == 3);
1186 assert_se(p == original + 17);
1187 assert_se(streq_ptr(a, "foobar"));
1188 assert_se(streq_ptr(b, "waldi"));
1189 assert_se(streq_ptr(c, "piep"));
1194 p = original = "'foobar' wa\"ld\"i ";
1195 assert_se(unquote_many_words(&p, &a, &b, &c, NULL) == 2);
1196 assert_se(p == original + 19);
1197 assert_se(streq_ptr(a, "foobar"));
1198 assert_se(streq_ptr(b, "waldi"));
1199 assert_se(streq_ptr(c, NULL));
1204 assert_se(unquote_many_words(&p, &a, &b, &c, NULL) == 0);
1205 assert_se(p == original);
1206 assert_se(streq_ptr(a, NULL));
1207 assert_se(streq_ptr(b, NULL));
1208 assert_se(streq_ptr(c, NULL));
1211 assert_se(unquote_many_words(&p, &a, &b, &c, NULL) == 0);
1212 assert_se(p == original+2);
1213 assert_se(streq_ptr(a, NULL));
1214 assert_se(streq_ptr(b, NULL));
1215 assert_se(streq_ptr(c, NULL));
1217 p = original = "foobar";
1218 assert_se(unquote_many_words(&p, NULL) == 0);
1219 assert_se(p == original);
1221 p = original = "foobar waldi";
1222 assert_se(unquote_many_words(&p, &a, NULL) == 1);
1223 assert_se(p == original+7);
1224 assert_se(streq_ptr(a, "foobar"));
1226 p = original = " foobar ";
1227 assert_se(unquote_many_words(&p, &a, NULL) == 1);
1228 assert_se(p == original+15);
1229 assert_se(streq_ptr(a, "foobar"));
1232 int main(int argc, char *argv[]) {
1233 log_parse_environment();
1237 test_align_power2();
1239 test_container_of();
1242 test_parse_boolean();
1249 test_delete_chars();
1259 test_foreach_word();
1260 test_foreach_word_quoted();
1261 test_default_term_for_tty();
1262 test_memdup_multiply();
1263 test_hostname_is_valid();
1265 test_get_process_comm();
1266 test_protect_errno();
1268 test_config_parse_iec_off();
1272 test_fstab_node_to_udev_node();
1273 test_get_files_in_directory();
1275 test_writing_tmpfile();
1278 test_foreach_string();
1279 test_filename_is_safe();
1280 test_string_has_cc();
1281 test_ascii_strlower();
1283 test_is_valid_documentation_url();
1284 test_file_in_same_dir();
1286 test_close_nointr();
1287 test_unlink_noerrno();
1288 test_readlink_and_make_absolute();
1289 test_read_one_char();
1290 test_ignore_signals();
1294 test_pid_is_unwaited();
1295 test_pid_is_alive();
1296 test_search_and_fopen();
1297 test_search_and_fopen_nulstr();
1299 test_execute_directory();
1300 test_unquote_first_word();
1301 test_unquote_many_words();