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/>.
29 #include <sys/types.h>
31 #include <sys/xattr.h>
34 #include "conf-parser.h"
35 #include "cpu-set-util.h"
40 #include "process-util.h"
42 #include "signal-util.h"
43 #include "string-util.h"
49 static void test_streq_ptr(void) {
50 assert_se(streq_ptr(NULL, NULL));
51 assert_se(!streq_ptr("abc", "cdef"));
54 static void test_align_power2(void) {
57 assert_se(ALIGN_POWER2(0) == 0);
58 assert_se(ALIGN_POWER2(1) == 1);
59 assert_se(ALIGN_POWER2(2) == 2);
60 assert_se(ALIGN_POWER2(3) == 4);
61 assert_se(ALIGN_POWER2(12) == 16);
63 assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
64 assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
65 assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
66 assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
67 assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
69 for (i = 1; i < 131071; ++i) {
70 for (p2 = 1; p2 < i; p2 <<= 1)
73 assert_se(ALIGN_POWER2(i) == p2);
76 for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
77 for (p2 = 1; p2 && p2 < i; p2 <<= 1)
80 assert_se(ALIGN_POWER2(i) == p2);
84 static void test_max(void) {
87 int b[CONST_MAX(10, 100)];
89 .a = CONST_MAX(10, 100),
93 assert_cc(sizeof(val1.b) == sizeof(int) * 100);
95 /* CONST_MAX returns (void) instead of a value if the passed arguments
96 * are not of the same type or not constant expressions. */
97 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
98 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
100 assert_se(val1.a == 100);
101 assert_se(MAX(++d, 0) == 1);
104 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
105 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
106 assert_cc(MAXSIZE(char, long) == sizeof(long));
108 assert_se(MAX(-5, 5) == 5);
109 assert_se(MAX(5, 5) == 5);
110 assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
111 assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
112 assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
113 assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
114 assert_se(LESS_BY(8, 4) == 4);
115 assert_se(LESS_BY(8, 8) == 0);
116 assert_se(LESS_BY(4, 8) == 0);
117 assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
118 assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
119 assert_se(CLAMP(-5, 0, 1) == 0);
120 assert_se(CLAMP(5, 0, 1) == 1);
121 assert_se(CLAMP(5, -10, 1) == 1);
122 assert_se(CLAMP(5, -10, 10) == 5);
123 assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
126 static void test_container_of(void) {
132 } _packed_ myval = { };
134 assert_cc(sizeof(myval) == 17);
135 assert_se(container_of(&myval.v1, struct mytype, v1) == &myval);
136 assert_se(container_of(&myval.v2, struct mytype, v2) == &myval);
137 assert_se(container_of(&container_of(&myval.v2,
144 static void test_alloca(void) {
145 static const uint8_t zero[997] = { };
148 t = alloca_align(17, 512);
149 assert_se(!((uintptr_t)t & 0xff));
152 t = alloca0_align(997, 1024);
153 assert_se(!((uintptr_t)t & 0x1ff));
154 assert_se(!memcmp(t, zero, 997));
157 static void test_div_round_up(void) {
161 assert_se(DIV_ROUND_UP(0, 8) == 0);
162 assert_se(DIV_ROUND_UP(1, 8) == 1);
163 assert_se(DIV_ROUND_UP(8, 8) == 1);
164 assert_se(DIV_ROUND_UP(12, 8) == 2);
165 assert_se(DIV_ROUND_UP(16, 8) == 2);
167 /* test multiple evaluation */
169 assert_se(DIV_ROUND_UP(div++, 8) == 0 && div == 1);
170 assert_se(DIV_ROUND_UP(++div, 8) == 1 && div == 2);
171 assert_se(DIV_ROUND_UP(8, div++) == 4 && div == 3);
172 assert_se(DIV_ROUND_UP(8, ++div) == 2 && div == 4);
174 /* overflow test with exact division */
175 assert_se(sizeof(0U) == 4);
176 assert_se(0xfffffffaU % 10U == 0U);
177 assert_se(0xfffffffaU / 10U == 429496729U);
178 assert_se(DIV_ROUND_UP(0xfffffffaU, 10U) == 429496729U);
179 assert_se((0xfffffffaU + 10U - 1U) / 10U == 0U);
180 assert_se(0xfffffffaU / 10U + !!(0xfffffffaU % 10U) == 429496729U);
182 /* overflow test with rounded division */
183 assert_se(0xfffffffdU % 10U == 3U);
184 assert_se(0xfffffffdU / 10U == 429496729U);
185 assert_se(DIV_ROUND_UP(0xfffffffdU, 10U) == 429496730U);
186 assert_se((0xfffffffdU + 10U - 1U) / 10U == 0U);
187 assert_se(0xfffffffdU / 10U + !!(0xfffffffdU % 10U) == 429496730U);
190 static void test_first_word(void) {
191 assert_se(first_word("Hello", ""));
192 assert_se(first_word("Hello", "Hello"));
193 assert_se(first_word("Hello world", "Hello"));
194 assert_se(first_word("Hello\tworld", "Hello"));
195 assert_se(first_word("Hello\nworld", "Hello"));
196 assert_se(first_word("Hello\rworld", "Hello"));
197 assert_se(first_word("Hello ", "Hello"));
199 assert_se(!first_word("Hello", "Hellooo"));
200 assert_se(!first_word("Hello", "xxxxx"));
201 assert_se(!first_word("Hellooo", "Hello"));
204 static void test_close_many(void) {
206 char name0[] = "/tmp/test-close-many.XXXXXX";
207 char name1[] = "/tmp/test-close-many.XXXXXX";
208 char name2[] = "/tmp/test-close-many.XXXXXX";
210 fds[0] = mkostemp_safe(name0, O_RDWR|O_CLOEXEC);
211 fds[1] = mkostemp_safe(name1, O_RDWR|O_CLOEXEC);
212 fds[2] = mkostemp_safe(name2, O_RDWR|O_CLOEXEC);
216 assert_se(fcntl(fds[0], F_GETFD) == -1);
217 assert_se(fcntl(fds[1], F_GETFD) == -1);
218 assert_se(fcntl(fds[2], F_GETFD) >= 0);
227 static void test_parse_boolean(void) {
228 assert_se(parse_boolean("1") == 1);
229 assert_se(parse_boolean("y") == 1);
230 assert_se(parse_boolean("Y") == 1);
231 assert_se(parse_boolean("yes") == 1);
232 assert_se(parse_boolean("YES") == 1);
233 assert_se(parse_boolean("true") == 1);
234 assert_se(parse_boolean("TRUE") == 1);
235 assert_se(parse_boolean("on") == 1);
236 assert_se(parse_boolean("ON") == 1);
238 assert_se(parse_boolean("0") == 0);
239 assert_se(parse_boolean("n") == 0);
240 assert_se(parse_boolean("N") == 0);
241 assert_se(parse_boolean("no") == 0);
242 assert_se(parse_boolean("NO") == 0);
243 assert_se(parse_boolean("false") == 0);
244 assert_se(parse_boolean("FALSE") == 0);
245 assert_se(parse_boolean("off") == 0);
246 assert_se(parse_boolean("OFF") == 0);
248 assert_se(parse_boolean("garbage") < 0);
249 assert_se(parse_boolean("") < 0);
250 assert_se(parse_boolean("full") < 0);
253 static void test_parse_pid(void) {
257 r = parse_pid("100", &pid);
259 assert_se(pid == 100);
261 r = parse_pid("0x7FFFFFFF", &pid);
263 assert_se(pid == 2147483647);
265 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
266 r = parse_pid("0", &pid);
267 assert_se(r == -ERANGE);
268 assert_se(pid == 65);
270 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
271 r = parse_pid("-100", &pid);
272 assert_se(r == -ERANGE);
273 assert_se(pid == 65);
275 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
276 r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
277 assert_se(r == -ERANGE);
278 assert_se(pid == 65);
280 r = parse_pid("junk", &pid);
281 assert_se(r == -EINVAL);
284 static void test_parse_uid(void) {
288 r = parse_uid("100", &uid);
290 assert_se(uid == 100);
292 r = parse_uid("65535", &uid);
293 assert_se(r == -ENXIO);
295 r = parse_uid("asdsdas", &uid);
296 assert_se(r == -EINVAL);
299 static void test_safe_atou16(void) {
303 r = safe_atou16("12345", &l);
305 assert_se(l == 12345);
307 r = safe_atou16("123456", &l);
308 assert_se(r == -ERANGE);
310 r = safe_atou16("junk", &l);
311 assert_se(r == -EINVAL);
314 static void test_safe_atoi16(void) {
318 r = safe_atoi16("-12345", &l);
320 assert_se(l == -12345);
322 r = safe_atoi16("36536", &l);
323 assert_se(r == -ERANGE);
325 r = safe_atoi16("junk", &l);
326 assert_se(r == -EINVAL);
329 static void test_safe_atolli(void) {
333 r = safe_atolli("12345", &l);
335 assert_se(l == 12345);
337 r = safe_atolli("junk", &l);
338 assert_se(r == -EINVAL);
341 static void test_safe_atod(void) {
346 r = safe_atod("junk", &d);
347 assert_se(r == -EINVAL);
349 r = safe_atod("0.2244", &d);
351 assert_se(fabs(d - 0.2244) < 0.000001);
353 r = safe_atod("0,5", &d);
354 assert_se(r == -EINVAL);
358 assert_se(*e == ',');
360 /* Check if this really is locale independent */
361 if (setlocale(LC_NUMERIC, "de_DE.utf8")) {
363 r = safe_atod("0.2244", &d);
365 assert_se(fabs(d - 0.2244) < 0.000001);
367 r = safe_atod("0,5", &d);
368 assert_se(r == -EINVAL);
371 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
374 /* And check again, reset */
375 assert_se(setlocale(LC_NUMERIC, "C"));
377 r = safe_atod("0.2244", &d);
379 assert_se(fabs(d - 0.2244) < 0.000001);
381 r = safe_atod("0,5", &d);
382 assert_se(r == -EINVAL);
386 assert_se(*e == ',');
389 static void test_strappend(void) {
390 _cleanup_free_ char *t1, *t2, *t3, *t4;
392 t1 = strappend(NULL, NULL);
393 assert_se(streq(t1, ""));
395 t2 = strappend(NULL, "suf");
396 assert_se(streq(t2, "suf"));
398 t3 = strappend("pre", NULL);
399 assert_se(streq(t3, "pre"));
401 t4 = strappend("pre", "suf");
402 assert_se(streq(t4, "presuf"));
405 static void test_strstrip(void) {
407 char input[] = " hello, waldo. ";
410 assert_se(streq(r, "hello, waldo."));
413 static void test_delete_chars(void) {
415 char input[] = " hello, waldo. abc";
417 r = delete_chars(input, WHITESPACE);
418 assert_se(streq(r, "hello,waldo.abc"));
421 static void test_in_charset(void) {
422 assert_se(in_charset("dddaaabbbcccc", "abcd"));
423 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
426 static void test_hexchar(void) {
427 assert_se(hexchar(0xa) == 'a');
428 assert_se(hexchar(0x0) == '0');
431 static void test_unhexchar(void) {
432 assert_se(unhexchar('a') == 0xA);
433 assert_se(unhexchar('A') == 0xA);
434 assert_se(unhexchar('0') == 0x0);
437 static void test_base32hexchar(void) {
438 assert_se(base32hexchar(0) == '0');
439 assert_se(base32hexchar(9) == '9');
440 assert_se(base32hexchar(10) == 'A');
441 assert_se(base32hexchar(31) == 'V');
444 static void test_unbase32hexchar(void) {
445 assert_se(unbase32hexchar('0') == 0);
446 assert_se(unbase32hexchar('9') == 9);
447 assert_se(unbase32hexchar('A') == 10);
448 assert_se(unbase32hexchar('V') == 31);
449 assert_se(unbase32hexchar('=') == -EINVAL);
452 static void test_base64char(void) {
453 assert_se(base64char(0) == 'A');
454 assert_se(base64char(26) == 'a');
455 assert_se(base64char(63) == '/');
458 static void test_unbase64char(void) {
459 assert_se(unbase64char('A') == 0);
460 assert_se(unbase64char('Z') == 25);
461 assert_se(unbase64char('a') == 26);
462 assert_se(unbase64char('z') == 51);
463 assert_se(unbase64char('0') == 52);
464 assert_se(unbase64char('9') == 61);
465 assert_se(unbase64char('+') == 62);
466 assert_se(unbase64char('/') == 63);
467 assert_se(unbase64char('=') == -EINVAL);
470 static void test_octchar(void) {
471 assert_se(octchar(00) == '0');
472 assert_se(octchar(07) == '7');
475 static void test_unoctchar(void) {
476 assert_se(unoctchar('0') == 00);
477 assert_se(unoctchar('7') == 07);
480 static void test_decchar(void) {
481 assert_se(decchar(0) == '0');
482 assert_se(decchar(9) == '9');
485 static void test_undecchar(void) {
486 assert_se(undecchar('0') == 0);
487 assert_se(undecchar('9') == 9);
490 static void test_unhexmem(void) {
491 const char *hex = "efa214921";
492 const char *hex_invalid = "efa214921o";
493 _cleanup_free_ char *hex2 = NULL;
494 _cleanup_free_ void *mem = NULL;
497 assert_se(unhexmem(hex, strlen(hex), &mem, &len) == 0);
498 assert_se(unhexmem(hex, strlen(hex) + 1, &mem, &len) == -EINVAL);
499 assert_se(unhexmem(hex_invalid, strlen(hex_invalid), &mem, &len) == -EINVAL);
501 assert_se((hex2 = hexmem(mem, len)));
505 assert_se(memcmp(hex, hex2, strlen(hex)) == 0);
509 assert_se(unhexmem(hex, strlen(hex) - 1, &mem, &len) == 0);
510 assert_se((hex2 = hexmem(mem, len)));
511 assert_se(memcmp(hex, hex2, strlen(hex) - 1) == 0);
514 /* https://tools.ietf.org/html/rfc4648#section-10 */
515 static void test_base32hexmem(void) {
518 b32 = base32hexmem("", strlen(""), true);
520 assert_se(streq(b32, ""));
523 b32 = base32hexmem("f", strlen("f"), true);
525 assert_se(streq(b32, "CO======"));
528 b32 = base32hexmem("fo", strlen("fo"), true);
530 assert_se(streq(b32, "CPNG===="));
533 b32 = base32hexmem("foo", strlen("foo"), true);
535 assert_se(streq(b32, "CPNMU==="));
538 b32 = base32hexmem("foob", strlen("foob"), true);
540 assert_se(streq(b32, "CPNMUOG="));
543 b32 = base32hexmem("fooba", strlen("fooba"), true);
545 assert_se(streq(b32, "CPNMUOJ1"));
548 b32 = base32hexmem("foobar", strlen("foobar"), true);
550 assert_se(streq(b32, "CPNMUOJ1E8======"));
553 b32 = base32hexmem("", strlen(""), false);
555 assert_se(streq(b32, ""));
558 b32 = base32hexmem("f", strlen("f"), false);
560 assert_se(streq(b32, "CO"));
563 b32 = base32hexmem("fo", strlen("fo"), false);
565 assert_se(streq(b32, "CPNG"));
568 b32 = base32hexmem("foo", strlen("foo"), false);
570 assert_se(streq(b32, "CPNMU"));
573 b32 = base32hexmem("foob", strlen("foob"), false);
575 assert_se(streq(b32, "CPNMUOG"));
578 b32 = base32hexmem("fooba", strlen("fooba"), false);
580 assert_se(streq(b32, "CPNMUOJ1"));
583 b32 = base32hexmem("foobar", strlen("foobar"), false);
585 assert_se(streq(b32, "CPNMUOJ1E8"));
589 static void test_unbase32hexmem(void) {
593 assert_se(unbase32hexmem("", strlen(""), true, &mem, &len) == 0);
594 assert_se(streq(strndupa(mem, len), ""));
597 assert_se(unbase32hexmem("CO======", strlen("CO======"), true, &mem, &len) == 0);
598 assert_se(streq(strndupa(mem, len), "f"));
601 assert_se(unbase32hexmem("CPNG====", strlen("CPNG===="), true, &mem, &len) == 0);
602 assert_se(streq(strndupa(mem, len), "fo"));
605 assert_se(unbase32hexmem("CPNMU===", strlen("CPNMU==="), true, &mem, &len) == 0);
606 assert_se(streq(strndupa(mem, len), "foo"));
609 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), true, &mem, &len) == 0);
610 assert_se(streq(strndupa(mem, len), "foob"));
613 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == 0);
614 assert_se(streq(strndupa(mem, len), "fooba"));
617 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), true, &mem, &len) == 0);
618 assert_se(streq(strndupa(mem, len), "foobar"));
621 assert_se(unbase32hexmem("A", strlen("A"), true, &mem, &len) == -EINVAL);
622 assert_se(unbase32hexmem("A=======", strlen("A======="), true, &mem, &len) == -EINVAL);
623 assert_se(unbase32hexmem("AAA=====", strlen("AAA====="), true, &mem, &len) == -EINVAL);
624 assert_se(unbase32hexmem("AAAAAA==", strlen("AAAAAA=="), true, &mem, &len) == -EINVAL);
625 assert_se(unbase32hexmem("AB======", strlen("AB======"), true, &mem, &len) == -EINVAL);
626 assert_se(unbase32hexmem("AAAB====", strlen("AAAB===="), true, &mem, &len) == -EINVAL);
627 assert_se(unbase32hexmem("AAAAB===", strlen("AAAAB==="), true, &mem, &len) == -EINVAL);
628 assert_se(unbase32hexmem("AAAAAAB=", strlen("AAAAAAB="), true, &mem, &len) == -EINVAL);
630 assert_se(unbase32hexmem("XPNMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
631 assert_se(unbase32hexmem("CXNMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
632 assert_se(unbase32hexmem("CPXMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
633 assert_se(unbase32hexmem("CPNXUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
634 assert_se(unbase32hexmem("CPNMXOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
635 assert_se(unbase32hexmem("CPNMUXJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
636 assert_se(unbase32hexmem("CPNMUOX1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
637 assert_se(unbase32hexmem("CPNMUOJX", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
639 assert_se(unbase32hexmem("", strlen(""), false, &mem, &len) == 0);
640 assert_se(streq(strndupa(mem, len), ""));
643 assert_se(unbase32hexmem("CO", strlen("CO"), false, &mem, &len) == 0);
644 assert_se(streq(strndupa(mem, len), "f"));
647 assert_se(unbase32hexmem("CPNG", strlen("CPNG"), false, &mem, &len) == 0);
648 assert_se(streq(strndupa(mem, len), "fo"));
651 assert_se(unbase32hexmem("CPNMU", strlen("CPNMU"), false, &mem, &len) == 0);
652 assert_se(streq(strndupa(mem, len), "foo"));
655 assert_se(unbase32hexmem("CPNMUOG", strlen("CPNMUOG"), false, &mem, &len) == 0);
656 assert_se(streq(strndupa(mem, len), "foob"));
659 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), false, &mem, &len) == 0);
660 assert_se(streq(strndupa(mem, len), "fooba"));
663 assert_se(unbase32hexmem("CPNMUOJ1E8", strlen("CPNMUOJ1E8"), false, &mem, &len) == 0);
664 assert_se(streq(strndupa(mem, len), "foobar"));
667 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), false, &mem, &len) == -EINVAL);
668 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), false, &mem, &len) == -EINVAL);
669 assert_se(unbase32hexmem("A", strlen("A"), false, &mem, &len) == -EINVAL);
670 assert_se(unbase32hexmem("A", strlen("A"), false, &mem, &len) == -EINVAL);
671 assert_se(unbase32hexmem("AAA", strlen("AAA"), false, &mem, &len) == -EINVAL);
672 assert_se(unbase32hexmem("AAAAAA", strlen("AAAAAA"), false, &mem, &len) == -EINVAL);
673 assert_se(unbase32hexmem("AB", strlen("AB"), false, &mem, &len) == -EINVAL);
674 assert_se(unbase32hexmem("AAAB", strlen("AAAB"), false, &mem, &len) == -EINVAL);
675 assert_se(unbase32hexmem("AAAAB", strlen("AAAAB"), false, &mem, &len) == -EINVAL);
676 assert_se(unbase32hexmem("AAAAAAB", strlen("AAAAAAB"), false, &mem, &len) == -EINVAL);
679 /* https://tools.ietf.org/html/rfc4648#section-10 */
680 static void test_base64mem(void) {
683 b64 = base64mem("", strlen(""));
685 assert_se(streq(b64, ""));
688 b64 = base64mem("f", strlen("f"));
690 assert_se(streq(b64, "Zg=="));
693 b64 = base64mem("fo", strlen("fo"));
695 assert_se(streq(b64, "Zm8="));
698 b64 = base64mem("foo", strlen("foo"));
700 assert_se(streq(b64, "Zm9v"));
703 b64 = base64mem("foob", strlen("foob"));
705 assert_se(streq(b64, "Zm9vYg=="));
708 b64 = base64mem("fooba", strlen("fooba"));
710 assert_se(streq(b64, "Zm9vYmE="));
713 b64 = base64mem("foobar", strlen("foobar"));
715 assert_se(streq(b64, "Zm9vYmFy"));
719 static void test_unbase64mem(void) {
723 assert_se(unbase64mem("", strlen(""), &mem, &len) == 0);
724 assert_se(streq(strndupa(mem, len), ""));
727 assert_se(unbase64mem("Zg==", strlen("Zg=="), &mem, &len) == 0);
728 assert_se(streq(strndupa(mem, len), "f"));
731 assert_se(unbase64mem("Zm8=", strlen("Zm8="), &mem, &len) == 0);
732 assert_se(streq(strndupa(mem, len), "fo"));
735 assert_se(unbase64mem("Zm9v", strlen("Zm9v"), &mem, &len) == 0);
736 assert_se(streq(strndupa(mem, len), "foo"));
739 assert_se(unbase64mem("Zm9vYg==", strlen("Zm9vYg=="), &mem, &len) == 0);
740 assert_se(streq(strndupa(mem, len), "foob"));
743 assert_se(unbase64mem("Zm9vYmE=", strlen("Zm9vYmE="), &mem, &len) == 0);
744 assert_se(streq(strndupa(mem, len), "fooba"));
747 assert_se(unbase64mem("Zm9vYmFy", strlen("Zm9vYmFy"), &mem, &len) == 0);
748 assert_se(streq(strndupa(mem, len), "foobar"));
751 assert_se(unbase64mem("A", strlen("A"), &mem, &len) == -EINVAL);
752 assert_se(unbase64mem("A====", strlen("A===="), &mem, &len) == -EINVAL);
753 assert_se(unbase64mem("AAB==", strlen("AAB=="), &mem, &len) == -EINVAL);
754 assert_se(unbase64mem("AAAB=", strlen("AAAB="), &mem, &len) == -EINVAL);
757 static void test_cescape(void) {
758 _cleanup_free_ char *escaped;
760 assert_se(escaped = cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
761 assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
764 static void test_cunescape(void) {
765 _cleanup_free_ char *unescaped;
767 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", 0, &unescaped) < 0);
768 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", UNESCAPE_RELAX, &unescaped) >= 0);
769 assert_se(streq_ptr(unescaped, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
770 unescaped = mfree(unescaped);
772 /* incomplete sequences */
773 assert_se(cunescape("\\x0", 0, &unescaped) < 0);
774 assert_se(cunescape("\\x0", UNESCAPE_RELAX, &unescaped) >= 0);
775 assert_se(streq_ptr(unescaped, "\\x0"));
776 unescaped = mfree(unescaped);
778 assert_se(cunescape("\\x", 0, &unescaped) < 0);
779 assert_se(cunescape("\\x", UNESCAPE_RELAX, &unescaped) >= 0);
780 assert_se(streq_ptr(unescaped, "\\x"));
781 unescaped = mfree(unescaped);
783 assert_se(cunescape("\\", 0, &unescaped) < 0);
784 assert_se(cunescape("\\", UNESCAPE_RELAX, &unescaped) >= 0);
785 assert_se(streq_ptr(unescaped, "\\"));
786 unescaped = mfree(unescaped);
788 assert_se(cunescape("\\11", 0, &unescaped) < 0);
789 assert_se(cunescape("\\11", UNESCAPE_RELAX, &unescaped) >= 0);
790 assert_se(streq_ptr(unescaped, "\\11"));
791 unescaped = mfree(unescaped);
793 assert_se(cunescape("\\1", 0, &unescaped) < 0);
794 assert_se(cunescape("\\1", UNESCAPE_RELAX, &unescaped) >= 0);
795 assert_se(streq_ptr(unescaped, "\\1"));
796 unescaped = mfree(unescaped);
798 assert_se(cunescape("\\u0000", 0, &unescaped) < 0);
799 assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX, &unescaped) >= 0);
800 assert_se(streq_ptr(unescaped, "ßßΠA"));
801 unescaped = mfree(unescaped);
803 assert_se(cunescape("\\073", 0, &unescaped) >= 0);
804 assert_se(streq_ptr(unescaped, ";"));
807 static void test_foreach_word(void) {
808 const char *word, *state;
811 const char test[] = "test abc d\te f ";
812 const char * const expected[] = {
822 FOREACH_WORD(word, l, test, state)
823 assert_se(strneq(expected[i++], word, l));
826 static void check(const char *test, char** expected, bool trailing) {
827 const char *word, *state;
831 printf("<<<%s>>>\n", test);
832 FOREACH_WORD_QUOTED(word, l, test, state) {
833 _cleanup_free_ char *t = NULL;
835 assert_se(t = strndup(word, l));
836 assert_se(strneq(expected[i++], word, l));
839 printf("<<<%s>>>\n", state);
840 assert_se(expected[i] == NULL);
841 assert_se(isempty(state) == !trailing);
844 static void test_foreach_word_quoted(void) {
845 check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
869 static void test_memdup_multiply(void) {
870 int org[] = {1, 2, 3};
873 dup = (int*)memdup_multiply(org, sizeof(int), 3);
876 assert_se(dup[0] == 1);
877 assert_se(dup[1] == 2);
878 assert_se(dup[2] == 3);
882 static void test_u64log2(void) {
883 assert_se(u64log2(0) == 0);
884 assert_se(u64log2(8) == 3);
885 assert_se(u64log2(9) == 3);
886 assert_se(u64log2(15) == 3);
887 assert_se(u64log2(16) == 4);
888 assert_se(u64log2(1024*1024) == 20);
889 assert_se(u64log2(1024*1024+5) == 20);
892 static void test_protect_errno(void) {
898 assert_se(errno == 12);
901 static void test_parse_size(void) {
904 assert_se(parse_size("111", 1024, &bytes) == 0);
905 assert_se(bytes == 111);
907 assert_se(parse_size("111.4", 1024, &bytes) == 0);
908 assert_se(bytes == 111);
910 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
911 assert_se(bytes == 112);
913 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
914 assert_se(bytes == 112);
916 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
917 assert_se(bytes == 3*1024 + 512);
919 assert_se(parse_size("3. K", 1024, &bytes) == 0);
920 assert_se(bytes == 3*1024);
922 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
923 assert_se(bytes == 3*1024);
925 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
927 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
928 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
930 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
932 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
933 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
935 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
936 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
938 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
940 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
941 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
943 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
944 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
946 assert_se(parse_size("12P", 1024, &bytes) == 0);
947 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
949 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
951 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
952 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
954 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
956 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
958 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
960 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
961 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
962 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
964 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
966 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
969 static void test_parse_cpu_set(void) {
974 /* Simple range (from CPUAffinity example) */
975 ncpus = parse_cpu_set_and_warn("1 2", &c, NULL, "fake", 1, "CPUAffinity");
976 assert_se(ncpus >= 1024);
977 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus), c));
978 assert_se(CPU_ISSET_S(2, CPU_ALLOC_SIZE(ncpus), c));
979 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 2);
982 /* A more interesting range */
983 ncpus = parse_cpu_set_and_warn("0 1 2 3 8 9 10 11", &c, NULL, "fake", 1, "CPUAffinity");
984 assert_se(ncpus >= 1024);
985 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
986 for (cpu = 0; cpu < 4; cpu++)
987 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
988 for (cpu = 8; cpu < 12; cpu++)
989 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
993 ncpus = parse_cpu_set_and_warn("8 '9' 10 \"11\"", &c, NULL, "fake", 1, "CPUAffinity");
994 assert_se(ncpus >= 1024);
995 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 4);
996 for (cpu = 8; cpu < 12; cpu++)
997 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
1000 /* Use commas as separators */
1001 ncpus = parse_cpu_set_and_warn("0,1,2,3 8,9,10,11", &c, NULL, "fake", 1, "CPUAffinity");
1002 assert_se(ncpus < 0);
1006 ncpus = parse_cpu_set_and_warn("0-3,8-11", &c, NULL, "fake", 1, "CPUAffinity");
1007 assert_se(ncpus < 0);
1011 ncpus = parse_cpu_set_and_warn("0 1 2 3 garbage", &c, NULL, "fake", 1, "CPUAffinity");
1012 assert_se(ncpus < 0);
1017 ncpus = parse_cpu_set_and_warn("", &c, NULL, "fake", 1, "CPUAffinity");
1018 assert_se(ncpus == 0); /* empty string returns 0 */
1021 /* Runnaway quoted string */
1022 ncpus = parse_cpu_set_and_warn("0 1 2 3 \"4 5 6 7 ", &c, NULL, "fake", 1, "CPUAffinity");
1023 assert_se(ncpus < 0);
1027 static void test_config_parse_iec_uint64(void) {
1028 uint64_t offset = 0;
1029 assert_se(config_parse_iec_uint64(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset, NULL) == 0);
1030 assert_se(offset == 4 * 1024 * 1024);
1032 assert_se(config_parse_iec_uint64(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset, NULL) == 0);
1035 static void test_strextend(void) {
1036 _cleanup_free_ char *str = strdup("0123");
1037 strextend(&str, "456", "78", "9", NULL);
1038 assert_se(streq(str, "0123456789"));
1041 static void test_strrep(void) {
1042 _cleanup_free_ char *one, *three, *zero;
1043 one = strrep("waldo", 1);
1044 three = strrep("waldo", 3);
1045 zero = strrep("waldo", 0);
1047 assert_se(streq(one, "waldo"));
1048 assert_se(streq(three, "waldowaldowaldo"));
1049 assert_se(streq(zero, ""));
1052 static void test_split_pair(void) {
1053 _cleanup_free_ char *a = NULL, *b = NULL;
1055 assert_se(split_pair("", "", &a, &b) == -EINVAL);
1056 assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
1057 assert_se(split_pair("", "=", &a, &b) == -EINVAL);
1058 assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
1059 assert_se(streq(a, "foo"));
1060 assert_se(streq(b, "bar"));
1063 assert_se(split_pair("==", "==", &a, &b) >= 0);
1064 assert_se(streq(a, ""));
1065 assert_se(streq(b, ""));
1069 assert_se(split_pair("===", "==", &a, &b) >= 0);
1070 assert_se(streq(a, ""));
1071 assert_se(streq(b, "="));
1074 static void test_fstab_node_to_udev_node(void) {
1077 n = fstab_node_to_udev_node("LABEL=applé/jack");
1079 assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack"));
1082 n = fstab_node_to_udev_node("PARTLABEL=pinkié pie");
1084 assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie"));
1087 n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1089 assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1092 n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1094 assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1097 n = fstab_node_to_udev_node("PONIES=awesome");
1099 assert_se(streq(n, "PONIES=awesome"));
1102 n = fstab_node_to_udev_node("/dev/xda1");
1104 assert_se(streq(n, "/dev/xda1"));
1108 static void test_get_files_in_directory(void) {
1109 _cleanup_strv_free_ char **l = NULL, **t = NULL;
1111 assert_se(get_files_in_directory("/tmp", &l) >= 0);
1112 assert_se(get_files_in_directory(".", &t) >= 0);
1113 assert_se(get_files_in_directory(".", NULL) >= 0);
1116 static void test_in_set(void) {
1117 assert_se(IN_SET(1, 1));
1118 assert_se(IN_SET(1, 1, 2, 3, 4));
1119 assert_se(IN_SET(2, 1, 2, 3, 4));
1120 assert_se(IN_SET(3, 1, 2, 3, 4));
1121 assert_se(IN_SET(4, 1, 2, 3, 4));
1122 assert_se(!IN_SET(0, 1));
1123 assert_se(!IN_SET(0, 1, 2, 3, 4));
1126 static void test_writing_tmpfile(void) {
1127 char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
1128 _cleanup_free_ char *contents = NULL;
1131 struct iovec iov[3];
1133 IOVEC_SET_STRING(iov[0], "abc\n");
1134 IOVEC_SET_STRING(iov[1], ALPHANUMERICAL "\n");
1135 IOVEC_SET_STRING(iov[2], "");
1137 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1138 printf("tmpfile: %s", name);
1140 r = writev(fd, iov, 3);
1143 r = read_full_file(name, &contents, &size);
1145 printf("contents: %s", contents);
1146 assert_se(streq(contents, "abc\n" ALPHANUMERICAL "\n"));
1151 static void test_hexdump(void) {
1155 hexdump(stdout, NULL, 0);
1156 hexdump(stdout, "", 0);
1157 hexdump(stdout, "", 1);
1158 hexdump(stdout, "x", 1);
1159 hexdump(stdout, "x", 2);
1160 hexdump(stdout, "foobar", 7);
1161 hexdump(stdout, "f\nobar", 7);
1162 hexdump(stdout, "xxxxxxxxxxxxxxxxxxxxyz", 23);
1164 for (i = 0; i < ELEMENTSOF(data); i++)
1167 hexdump(stdout, data, sizeof(data));
1170 static void test_log2i(void) {
1171 assert_se(log2i(1) == 0);
1172 assert_se(log2i(2) == 1);
1173 assert_se(log2i(3) == 1);
1174 assert_se(log2i(4) == 2);
1175 assert_se(log2i(32) == 5);
1176 assert_se(log2i(33) == 5);
1177 assert_se(log2i(63) == 5);
1178 assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
1181 static void test_foreach_string(void) {
1182 const char * const t[] = {
1191 FOREACH_STRING(x, "foo", "bar", "waldo")
1192 assert_se(streq_ptr(t[i++], x));
1196 FOREACH_STRING(x, "zzz")
1197 assert_se(streq(x, "zzz"));
1200 static void test_filename_is_valid(void) {
1201 char foo[FILENAME_MAX+2];
1204 assert_se(!filename_is_valid(""));
1205 assert_se(!filename_is_valid("/bar/foo"));
1206 assert_se(!filename_is_valid("/"));
1207 assert_se(!filename_is_valid("."));
1208 assert_se(!filename_is_valid(".."));
1210 for (i=0; i<FILENAME_MAX+1; i++)
1212 foo[FILENAME_MAX+1] = '\0';
1214 assert_se(!filename_is_valid(foo));
1216 assert_se(filename_is_valid("foo_bar-333"));
1217 assert_se(filename_is_valid("o.o"));
1220 static void test_string_has_cc(void) {
1221 assert_se(string_has_cc("abc\1", NULL));
1222 assert_se(string_has_cc("abc\x7f", NULL));
1223 assert_se(string_has_cc("abc\x7f", NULL));
1224 assert_se(string_has_cc("abc\t\x7f", "\t"));
1225 assert_se(string_has_cc("abc\t\x7f", "\t"));
1226 assert_se(string_has_cc("\x7f", "\t"));
1227 assert_se(string_has_cc("\x7f", "\t\a"));
1229 assert_se(!string_has_cc("abc\t\t", "\t"));
1230 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
1231 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
1234 static void test_ascii_strlower(void) {
1235 char a[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
1236 assert_se(streq(ascii_strlower(a), "aabbcc jk ii od lkjjj kkd lk"));
1239 static void test_files_same(void) {
1240 _cleanup_close_ int fd = -1;
1241 char name[] = "/tmp/test-files_same.XXXXXX";
1242 char name_alias[] = "/tmp/test-files_same.alias";
1244 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1246 assert_se(symlink(name, name_alias) >= 0);
1248 assert_se(files_same(name, name));
1249 assert_se(files_same(name, name_alias));
1255 static void test_is_valid_documentation_url(void) {
1256 assert_se(documentation_url_is_valid("http://www.freedesktop.org/wiki/Software/systemd"));
1257 assert_se(documentation_url_is_valid("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
1258 assert_se(documentation_url_is_valid("file:/foo/foo"));
1259 assert_se(documentation_url_is_valid("man:systemd.special(7)"));
1260 assert_se(documentation_url_is_valid("info:bar"));
1262 assert_se(!documentation_url_is_valid("foo:"));
1263 assert_se(!documentation_url_is_valid("info:"));
1264 assert_se(!documentation_url_is_valid(""));
1267 static void test_file_in_same_dir(void) {
1270 t = file_in_same_dir("/", "a");
1271 assert_se(streq(t, "/a"));
1274 t = file_in_same_dir("/", "/a");
1275 assert_se(streq(t, "/a"));
1278 t = file_in_same_dir("", "a");
1279 assert_se(streq(t, "a"));
1282 t = file_in_same_dir("a/", "a");
1283 assert_se(streq(t, "a/a"));
1286 t = file_in_same_dir("bar/foo", "bar");
1287 assert_se(streq(t, "bar/bar"));
1291 static void test_endswith(void) {
1292 assert_se(endswith("foobar", "bar"));
1293 assert_se(endswith("foobar", ""));
1294 assert_se(endswith("foobar", "foobar"));
1295 assert_se(endswith("", ""));
1297 assert_se(!endswith("foobar", "foo"));
1298 assert_se(!endswith("foobar", "foobarfoofoo"));
1301 static void test_endswith_no_case(void) {
1302 assert_se(endswith_no_case("fooBAR", "bar"));
1303 assert_se(endswith_no_case("foobar", ""));
1304 assert_se(endswith_no_case("foobar", "FOOBAR"));
1305 assert_se(endswith_no_case("", ""));
1307 assert_se(!endswith_no_case("foobar", "FOO"));
1308 assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
1311 static void test_close_nointr(void) {
1312 char name[] = "/tmp/test-test-close_nointr.XXXXXX";
1315 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1317 assert_se(close_nointr(fd) >= 0);
1318 assert_se(close_nointr(fd) < 0);
1324 static void test_unlink_noerrno(void) {
1325 char name[] = "/tmp/test-close_nointr.XXXXXX";
1328 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1330 assert_se(close_nointr(fd) >= 0);
1335 assert_se(unlink_noerrno(name) >= 0);
1336 assert_se(errno == -42);
1337 assert_se(unlink_noerrno(name) < 0);
1338 assert_se(errno == -42);
1342 static void test_readlink_and_make_absolute(void) {
1343 char tempdir[] = "/tmp/test-readlink_and_make_absolute";
1344 char name[] = "/tmp/test-readlink_and_make_absolute/original";
1345 char name2[] = "test-readlink_and_make_absolute/original";
1346 char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
1349 assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
1350 assert_se(touch(name) >= 0);
1352 assert_se(symlink(name, name_alias) >= 0);
1353 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
1354 assert_se(streq(r, name));
1356 assert_se(unlink(name_alias) >= 0);
1358 assert_se(chdir(tempdir) >= 0);
1359 assert_se(symlink(name2, name_alias) >= 0);
1360 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
1361 assert_se(streq(r, name));
1363 assert_se(unlink(name_alias) >= 0);
1365 assert_se(rm_rf(tempdir, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
1368 static void test_ignore_signals(void) {
1369 assert_se(ignore_signals(SIGINT, -1) >= 0);
1370 assert_se(kill(getpid(), SIGINT) >= 0);
1371 assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
1372 assert_se(kill(getpid(), SIGUSR1) >= 0);
1373 assert_se(kill(getpid(), SIGUSR2) >= 0);
1374 assert_se(kill(getpid(), SIGTERM) >= 0);
1375 assert_se(kill(getpid(), SIGPIPE) >= 0);
1376 assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
1379 static void test_strshorten(void) {
1380 char s[] = "foobar";
1382 assert_se(strlen(strshorten(s, 6)) == 6);
1383 assert_se(strlen(strshorten(s, 12)) == 6);
1384 assert_se(strlen(strshorten(s, 2)) == 2);
1385 assert_se(strlen(strshorten(s, 0)) == 0);
1388 static void test_strjoina(void) {
1391 actual = strjoina("", "foo", "bar");
1392 assert_se(streq(actual, "foobar"));
1394 actual = strjoina("foo", "bar", "baz");
1395 assert_se(streq(actual, "foobarbaz"));
1397 actual = strjoina("foo", "", "bar", "baz");
1398 assert_se(streq(actual, "foobarbaz"));
1400 actual = strjoina("foo");
1401 assert_se(streq(actual, "foo"));
1403 actual = strjoina(NULL);
1404 assert_se(streq(actual, ""));
1406 actual = strjoina(NULL, "foo");
1407 assert_se(streq(actual, ""));
1409 actual = strjoina("foo", NULL, "bar");
1410 assert_se(streq(actual, "foo"));
1413 static void test_is_symlink(void) {
1414 char name[] = "/tmp/test-is_symlink.XXXXXX";
1415 char name_link[] = "/tmp/test-is_symlink.link";
1416 _cleanup_close_ int fd = -1;
1418 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1420 assert_se(symlink(name, name_link) >= 0);
1422 assert_se(is_symlink(name) == 0);
1423 assert_se(is_symlink(name_link) == 1);
1424 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
1431 static void test_search_and_fopen(void) {
1432 const char *dirs[] = {"/tmp/foo/bar", "/tmp", NULL};
1433 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
1438 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1442 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
1446 r = search_and_fopen(name, "r", NULL, dirs, &f);
1450 r = search_and_fopen(basename(name), "r", "/", dirs, &f);
1454 r = search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
1456 r = search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
1462 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
1467 static void test_search_and_fopen_nulstr(void) {
1468 const char dirs[] = "/tmp/foo/bar\0/tmp\0";
1469 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
1474 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1478 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
1482 r = search_and_fopen_nulstr(name, "r", NULL, dirs, &f);
1486 r = search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
1488 r = search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
1494 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
1498 static void test_glob_exists(void) {
1499 char name[] = "/tmp/test-glob_exists.XXXXXX";
1503 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1507 r = glob_exists("/tmp/test-glob_exists*");
1512 r = glob_exists("/tmp/test-glob_exists*");
1516 static void test_execute_directory(void) {
1517 char template_lo[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
1518 char template_hi[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
1519 const char * dirs[] = {template_hi, template_lo, NULL};
1520 const char *name, *name2, *name3, *overridden, *override, *masked, *mask;
1522 assert_se(mkdtemp(template_lo));
1523 assert_se(mkdtemp(template_hi));
1525 name = strjoina(template_lo, "/script");
1526 name2 = strjoina(template_hi, "/script2");
1527 name3 = strjoina(template_lo, "/useless");
1528 overridden = strjoina(template_lo, "/overridden");
1529 override = strjoina(template_hi, "/overridden");
1530 masked = strjoina(template_lo, "/masked");
1531 mask = strjoina(template_hi, "/masked");
1533 assert_se(write_string_file(name, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE) == 0);
1534 assert_se(write_string_file(name2, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE) == 0);
1535 assert_se(write_string_file(overridden, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
1536 assert_se(write_string_file(override, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE) == 0);
1537 assert_se(write_string_file(masked, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
1538 assert_se(symlink("/dev/null", mask) == 0);
1539 assert_se(chmod(name, 0755) == 0);
1540 assert_se(chmod(name2, 0755) == 0);
1541 assert_se(chmod(overridden, 0755) == 0);
1542 assert_se(chmod(override, 0755) == 0);
1543 assert_se(chmod(masked, 0755) == 0);
1544 assert_se(touch(name3) >= 0);
1546 execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL);
1548 assert_se(chdir(template_lo) == 0);
1549 assert_se(access("it_works", F_OK) >= 0);
1550 assert_se(access("failed", F_OK) < 0);
1552 assert_se(chdir(template_hi) == 0);
1553 assert_se(access("it_works2", F_OK) >= 0);
1554 assert_se(access("failed", F_OK) < 0);
1556 (void) rm_rf(template_lo, REMOVE_ROOT|REMOVE_PHYSICAL);
1557 (void) rm_rf(template_hi, REMOVE_ROOT|REMOVE_PHYSICAL);
1560 static void test_extract_first_word(void) {
1561 const char *p, *original;
1564 p = original = "foobar waldo";
1565 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1566 assert_se(streq(t, "foobar"));
1568 assert_se(p == original + 7);
1570 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1571 assert_se(streq(t, "waldo"));
1573 assert_se(isempty(p));
1575 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
1577 assert_se(isempty(p));
1579 p = original = "\"foobar\" \'waldo\'";
1580 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1581 assert_se(streq(t, "\"foobar\""));
1583 assert_se(p == original + 9);
1585 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1586 assert_se(streq(t, "\'waldo\'"));
1588 assert_se(isempty(p));
1590 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
1592 assert_se(isempty(p));
1594 p = original = "\"foobar\" \'waldo\'";
1595 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1596 assert_se(streq(t, "foobar"));
1598 assert_se(p == original + 9);
1600 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1601 assert_se(streq(t, "waldo"));
1603 assert_se(isempty(p));
1605 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
1607 assert_se(isempty(p));
1609 p = original = "\"";
1610 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
1611 assert_se(streq(t, "\""));
1613 assert_se(isempty(p));
1615 p = original = "\"";
1616 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) == -EINVAL);
1617 assert_se(p == original + 1);
1619 p = original = "\'";
1620 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
1621 assert_se(streq(t, "\'"));
1623 assert_se(isempty(p));
1625 p = original = "\'";
1626 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) == -EINVAL);
1627 assert_se(p == original + 1);
1629 p = original = "\'fooo";
1630 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
1631 assert_se(streq(t, "\'fooo"));
1633 assert_se(isempty(p));
1635 p = original = "\'fooo";
1636 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) == -EINVAL);
1637 assert_se(p == original + 5);
1639 p = original = "\'fooo";
1640 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX) > 0);
1641 assert_se(streq(t, "fooo"));
1643 assert_se(isempty(p));
1645 p = original = "\"fooo";
1646 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX) > 0);
1647 assert_se(streq(t, "fooo"));
1649 assert_se(isempty(p));
1651 p = original = "yay\'foo\'bar";
1652 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1653 assert_se(streq(t, "yay\'foo\'bar"));
1655 assert_se(isempty(p));
1657 p = original = "yay\'foo\'bar";
1658 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1659 assert_se(streq(t, "yayfoobar"));
1661 assert_se(isempty(p));
1663 p = original = " foobar ";
1664 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1665 assert_se(streq(t, "foobar"));
1667 assert_se(isempty(p));
1669 p = original = " foo\\ba\\x6ar ";
1670 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0);
1671 assert_se(streq(t, "foo\ba\x6ar"));
1673 assert_se(isempty(p));
1675 p = original = " foo\\ba\\x6ar ";
1676 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1677 assert_se(streq(t, "foobax6ar"));
1679 assert_se(isempty(p));
1681 p = original = " f\\u00f6o \"pi\\U0001F4A9le\" ";
1682 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0);
1683 assert_se(streq(t, "föo"));
1685 assert_se(p == original + 13);
1687 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE) > 0);
1688 assert_se(streq(t, "pi\360\237\222\251le"));
1690 assert_se(isempty(p));
1692 p = original = "fooo\\";
1693 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0);
1694 assert_se(streq(t, "fooo"));
1696 assert_se(isempty(p));
1698 p = original = "fooo\\";
1699 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
1700 assert_se(streq(t, "fooo\\"));
1702 assert_se(isempty(p));
1704 p = original = "fooo\\";
1705 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
1706 assert_se(streq(t, "fooo\\"));
1708 assert_se(isempty(p));
1710 p = original = "fooo\\";
1711 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
1712 assert_se(streq(t, "fooo\\"));
1714 assert_se(isempty(p));
1716 p = original = "\"foo\\";
1717 assert_se(extract_first_word(&p, &t, NULL, 0) == -EINVAL);
1718 assert_se(p == original + 5);
1720 p = original = "\"foo\\";
1721 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX) > 0);
1722 assert_se(streq(t, "foo"));
1724 assert_se(isempty(p));
1726 p = original = "foo::bar";
1727 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
1728 assert_se(streq(t, "foo"));
1730 assert_se(p == original + 5);
1732 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
1733 assert_se(streq(t, "bar"));
1735 assert_se(isempty(p));
1737 assert_se(extract_first_word(&p, &t, ":", 0) == 0);
1739 assert_se(isempty(p));
1741 p = original = "foo\\:bar::waldo";
1742 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
1743 assert_se(streq(t, "foo:bar"));
1745 assert_se(p == original + 10);
1747 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
1748 assert_se(streq(t, "waldo"));
1750 assert_se(isempty(p));
1752 assert_se(extract_first_word(&p, &t, ":", 0) == 0);
1754 assert_se(isempty(p));
1756 p = original = "\"foo\\";
1757 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE_RELAX) == -EINVAL);
1758 assert_se(p == original + 5);
1760 p = original = "\"foo\\";
1761 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
1762 assert_se(streq(t, "foo\\"));
1764 assert_se(isempty(p));
1766 p = original = "\"foo\\";
1767 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
1768 assert_se(streq(t, "foo\\"));
1770 assert_se(isempty(p));
1772 p = original = "fooo\\ bar quux";
1773 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0);
1774 assert_se(streq(t, "fooo bar"));
1776 assert_se(p == original + 10);
1778 p = original = "fooo\\ bar quux";
1779 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
1780 assert_se(streq(t, "fooo bar"));
1782 assert_se(p == original + 10);
1784 p = original = "fooo\\ bar quux";
1785 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
1786 assert_se(streq(t, "fooo bar"));
1788 assert_se(p == original + 10);
1790 p = original = "fooo\\ bar quux";
1791 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL);
1792 assert_se(p == original + 5);
1794 p = original = "fooo\\ bar quux";
1795 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
1796 assert_se(streq(t, "fooo\\ bar"));
1798 assert_se(p == original + 10);
1800 p = original = "\\w+@\\K[\\d.]+";
1801 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL);
1802 assert_se(p == original + 1);
1804 p = original = "\\w+@\\K[\\d.]+";
1805 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
1806 assert_se(streq(t, "\\w+@\\K[\\d.]+"));
1808 assert_se(isempty(p));
1810 p = original = "\\w+\\b";
1811 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
1812 assert_se(streq(t, "\\w+\b"));
1814 assert_se(isempty(p));
1816 p = original = "-N ''";
1817 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1818 assert_se(streq(t, "-N"));
1820 assert_se(p == original + 3);
1822 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1823 assert_se(streq(t, ""));
1825 assert_se(isempty(p));
1827 p = original = ":foo\\:bar::waldo:";
1828 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1830 assert_se(streq(t, ""));
1832 assert_se(p == original + 1);
1834 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1835 assert_se(streq(t, "foo:bar"));
1837 assert_se(p == original + 10);
1839 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1841 assert_se(streq(t, ""));
1843 assert_se(p == original + 11);
1845 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1846 assert_se(streq(t, "waldo"));
1848 assert_se(p == original + 17);
1850 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1851 assert_se(streq(t, ""));
1853 assert_se(p == NULL);
1855 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 0);
1860 static void test_extract_first_word_and_warn(void) {
1861 const char *p, *original;
1864 p = original = "foobar waldo";
1865 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1866 assert_se(streq(t, "foobar"));
1868 assert_se(p == original + 7);
1870 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1871 assert_se(streq(t, "waldo"));
1873 assert_se(isempty(p));
1875 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
1877 assert_se(isempty(p));
1879 p = original = "\"foobar\" \'waldo\'";
1880 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) > 0);
1881 assert_se(streq(t, "foobar"));
1883 assert_se(p == original + 9);
1885 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) > 0);
1886 assert_se(streq(t, "waldo"));
1888 assert_se(isempty(p));
1890 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
1892 assert_se(isempty(p));
1894 p = original = "\"";
1895 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
1896 assert_se(p == original + 1);
1898 p = original = "\'";
1899 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
1900 assert_se(p == original + 1);
1902 p = original = "\'fooo";
1903 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
1904 assert_se(p == original + 5);
1906 p = original = "\'fooo";
1907 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1908 assert_se(streq(t, "fooo"));
1910 assert_se(isempty(p));
1912 p = original = " foo\\ba\\x6ar ";
1913 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1914 assert_se(streq(t, "foo\ba\x6ar"));
1916 assert_se(isempty(p));
1918 p = original = " foo\\ba\\x6ar ";
1919 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1920 assert_se(streq(t, "foobax6ar"));
1922 assert_se(isempty(p));
1924 p = original = " f\\u00f6o \"pi\\U0001F4A9le\" ";
1925 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1926 assert_se(streq(t, "föo"));
1928 assert_se(p == original + 13);
1930 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1931 assert_se(streq(t, "pi\360\237\222\251le"));
1933 assert_se(isempty(p));
1935 p = original = "fooo\\";
1936 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1937 assert_se(streq(t, "fooo"));
1939 assert_se(isempty(p));
1941 p = original = "fooo\\";
1942 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1943 assert_se(streq(t, "fooo\\"));
1945 assert_se(isempty(p));
1947 p = original = "fooo\\";
1948 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1949 assert_se(streq(t, "fooo\\"));
1951 assert_se(isempty(p));
1953 p = original = "\"foo\\";
1954 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
1955 assert_se(p == original + 5);
1957 p = original = "\"foo\\";
1958 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1959 assert_se(streq(t, "foo"));
1961 assert_se(isempty(p));
1963 p = original = "\"foo\\";
1964 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) == -EINVAL);
1965 assert_se(p == original + 5);
1967 p = original = "\"foo\\";
1968 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1969 assert_se(streq(t, "foo"));
1971 assert_se(isempty(p));
1973 p = original = "fooo\\ bar quux";
1974 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1975 assert_se(streq(t, "fooo bar"));
1977 assert_se(p == original + 10);
1979 p = original = "fooo\\ bar quux";
1980 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1981 assert_se(streq(t, "fooo bar"));
1983 assert_se(p == original + 10);
1985 p = original = "fooo\\ bar quux";
1986 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1987 assert_se(streq(t, "fooo\\ bar"));
1989 assert_se(p == original + 10);
1991 p = original = "\\w+@\\K[\\d.]+";
1992 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1993 assert_se(streq(t, "\\w+@\\K[\\d.]+"));
1995 assert_se(isempty(p));
1997 p = original = "\\w+\\b";
1998 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1999 assert_se(streq(t, "\\w+\b"));
2001 assert_se(isempty(p));
2004 static void test_extract_many_words(void) {
2005 const char *p, *original;
2008 p = original = "foobar waldi piep";
2009 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 3);
2010 assert_se(isempty(p));
2011 assert_se(streq_ptr(a, "foobar"));
2012 assert_se(streq_ptr(b, "waldi"));
2013 assert_se(streq_ptr(c, "piep"));
2018 p = original = "'foobar' wa\"ld\"i ";
2019 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 2);
2020 assert_se(isempty(p));
2021 assert_se(streq_ptr(a, "'foobar'"));
2022 assert_se(streq_ptr(b, "wa\"ld\"i"));
2023 assert_se(streq_ptr(c, NULL));
2027 p = original = "'foobar' wa\"ld\"i ";
2028 assert_se(extract_many_words(&p, NULL, EXTRACT_QUOTES, &a, &b, &c, NULL) == 2);
2029 assert_se(isempty(p));
2030 assert_se(streq_ptr(a, "foobar"));
2031 assert_se(streq_ptr(b, "waldi"));
2032 assert_se(streq_ptr(c, NULL));
2037 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
2038 assert_se(isempty(p));
2039 assert_se(streq_ptr(a, NULL));
2040 assert_se(streq_ptr(b, NULL));
2041 assert_se(streq_ptr(c, NULL));
2044 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
2045 assert_se(isempty(p));
2046 assert_se(streq_ptr(a, NULL));
2047 assert_se(streq_ptr(b, NULL));
2048 assert_se(streq_ptr(c, NULL));
2050 p = original = "foobar";
2051 assert_se(extract_many_words(&p, NULL, 0, NULL) == 0);
2052 assert_se(p == original);
2054 p = original = "foobar waldi";
2055 assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
2056 assert_se(p == original+7);
2057 assert_se(streq_ptr(a, "foobar"));
2060 p = original = " foobar ";
2061 assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
2062 assert_se(isempty(p));
2063 assert_se(streq_ptr(a, "foobar"));
2067 static int parse_item(const char *key, const char *value) {
2070 log_info("kernel cmdline option <%s> = <%s>", key, strna(value));
2074 static void test_parse_proc_cmdline(void) {
2075 assert_se(parse_proc_cmdline(parse_item) >= 0);
2078 static void test_raw_clone(void) {
2079 pid_t parent, pid, pid2;
2082 log_info("before clone: getpid()→"PID_FMT, parent);
2083 assert_se(raw_getpid() == parent);
2085 pid = raw_clone(0, NULL);
2086 assert_se(pid >= 0);
2088 pid2 = raw_getpid();
2089 log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT,
2090 pid, getpid(), pid2);
2092 assert_se(pid2 != parent);
2093 _exit(EXIT_SUCCESS);
2097 assert_se(pid2 == parent);
2098 waitpid(pid, &status, __WCLONE);
2099 assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
2103 static void test_same_fd(void) {
2104 _cleanup_close_pair_ int p[2] = { -1, -1 };
2105 _cleanup_close_ int a = -1, b = -1, c = -1;
2107 assert_se(pipe2(p, O_CLOEXEC) >= 0);
2108 assert_se((a = dup(p[0])) >= 0);
2109 assert_se((b = open("/dev/null", O_RDONLY|O_CLOEXEC)) >= 0);
2110 assert_se((c = dup(a)) >= 0);
2112 assert_se(same_fd(p[0], p[0]) > 0);
2113 assert_se(same_fd(p[1], p[1]) > 0);
2114 assert_se(same_fd(a, a) > 0);
2115 assert_se(same_fd(b, b) > 0);
2117 assert_se(same_fd(a, p[0]) > 0);
2118 assert_se(same_fd(p[0], a) > 0);
2119 assert_se(same_fd(c, p[0]) > 0);
2120 assert_se(same_fd(p[0], c) > 0);
2121 assert_se(same_fd(a, c) > 0);
2122 assert_se(same_fd(c, a) > 0);
2124 assert_se(same_fd(p[0], p[1]) == 0);
2125 assert_se(same_fd(p[1], p[0]) == 0);
2126 assert_se(same_fd(p[0], b) == 0);
2127 assert_se(same_fd(b, p[0]) == 0);
2128 assert_se(same_fd(p[1], a) == 0);
2129 assert_se(same_fd(a, p[1]) == 0);
2130 assert_se(same_fd(p[1], b) == 0);
2131 assert_se(same_fd(b, p[1]) == 0);
2133 assert_se(same_fd(a, b) == 0);
2134 assert_se(same_fd(b, a) == 0);
2137 static void test_uid_ptr(void) {
2139 assert_se(UID_TO_PTR(0) != NULL);
2140 assert_se(UID_TO_PTR(1000) != NULL);
2142 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
2143 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
2146 static void test_sparse_write_one(int fd, const char *buffer, size_t n) {
2149 assert_se(lseek(fd, 0, SEEK_SET) == 0);
2150 assert_se(ftruncate(fd, 0) >= 0);
2151 assert_se(sparse_write(fd, buffer, n, 4) == (ssize_t) n);
2153 assert_se(lseek(fd, 0, SEEK_CUR) == (off_t) n);
2154 assert_se(ftruncate(fd, n) >= 0);
2156 assert_se(lseek(fd, 0, SEEK_SET) == 0);
2157 assert_se(read(fd, check, n) == (ssize_t) n);
2159 assert_se(memcmp(buffer, check, n) == 0);
2162 static void test_sparse_write(void) {
2163 const char test_a[] = "test";
2164 const char test_b[] = "\0\0\0\0test\0\0\0\0";
2165 const char test_c[] = "\0\0test\0\0\0\0";
2166 const char test_d[] = "\0\0test\0\0\0test\0\0\0\0test\0\0\0\0\0test\0\0\0test\0\0\0\0test\0\0\0\0\0\0\0\0";
2167 const char test_e[] = "test\0\0\0\0test";
2168 _cleanup_close_ int fd = -1;
2169 char fn[] = "/tmp/sparseXXXXXX";
2171 fd = mkostemp(fn, O_CLOEXEC);
2175 test_sparse_write_one(fd, test_a, sizeof(test_a));
2176 test_sparse_write_one(fd, test_b, sizeof(test_b));
2177 test_sparse_write_one(fd, test_c, sizeof(test_c));
2178 test_sparse_write_one(fd, test_d, sizeof(test_d));
2179 test_sparse_write_one(fd, test_e, sizeof(test_e));
2182 static void test_shell_escape_one(const char *s, const char *bad, const char *expected) {
2183 _cleanup_free_ char *r;
2185 assert_se(r = shell_escape(s, bad));
2186 assert_se(streq_ptr(r, expected));
2189 static void test_shell_escape(void) {
2190 test_shell_escape_one("", "", "");
2191 test_shell_escape_one("\\", "", "\\\\");
2192 test_shell_escape_one("foobar", "", "foobar");
2193 test_shell_escape_one("foobar", "o", "f\\o\\obar");
2194 test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz");
2197 static void test_shell_maybe_quote_one(const char *s, const char *expected) {
2198 _cleanup_free_ char *r;
2200 assert_se(r = shell_maybe_quote(s));
2201 assert_se(streq(r, expected));
2204 static void test_shell_maybe_quote(void) {
2206 test_shell_maybe_quote_one("", "");
2207 test_shell_maybe_quote_one("\\", "\"\\\\\"");
2208 test_shell_maybe_quote_one("\"", "\"\\\"\"");
2209 test_shell_maybe_quote_one("foobar", "foobar");
2210 test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
2211 test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
2212 test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
2215 static void test_parse_mode(void) {
2218 assert_se(parse_mode("-1", &m) < 0);
2219 assert_se(parse_mode("", &m) < 0);
2220 assert_se(parse_mode("888", &m) < 0);
2221 assert_se(parse_mode("77777", &m) < 0);
2223 assert_se(parse_mode("544", &m) >= 0 && m == 0544);
2224 assert_se(parse_mode("777", &m) >= 0 && m == 0777);
2225 assert_se(parse_mode("7777", &m) >= 0 && m == 07777);
2226 assert_se(parse_mode("0", &m) >= 0 && m == 0);
2229 static void test_tempfn(void) {
2230 char *ret = NULL, *p;
2232 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL, &ret) >= 0);
2233 assert_se(streq_ptr(ret, "/foo/bar/.#waldoXXXXXX"));
2236 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret) >= 0);
2237 assert_se(streq_ptr(ret, "/foo/bar/.#[miau]waldoXXXXXX"));
2240 assert_se(tempfn_random("/foo/bar/waldo", NULL, &ret) >= 0);
2241 assert_se(p = startswith(ret, "/foo/bar/.#waldo"));
2242 assert_se(strlen(p) == 16);
2243 assert_se(in_charset(p, "0123456789abcdef"));
2246 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret) >= 0);
2247 assert_se(p = startswith(ret, "/foo/bar/.#[wuff]waldo"));
2248 assert_se(strlen(p) == 16);
2249 assert_se(in_charset(p, "0123456789abcdef"));
2252 assert_se(tempfn_random_child("/foo/bar/waldo", NULL, &ret) >= 0);
2253 assert_se(p = startswith(ret, "/foo/bar/waldo/.#"));
2254 assert_se(strlen(p) == 16);
2255 assert_se(in_charset(p, "0123456789abcdef"));
2258 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret) >= 0);
2259 assert_se(p = startswith(ret, "/foo/bar/waldo/.#[kikiriki]"));
2260 assert_se(strlen(p) == 16);
2261 assert_se(in_charset(p, "0123456789abcdef"));
2265 static void test_strcmp_ptr(void) {
2266 assert_se(strcmp_ptr(NULL, NULL) == 0);
2267 assert_se(strcmp_ptr("", NULL) > 0);
2268 assert_se(strcmp_ptr("foo", NULL) > 0);
2269 assert_se(strcmp_ptr(NULL, "") < 0);
2270 assert_se(strcmp_ptr(NULL, "bar") < 0);
2271 assert_se(strcmp_ptr("foo", "bar") > 0);
2272 assert_se(strcmp_ptr("bar", "baz") < 0);
2273 assert_se(strcmp_ptr("foo", "foo") == 0);
2274 assert_se(strcmp_ptr("", "") == 0);
2277 static void test_fgetxattrat_fake(void) {
2278 char t[] = "/var/tmp/xattrtestXXXXXX";
2279 _cleanup_close_ int fd = -1;
2284 assert_se(mkdtemp(t));
2285 x = strjoina(t, "/test");
2286 assert_se(touch(x) >= 0);
2288 r = setxattr(x, "user.foo", "bar", 3, 0);
2289 if (r < 0 && errno == EOPNOTSUPP) /* no xattrs supported on /var/tmp... */
2293 fd = open(t, O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOCTTY);
2296 assert_se(fgetxattrat_fake(fd, "test", "user.foo", v, 3, 0) >= 0);
2297 assert_se(memcmp(v, "bar", 3) == 0);
2300 fd = open("/", O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOCTTY);
2302 assert_se(fgetxattrat_fake(fd, "usr", "user.idontexist", v, 3, 0) == -ENODATA);
2305 assert_se(unlink(x) >= 0);
2306 assert_se(rmdir(t) >= 0);
2309 int main(int argc, char *argv[]) {
2310 log_parse_environment();
2314 test_align_power2();
2316 test_container_of();
2318 test_div_round_up();
2321 test_parse_boolean();
2330 test_delete_chars();
2334 test_base32hexchar();
2335 test_unbase32hexchar();
2337 test_unbase64char();
2343 test_base32hexmem();
2344 test_unbase32hexmem();
2349 test_foreach_word();
2350 test_foreach_word_quoted();
2351 test_memdup_multiply();
2353 test_protect_errno();
2355 test_parse_cpu_set();
2356 test_config_parse_iec_uint64();
2360 test_fstab_node_to_udev_node();
2361 test_get_files_in_directory();
2363 test_writing_tmpfile();
2366 test_foreach_string();
2367 test_filename_is_valid();
2368 test_string_has_cc();
2369 test_ascii_strlower();
2371 test_is_valid_documentation_url();
2372 test_file_in_same_dir();
2374 test_endswith_no_case();
2375 test_close_nointr();
2376 test_unlink_noerrno();
2377 test_readlink_and_make_absolute();
2378 test_ignore_signals();
2382 test_search_and_fopen();
2383 test_search_and_fopen_nulstr();
2385 test_execute_directory();
2386 test_extract_first_word();
2387 test_extract_first_word_and_warn();
2388 test_extract_many_words();
2389 test_parse_proc_cmdline();
2393 test_sparse_write();
2394 test_shell_escape();
2395 test_shell_maybe_quote();
2399 test_fgetxattrat_fake();