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);
134 static void test_parse_pid(void) {
138 r = parse_pid("100", &pid);
140 assert_se(pid == 100);
142 r = parse_pid("0x7FFFFFFF", &pid);
144 assert_se(pid == 2147483647);
146 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
147 r = parse_pid("0", &pid);
148 assert_se(r == -ERANGE);
149 assert_se(pid == 65);
151 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
152 r = parse_pid("-100", &pid);
153 assert_se(r == -ERANGE);
154 assert_se(pid == 65);
156 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
157 r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
158 assert(r == -ERANGE);
159 assert_se(pid == 65);
162 static void test_parse_uid(void) {
166 r = parse_uid("100", &uid);
168 assert_se(uid == 100);
171 static void test_safe_atolli(void) {
175 r = safe_atolli("12345", &l);
177 assert_se(l == 12345);
179 r = safe_atolli("junk", &l);
180 assert_se(r == -EINVAL);
183 static void test_safe_atod(void) {
188 r = safe_atod("junk", &d);
189 assert_se(r == -EINVAL);
191 r = safe_atod("0.2244", &d);
193 assert_se(abs(d - 0.2244) < 0.000001);
195 r = safe_atod("0,5", &d);
196 assert_se(r == -EINVAL);
200 assert_se(*e == ',');
202 /* Check if this really is locale independent */
203 setlocale(LC_NUMERIC, "de_DE.utf8");
205 r = safe_atod("0.2244", &d);
207 assert_se(abs(d - 0.2244) < 0.000001);
209 r = safe_atod("0,5", &d);
210 assert_se(r == -EINVAL);
213 assert_se(abs(strtod("0,5", &e) - 0.5) < 0.00001);
215 /* And check again, reset */
216 setlocale(LC_NUMERIC, "C");
218 r = safe_atod("0.2244", &d);
220 assert_se(abs(d - 0.2244) < 0.000001);
222 r = safe_atod("0,5", &d);
223 assert_se(r == -EINVAL);
227 assert_se(*e == ',');
230 static void test_strappend(void) {
231 _cleanup_free_ char *t1, *t2, *t3, *t4;
233 t1 = strappend(NULL, NULL);
234 assert_se(streq(t1, ""));
236 t2 = strappend(NULL, "suf");
237 assert_se(streq(t2, "suf"));
239 t3 = strappend("pre", NULL);
240 assert_se(streq(t3, "pre"));
242 t4 = strappend("pre", "suf");
243 assert_se(streq(t4, "presuf"));
246 static void test_strstrip(void) {
248 char input[] = " hello, waldo. ";
251 assert_se(streq(r, "hello, waldo."));
254 static void test_delete_chars(void) {
256 char input[] = " hello, waldo. abc";
258 r = delete_chars(input, WHITESPACE);
259 assert_se(streq(r, "hello,waldo.abc"));
262 static void test_in_charset(void) {
263 assert_se(in_charset("dddaaabbbcccc", "abcd"));
264 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
267 static void test_hexchar(void) {
268 assert_se(hexchar(0xa) == 'a');
269 assert_se(hexchar(0x0) == '0');
272 static void test_unhexchar(void) {
273 assert_se(unhexchar('a') == 0xA);
274 assert_se(unhexchar('A') == 0xA);
275 assert_se(unhexchar('0') == 0x0);
278 static void test_octchar(void) {
279 assert_se(octchar(00) == '0');
280 assert_se(octchar(07) == '7');
283 static void test_unoctchar(void) {
284 assert_se(unoctchar('0') == 00);
285 assert_se(unoctchar('7') == 07);
288 static void test_decchar(void) {
289 assert_se(decchar(0) == '0');
290 assert_se(decchar(9) == '9');
293 static void test_undecchar(void) {
294 assert_se(undecchar('0') == 0);
295 assert_se(undecchar('9') == 9);
298 static void test_cescape(void) {
299 _cleanup_free_ char *escaped;
300 escaped = cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313");
301 assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
304 static void test_cunescape(void) {
305 _cleanup_free_ char *unescaped;
306 unescaped = cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313");
307 assert_se(streq(unescaped, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313"));
310 static void test_foreach_word(void) {
314 const char test[] = "test abc d\te f ";
315 const char * const expected[] = {
325 FOREACH_WORD(w, l, test, state) {
326 assert_se(strneq(expected[i++], w, l));
330 static void test_foreach_word_quoted(void) {
334 const char test[] = "test a b c 'd' e '' '' hhh '' '' \"a b c\"";
335 const char * const expected[] = {
351 printf("<%s>\n", test);
352 FOREACH_WORD_QUOTED(w, l, test, state) {
353 _cleanup_free_ char *t = NULL;
355 assert_se(t = strndup(w, l));
356 assert_se(strneq(expected[i++], w, l));
361 static void test_default_term_for_tty(void) {
362 puts(default_term_for_tty("/dev/tty23"));
363 puts(default_term_for_tty("/dev/ttyS23"));
364 puts(default_term_for_tty("/dev/tty0"));
365 puts(default_term_for_tty("/dev/pty0"));
366 puts(default_term_for_tty("/dev/pts/0"));
367 puts(default_term_for_tty("/dev/console"));
368 puts(default_term_for_tty("tty23"));
369 puts(default_term_for_tty("ttyS23"));
370 puts(default_term_for_tty("tty0"));
371 puts(default_term_for_tty("pty0"));
372 puts(default_term_for_tty("pts/0"));
373 puts(default_term_for_tty("console"));
376 static void test_memdup_multiply(void) {
377 int org[] = {1, 2, 3};
380 dup = (int*)memdup_multiply(org, sizeof(int), 3);
383 assert_se(dup[0] == 1);
384 assert_se(dup[1] == 2);
385 assert_se(dup[2] == 3);
389 static void test_hostname_is_valid(void) {
390 assert(hostname_is_valid("foobar"));
391 assert(hostname_is_valid("foobar.com"));
392 assert(!hostname_is_valid("fööbar"));
393 assert(!hostname_is_valid(""));
394 assert(!hostname_is_valid("."));
395 assert(!hostname_is_valid(".."));
396 assert(!hostname_is_valid("foobar."));
397 assert(!hostname_is_valid(".foobar"));
398 assert(!hostname_is_valid("foo..bar"));
399 assert(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
402 static void test_u64log2(void) {
403 assert(u64log2(0) == 0);
404 assert(u64log2(8) == 3);
405 assert(u64log2(9) == 3);
406 assert(u64log2(15) == 3);
407 assert(u64log2(16) == 4);
408 assert(u64log2(1024*1024) == 20);
409 assert(u64log2(1024*1024+5) == 20);
412 static void test_get_process_comm(void) {
414 _cleanup_free_ char *a = NULL, *c = NULL, *d = NULL, *f = NULL, *i = NULL;
415 unsigned long long b;
422 if (stat("/proc/1/comm", &st) == 0) {
423 assert_se(get_process_comm(1, &a) >= 0);
424 log_info("pid1 comm: '%s'", a);
426 log_warning("/proc/1/comm does not exist.");
429 assert_se(get_starttime_of_pid(1, &b) >= 0);
430 log_info("pid1 starttime: '%llu'", b);
432 assert_se(get_process_cmdline(1, 0, true, &c) >= 0);
433 log_info("pid1 cmdline: '%s'", c);
435 assert_se(get_process_cmdline(1, 8, false, &d) >= 0);
436 log_info("pid1 cmdline truncated: '%s'", d);
438 assert_se(get_parent_of_pid(1, &e) >= 0);
439 log_info("pid1 ppid: "PID_FMT, e);
442 assert_se(is_kernel_thread(1) == 0);
444 r = get_process_exe(1, &f);
445 assert_se(r >= 0 || r == -EACCES);
446 log_info("pid1 exe: '%s'", strna(f));
448 assert_se(get_process_uid(1, &u) == 0);
449 log_info("pid1 uid: "UID_FMT, u);
452 assert_se(get_process_gid(1, &g) == 0);
453 log_info("pid1 gid: "GID_FMT, g);
456 assert(get_ctty_devnr(1, &h) == -ENOENT);
458 getenv_for_pid(1, "PATH", &i);
459 log_info("pid1 $PATH: '%s'", strna(i));
462 static void test_protect_errno(void) {
471 static void test_parse_size(void) {
474 assert_se(parse_size("111", 1024, &bytes) == 0);
475 assert_se(bytes == 111);
477 assert_se(parse_size("111.4", 1024, &bytes) == 0);
478 assert_se(bytes == 111);
480 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
481 assert_se(bytes == 112);
483 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
484 assert_se(bytes == 112);
486 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
487 assert_se(bytes == 3*1024 + 512);
489 assert_se(parse_size("3. K", 1024, &bytes) == 0);
490 assert_se(bytes == 3*1024);
492 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
493 assert_se(bytes == 3*1024);
495 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
497 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
498 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
500 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
502 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
503 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
505 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
506 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
508 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
510 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
511 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
513 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
514 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
516 assert_se(parse_size("12P", 1024, &bytes) == 0);
517 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
519 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
521 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
522 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
524 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
526 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
528 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
530 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
531 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
532 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
534 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
536 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
539 static void test_config_parse_iec_off(void) {
541 assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset, NULL) == 0);
542 assert_se(offset == 4 * 1024 * 1024);
544 assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset, NULL) == 0);
547 static void test_strextend(void) {
548 _cleanup_free_ char *str = strdup("0123");
549 strextend(&str, "456", "78", "9", NULL);
550 assert_se(streq(str, "0123456789"));
553 static void test_strrep(void) {
554 _cleanup_free_ char *one, *three, *zero;
555 one = strrep("waldo", 1);
556 three = strrep("waldo", 3);
557 zero = strrep("waldo", 0);
559 assert_se(streq(one, "waldo"));
560 assert_se(streq(three, "waldowaldowaldo"));
561 assert_se(streq(zero, ""));
564 static void test_split_pair(void) {
565 _cleanup_free_ char *a = NULL, *b = NULL;
567 assert_se(split_pair("", "", &a, &b) == -EINVAL);
568 assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
569 assert_se(split_pair("", "=", &a, &b) == -EINVAL);
570 assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
571 assert_se(streq(a, "foo"));
572 assert_se(streq(b, "bar"));
575 assert_se(split_pair("==", "==", &a, &b) >= 0);
576 assert_se(streq(a, ""));
577 assert_se(streq(b, ""));
581 assert_se(split_pair("===", "==", &a, &b) >= 0);
582 assert_se(streq(a, ""));
583 assert_se(streq(b, "="));
586 static void test_fstab_node_to_udev_node(void) {
589 n = fstab_node_to_udev_node("LABEL=applé/jack");
591 assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack"));
594 n = fstab_node_to_udev_node("PARTLABEL=pinkié pie");
596 assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie"));
599 n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
601 assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
604 n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
606 assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
609 n = fstab_node_to_udev_node("PONIES=awesome");
611 assert_se(streq(n, "PONIES=awesome"));
614 n = fstab_node_to_udev_node("/dev/xda1");
616 assert_se(streq(n, "/dev/xda1"));
620 static void test_get_files_in_directory(void) {
621 _cleanup_strv_free_ char **l = NULL, **t = NULL;
623 assert_se(get_files_in_directory("/tmp", &l) >= 0);
624 assert_se(get_files_in_directory(".", &t) >= 0);
625 assert_se(get_files_in_directory(".", NULL) >= 0);
628 static void test_in_set(void) {
629 assert_se(IN_SET(1, 1));
630 assert_se(IN_SET(1, 1, 2, 3, 4));
631 assert_se(IN_SET(2, 1, 2, 3, 4));
632 assert_se(IN_SET(3, 1, 2, 3, 4));
633 assert_se(IN_SET(4, 1, 2, 3, 4));
634 assert_se(!IN_SET(0, 1));
635 assert_se(!IN_SET(0, 1, 2, 3, 4));
638 static void test_writing_tmpfile(void) {
639 char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
640 _cleanup_free_ char *contents = NULL;
645 IOVEC_SET_STRING(iov[0], "abc\n");
646 IOVEC_SET_STRING(iov[1], ALPHANUMERICAL "\n");
647 IOVEC_SET_STRING(iov[2], "");
649 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
650 printf("tmpfile: %s", name);
652 r = writev(fd, iov, 3);
655 r = read_full_file(name, &contents, &size);
657 printf("contents: %s", contents);
658 assert(streq(contents, "abc\n" ALPHANUMERICAL "\n"));
663 static void test_hexdump(void) {
667 hexdump(stdout, NULL, 0);
668 hexdump(stdout, "", 0);
669 hexdump(stdout, "", 1);
670 hexdump(stdout, "x", 1);
671 hexdump(stdout, "x", 2);
672 hexdump(stdout, "foobar", 7);
673 hexdump(stdout, "f\nobar", 7);
674 hexdump(stdout, "xxxxxxxxxxxxxxxxxxxxyz", 23);
676 for (i = 0; i < ELEMENTSOF(data); i++)
679 hexdump(stdout, data, sizeof(data));
682 static void test_log2i(void) {
683 assert_se(log2i(1) == 0);
684 assert_se(log2i(2) == 1);
685 assert_se(log2i(3) == 1);
686 assert_se(log2i(4) == 2);
687 assert_se(log2i(32) == 5);
688 assert_se(log2i(33) == 5);
689 assert_se(log2i(63) == 5);
690 assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
693 static void test_foreach_string(void) {
694 const char * const t[] = {
703 FOREACH_STRING(x, "foo", "bar", "waldo")
704 assert_se(streq_ptr(t[i++], x));
708 FOREACH_STRING(x, "zzz")
709 assert_se(streq(x, "zzz"));
712 static void test_filename_is_safe(void) {
713 char foo[FILENAME_MAX+2];
716 assert_se(!filename_is_safe(""));
717 assert_se(!filename_is_safe("/bar/foo"));
718 assert_se(!filename_is_safe("/"));
719 assert_se(!filename_is_safe("."));
720 assert_se(!filename_is_safe(".."));
722 for (i=0; i<FILENAME_MAX+1; i++)
724 foo[FILENAME_MAX+1] = '\0';
726 assert_se(!filename_is_safe(foo));
728 assert_se(filename_is_safe("foo_bar-333"));
729 assert_se(filename_is_safe("o.o"));
732 static void test_ascii_strlower(void) {
733 char a[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
734 assert_se(streq(ascii_strlower(a), "aabbcc jk ii od lkjjj kkd lk"));
737 static void test_files_same(void) {
738 _cleanup_close_ int fd = -1;
739 char name[] = "/tmp/test-files_same.XXXXXX";
740 char name_alias[] = "/tmp/test-files_same.alias";
742 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
744 assert_se(symlink(name, name_alias) >= 0);
746 assert_se(files_same(name, name));
747 assert_se(files_same(name, name_alias));
753 static void test_is_valid_documentation_url(void) {
754 assert_se(is_valid_documentation_url("http://www.freedesktop.org/wiki/Software/systemd"));
755 assert_se(is_valid_documentation_url("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
756 assert_se(is_valid_documentation_url("file:foo"));
757 assert_se(is_valid_documentation_url("man:systemd.special(7)"));
758 assert_se(is_valid_documentation_url("info:bar"));
760 assert_se(!is_valid_documentation_url("foo:"));
761 assert_se(!is_valid_documentation_url("info:"));
762 assert_se(!is_valid_documentation_url(""));
765 static void test_file_in_same_dir(void) {
766 assert_se(streq(file_in_same_dir("/", "a"), "/a"));
767 assert_se(streq(file_in_same_dir("/", "/a"), "/a"));
768 assert_se(streq(file_in_same_dir("", "a"), "a"));
769 assert_se(streq(file_in_same_dir("a/", "a"), "a/a"));
770 assert_se(streq(file_in_same_dir("bar/foo", "bar"), "bar/bar"));
773 static void test_endswith(void) {
774 assert_se(endswith("foobar", "bar"));
775 assert_se(endswith("foobar", ""));
776 assert_se(endswith("foobar", "foobar"));
777 assert_se(endswith("", ""));
779 assert_se(!endswith("foobar", "foo"));
780 assert_se(!endswith("foobar", "foobarfoofoo"));
783 static void test_close_nointr(void) {
784 char name[] = "/tmp/test-test-close_nointr.XXXXXX";
787 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
789 assert_se(close_nointr(fd) >= 0);
790 assert_se(close_nointr(fd) < 0);
796 static void test_unlink_noerrno(void) {
797 char name[] = "/tmp/test-close_nointr.XXXXXX";
800 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
802 assert_se(close_nointr(fd) >= 0);
807 assert_se(unlink_noerrno(name) >= 0);
808 assert_se(errno == -42);
809 assert_se(unlink_noerrno(name) < 0);
810 assert_se(errno == -42);
814 static void test_readlink_and_make_absolute(void) {
815 char tempdir[] = "/tmp/test-readlink_and_make_absolute";
816 char name[] = "/tmp/test-readlink_and_make_absolute/original";
817 char name2[] = "test-readlink_and_make_absolute/original";
818 char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
821 assert(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
822 assert_se(touch(name) >= 0);
824 assert_se(symlink(name, name_alias) >= 0);
825 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
826 assert_se(streq(r, name));
828 assert_se(unlink(name_alias) >= 0);
830 assert_se(chdir(tempdir) >= 0);
831 assert_se(symlink(name2, name_alias) >= 0);
832 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
833 assert_se(streq(r, name));
835 assert_se(unlink(name_alias) >= 0);
837 assert_se(rm_rf_dangerous(tempdir, false, true, false) >= 0);
840 static void test_read_one_char(void) {
843 char name[] = "/tmp/test-read_one_char.XXXXXX";
844 _cleanup_close_ int fd = -1;
847 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
849 file = fdopen(fd, "r+");
851 assert_se(fputs("c\n", file) >= 0);
854 assert_se(read_one_char(file, &r, 1000000, &need_nl) >= 0);
857 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
860 assert_se(fputs("foobar\n", file) >= 0);
862 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
865 assert_se(fputs("\n", file) >= 0);
867 assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0);
872 static void test_ignore_signals(void) {
873 assert_se(ignore_signals(SIGINT, -1) >= 0);
874 assert_se(kill(getpid(), SIGINT) >= 0);
875 assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
876 assert_se(kill(getpid(), SIGUSR1) >= 0);
877 assert_se(kill(getpid(), SIGUSR2) >= 0);
878 assert_se(kill(getpid(), SIGTERM) >= 0);
879 assert_se(kill(getpid(), SIGPIPE) >= 0);
880 assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
883 static void test_strshorten(void) {
886 assert_se(strlen(strshorten(s, 6)) == 6);
887 assert_se(strlen(strshorten(s, 12)) == 6);
888 assert_se(strlen(strshorten(s, 2)) == 2);
889 assert_se(strlen(strshorten(s, 0)) == 0);
892 int main(int argc, char *argv[]) {
893 log_parse_environment();
900 test_parse_boolean();
918 test_foreach_word_quoted();
919 test_default_term_for_tty();
920 test_memdup_multiply();
921 test_hostname_is_valid();
923 test_get_process_comm();
924 test_protect_errno();
926 test_config_parse_iec_off();
930 test_fstab_node_to_udev_node();
931 test_get_files_in_directory();
933 test_writing_tmpfile();
936 test_foreach_string();
937 test_filename_is_safe();
938 test_ascii_strlower();
940 test_is_valid_documentation_url();
941 test_file_in_same_dir();
944 test_unlink_noerrno();
945 test_readlink_and_make_absolute();
946 test_read_one_char();
947 test_ignore_signals();