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/>.
35 #include "conf-parser.h"
37 static void test_streq_ptr(void) {
38 assert_se(streq_ptr(NULL, NULL));
39 assert_se(!streq_ptr("abc", "cdef"));
42 static void test_align_power2(void) {
45 assert_se(ALIGN_POWER2(0) == 0);
46 assert_se(ALIGN_POWER2(1) == 1);
47 assert_se(ALIGN_POWER2(2) == 2);
48 assert_se(ALIGN_POWER2(3) == 4);
49 assert_se(ALIGN_POWER2(12) == 16);
51 assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
52 assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
53 assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
54 assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
55 assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
57 for (i = 1; i < 131071; ++i) {
58 for (p2 = 1; p2 < i; p2 <<= 1)
61 assert_se(ALIGN_POWER2(i) == p2);
64 for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
65 for (p2 = 1; p2 && p2 < i; p2 <<= 1)
68 assert_se(ALIGN_POWER2(i) == p2);
72 static void test_first_word(void) {
73 assert_se(first_word("Hello", ""));
74 assert_se(first_word("Hello", "Hello"));
75 assert_se(first_word("Hello world", "Hello"));
76 assert_se(first_word("Hello\tworld", "Hello"));
77 assert_se(first_word("Hello\nworld", "Hello"));
78 assert_se(first_word("Hello\rworld", "Hello"));
79 assert_se(first_word("Hello ", "Hello"));
81 assert_se(!first_word("Hello", "Hellooo"));
82 assert_se(!first_word("Hello", "xxxxx"));
83 assert_se(!first_word("Hellooo", "Hello"));
86 static void test_close_many(void) {
88 char name0[] = "/tmp/test-close-many.XXXXXX";
89 char name1[] = "/tmp/test-close-many.XXXXXX";
90 char name2[] = "/tmp/test-close-many.XXXXXX";
92 fds[0] = mkostemp_safe(name0, O_RDWR|O_CLOEXEC);
93 fds[1] = mkostemp_safe(name1, O_RDWR|O_CLOEXEC);
94 fds[2] = mkostemp_safe(name2, O_RDWR|O_CLOEXEC);
98 assert_se(fcntl(fds[0], F_GETFD) == -1);
99 assert_se(fcntl(fds[1], F_GETFD) == -1);
100 assert_se(fcntl(fds[2], F_GETFD) >= 0);
109 static void test_parse_boolean(void) {
110 assert_se(parse_boolean("1") == 1);
111 assert_se(parse_boolean("y") == 1);
112 assert_se(parse_boolean("Y") == 1);
113 assert_se(parse_boolean("yes") == 1);
114 assert_se(parse_boolean("YES") == 1);
115 assert_se(parse_boolean("true") == 1);
116 assert_se(parse_boolean("TRUE") == 1);
117 assert_se(parse_boolean("on") == 1);
118 assert_se(parse_boolean("ON") == 1);
120 assert_se(parse_boolean("0") == 0);
121 assert_se(parse_boolean("n") == 0);
122 assert_se(parse_boolean("N") == 0);
123 assert_se(parse_boolean("no") == 0);
124 assert_se(parse_boolean("NO") == 0);
125 assert_se(parse_boolean("false") == 0);
126 assert_se(parse_boolean("FALSE") == 0);
127 assert_se(parse_boolean("off") == 0);
128 assert_se(parse_boolean("OFF") == 0);
130 assert_se(parse_boolean("garbage") < 0);
131 assert_se(parse_boolean("") < 0);
132 assert_se(parse_boolean("full") < 0);
135 static void test_parse_pid(void) {
139 r = parse_pid("100", &pid);
141 assert_se(pid == 100);
143 r = parse_pid("0x7FFFFFFF", &pid);
145 assert_se(pid == 2147483647);
147 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
148 r = parse_pid("0", &pid);
149 assert_se(r == -ERANGE);
150 assert_se(pid == 65);
152 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
153 r = parse_pid("-100", &pid);
154 assert_se(r == -ERANGE);
155 assert_se(pid == 65);
157 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
158 r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
159 assert(r == -ERANGE);
160 assert_se(pid == 65);
163 static void test_parse_uid(void) {
167 r = parse_uid("100", &uid);
169 assert_se(uid == 100);
172 static void test_safe_atolli(void) {
176 r = safe_atolli("12345", &l);
178 assert_se(l == 12345);
180 r = safe_atolli("junk", &l);
181 assert_se(r == -EINVAL);
184 static void test_safe_atod(void) {
189 r = safe_atod("junk", &d);
190 assert_se(r == -EINVAL);
192 r = safe_atod("0.2244", &d);
194 assert_se(abs(d - 0.2244) < 0.000001);
196 r = safe_atod("0,5", &d);
197 assert_se(r == -EINVAL);
201 assert_se(*e == ',');
203 /* Check if this really is locale independent */
204 setlocale(LC_NUMERIC, "de_DE.utf8");
206 r = safe_atod("0.2244", &d);
208 assert_se(abs(d - 0.2244) < 0.000001);
210 r = safe_atod("0,5", &d);
211 assert_se(r == -EINVAL);
214 assert_se(abs(strtod("0,5", &e) - 0.5) < 0.00001);
216 /* And check again, reset */
217 setlocale(LC_NUMERIC, "C");
219 r = safe_atod("0.2244", &d);
221 assert_se(abs(d - 0.2244) < 0.000001);
223 r = safe_atod("0,5", &d);
224 assert_se(r == -EINVAL);
228 assert_se(*e == ',');
231 static void test_strappend(void) {
232 _cleanup_free_ char *t1, *t2, *t3, *t4;
234 t1 = strappend(NULL, NULL);
235 assert_se(streq(t1, ""));
237 t2 = strappend(NULL, "suf");
238 assert_se(streq(t2, "suf"));
240 t3 = strappend("pre", NULL);
241 assert_se(streq(t3, "pre"));
243 t4 = strappend("pre", "suf");
244 assert_se(streq(t4, "presuf"));
247 static void test_strstrip(void) {
249 char input[] = " hello, waldo. ";
252 assert_se(streq(r, "hello, waldo."));
255 static void test_delete_chars(void) {
257 char input[] = " hello, waldo. abc";
259 r = delete_chars(input, WHITESPACE);
260 assert_se(streq(r, "hello,waldo.abc"));
263 static void test_in_charset(void) {
264 assert_se(in_charset("dddaaabbbcccc", "abcd"));
265 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
268 static void test_hexchar(void) {
269 assert_se(hexchar(0xa) == 'a');
270 assert_se(hexchar(0x0) == '0');
273 static void test_unhexchar(void) {
274 assert_se(unhexchar('a') == 0xA);
275 assert_se(unhexchar('A') == 0xA);
276 assert_se(unhexchar('0') == 0x0);
279 static void test_octchar(void) {
280 assert_se(octchar(00) == '0');
281 assert_se(octchar(07) == '7');
284 static void test_unoctchar(void) {
285 assert_se(unoctchar('0') == 00);
286 assert_se(unoctchar('7') == 07);
289 static void test_decchar(void) {
290 assert_se(decchar(0) == '0');
291 assert_se(decchar(9) == '9');
294 static void test_undecchar(void) {
295 assert_se(undecchar('0') == 0);
296 assert_se(undecchar('9') == 9);
299 static void test_cescape(void) {
300 _cleanup_free_ char *escaped;
302 assert_se(escaped = cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
303 assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
306 static void test_cunescape(void) {
307 _cleanup_free_ char *unescaped;
309 assert_se(unescaped = cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00"));
310 assert_se(streq(unescaped, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
313 static void test_foreach_word(void) {
317 const char test[] = "test abc d\te f ";
318 const char * const expected[] = {
328 FOREACH_WORD(w, l, test, state) {
329 assert_se(strneq(expected[i++], w, l));
333 static void test_foreach_word_quoted(void) {
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(w, l, test, state) {
356 _cleanup_free_ char *t = NULL;
358 assert_se(t = strndup(w, l));
359 assert_se(strneq(expected[i++], w, l));
364 static void test_default_term_for_tty(void) {
365 puts(default_term_for_tty("/dev/tty23"));
366 puts(default_term_for_tty("/dev/ttyS23"));
367 puts(default_term_for_tty("/dev/tty0"));
368 puts(default_term_for_tty("/dev/pty0"));
369 puts(default_term_for_tty("/dev/pts/0"));
370 puts(default_term_for_tty("/dev/console"));
371 puts(default_term_for_tty("tty23"));
372 puts(default_term_for_tty("ttyS23"));
373 puts(default_term_for_tty("tty0"));
374 puts(default_term_for_tty("pty0"));
375 puts(default_term_for_tty("pts/0"));
376 puts(default_term_for_tty("console"));
379 static void test_memdup_multiply(void) {
380 int org[] = {1, 2, 3};
383 dup = (int*)memdup_multiply(org, sizeof(int), 3);
386 assert_se(dup[0] == 1);
387 assert_se(dup[1] == 2);
388 assert_se(dup[2] == 3);
392 static void test_hostname_is_valid(void) {
393 assert(hostname_is_valid("foobar"));
394 assert(hostname_is_valid("foobar.com"));
395 assert(!hostname_is_valid("fööbar"));
396 assert(!hostname_is_valid(""));
397 assert(!hostname_is_valid("."));
398 assert(!hostname_is_valid(".."));
399 assert(!hostname_is_valid("foobar."));
400 assert(!hostname_is_valid(".foobar"));
401 assert(!hostname_is_valid("foo..bar"));
402 assert(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
405 static void test_u64log2(void) {
406 assert(u64log2(0) == 0);
407 assert(u64log2(8) == 3);
408 assert(u64log2(9) == 3);
409 assert(u64log2(15) == 3);
410 assert(u64log2(16) == 4);
411 assert(u64log2(1024*1024) == 20);
412 assert(u64log2(1024*1024+5) == 20);
415 static void test_get_process_comm(void) {
417 _cleanup_free_ char *a = NULL, *c = NULL, *d = NULL, *f = NULL, *i = NULL;
418 unsigned long long b;
425 if (stat("/proc/1/comm", &st) == 0) {
426 assert_se(get_process_comm(1, &a) >= 0);
427 log_info("pid1 comm: '%s'", a);
429 log_warning("/proc/1/comm does not exist.");
432 assert_se(get_starttime_of_pid(1, &b) >= 0);
433 log_info("pid1 starttime: '%llu'", b);
435 assert_se(get_process_cmdline(1, 0, true, &c) >= 0);
436 log_info("pid1 cmdline: '%s'", c);
438 assert_se(get_process_cmdline(1, 8, false, &d) >= 0);
439 log_info("pid1 cmdline truncated: '%s'", d);
441 assert_se(get_parent_of_pid(1, &e) >= 0);
442 log_info("pid1 ppid: "PID_FMT, e);
445 assert_se(is_kernel_thread(1) == 0);
447 r = get_process_exe(1, &f);
448 assert_se(r >= 0 || r == -EACCES);
449 log_info("pid1 exe: '%s'", strna(f));
451 assert_se(get_process_uid(1, &u) == 0);
452 log_info("pid1 uid: "UID_FMT, u);
455 assert_se(get_process_gid(1, &g) == 0);
456 log_info("pid1 gid: "GID_FMT, g);
459 assert(get_ctty_devnr(1, &h) == -ENOENT);
461 getenv_for_pid(1, "PATH", &i);
462 log_info("pid1 $PATH: '%s'", strna(i));
465 static void test_protect_errno(void) {
474 static void test_parse_size(void) {
477 assert_se(parse_size("111", 1024, &bytes) == 0);
478 assert_se(bytes == 111);
480 assert_se(parse_size("111.4", 1024, &bytes) == 0);
481 assert_se(bytes == 111);
483 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
484 assert_se(bytes == 112);
486 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
487 assert_se(bytes == 112);
489 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
490 assert_se(bytes == 3*1024 + 512);
492 assert_se(parse_size("3. K", 1024, &bytes) == 0);
493 assert_se(bytes == 3*1024);
495 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
496 assert_se(bytes == 3*1024);
498 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
500 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
501 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
503 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
505 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
506 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
508 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
509 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
511 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
513 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
514 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
516 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
517 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
519 assert_se(parse_size("12P", 1024, &bytes) == 0);
520 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
522 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
524 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
525 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
527 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
529 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
531 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
533 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
534 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
535 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
537 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
539 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
542 static void test_config_parse_iec_off(void) {
544 assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset, NULL) == 0);
545 assert_se(offset == 4 * 1024 * 1024);
547 assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset, NULL) == 0);
550 static void test_strextend(void) {
551 _cleanup_free_ char *str = strdup("0123");
552 strextend(&str, "456", "78", "9", NULL);
553 assert_se(streq(str, "0123456789"));
556 static void test_strrep(void) {
557 _cleanup_free_ char *one, *three, *zero;
558 one = strrep("waldo", 1);
559 three = strrep("waldo", 3);
560 zero = strrep("waldo", 0);
562 assert_se(streq(one, "waldo"));
563 assert_se(streq(three, "waldowaldowaldo"));
564 assert_se(streq(zero, ""));
567 static void test_split_pair(void) {
568 _cleanup_free_ char *a = NULL, *b = NULL;
570 assert_se(split_pair("", "", &a, &b) == -EINVAL);
571 assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
572 assert_se(split_pair("", "=", &a, &b) == -EINVAL);
573 assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
574 assert_se(streq(a, "foo"));
575 assert_se(streq(b, "bar"));
578 assert_se(split_pair("==", "==", &a, &b) >= 0);
579 assert_se(streq(a, ""));
580 assert_se(streq(b, ""));
584 assert_se(split_pair("===", "==", &a, &b) >= 0);
585 assert_se(streq(a, ""));
586 assert_se(streq(b, "="));
589 static void test_fstab_node_to_udev_node(void) {
592 n = fstab_node_to_udev_node("LABEL=applé/jack");
594 assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack"));
597 n = fstab_node_to_udev_node("PARTLABEL=pinkié pie");
599 assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie"));
602 n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
604 assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
607 n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
609 assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
612 n = fstab_node_to_udev_node("PONIES=awesome");
614 assert_se(streq(n, "PONIES=awesome"));
617 n = fstab_node_to_udev_node("/dev/xda1");
619 assert_se(streq(n, "/dev/xda1"));
623 static void test_get_files_in_directory(void) {
624 _cleanup_strv_free_ char **l = NULL, **t = NULL;
626 assert_se(get_files_in_directory("/tmp", &l) >= 0);
627 assert_se(get_files_in_directory(".", &t) >= 0);
628 assert_se(get_files_in_directory(".", NULL) >= 0);
631 static void test_in_set(void) {
632 assert_se(IN_SET(1, 1));
633 assert_se(IN_SET(1, 1, 2, 3, 4));
634 assert_se(IN_SET(2, 1, 2, 3, 4));
635 assert_se(IN_SET(3, 1, 2, 3, 4));
636 assert_se(IN_SET(4, 1, 2, 3, 4));
637 assert_se(!IN_SET(0, 1));
638 assert_se(!IN_SET(0, 1, 2, 3, 4));
641 static void test_writing_tmpfile(void) {
642 char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
643 _cleanup_free_ char *contents = NULL;
648 IOVEC_SET_STRING(iov[0], "abc\n");
649 IOVEC_SET_STRING(iov[1], ALPHANUMERICAL "\n");
650 IOVEC_SET_STRING(iov[2], "");
652 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
653 printf("tmpfile: %s", name);
655 r = writev(fd, iov, 3);
658 r = read_full_file(name, &contents, &size);
660 printf("contents: %s", contents);
661 assert(streq(contents, "abc\n" ALPHANUMERICAL "\n"));
666 static void test_hexdump(void) {
670 hexdump(stdout, NULL, 0);
671 hexdump(stdout, "", 0);
672 hexdump(stdout, "", 1);
673 hexdump(stdout, "x", 1);
674 hexdump(stdout, "x", 2);
675 hexdump(stdout, "foobar", 7);
676 hexdump(stdout, "f\nobar", 7);
677 hexdump(stdout, "xxxxxxxxxxxxxxxxxxxxyz", 23);
679 for (i = 0; i < ELEMENTSOF(data); i++)
682 hexdump(stdout, data, sizeof(data));
685 static void test_log2i(void) {
686 assert_se(log2i(1) == 0);
687 assert_se(log2i(2) == 1);
688 assert_se(log2i(3) == 1);
689 assert_se(log2i(4) == 2);
690 assert_se(log2i(32) == 5);
691 assert_se(log2i(33) == 5);
692 assert_se(log2i(63) == 5);
693 assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
696 static void test_foreach_string(void) {
697 const char * const t[] = {
706 FOREACH_STRING(x, "foo", "bar", "waldo")
707 assert_se(streq_ptr(t[i++], x));
711 FOREACH_STRING(x, "zzz")
712 assert_se(streq(x, "zzz"));
715 static void test_filename_is_safe(void) {
716 char foo[FILENAME_MAX+2];
719 assert_se(!filename_is_safe(""));
720 assert_se(!filename_is_safe("/bar/foo"));
721 assert_se(!filename_is_safe("/"));
722 assert_se(!filename_is_safe("."));
723 assert_se(!filename_is_safe(".."));
725 for (i=0; i<FILENAME_MAX+1; i++)
727 foo[FILENAME_MAX+1] = '\0';
729 assert_se(!filename_is_safe(foo));
731 assert_se(filename_is_safe("foo_bar-333"));
732 assert_se(filename_is_safe("o.o"));
735 static void test_string_has_cc(void) {
736 assert_se(string_has_cc("abc\1", NULL));
737 assert_se(string_has_cc("abc\x7f", NULL));
738 assert_se(string_has_cc("abc\x7f", NULL));
739 assert_se(string_has_cc("abc\t\x7f", "\t"));
740 assert_se(string_has_cc("abc\t\x7f", "\t"));
741 assert_se(string_has_cc("\x7f", "\t"));
742 assert_se(string_has_cc("\x7f", "\t\a"));
744 assert_se(!string_has_cc("abc\t\t", "\t"));
745 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
746 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
749 static void test_ascii_strlower(void) {
750 char a[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
751 assert_se(streq(ascii_strlower(a), "aabbcc jk ii od lkjjj kkd lk"));
754 static void test_files_same(void) {
755 _cleanup_close_ int fd = -1;
756 char name[] = "/tmp/test-files_same.XXXXXX";
757 char name_alias[] = "/tmp/test-files_same.alias";
759 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
761 assert_se(symlink(name, name_alias) >= 0);
763 assert_se(files_same(name, name));
764 assert_se(files_same(name, name_alias));
770 static void test_is_valid_documentation_url(void) {
771 assert_se(is_valid_documentation_url("http://www.freedesktop.org/wiki/Software/systemd"));
772 assert_se(is_valid_documentation_url("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
773 assert_se(is_valid_documentation_url("file:foo"));
774 assert_se(is_valid_documentation_url("man:systemd.special(7)"));
775 assert_se(is_valid_documentation_url("info:bar"));
777 assert_se(!is_valid_documentation_url("foo:"));
778 assert_se(!is_valid_documentation_url("info:"));
779 assert_se(!is_valid_documentation_url(""));
782 static void test_file_in_same_dir(void) {
783 assert_se(streq(file_in_same_dir("/", "a"), "/a"));
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"), "a/a"));
787 assert_se(streq(file_in_same_dir("bar/foo", "bar"), "bar/bar"));
790 static void test_endswith(void) {
791 assert_se(endswith("foobar", "bar"));
792 assert_se(endswith("foobar", ""));
793 assert_se(endswith("foobar", "foobar"));
794 assert_se(endswith("", ""));
796 assert_se(!endswith("foobar", "foo"));
797 assert_se(!endswith("foobar", "foobarfoofoo"));
800 static void test_close_nointr(void) {
801 char name[] = "/tmp/test-test-close_nointr.XXXXXX";
804 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
806 assert_se(close_nointr(fd) >= 0);
807 assert_se(close_nointr(fd) < 0);
813 static void test_unlink_noerrno(void) {
814 char name[] = "/tmp/test-close_nointr.XXXXXX";
817 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
819 assert_se(close_nointr(fd) >= 0);
824 assert_se(unlink_noerrno(name) >= 0);
825 assert_se(errno == -42);
826 assert_se(unlink_noerrno(name) < 0);
827 assert_se(errno == -42);
831 static void test_readlink_and_make_absolute(void) {
832 char tempdir[] = "/tmp/test-readlink_and_make_absolute";
833 char name[] = "/tmp/test-readlink_and_make_absolute/original";
834 char name2[] = "test-readlink_and_make_absolute/original";
835 char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
838 assert(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
839 assert_se(touch(name) >= 0);
841 assert_se(symlink(name, name_alias) >= 0);
842 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
843 assert_se(streq(r, name));
845 assert_se(unlink(name_alias) >= 0);
847 assert_se(chdir(tempdir) >= 0);
848 assert_se(symlink(name2, name_alias) >= 0);
849 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
850 assert_se(streq(r, name));
852 assert_se(unlink(name_alias) >= 0);
854 assert_se(rm_rf_dangerous(tempdir, false, true, false) >= 0);
857 static void test_read_one_char(void) {
860 char name[] = "/tmp/test-read_one_char.XXXXXX";
861 _cleanup_close_ int fd = -1;
864 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
866 file = fdopen(fd, "r+");
868 assert_se(fputs("c\n", file) >= 0);
871 assert_se(read_one_char(file, &r, 1000000, &need_nl) >= 0);
874 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
877 assert_se(fputs("foobar\n", file) >= 0);
879 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
882 assert_se(fputs("\n", file) >= 0);
884 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
889 static void test_ignore_signals(void) {
890 assert_se(ignore_signals(SIGINT, -1) >= 0);
891 assert_se(kill(getpid(), SIGINT) >= 0);
892 assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
893 assert_se(kill(getpid(), SIGUSR1) >= 0);
894 assert_se(kill(getpid(), SIGUSR2) >= 0);
895 assert_se(kill(getpid(), SIGTERM) >= 0);
896 assert_se(kill(getpid(), SIGPIPE) >= 0);
897 assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
900 static void test_strshorten(void) {
903 assert_se(strlen(strshorten(s, 6)) == 6);
904 assert_se(strlen(strshorten(s, 12)) == 6);
905 assert_se(strlen(strshorten(s, 2)) == 2);
906 assert_se(strlen(strshorten(s, 0)) == 0);
909 int main(int argc, char *argv[]) {
910 log_parse_environment();
917 test_parse_boolean();
935 test_foreach_word_quoted();
936 test_default_term_for_tty();
937 test_memdup_multiply();
938 test_hostname_is_valid();
940 test_get_process_comm();
941 test_protect_errno();
943 test_config_parse_iec_off();
947 test_fstab_node_to_udev_node();
948 test_get_files_in_directory();
950 test_writing_tmpfile();
953 test_foreach_string();
954 test_filename_is_safe();
955 test_string_has_cc();
956 test_ascii_strlower();
958 test_is_valid_documentation_url();
959 test_file_in_same_dir();
962 test_unlink_noerrno();
963 test_readlink_and_make_absolute();
964 test_read_one_char();
965 test_ignore_signals();