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/>.
36 #include "conf-parser.h"
38 static void test_streq_ptr(void) {
39 assert_se(streq_ptr(NULL, NULL));
40 assert_se(!streq_ptr("abc", "cdef"));
43 static void test_align_power2(void) {
46 assert_se(ALIGN_POWER2(0) == 0);
47 assert_se(ALIGN_POWER2(1) == 1);
48 assert_se(ALIGN_POWER2(2) == 2);
49 assert_se(ALIGN_POWER2(3) == 4);
50 assert_se(ALIGN_POWER2(12) == 16);
52 assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
53 assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
54 assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
55 assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
56 assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
58 for (i = 1; i < 131071; ++i) {
59 for (p2 = 1; p2 < i; p2 <<= 1)
62 assert_se(ALIGN_POWER2(i) == p2);
65 for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
66 for (p2 = 1; p2 && p2 < i; p2 <<= 1)
69 assert_se(ALIGN_POWER2(i) == p2);
73 static void test_first_word(void) {
74 assert_se(first_word("Hello", ""));
75 assert_se(first_word("Hello", "Hello"));
76 assert_se(first_word("Hello world", "Hello"));
77 assert_se(first_word("Hello\tworld", "Hello"));
78 assert_se(first_word("Hello\nworld", "Hello"));
79 assert_se(first_word("Hello\rworld", "Hello"));
80 assert_se(first_word("Hello ", "Hello"));
82 assert_se(!first_word("Hello", "Hellooo"));
83 assert_se(!first_word("Hello", "xxxxx"));
84 assert_se(!first_word("Hellooo", "Hello"));
87 static void test_close_many(void) {
89 char name0[] = "/tmp/test-close-many.XXXXXX";
90 char name1[] = "/tmp/test-close-many.XXXXXX";
91 char name2[] = "/tmp/test-close-many.XXXXXX";
93 fds[0] = mkostemp_safe(name0, O_RDWR|O_CLOEXEC);
94 fds[1] = mkostemp_safe(name1, O_RDWR|O_CLOEXEC);
95 fds[2] = mkostemp_safe(name2, O_RDWR|O_CLOEXEC);
99 assert_se(fcntl(fds[0], F_GETFD) == -1);
100 assert_se(fcntl(fds[1], F_GETFD) == -1);
101 assert_se(fcntl(fds[2], F_GETFD) >= 0);
110 static void test_parse_boolean(void) {
111 assert_se(parse_boolean("1") == 1);
112 assert_se(parse_boolean("y") == 1);
113 assert_se(parse_boolean("Y") == 1);
114 assert_se(parse_boolean("yes") == 1);
115 assert_se(parse_boolean("YES") == 1);
116 assert_se(parse_boolean("true") == 1);
117 assert_se(parse_boolean("TRUE") == 1);
118 assert_se(parse_boolean("on") == 1);
119 assert_se(parse_boolean("ON") == 1);
121 assert_se(parse_boolean("0") == 0);
122 assert_se(parse_boolean("n") == 0);
123 assert_se(parse_boolean("N") == 0);
124 assert_se(parse_boolean("no") == 0);
125 assert_se(parse_boolean("NO") == 0);
126 assert_se(parse_boolean("false") == 0);
127 assert_se(parse_boolean("FALSE") == 0);
128 assert_se(parse_boolean("off") == 0);
129 assert_se(parse_boolean("OFF") == 0);
131 assert_se(parse_boolean("garbage") < 0);
132 assert_se(parse_boolean("") < 0);
133 assert_se(parse_boolean("full") < 0);
136 static void test_parse_pid(void) {
140 r = parse_pid("100", &pid);
142 assert_se(pid == 100);
144 r = parse_pid("0x7FFFFFFF", &pid);
146 assert_se(pid == 2147483647);
148 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
149 r = parse_pid("0", &pid);
150 assert_se(r == -ERANGE);
151 assert_se(pid == 65);
153 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
154 r = parse_pid("-100", &pid);
155 assert_se(r == -ERANGE);
156 assert_se(pid == 65);
158 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
159 r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
160 assert(r == -ERANGE);
161 assert_se(pid == 65);
164 static void test_parse_uid(void) {
168 r = parse_uid("100", &uid);
170 assert_se(uid == 100);
173 static void test_safe_atolli(void) {
177 r = safe_atolli("12345", &l);
179 assert_se(l == 12345);
181 r = safe_atolli("junk", &l);
182 assert_se(r == -EINVAL);
185 static void test_safe_atod(void) {
190 r = safe_atod("junk", &d);
191 assert_se(r == -EINVAL);
193 r = safe_atod("0.2244", &d);
195 assert_se(fabs(d - 0.2244) < 0.000001);
197 r = safe_atod("0,5", &d);
198 assert_se(r == -EINVAL);
202 assert_se(*e == ',');
204 /* Check if this really is locale independent */
205 setlocale(LC_NUMERIC, "de_DE.utf8");
207 r = safe_atod("0.2244", &d);
209 assert_se(fabs(d - 0.2244) < 0.000001);
211 r = safe_atod("0,5", &d);
212 assert_se(r == -EINVAL);
215 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
217 /* And check again, reset */
218 setlocale(LC_NUMERIC, "C");
220 r = safe_atod("0.2244", &d);
222 assert_se(fabs(d - 0.2244) < 0.000001);
224 r = safe_atod("0,5", &d);
225 assert_se(r == -EINVAL);
229 assert_se(*e == ',');
232 static void test_strappend(void) {
233 _cleanup_free_ char *t1, *t2, *t3, *t4;
235 t1 = strappend(NULL, NULL);
236 assert_se(streq(t1, ""));
238 t2 = strappend(NULL, "suf");
239 assert_se(streq(t2, "suf"));
241 t3 = strappend("pre", NULL);
242 assert_se(streq(t3, "pre"));
244 t4 = strappend("pre", "suf");
245 assert_se(streq(t4, "presuf"));
248 static void test_strstrip(void) {
250 char input[] = " hello, waldo. ";
253 assert_se(streq(r, "hello, waldo."));
256 static void test_delete_chars(void) {
258 char input[] = " hello, waldo. abc";
260 r = delete_chars(input, WHITESPACE);
261 assert_se(streq(r, "hello,waldo.abc"));
264 static void test_in_charset(void) {
265 assert_se(in_charset("dddaaabbbcccc", "abcd"));
266 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
269 static void test_hexchar(void) {
270 assert_se(hexchar(0xa) == 'a');
271 assert_se(hexchar(0x0) == '0');
274 static void test_unhexchar(void) {
275 assert_se(unhexchar('a') == 0xA);
276 assert_se(unhexchar('A') == 0xA);
277 assert_se(unhexchar('0') == 0x0);
280 static void test_octchar(void) {
281 assert_se(octchar(00) == '0');
282 assert_se(octchar(07) == '7');
285 static void test_unoctchar(void) {
286 assert_se(unoctchar('0') == 00);
287 assert_se(unoctchar('7') == 07);
290 static void test_decchar(void) {
291 assert_se(decchar(0) == '0');
292 assert_se(decchar(9) == '9');
295 static void test_undecchar(void) {
296 assert_se(undecchar('0') == 0);
297 assert_se(undecchar('9') == 9);
300 static void test_cescape(void) {
301 _cleanup_free_ char *escaped;
303 assert_se(escaped = cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
304 assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
307 static void test_cunescape(void) {
308 _cleanup_free_ char *unescaped;
310 assert_se(unescaped = cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00"));
311 assert_se(streq(unescaped, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
314 static void test_foreach_word(void) {
315 const char *word, *state;
318 const char test[] = "test abc d\te f ";
319 const char * const expected[] = {
329 FOREACH_WORD(word, l, test, state)
330 assert_se(strneq(expected[i++], word, l));
333 static void test_foreach_word_quoted(void) {
334 const char *word, *state;
337 const char test[] = "test a b c 'd' e '' '' hhh '' '' \"a b c\"";
338 const char * const expected[] = {
354 printf("<%s>\n", test);
355 FOREACH_WORD_QUOTED(word, l, test, state) {
356 _cleanup_free_ char *t = NULL;
358 assert_se(t = strndup(word, l));
359 assert_se(strneq(expected[i++], word, l));
362 assert(isempty(state));
365 static void test_default_term_for_tty(void) {
366 puts(default_term_for_tty("/dev/tty23"));
367 puts(default_term_for_tty("/dev/ttyS23"));
368 puts(default_term_for_tty("/dev/tty0"));
369 puts(default_term_for_tty("/dev/pty0"));
370 puts(default_term_for_tty("/dev/pts/0"));
371 puts(default_term_for_tty("/dev/console"));
372 puts(default_term_for_tty("tty23"));
373 puts(default_term_for_tty("ttyS23"));
374 puts(default_term_for_tty("tty0"));
375 puts(default_term_for_tty("pty0"));
376 puts(default_term_for_tty("pts/0"));
377 puts(default_term_for_tty("console"));
380 static void test_memdup_multiply(void) {
381 int org[] = {1, 2, 3};
384 dup = (int*)memdup_multiply(org, sizeof(int), 3);
387 assert_se(dup[0] == 1);
388 assert_se(dup[1] == 2);
389 assert_se(dup[2] == 3);
393 static void test_hostname_is_valid(void) {
394 assert(hostname_is_valid("foobar"));
395 assert(hostname_is_valid("foobar.com"));
396 assert(!hostname_is_valid("fööbar"));
397 assert(!hostname_is_valid(""));
398 assert(!hostname_is_valid("."));
399 assert(!hostname_is_valid(".."));
400 assert(!hostname_is_valid("foobar."));
401 assert(!hostname_is_valid(".foobar"));
402 assert(!hostname_is_valid("foo..bar"));
403 assert(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
406 static void test_u64log2(void) {
407 assert(u64log2(0) == 0);
408 assert(u64log2(8) == 3);
409 assert(u64log2(9) == 3);
410 assert(u64log2(15) == 3);
411 assert(u64log2(16) == 4);
412 assert(u64log2(1024*1024) == 20);
413 assert(u64log2(1024*1024+5) == 20);
416 static void test_get_process_comm(void) {
418 _cleanup_free_ char *a = NULL, *c = NULL, *d = NULL, *f = NULL, *i = NULL;
419 unsigned long long b;
426 if (stat("/proc/1/comm", &st) == 0) {
427 assert_se(get_process_comm(1, &a) >= 0);
428 log_info("pid1 comm: '%s'", a);
430 log_warning("/proc/1/comm does not exist.");
433 assert_se(get_starttime_of_pid(1, &b) >= 0);
434 log_info("pid1 starttime: '%llu'", b);
436 assert_se(get_process_cmdline(1, 0, true, &c) >= 0);
437 log_info("pid1 cmdline: '%s'", c);
439 assert_se(get_process_cmdline(1, 8, false, &d) >= 0);
440 log_info("pid1 cmdline truncated: '%s'", d);
442 assert_se(get_parent_of_pid(1, &e) >= 0);
443 log_info("pid1 ppid: "PID_FMT, e);
446 assert_se(is_kernel_thread(1) == 0);
448 r = get_process_exe(1, &f);
449 assert_se(r >= 0 || r == -EACCES);
450 log_info("pid1 exe: '%s'", strna(f));
452 assert_se(get_process_uid(1, &u) == 0);
453 log_info("pid1 uid: "UID_FMT, u);
456 assert_se(get_process_gid(1, &g) == 0);
457 log_info("pid1 gid: "GID_FMT, g);
460 assert(get_ctty_devnr(1, &h) == -ENOENT);
462 getenv_for_pid(1, "PATH", &i);
463 log_info("pid1 $PATH: '%s'", strna(i));
466 static void test_protect_errno(void) {
475 static void test_parse_size(void) {
478 assert_se(parse_size("111", 1024, &bytes) == 0);
479 assert_se(bytes == 111);
481 assert_se(parse_size("111.4", 1024, &bytes) == 0);
482 assert_se(bytes == 111);
484 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
485 assert_se(bytes == 112);
487 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
488 assert_se(bytes == 112);
490 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
491 assert_se(bytes == 3*1024 + 512);
493 assert_se(parse_size("3. K", 1024, &bytes) == 0);
494 assert_se(bytes == 3*1024);
496 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
497 assert_se(bytes == 3*1024);
499 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
501 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
502 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
504 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
506 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
507 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
509 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
510 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
512 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
514 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
515 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
517 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
518 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
520 assert_se(parse_size("12P", 1024, &bytes) == 0);
521 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
523 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
525 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
526 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
528 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
530 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
532 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
534 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
535 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
536 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
538 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
540 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
543 static void test_config_parse_iec_off(void) {
545 assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset, NULL) == 0);
546 assert_se(offset == 4 * 1024 * 1024);
548 assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset, NULL) == 0);
551 static void test_strextend(void) {
552 _cleanup_free_ char *str = strdup("0123");
553 strextend(&str, "456", "78", "9", NULL);
554 assert_se(streq(str, "0123456789"));
557 static void test_strrep(void) {
558 _cleanup_free_ char *one, *three, *zero;
559 one = strrep("waldo", 1);
560 three = strrep("waldo", 3);
561 zero = strrep("waldo", 0);
563 assert_se(streq(one, "waldo"));
564 assert_se(streq(three, "waldowaldowaldo"));
565 assert_se(streq(zero, ""));
568 static void test_split_pair(void) {
569 _cleanup_free_ char *a = NULL, *b = NULL;
571 assert_se(split_pair("", "", &a, &b) == -EINVAL);
572 assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
573 assert_se(split_pair("", "=", &a, &b) == -EINVAL);
574 assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
575 assert_se(streq(a, "foo"));
576 assert_se(streq(b, "bar"));
579 assert_se(split_pair("==", "==", &a, &b) >= 0);
580 assert_se(streq(a, ""));
581 assert_se(streq(b, ""));
585 assert_se(split_pair("===", "==", &a, &b) >= 0);
586 assert_se(streq(a, ""));
587 assert_se(streq(b, "="));
590 static void test_fstab_node_to_udev_node(void) {
593 n = fstab_node_to_udev_node("LABEL=applé/jack");
595 assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack"));
598 n = fstab_node_to_udev_node("PARTLABEL=pinkié pie");
600 assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie"));
603 n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
605 assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
608 n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
610 assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
613 n = fstab_node_to_udev_node("PONIES=awesome");
615 assert_se(streq(n, "PONIES=awesome"));
618 n = fstab_node_to_udev_node("/dev/xda1");
620 assert_se(streq(n, "/dev/xda1"));
624 static void test_get_files_in_directory(void) {
625 _cleanup_strv_free_ char **l = NULL, **t = NULL;
627 assert_se(get_files_in_directory("/tmp", &l) >= 0);
628 assert_se(get_files_in_directory(".", &t) >= 0);
629 assert_se(get_files_in_directory(".", NULL) >= 0);
632 static void test_in_set(void) {
633 assert_se(IN_SET(1, 1));
634 assert_se(IN_SET(1, 1, 2, 3, 4));
635 assert_se(IN_SET(2, 1, 2, 3, 4));
636 assert_se(IN_SET(3, 1, 2, 3, 4));
637 assert_se(IN_SET(4, 1, 2, 3, 4));
638 assert_se(!IN_SET(0, 1));
639 assert_se(!IN_SET(0, 1, 2, 3, 4));
642 static void test_writing_tmpfile(void) {
643 char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
644 _cleanup_free_ char *contents = NULL;
649 IOVEC_SET_STRING(iov[0], "abc\n");
650 IOVEC_SET_STRING(iov[1], ALPHANUMERICAL "\n");
651 IOVEC_SET_STRING(iov[2], "");
653 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
654 printf("tmpfile: %s", name);
656 r = writev(fd, iov, 3);
659 r = read_full_file(name, &contents, &size);
661 printf("contents: %s", contents);
662 assert(streq(contents, "abc\n" ALPHANUMERICAL "\n"));
667 static void test_hexdump(void) {
671 hexdump(stdout, NULL, 0);
672 hexdump(stdout, "", 0);
673 hexdump(stdout, "", 1);
674 hexdump(stdout, "x", 1);
675 hexdump(stdout, "x", 2);
676 hexdump(stdout, "foobar", 7);
677 hexdump(stdout, "f\nobar", 7);
678 hexdump(stdout, "xxxxxxxxxxxxxxxxxxxxyz", 23);
680 for (i = 0; i < ELEMENTSOF(data); i++)
683 hexdump(stdout, data, sizeof(data));
686 static void test_log2i(void) {
687 assert_se(log2i(1) == 0);
688 assert_se(log2i(2) == 1);
689 assert_se(log2i(3) == 1);
690 assert_se(log2i(4) == 2);
691 assert_se(log2i(32) == 5);
692 assert_se(log2i(33) == 5);
693 assert_se(log2i(63) == 5);
694 assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
697 static void test_foreach_string(void) {
698 const char * const t[] = {
707 FOREACH_STRING(x, "foo", "bar", "waldo")
708 assert_se(streq_ptr(t[i++], x));
712 FOREACH_STRING(x, "zzz")
713 assert_se(streq(x, "zzz"));
716 static void test_filename_is_safe(void) {
717 char foo[FILENAME_MAX+2];
720 assert_se(!filename_is_safe(""));
721 assert_se(!filename_is_safe("/bar/foo"));
722 assert_se(!filename_is_safe("/"));
723 assert_se(!filename_is_safe("."));
724 assert_se(!filename_is_safe(".."));
726 for (i=0; i<FILENAME_MAX+1; i++)
728 foo[FILENAME_MAX+1] = '\0';
730 assert_se(!filename_is_safe(foo));
732 assert_se(filename_is_safe("foo_bar-333"));
733 assert_se(filename_is_safe("o.o"));
736 static void test_string_has_cc(void) {
737 assert_se(string_has_cc("abc\1", NULL));
738 assert_se(string_has_cc("abc\x7f", NULL));
739 assert_se(string_has_cc("abc\x7f", NULL));
740 assert_se(string_has_cc("abc\t\x7f", "\t"));
741 assert_se(string_has_cc("abc\t\x7f", "\t"));
742 assert_se(string_has_cc("\x7f", "\t"));
743 assert_se(string_has_cc("\x7f", "\t\a"));
745 assert_se(!string_has_cc("abc\t\t", "\t"));
746 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
747 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
750 static void test_ascii_strlower(void) {
751 char a[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
752 assert_se(streq(ascii_strlower(a), "aabbcc jk ii od lkjjj kkd lk"));
755 static void test_files_same(void) {
756 _cleanup_close_ int fd = -1;
757 char name[] = "/tmp/test-files_same.XXXXXX";
758 char name_alias[] = "/tmp/test-files_same.alias";
760 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
762 assert_se(symlink(name, name_alias) >= 0);
764 assert_se(files_same(name, name));
765 assert_se(files_same(name, name_alias));
771 static void test_is_valid_documentation_url(void) {
772 assert_se(is_valid_documentation_url("http://www.freedesktop.org/wiki/Software/systemd"));
773 assert_se(is_valid_documentation_url("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
774 assert_se(is_valid_documentation_url("file:foo"));
775 assert_se(is_valid_documentation_url("man:systemd.special(7)"));
776 assert_se(is_valid_documentation_url("info:bar"));
778 assert_se(!is_valid_documentation_url("foo:"));
779 assert_se(!is_valid_documentation_url("info:"));
780 assert_se(!is_valid_documentation_url(""));
783 static void test_file_in_same_dir(void) {
784 assert_se(streq(file_in_same_dir("/", "a"), "/a"));
785 assert_se(streq(file_in_same_dir("/", "/a"), "/a"));
786 assert_se(streq(file_in_same_dir("", "a"), "a"));
787 assert_se(streq(file_in_same_dir("a/", "a"), "a/a"));
788 assert_se(streq(file_in_same_dir("bar/foo", "bar"), "bar/bar"));
791 static void test_endswith(void) {
792 assert_se(endswith("foobar", "bar"));
793 assert_se(endswith("foobar", ""));
794 assert_se(endswith("foobar", "foobar"));
795 assert_se(endswith("", ""));
797 assert_se(!endswith("foobar", "foo"));
798 assert_se(!endswith("foobar", "foobarfoofoo"));
801 static void test_close_nointr(void) {
802 char name[] = "/tmp/test-test-close_nointr.XXXXXX";
805 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
807 assert_se(close_nointr(fd) >= 0);
808 assert_se(close_nointr(fd) < 0);
814 static void test_unlink_noerrno(void) {
815 char name[] = "/tmp/test-close_nointr.XXXXXX";
818 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
820 assert_se(close_nointr(fd) >= 0);
825 assert_se(unlink_noerrno(name) >= 0);
826 assert_se(errno == -42);
827 assert_se(unlink_noerrno(name) < 0);
828 assert_se(errno == -42);
832 static void test_readlink_and_make_absolute(void) {
833 char tempdir[] = "/tmp/test-readlink_and_make_absolute";
834 char name[] = "/tmp/test-readlink_and_make_absolute/original";
835 char name2[] = "test-readlink_and_make_absolute/original";
836 char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
839 assert(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
840 assert_se(touch(name) >= 0);
842 assert_se(symlink(name, name_alias) >= 0);
843 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
844 assert_se(streq(r, name));
846 assert_se(unlink(name_alias) >= 0);
848 assert_se(chdir(tempdir) >= 0);
849 assert_se(symlink(name2, name_alias) >= 0);
850 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
851 assert_se(streq(r, name));
853 assert_se(unlink(name_alias) >= 0);
855 assert_se(rm_rf_dangerous(tempdir, false, true, false) >= 0);
858 static void test_read_one_char(void) {
861 char name[] = "/tmp/test-read_one_char.XXXXXX";
862 _cleanup_close_ int fd = -1;
865 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
867 file = fdopen(fd, "r+");
869 assert_se(fputs("c\n", file) >= 0);
872 assert_se(read_one_char(file, &r, 1000000, &need_nl) >= 0);
875 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
878 assert_se(fputs("foobar\n", file) >= 0);
880 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
883 assert_se(fputs("\n", file) >= 0);
885 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
890 static void test_ignore_signals(void) {
891 assert_se(ignore_signals(SIGINT, -1) >= 0);
892 assert_se(kill(getpid(), SIGINT) >= 0);
893 assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
894 assert_se(kill(getpid(), SIGUSR1) >= 0);
895 assert_se(kill(getpid(), SIGUSR2) >= 0);
896 assert_se(kill(getpid(), SIGTERM) >= 0);
897 assert_se(kill(getpid(), SIGPIPE) >= 0);
898 assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
901 static void test_strshorten(void) {
904 assert_se(strlen(strshorten(s, 6)) == 6);
905 assert_se(strlen(strshorten(s, 12)) == 6);
906 assert_se(strlen(strshorten(s, 2)) == 2);
907 assert_se(strlen(strshorten(s, 0)) == 0);
910 int main(int argc, char *argv[]) {
911 log_parse_environment();
918 test_parse_boolean();
936 test_foreach_word_quoted();
937 test_default_term_for_tty();
938 test_memdup_multiply();
939 test_hostname_is_valid();
941 test_get_process_comm();
942 test_protect_errno();
944 test_config_parse_iec_off();
948 test_fstab_node_to_udev_node();
949 test_get_files_in_directory();
951 test_writing_tmpfile();
954 test_foreach_string();
955 test_filename_is_safe();
956 test_string_has_cc();
957 test_ascii_strlower();
959 test_is_valid_documentation_url();
960 test_file_in_same_dir();
963 test_unlink_noerrno();
964 test_readlink_and_make_absolute();
965 test_read_one_char();
966 test_ignore_signals();