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/>.
38 #include "conf-parser.h"
40 #include "process-util.h"
41 #include "signal-util.h"
43 static void test_streq_ptr(void) {
44 assert_se(streq_ptr(NULL
, NULL
));
45 assert_se(!streq_ptr("abc", "cdef"));
48 static void test_align_power2(void) {
51 assert_se(ALIGN_POWER2(0) == 0);
52 assert_se(ALIGN_POWER2(1) == 1);
53 assert_se(ALIGN_POWER2(2) == 2);
54 assert_se(ALIGN_POWER2(3) == 4);
55 assert_se(ALIGN_POWER2(12) == 16);
57 assert_se(ALIGN_POWER2(ULONG_MAX
) == 0);
58 assert_se(ALIGN_POWER2(ULONG_MAX
- 1) == 0);
59 assert_se(ALIGN_POWER2(ULONG_MAX
- 1024) == 0);
60 assert_se(ALIGN_POWER2(ULONG_MAX
/ 2) == ULONG_MAX
/ 2 + 1);
61 assert_se(ALIGN_POWER2(ULONG_MAX
+ 1) == 0);
63 for (i
= 1; i
< 131071; ++i
) {
64 for (p2
= 1; p2
< i
; p2
<<= 1)
67 assert_se(ALIGN_POWER2(i
) == p2
);
70 for (i
= ULONG_MAX
- 1024; i
< ULONG_MAX
; ++i
) {
71 for (p2
= 1; p2
&& p2
< i
; p2
<<= 1)
74 assert_se(ALIGN_POWER2(i
) == p2
);
78 static void test_max(void) {
81 int b
[CONST_MAX(10, 100)];
83 .a
= CONST_MAX(10, 100),
87 assert_cc(sizeof(val1
.b
) == sizeof(int) * 100);
89 /* CONST_MAX returns (void) instead of a value if the passed arguments
90 * are not of the same type or not constant expressions. */
91 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
92 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
94 assert_se(val1
.a
== 100);
95 assert_se(MAX(++d
, 0) == 1);
98 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
99 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
100 assert_cc(MAXSIZE(char, long) == sizeof(long));
102 assert_se(MAX(-5, 5) == 5);
103 assert_se(MAX(5, 5) == 5);
104 assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
105 assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
106 assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
107 assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
108 assert_se(LESS_BY(8, 4) == 4);
109 assert_se(LESS_BY(8, 8) == 0);
110 assert_se(LESS_BY(4, 8) == 0);
111 assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
112 assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
113 assert_se(CLAMP(-5, 0, 1) == 0);
114 assert_se(CLAMP(5, 0, 1) == 1);
115 assert_se(CLAMP(5, -10, 1) == 1);
116 assert_se(CLAMP(5, -10, 10) == 5);
117 assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
120 static void test_container_of(void) {
126 } _packed_ myval
= { };
128 assert_cc(sizeof(myval
) == 17);
129 assert_se(container_of(&myval
.v1
, struct mytype
, v1
) == &myval
);
130 assert_se(container_of(&myval
.v2
, struct mytype
, v2
) == &myval
);
131 assert_se(container_of(&container_of(&myval
.v2
,
138 static void test_alloca(void) {
139 static const uint8_t zero
[997] = { };
142 t
= alloca_align(17, 512);
143 assert_se(!((uintptr_t)t
& 0xff));
146 t
= alloca0_align(997, 1024);
147 assert_se(!((uintptr_t)t
& 0x1ff));
148 assert_se(!memcmp(t
, zero
, 997));
151 static void test_div_round_up(void) {
155 assert_se(DIV_ROUND_UP(0, 8) == 0);
156 assert_se(DIV_ROUND_UP(1, 8) == 1);
157 assert_se(DIV_ROUND_UP(8, 8) == 1);
158 assert_se(DIV_ROUND_UP(12, 8) == 2);
159 assert_se(DIV_ROUND_UP(16, 8) == 2);
161 /* test multiple evaluation */
163 assert_se(DIV_ROUND_UP(div
++, 8) == 0 && div
== 1);
164 assert_se(DIV_ROUND_UP(++div
, 8) == 1 && div
== 2);
165 assert_se(DIV_ROUND_UP(8, div
++) == 4 && div
== 3);
166 assert_se(DIV_ROUND_UP(8, ++div
) == 2 && div
== 4);
168 /* overflow test with exact division */
169 assert_se(sizeof(0U) == 4);
170 assert_se(0xfffffffaU
% 10U == 0U);
171 assert_se(0xfffffffaU
/ 10U == 429496729U);
172 assert_se(DIV_ROUND_UP(0xfffffffaU
, 10U) == 429496729U);
173 assert_se((0xfffffffaU
+ 10U - 1U) / 10U == 0U);
174 assert_se(0xfffffffaU
/ 10U + !!(0xfffffffaU
% 10U) == 429496729U);
176 /* overflow test with rounded division */
177 assert_se(0xfffffffdU
% 10U == 3U);
178 assert_se(0xfffffffdU
/ 10U == 429496729U);
179 assert_se(DIV_ROUND_UP(0xfffffffdU
, 10U) == 429496730U);
180 assert_se((0xfffffffdU
+ 10U - 1U) / 10U == 0U);
181 assert_se(0xfffffffdU
/ 10U + !!(0xfffffffdU
% 10U) == 429496730U);
184 static void test_first_word(void) {
185 assert_se(first_word("Hello", ""));
186 assert_se(first_word("Hello", "Hello"));
187 assert_se(first_word("Hello world", "Hello"));
188 assert_se(first_word("Hello\tworld", "Hello"));
189 assert_se(first_word("Hello\nworld", "Hello"));
190 assert_se(first_word("Hello\rworld", "Hello"));
191 assert_se(first_word("Hello ", "Hello"));
193 assert_se(!first_word("Hello", "Hellooo"));
194 assert_se(!first_word("Hello", "xxxxx"));
195 assert_se(!first_word("Hellooo", "Hello"));
198 static void test_close_many(void) {
200 char name0
[] = "/tmp/test-close-many.XXXXXX";
201 char name1
[] = "/tmp/test-close-many.XXXXXX";
202 char name2
[] = "/tmp/test-close-many.XXXXXX";
204 fds
[0] = mkostemp_safe(name0
, O_RDWR
|O_CLOEXEC
);
205 fds
[1] = mkostemp_safe(name1
, O_RDWR
|O_CLOEXEC
);
206 fds
[2] = mkostemp_safe(name2
, O_RDWR
|O_CLOEXEC
);
210 assert_se(fcntl(fds
[0], F_GETFD
) == -1);
211 assert_se(fcntl(fds
[1], F_GETFD
) == -1);
212 assert_se(fcntl(fds
[2], F_GETFD
) >= 0);
221 static void test_parse_boolean(void) {
222 assert_se(parse_boolean("1") == 1);
223 assert_se(parse_boolean("y") == 1);
224 assert_se(parse_boolean("Y") == 1);
225 assert_se(parse_boolean("yes") == 1);
226 assert_se(parse_boolean("YES") == 1);
227 assert_se(parse_boolean("true") == 1);
228 assert_se(parse_boolean("TRUE") == 1);
229 assert_se(parse_boolean("on") == 1);
230 assert_se(parse_boolean("ON") == 1);
232 assert_se(parse_boolean("0") == 0);
233 assert_se(parse_boolean("n") == 0);
234 assert_se(parse_boolean("N") == 0);
235 assert_se(parse_boolean("no") == 0);
236 assert_se(parse_boolean("NO") == 0);
237 assert_se(parse_boolean("false") == 0);
238 assert_se(parse_boolean("FALSE") == 0);
239 assert_se(parse_boolean("off") == 0);
240 assert_se(parse_boolean("OFF") == 0);
242 assert_se(parse_boolean("garbage") < 0);
243 assert_se(parse_boolean("") < 0);
244 assert_se(parse_boolean("full") < 0);
247 static void test_parse_pid(void) {
251 r
= parse_pid("100", &pid
);
253 assert_se(pid
== 100);
255 r
= parse_pid("0x7FFFFFFF", &pid
);
257 assert_se(pid
== 2147483647);
259 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
260 r
= parse_pid("0", &pid
);
261 assert_se(r
== -ERANGE
);
262 assert_se(pid
== 65);
264 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
265 r
= parse_pid("-100", &pid
);
266 assert_se(r
== -ERANGE
);
267 assert_se(pid
== 65);
269 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
270 r
= parse_pid("0xFFFFFFFFFFFFFFFFF", &pid
);
271 assert_se(r
== -ERANGE
);
272 assert_se(pid
== 65);
275 static void test_parse_uid(void) {
279 r
= parse_uid("100", &uid
);
281 assert_se(uid
== 100);
283 r
= parse_uid("65535", &uid
);
284 assert_se(r
== -ENXIO
);
287 static void test_safe_atou16(void) {
291 r
= safe_atou16("12345", &l
);
293 assert_se(l
== 12345);
295 r
= safe_atou16("123456", &l
);
296 assert_se(r
== -ERANGE
);
298 r
= safe_atou16("junk", &l
);
299 assert_se(r
== -EINVAL
);
302 static void test_safe_atoi16(void) {
306 r
= safe_atoi16("-12345", &l
);
308 assert_se(l
== -12345);
310 r
= safe_atoi16("36536", &l
);
311 assert_se(r
== -ERANGE
);
313 r
= safe_atoi16("junk", &l
);
314 assert_se(r
== -EINVAL
);
317 static void test_safe_atolli(void) {
321 r
= safe_atolli("12345", &l
);
323 assert_se(l
== 12345);
325 r
= safe_atolli("junk", &l
);
326 assert_se(r
== -EINVAL
);
329 static void test_safe_atod(void) {
334 r
= safe_atod("junk", &d
);
335 assert_se(r
== -EINVAL
);
337 r
= safe_atod("0.2244", &d
);
339 assert_se(fabs(d
- 0.2244) < 0.000001);
341 r
= safe_atod("0,5", &d
);
342 assert_se(r
== -EINVAL
);
346 assert_se(*e
== ',');
348 /* Check if this really is locale independent */
349 if (setlocale(LC_NUMERIC
, "de_DE.utf8")) {
351 r
= safe_atod("0.2244", &d
);
353 assert_se(fabs(d
- 0.2244) < 0.000001);
355 r
= safe_atod("0,5", &d
);
356 assert_se(r
== -EINVAL
);
359 assert_se(fabs(strtod("0,5", &e
) - 0.5) < 0.00001);
362 /* And check again, reset */
363 assert_se(setlocale(LC_NUMERIC
, "C"));
365 r
= safe_atod("0.2244", &d
);
367 assert_se(fabs(d
- 0.2244) < 0.000001);
369 r
= safe_atod("0,5", &d
);
370 assert_se(r
== -EINVAL
);
374 assert_se(*e
== ',');
377 static void test_strappend(void) {
378 _cleanup_free_
char *t1
, *t2
, *t3
, *t4
;
380 t1
= strappend(NULL
, NULL
);
381 assert_se(streq(t1
, ""));
383 t2
= strappend(NULL
, "suf");
384 assert_se(streq(t2
, "suf"));
386 t3
= strappend("pre", NULL
);
387 assert_se(streq(t3
, "pre"));
389 t4
= strappend("pre", "suf");
390 assert_se(streq(t4
, "presuf"));
393 static void test_strstrip(void) {
395 char input
[] = " hello, waldo. ";
398 assert_se(streq(r
, "hello, waldo."));
401 static void test_delete_chars(void) {
403 char input
[] = " hello, waldo. abc";
405 r
= delete_chars(input
, WHITESPACE
);
406 assert_se(streq(r
, "hello,waldo.abc"));
409 static void test_in_charset(void) {
410 assert_se(in_charset("dddaaabbbcccc", "abcd"));
411 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
414 static void test_hexchar(void) {
415 assert_se(hexchar(0xa) == 'a');
416 assert_se(hexchar(0x0) == '0');
419 static void test_unhexchar(void) {
420 assert_se(unhexchar('a') == 0xA);
421 assert_se(unhexchar('A') == 0xA);
422 assert_se(unhexchar('0') == 0x0);
425 static void test_base32hexchar(void) {
426 assert_se(base32hexchar(0) == '0');
427 assert_se(base32hexchar(9) == '9');
428 assert_se(base32hexchar(10) == 'A');
429 assert_se(base32hexchar(31) == 'V');
432 static void test_unbase32hexchar(void) {
433 assert_se(unbase32hexchar('0') == 0);
434 assert_se(unbase32hexchar('9') == 9);
435 assert_se(unbase32hexchar('A') == 10);
436 assert_se(unbase32hexchar('V') == 31);
437 assert_se(unbase32hexchar('=') == -EINVAL
);
440 static void test_base64char(void) {
441 assert_se(base64char(0) == 'A');
442 assert_se(base64char(26) == 'a');
443 assert_se(base64char(63) == '/');
446 static void test_unbase64char(void) {
447 assert_se(unbase64char('A') == 0);
448 assert_se(unbase64char('Z') == 25);
449 assert_se(unbase64char('a') == 26);
450 assert_se(unbase64char('z') == 51);
451 assert_se(unbase64char('0') == 52);
452 assert_se(unbase64char('9') == 61);
453 assert_se(unbase64char('+') == 62);
454 assert_se(unbase64char('/') == 63);
455 assert_se(unbase64char('=') == -EINVAL
);
458 static void test_octchar(void) {
459 assert_se(octchar(00) == '0');
460 assert_se(octchar(07) == '7');
463 static void test_unoctchar(void) {
464 assert_se(unoctchar('0') == 00);
465 assert_se(unoctchar('7') == 07);
468 static void test_decchar(void) {
469 assert_se(decchar(0) == '0');
470 assert_se(decchar(9) == '9');
473 static void test_undecchar(void) {
474 assert_se(undecchar('0') == 0);
475 assert_se(undecchar('9') == 9);
478 static void test_unhexmem(void) {
479 const char *hex
= "efa214921";
480 const char *hex_invalid
= "efa214921o";
481 _cleanup_free_
char *hex2
= NULL
;
482 _cleanup_free_
void *mem
= NULL
;
485 assert_se(unhexmem(hex
, strlen(hex
), &mem
, &len
) == 0);
486 assert_se(unhexmem(hex
, strlen(hex
) + 1, &mem
, &len
) == -EINVAL
);
487 assert_se(unhexmem(hex_invalid
, strlen(hex_invalid
), &mem
, &len
) == -EINVAL
);
489 assert_se((hex2
= hexmem(mem
, len
)));
493 assert_se(memcmp(hex
, hex2
, strlen(hex
)) == 0);
497 assert_se(unhexmem(hex
, strlen(hex
) - 1, &mem
, &len
) == 0);
498 assert_se((hex2
= hexmem(mem
, len
)));
499 assert_se(memcmp(hex
, hex2
, strlen(hex
) - 1) == 0);
502 /* https://tools.ietf.org/html/rfc4648#section-10 */
503 static void test_base32hexmem(void) {
506 b32
= base32hexmem("", strlen(""), true);
508 assert_se(streq(b32
, ""));
511 b32
= base32hexmem("f", strlen("f"), true);
513 assert_se(streq(b32
, "CO======"));
516 b32
= base32hexmem("fo", strlen("fo"), true);
518 assert_se(streq(b32
, "CPNG===="));
521 b32
= base32hexmem("foo", strlen("foo"), true);
523 assert_se(streq(b32
, "CPNMU==="));
526 b32
= base32hexmem("foob", strlen("foob"), true);
528 assert_se(streq(b32
, "CPNMUOG="));
531 b32
= base32hexmem("fooba", strlen("fooba"), true);
533 assert_se(streq(b32
, "CPNMUOJ1"));
536 b32
= base32hexmem("foobar", strlen("foobar"), true);
538 assert_se(streq(b32
, "CPNMUOJ1E8======"));
541 b32
= base32hexmem("", strlen(""), false);
543 assert_se(streq(b32
, ""));
546 b32
= base32hexmem("f", strlen("f"), false);
548 assert_se(streq(b32
, "CO"));
551 b32
= base32hexmem("fo", strlen("fo"), false);
553 assert_se(streq(b32
, "CPNG"));
556 b32
= base32hexmem("foo", strlen("foo"), false);
558 assert_se(streq(b32
, "CPNMU"));
561 b32
= base32hexmem("foob", strlen("foob"), false);
563 assert_se(streq(b32
, "CPNMUOG"));
566 b32
= base32hexmem("fooba", strlen("fooba"), false);
568 assert_se(streq(b32
, "CPNMUOJ1"));
571 b32
= base32hexmem("foobar", strlen("foobar"), false);
573 assert_se(streq(b32
, "CPNMUOJ1E8"));
577 static void test_unbase32hexmem(void) {
581 assert_se(unbase32hexmem("", strlen(""), true, &mem
, &len
) == 0);
582 assert_se(streq(strndupa(mem
, len
), ""));
585 assert_se(unbase32hexmem("CO======", strlen("CO======"), true, &mem
, &len
) == 0);
586 assert_se(streq(strndupa(mem
, len
), "f"));
589 assert_se(unbase32hexmem("CPNG====", strlen("CPNG===="), true, &mem
, &len
) == 0);
590 assert_se(streq(strndupa(mem
, len
), "fo"));
593 assert_se(unbase32hexmem("CPNMU===", strlen("CPNMU==="), true, &mem
, &len
) == 0);
594 assert_se(streq(strndupa(mem
, len
), "foo"));
597 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), true, &mem
, &len
) == 0);
598 assert_se(streq(strndupa(mem
, len
), "foob"));
601 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == 0);
602 assert_se(streq(strndupa(mem
, len
), "fooba"));
605 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), true, &mem
, &len
) == 0);
606 assert_se(streq(strndupa(mem
, len
), "foobar"));
609 assert_se(unbase32hexmem("A", strlen("A"), true, &mem
, &len
) == -EINVAL
);
610 assert_se(unbase32hexmem("A=======", strlen("A======="), true, &mem
, &len
) == -EINVAL
);
611 assert_se(unbase32hexmem("AAA=====", strlen("AAA====="), true, &mem
, &len
) == -EINVAL
);
612 assert_se(unbase32hexmem("AAAAAA==", strlen("AAAAAA=="), true, &mem
, &len
) == -EINVAL
);
613 assert_se(unbase32hexmem("AB======", strlen("AB======"), true, &mem
, &len
) == -EINVAL
);
614 assert_se(unbase32hexmem("AAAB====", strlen("AAAB===="), true, &mem
, &len
) == -EINVAL
);
615 assert_se(unbase32hexmem("AAAAB===", strlen("AAAAB==="), true, &mem
, &len
) == -EINVAL
);
616 assert_se(unbase32hexmem("AAAAAAB=", strlen("AAAAAAB="), true, &mem
, &len
) == -EINVAL
);
618 assert_se(unbase32hexmem("XPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
619 assert_se(unbase32hexmem("CXNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
620 assert_se(unbase32hexmem("CPXMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
621 assert_se(unbase32hexmem("CPNXUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
622 assert_se(unbase32hexmem("CPNMXOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
623 assert_se(unbase32hexmem("CPNMUXJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
624 assert_se(unbase32hexmem("CPNMUOX1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
625 assert_se(unbase32hexmem("CPNMUOJX", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
627 assert_se(unbase32hexmem("", strlen(""), false, &mem
, &len
) == 0);
628 assert_se(streq(strndupa(mem
, len
), ""));
631 assert_se(unbase32hexmem("CO", strlen("CO"), false, &mem
, &len
) == 0);
632 assert_se(streq(strndupa(mem
, len
), "f"));
635 assert_se(unbase32hexmem("CPNG", strlen("CPNG"), false, &mem
, &len
) == 0);
636 assert_se(streq(strndupa(mem
, len
), "fo"));
639 assert_se(unbase32hexmem("CPNMU", strlen("CPNMU"), false, &mem
, &len
) == 0);
640 assert_se(streq(strndupa(mem
, len
), "foo"));
643 assert_se(unbase32hexmem("CPNMUOG", strlen("CPNMUOG"), false, &mem
, &len
) == 0);
644 assert_se(streq(strndupa(mem
, len
), "foob"));
647 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), false, &mem
, &len
) == 0);
648 assert_se(streq(strndupa(mem
, len
), "fooba"));
651 assert_se(unbase32hexmem("CPNMUOJ1E8", strlen("CPNMUOJ1E8"), false, &mem
, &len
) == 0);
652 assert_se(streq(strndupa(mem
, len
), "foobar"));
655 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), false, &mem
, &len
) == -EINVAL
);
656 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), false, &mem
, &len
) == -EINVAL
);
657 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
658 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
659 assert_se(unbase32hexmem("AAA", strlen("AAA"), false, &mem
, &len
) == -EINVAL
);
660 assert_se(unbase32hexmem("AAAAAA", strlen("AAAAAA"), false, &mem
, &len
) == -EINVAL
);
661 assert_se(unbase32hexmem("AB", strlen("AB"), false, &mem
, &len
) == -EINVAL
);
662 assert_se(unbase32hexmem("AAAB", strlen("AAAB"), false, &mem
, &len
) == -EINVAL
);
663 assert_se(unbase32hexmem("AAAAB", strlen("AAAAB"), false, &mem
, &len
) == -EINVAL
);
664 assert_se(unbase32hexmem("AAAAAAB", strlen("AAAAAAB"), false, &mem
, &len
) == -EINVAL
);
667 /* https://tools.ietf.org/html/rfc4648#section-10 */
668 static void test_base64mem(void) {
671 b64
= base64mem("", strlen(""));
673 assert_se(streq(b64
, ""));
676 b64
= base64mem("f", strlen("f"));
678 assert_se(streq(b64
, "Zg=="));
681 b64
= base64mem("fo", strlen("fo"));
683 assert_se(streq(b64
, "Zm8="));
686 b64
= base64mem("foo", strlen("foo"));
688 assert_se(streq(b64
, "Zm9v"));
691 b64
= base64mem("foob", strlen("foob"));
693 assert_se(streq(b64
, "Zm9vYg=="));
696 b64
= base64mem("fooba", strlen("fooba"));
698 assert_se(streq(b64
, "Zm9vYmE="));
701 b64
= base64mem("foobar", strlen("foobar"));
703 assert_se(streq(b64
, "Zm9vYmFy"));
707 static void test_unbase64mem(void) {
711 assert_se(unbase64mem("", strlen(""), &mem
, &len
) == 0);
712 assert_se(streq(strndupa(mem
, len
), ""));
715 assert_se(unbase64mem("Zg==", strlen("Zg=="), &mem
, &len
) == 0);
716 assert_se(streq(strndupa(mem
, len
), "f"));
719 assert_se(unbase64mem("Zm8=", strlen("Zm8="), &mem
, &len
) == 0);
720 assert_se(streq(strndupa(mem
, len
), "fo"));
723 assert_se(unbase64mem("Zm9v", strlen("Zm9v"), &mem
, &len
) == 0);
724 assert_se(streq(strndupa(mem
, len
), "foo"));
727 assert_se(unbase64mem("Zm9vYg==", strlen("Zm9vYg=="), &mem
, &len
) == 0);
728 assert_se(streq(strndupa(mem
, len
), "foob"));
731 assert_se(unbase64mem("Zm9vYmE=", strlen("Zm9vYmE="), &mem
, &len
) == 0);
732 assert_se(streq(strndupa(mem
, len
), "fooba"));
735 assert_se(unbase64mem("Zm9vYmFy", strlen("Zm9vYmFy"), &mem
, &len
) == 0);
736 assert_se(streq(strndupa(mem
, len
), "foobar"));
739 assert_se(unbase64mem("A", strlen("A"), &mem
, &len
) == -EINVAL
);
740 assert_se(unbase64mem("A====", strlen("A===="), &mem
, &len
) == -EINVAL
);
741 assert_se(unbase64mem("AAB==", strlen("AAB=="), &mem
, &len
) == -EINVAL
);
742 assert_se(unbase64mem("AAAB=", strlen("AAAB="), &mem
, &len
) == -EINVAL
);
745 static void test_cescape(void) {
746 _cleanup_free_
char *escaped
;
748 assert_se(escaped
= cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
749 assert_se(streq(escaped
, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
752 static void test_cunescape(void) {
753 _cleanup_free_
char *unescaped
;
755 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", 0, &unescaped
) < 0);
756 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", UNESCAPE_RELAX
, &unescaped
) >= 0);
757 assert_se(streq_ptr(unescaped
, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
758 unescaped
= mfree(unescaped
);
760 /* incomplete sequences */
761 assert_se(cunescape("\\x0", 0, &unescaped
) < 0);
762 assert_se(cunescape("\\x0", UNESCAPE_RELAX
, &unescaped
) >= 0);
763 assert_se(streq_ptr(unescaped
, "\\x0"));
764 unescaped
= mfree(unescaped
);
766 assert_se(cunescape("\\x", 0, &unescaped
) < 0);
767 assert_se(cunescape("\\x", UNESCAPE_RELAX
, &unescaped
) >= 0);
768 assert_se(streq_ptr(unescaped
, "\\x"));
769 unescaped
= mfree(unescaped
);
771 assert_se(cunescape("\\", 0, &unescaped
) < 0);
772 assert_se(cunescape("\\", UNESCAPE_RELAX
, &unescaped
) >= 0);
773 assert_se(streq_ptr(unescaped
, "\\"));
774 unescaped
= mfree(unescaped
);
776 assert_se(cunescape("\\11", 0, &unescaped
) < 0);
777 assert_se(cunescape("\\11", UNESCAPE_RELAX
, &unescaped
) >= 0);
778 assert_se(streq_ptr(unescaped
, "\\11"));
779 unescaped
= mfree(unescaped
);
781 assert_se(cunescape("\\1", 0, &unescaped
) < 0);
782 assert_se(cunescape("\\1", UNESCAPE_RELAX
, &unescaped
) >= 0);
783 assert_se(streq_ptr(unescaped
, "\\1"));
784 unescaped
= mfree(unescaped
);
786 assert_se(cunescape("\\u0000", 0, &unescaped
) < 0);
787 assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX
, &unescaped
) >= 0);
788 assert_se(streq_ptr(unescaped
, "ßßΠA"));
789 unescaped
= mfree(unescaped
);
791 assert_se(cunescape("\\073", 0, &unescaped
) >= 0);
792 assert_se(streq_ptr(unescaped
, ";"));
795 static void test_foreach_word(void) {
796 const char *word
, *state
;
799 const char test
[] = "test abc d\te f ";
800 const char * const expected
[] = {
810 FOREACH_WORD(word
, l
, test
, state
)
811 assert_se(strneq(expected
[i
++], word
, l
));
814 static void check(const char *test
, char** expected
, bool trailing
) {
815 const char *word
, *state
;
819 printf("<<<%s>>>\n", test
);
820 FOREACH_WORD_QUOTED(word
, l
, test
, state
) {
821 _cleanup_free_
char *t
= NULL
;
823 assert_se(t
= strndup(word
, l
));
824 assert_se(strneq(expected
[i
++], word
, l
));
827 printf("<<<%s>>>\n", state
);
828 assert_se(expected
[i
] == NULL
);
829 assert_se(isempty(state
) == !trailing
);
832 static void test_foreach_word_quoted(void) {
833 check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
857 static void test_memdup_multiply(void) {
858 int org
[] = {1, 2, 3};
861 dup
= (int*)memdup_multiply(org
, sizeof(int), 3);
864 assert_se(dup
[0] == 1);
865 assert_se(dup
[1] == 2);
866 assert_se(dup
[2] == 3);
870 static void test_u64log2(void) {
871 assert_se(u64log2(0) == 0);
872 assert_se(u64log2(8) == 3);
873 assert_se(u64log2(9) == 3);
874 assert_se(u64log2(15) == 3);
875 assert_se(u64log2(16) == 4);
876 assert_se(u64log2(1024*1024) == 20);
877 assert_se(u64log2(1024*1024+5) == 20);
880 static void test_protect_errno(void) {
886 assert_se(errno
== 12);
889 static void test_parse_size(void) {
892 assert_se(parse_size("111", 1024, &bytes
) == 0);
893 assert_se(bytes
== 111);
895 assert_se(parse_size("111.4", 1024, &bytes
) == 0);
896 assert_se(bytes
== 111);
898 assert_se(parse_size(" 112 B", 1024, &bytes
) == 0);
899 assert_se(bytes
== 112);
901 assert_se(parse_size(" 112.6 B", 1024, &bytes
) == 0);
902 assert_se(bytes
== 112);
904 assert_se(parse_size("3.5 K", 1024, &bytes
) == 0);
905 assert_se(bytes
== 3*1024 + 512);
907 assert_se(parse_size("3. K", 1024, &bytes
) == 0);
908 assert_se(bytes
== 3*1024);
910 assert_se(parse_size("3.0 K", 1024, &bytes
) == 0);
911 assert_se(bytes
== 3*1024);
913 assert_se(parse_size("3. 0 K", 1024, &bytes
) == -EINVAL
);
915 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes
) == 0);
916 assert_se(bytes
== 4*1024*1024 + 11 * 1024 + 512);
918 assert_se(parse_size("3B3.5G", 1024, &bytes
) == -EINVAL
);
920 assert_se(parse_size("3.5G3B", 1024, &bytes
) == 0);
921 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
923 assert_se(parse_size("3.5G 4B", 1024, &bytes
) == 0);
924 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
926 assert_se(parse_size("3B3G4T", 1024, &bytes
) == -EINVAL
);
928 assert_se(parse_size("4T3G3B", 1024, &bytes
) == 0);
929 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
931 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes
) == 0);
932 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
934 assert_se(parse_size("12P", 1024, &bytes
) == 0);
935 assert_se(bytes
== 12ULL * 1024*1024*1024*1024*1024);
937 assert_se(parse_size("12P12P", 1024, &bytes
) == -EINVAL
);
939 assert_se(parse_size("3E 2P", 1024, &bytes
) == 0);
940 assert_se(bytes
== (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
942 assert_se(parse_size("12X", 1024, &bytes
) == -EINVAL
);
944 assert_se(parse_size("12.5X", 1024, &bytes
) == -EINVAL
);
946 assert_se(parse_size("12.5e3", 1024, &bytes
) == -EINVAL
);
948 assert_se(parse_size("1024E", 1024, &bytes
) == -ERANGE
);
949 assert_se(parse_size("-1", 1024, &bytes
) == -ERANGE
);
950 assert_se(parse_size("-1024E", 1024, &bytes
) == -ERANGE
);
952 assert_se(parse_size("-1024P", 1024, &bytes
) == -ERANGE
);
954 assert_se(parse_size("-10B 20K", 1024, &bytes
) == -ERANGE
);
957 static void test_config_parse_iec_off(void) {
959 assert_se(config_parse_iec_off(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset
, NULL
) == 0);
960 assert_se(offset
== 4 * 1024 * 1024);
962 assert_se(config_parse_iec_off(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset
, NULL
) == 0);
965 static void test_strextend(void) {
966 _cleanup_free_
char *str
= strdup("0123");
967 strextend(&str
, "456", "78", "9", NULL
);
968 assert_se(streq(str
, "0123456789"));
971 static void test_strrep(void) {
972 _cleanup_free_
char *one
, *three
, *zero
;
973 one
= strrep("waldo", 1);
974 three
= strrep("waldo", 3);
975 zero
= strrep("waldo", 0);
977 assert_se(streq(one
, "waldo"));
978 assert_se(streq(three
, "waldowaldowaldo"));
979 assert_se(streq(zero
, ""));
982 static void test_split_pair(void) {
983 _cleanup_free_
char *a
= NULL
, *b
= NULL
;
985 assert_se(split_pair("", "", &a
, &b
) == -EINVAL
);
986 assert_se(split_pair("foo=bar", "", &a
, &b
) == -EINVAL
);
987 assert_se(split_pair("", "=", &a
, &b
) == -EINVAL
);
988 assert_se(split_pair("foo=bar", "=", &a
, &b
) >= 0);
989 assert_se(streq(a
, "foo"));
990 assert_se(streq(b
, "bar"));
993 assert_se(split_pair("==", "==", &a
, &b
) >= 0);
994 assert_se(streq(a
, ""));
995 assert_se(streq(b
, ""));
999 assert_se(split_pair("===", "==", &a
, &b
) >= 0);
1000 assert_se(streq(a
, ""));
1001 assert_se(streq(b
, "="));
1004 static void test_fstab_node_to_udev_node(void) {
1007 n
= fstab_node_to_udev_node("LABEL=applé/jack");
1009 assert_se(streq(n
, "/dev/disk/by-label/applé\\x2fjack"));
1012 n
= fstab_node_to_udev_node("PARTLABEL=pinkié pie");
1014 assert_se(streq(n
, "/dev/disk/by-partlabel/pinkié\\x20pie"));
1017 n
= fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1019 assert_se(streq(n
, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1022 n
= fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1024 assert_se(streq(n
, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1027 n
= fstab_node_to_udev_node("PONIES=awesome");
1029 assert_se(streq(n
, "PONIES=awesome"));
1032 n
= fstab_node_to_udev_node("/dev/xda1");
1034 assert_se(streq(n
, "/dev/xda1"));
1038 static void test_get_files_in_directory(void) {
1039 _cleanup_strv_free_
char **l
= NULL
, **t
= NULL
;
1041 assert_se(get_files_in_directory("/tmp", &l
) >= 0);
1042 assert_se(get_files_in_directory(".", &t
) >= 0);
1043 assert_se(get_files_in_directory(".", NULL
) >= 0);
1046 static void test_in_set(void) {
1047 assert_se(IN_SET(1, 1));
1048 assert_se(IN_SET(1, 1, 2, 3, 4));
1049 assert_se(IN_SET(2, 1, 2, 3, 4));
1050 assert_se(IN_SET(3, 1, 2, 3, 4));
1051 assert_se(IN_SET(4, 1, 2, 3, 4));
1052 assert_se(!IN_SET(0, 1));
1053 assert_se(!IN_SET(0, 1, 2, 3, 4));
1056 static void test_writing_tmpfile(void) {
1057 char name
[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
1058 _cleanup_free_
char *contents
= NULL
;
1061 struct iovec iov
[3];
1063 IOVEC_SET_STRING(iov
[0], "abc\n");
1064 IOVEC_SET_STRING(iov
[1], ALPHANUMERICAL
"\n");
1065 IOVEC_SET_STRING(iov
[2], "");
1067 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1068 printf("tmpfile: %s", name
);
1070 r
= writev(fd
, iov
, 3);
1073 r
= read_full_file(name
, &contents
, &size
);
1075 printf("contents: %s", contents
);
1076 assert_se(streq(contents
, "abc\n" ALPHANUMERICAL
"\n"));
1081 static void test_hexdump(void) {
1085 hexdump(stdout
, NULL
, 0);
1086 hexdump(stdout
, "", 0);
1087 hexdump(stdout
, "", 1);
1088 hexdump(stdout
, "x", 1);
1089 hexdump(stdout
, "x", 2);
1090 hexdump(stdout
, "foobar", 7);
1091 hexdump(stdout
, "f\nobar", 7);
1092 hexdump(stdout
, "xxxxxxxxxxxxxxxxxxxxyz", 23);
1094 for (i
= 0; i
< ELEMENTSOF(data
); i
++)
1097 hexdump(stdout
, data
, sizeof(data
));
1100 static void test_log2i(void) {
1101 assert_se(log2i(1) == 0);
1102 assert_se(log2i(2) == 1);
1103 assert_se(log2i(3) == 1);
1104 assert_se(log2i(4) == 2);
1105 assert_se(log2i(32) == 5);
1106 assert_se(log2i(33) == 5);
1107 assert_se(log2i(63) == 5);
1108 assert_se(log2i(INT_MAX
) == sizeof(int)*8-2);
1111 static void test_foreach_string(void) {
1112 const char * const t
[] = {
1121 FOREACH_STRING(x
, "foo", "bar", "waldo")
1122 assert_se(streq_ptr(t
[i
++], x
));
1126 FOREACH_STRING(x
, "zzz")
1127 assert_se(streq(x
, "zzz"));
1130 static void test_filename_is_valid(void) {
1131 char foo
[FILENAME_MAX
+2];
1134 assert_se(!filename_is_valid(""));
1135 assert_se(!filename_is_valid("/bar/foo"));
1136 assert_se(!filename_is_valid("/"));
1137 assert_se(!filename_is_valid("."));
1138 assert_se(!filename_is_valid(".."));
1140 for (i
=0; i
<FILENAME_MAX
+1; i
++)
1142 foo
[FILENAME_MAX
+1] = '\0';
1144 assert_se(!filename_is_valid(foo
));
1146 assert_se(filename_is_valid("foo_bar-333"));
1147 assert_se(filename_is_valid("o.o"));
1150 static void test_string_has_cc(void) {
1151 assert_se(string_has_cc("abc\1", NULL
));
1152 assert_se(string_has_cc("abc\x7f", NULL
));
1153 assert_se(string_has_cc("abc\x7f", NULL
));
1154 assert_se(string_has_cc("abc\t\x7f", "\t"));
1155 assert_se(string_has_cc("abc\t\x7f", "\t"));
1156 assert_se(string_has_cc("\x7f", "\t"));
1157 assert_se(string_has_cc("\x7f", "\t\a"));
1159 assert_se(!string_has_cc("abc\t\t", "\t"));
1160 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
1161 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
1164 static void test_ascii_strlower(void) {
1165 char a
[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
1166 assert_se(streq(ascii_strlower(a
), "aabbcc jk ii od lkjjj kkd lk"));
1169 static void test_files_same(void) {
1170 _cleanup_close_
int fd
= -1;
1171 char name
[] = "/tmp/test-files_same.XXXXXX";
1172 char name_alias
[] = "/tmp/test-files_same.alias";
1174 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1176 assert_se(symlink(name
, name_alias
) >= 0);
1178 assert_se(files_same(name
, name
));
1179 assert_se(files_same(name
, name_alias
));
1185 static void test_is_valid_documentation_url(void) {
1186 assert_se(documentation_url_is_valid("http://www.freedesktop.org/wiki/Software/systemd"));
1187 assert_se(documentation_url_is_valid("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
1188 assert_se(documentation_url_is_valid("file:/foo/foo"));
1189 assert_se(documentation_url_is_valid("man:systemd.special(7)"));
1190 assert_se(documentation_url_is_valid("info:bar"));
1192 assert_se(!documentation_url_is_valid("foo:"));
1193 assert_se(!documentation_url_is_valid("info:"));
1194 assert_se(!documentation_url_is_valid(""));
1197 static void test_file_in_same_dir(void) {
1200 t
= file_in_same_dir("/", "a");
1201 assert_se(streq(t
, "/a"));
1204 t
= file_in_same_dir("/", "/a");
1205 assert_se(streq(t
, "/a"));
1208 t
= file_in_same_dir("", "a");
1209 assert_se(streq(t
, "a"));
1212 t
= file_in_same_dir("a/", "a");
1213 assert_se(streq(t
, "a/a"));
1216 t
= file_in_same_dir("bar/foo", "bar");
1217 assert_se(streq(t
, "bar/bar"));
1221 static void test_endswith(void) {
1222 assert_se(endswith("foobar", "bar"));
1223 assert_se(endswith("foobar", ""));
1224 assert_se(endswith("foobar", "foobar"));
1225 assert_se(endswith("", ""));
1227 assert_se(!endswith("foobar", "foo"));
1228 assert_se(!endswith("foobar", "foobarfoofoo"));
1231 static void test_endswith_no_case(void) {
1232 assert_se(endswith_no_case("fooBAR", "bar"));
1233 assert_se(endswith_no_case("foobar", ""));
1234 assert_se(endswith_no_case("foobar", "FOOBAR"));
1235 assert_se(endswith_no_case("", ""));
1237 assert_se(!endswith_no_case("foobar", "FOO"));
1238 assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
1241 static void test_close_nointr(void) {
1242 char name
[] = "/tmp/test-test-close_nointr.XXXXXX";
1245 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1247 assert_se(close_nointr(fd
) >= 0);
1248 assert_se(close_nointr(fd
) < 0);
1254 static void test_unlink_noerrno(void) {
1255 char name
[] = "/tmp/test-close_nointr.XXXXXX";
1258 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1260 assert_se(close_nointr(fd
) >= 0);
1265 assert_se(unlink_noerrno(name
) >= 0);
1266 assert_se(errno
== -42);
1267 assert_se(unlink_noerrno(name
) < 0);
1268 assert_se(errno
== -42);
1272 static void test_readlink_and_make_absolute(void) {
1273 char tempdir
[] = "/tmp/test-readlink_and_make_absolute";
1274 char name
[] = "/tmp/test-readlink_and_make_absolute/original";
1275 char name2
[] = "test-readlink_and_make_absolute/original";
1276 char name_alias
[] = "/tmp/test-readlink_and_make_absolute-alias";
1279 assert_se(mkdir_safe(tempdir
, 0755, getuid(), getgid()) >= 0);
1280 assert_se(touch(name
) >= 0);
1282 assert_se(symlink(name
, name_alias
) >= 0);
1283 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1284 assert_se(streq(r
, name
));
1286 assert_se(unlink(name_alias
) >= 0);
1288 assert_se(chdir(tempdir
) >= 0);
1289 assert_se(symlink(name2
, name_alias
) >= 0);
1290 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1291 assert_se(streq(r
, name
));
1293 assert_se(unlink(name_alias
) >= 0);
1295 assert_se(rm_rf(tempdir
, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);
1298 static void test_ignore_signals(void) {
1299 assert_se(ignore_signals(SIGINT
, -1) >= 0);
1300 assert_se(kill(getpid(), SIGINT
) >= 0);
1301 assert_se(ignore_signals(SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1302 assert_se(kill(getpid(), SIGUSR1
) >= 0);
1303 assert_se(kill(getpid(), SIGUSR2
) >= 0);
1304 assert_se(kill(getpid(), SIGTERM
) >= 0);
1305 assert_se(kill(getpid(), SIGPIPE
) >= 0);
1306 assert_se(default_signals(SIGINT
, SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1309 static void test_strshorten(void) {
1310 char s
[] = "foobar";
1312 assert_se(strlen(strshorten(s
, 6)) == 6);
1313 assert_se(strlen(strshorten(s
, 12)) == 6);
1314 assert_se(strlen(strshorten(s
, 2)) == 2);
1315 assert_se(strlen(strshorten(s
, 0)) == 0);
1318 static void test_strjoina(void) {
1321 actual
= strjoina("", "foo", "bar");
1322 assert_se(streq(actual
, "foobar"));
1324 actual
= strjoina("foo", "bar", "baz");
1325 assert_se(streq(actual
, "foobarbaz"));
1327 actual
= strjoina("foo", "", "bar", "baz");
1328 assert_se(streq(actual
, "foobarbaz"));
1330 actual
= strjoina("foo");
1331 assert_se(streq(actual
, "foo"));
1333 actual
= strjoina(NULL
);
1334 assert_se(streq(actual
, ""));
1336 actual
= strjoina(NULL
, "foo");
1337 assert_se(streq(actual
, ""));
1339 actual
= strjoina("foo", NULL
, "bar");
1340 assert_se(streq(actual
, "foo"));
1343 static void test_is_symlink(void) {
1344 char name
[] = "/tmp/test-is_symlink.XXXXXX";
1345 char name_link
[] = "/tmp/test-is_symlink.link";
1346 _cleanup_close_
int fd
= -1;
1348 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1350 assert_se(symlink(name
, name_link
) >= 0);
1352 assert_se(is_symlink(name
) == 0);
1353 assert_se(is_symlink(name_link
) == 1);
1354 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
1361 static void test_search_and_fopen(void) {
1362 const char *dirs
[] = {"/tmp/foo/bar", "/tmp", NULL
};
1363 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1368 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1372 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1376 r
= search_and_fopen(name
, "r", NULL
, dirs
, &f
);
1380 r
= search_and_fopen(basename(name
), "r", "/", dirs
, &f
);
1384 r
= search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1386 r
= search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1392 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1397 static void test_search_and_fopen_nulstr(void) {
1398 const char dirs
[] = "/tmp/foo/bar\0/tmp\0";
1399 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1404 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1408 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1412 r
= search_and_fopen_nulstr(name
, "r", NULL
, dirs
, &f
);
1416 r
= search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1418 r
= search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1424 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1428 static void test_glob_exists(void) {
1429 char name
[] = "/tmp/test-glob_exists.XXXXXX";
1433 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1437 r
= glob_exists("/tmp/test-glob_exists*");
1442 r
= glob_exists("/tmp/test-glob_exists*");
1446 static void test_execute_directory(void) {
1447 char template_lo
[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
1448 char template_hi
[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
1449 const char * dirs
[] = {template_hi
, template_lo
, NULL
};
1450 const char *name
, *name2
, *name3
, *overridden
, *override
, *masked
, *mask
;
1452 assert_se(mkdtemp(template_lo
));
1453 assert_se(mkdtemp(template_hi
));
1455 name
= strjoina(template_lo
, "/script");
1456 name2
= strjoina(template_hi
, "/script2");
1457 name3
= strjoina(template_lo
, "/useless");
1458 overridden
= strjoina(template_lo
, "/overridden");
1459 override
= strjoina(template_hi
, "/overridden");
1460 masked
= strjoina(template_lo
, "/masked");
1461 mask
= strjoina(template_hi
, "/masked");
1463 assert_se(write_string_file(name
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE
) == 0);
1464 assert_se(write_string_file(name2
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE
) == 0);
1465 assert_se(write_string_file(overridden
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1466 assert_se(write_string_file(override
, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE
) == 0);
1467 assert_se(write_string_file(masked
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1468 assert_se(symlink("/dev/null", mask
) == 0);
1469 assert_se(chmod(name
, 0755) == 0);
1470 assert_se(chmod(name2
, 0755) == 0);
1471 assert_se(chmod(overridden
, 0755) == 0);
1472 assert_se(chmod(override
, 0755) == 0);
1473 assert_se(chmod(masked
, 0755) == 0);
1474 assert_se(touch(name3
) >= 0);
1476 execute_directories(dirs
, DEFAULT_TIMEOUT_USEC
, NULL
);
1478 assert_se(chdir(template_lo
) == 0);
1479 assert_se(access("it_works", F_OK
) >= 0);
1480 assert_se(access("failed", F_OK
) < 0);
1482 assert_se(chdir(template_hi
) == 0);
1483 assert_se(access("it_works2", F_OK
) >= 0);
1484 assert_se(access("failed", F_OK
) < 0);
1486 (void) rm_rf(template_lo
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1487 (void) rm_rf(template_hi
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1490 static void test_extract_first_word(void) {
1491 const char *p
, *original
;
1494 p
= original
= "foobar waldo";
1495 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1496 assert_se(streq(t
, "foobar"));
1498 assert_se(p
== original
+ 7);
1500 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1501 assert_se(streq(t
, "waldo"));
1503 assert_se(isempty(p
));
1505 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1507 assert_se(isempty(p
));
1509 p
= original
= "\"foobar\" \'waldo\'";
1510 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1511 assert_se(streq(t
, "\"foobar\""));
1513 assert_se(p
== original
+ 9);
1515 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1516 assert_se(streq(t
, "\'waldo\'"));
1518 assert_se(isempty(p
));
1520 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1522 assert_se(isempty(p
));
1524 p
= original
= "\"foobar\" \'waldo\'";
1525 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1526 assert_se(streq(t
, "foobar"));
1528 assert_se(p
== original
+ 9);
1530 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1531 assert_se(streq(t
, "waldo"));
1533 assert_se(isempty(p
));
1535 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1537 assert_se(isempty(p
));
1539 p
= original
= "\"";
1540 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1541 assert_se(streq(t
, "\""));
1543 assert_se(isempty(p
));
1545 p
= original
= "\"";
1546 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1547 assert_se(p
== original
+ 1);
1549 p
= original
= "\'";
1550 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1551 assert_se(streq(t
, "\'"));
1553 assert_se(isempty(p
));
1555 p
= original
= "\'";
1556 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1557 assert_se(p
== original
+ 1);
1559 p
= original
= "\'fooo";
1560 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1561 assert_se(streq(t
, "\'fooo"));
1563 assert_se(isempty(p
));
1565 p
= original
= "\'fooo";
1566 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1567 assert_se(p
== original
+ 5);
1569 p
= original
= "\'fooo";
1570 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1571 assert_se(streq(t
, "fooo"));
1573 assert_se(isempty(p
));
1575 p
= original
= "yay\'foo\'bar";
1576 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1577 assert_se(streq(t
, "yay\'foo\'bar"));
1579 assert_se(isempty(p
));
1581 p
= original
= "yay\'foo\'bar";
1582 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1583 assert_se(streq(t
, "yayfoobar"));
1585 assert_se(isempty(p
));
1587 p
= original
= " foobar ";
1588 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1589 assert_se(streq(t
, "foobar"));
1591 assert_se(isempty(p
));
1593 p
= original
= " foo\\ba\\x6ar ";
1594 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1595 assert_se(streq(t
, "foo\ba\x6ar"));
1597 assert_se(isempty(p
));
1599 p
= original
= " foo\\ba\\x6ar ";
1600 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1601 assert_se(streq(t
, "foobax6ar"));
1603 assert_se(isempty(p
));
1605 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1606 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1607 assert_se(streq(t
, "föo"));
1609 assert_se(p
== original
+ 13);
1611 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
) > 0);
1612 assert_se(streq(t
, "pi\360\237\222\251le"));
1614 assert_se(isempty(p
));
1616 p
= original
= "fooo\\";
1617 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1618 assert_se(streq(t
, "fooo"));
1620 assert_se(isempty(p
));
1622 p
= original
= "fooo\\";
1623 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1624 assert_se(streq(t
, "fooo\\"));
1626 assert_se(isempty(p
));
1628 p
= original
= "fooo\\";
1629 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1630 assert_se(streq(t
, "fooo\\"));
1632 assert_se(isempty(p
));
1634 p
= original
= "fooo\\";
1635 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1636 assert_se(streq(t
, "fooo\\"));
1638 assert_se(isempty(p
));
1640 p
= original
= "\"foo\\";
1641 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == -EINVAL
);
1642 assert_se(p
== original
+ 5);
1644 p
= original
= "\"foo\\";
1645 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1646 assert_se(streq(t
, "foo"));
1648 assert_se(isempty(p
));
1650 p
= original
= "foo::bar";
1651 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1652 assert_se(streq(t
, "foo"));
1654 assert_se(p
== original
+ 5);
1656 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1657 assert_se(streq(t
, "bar"));
1659 assert_se(isempty(p
));
1661 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1663 assert_se(isempty(p
));
1665 p
= original
= "foo\\:bar::waldo";
1666 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1667 assert_se(streq(t
, "foo:bar"));
1669 assert_se(p
== original
+ 10);
1671 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1672 assert_se(streq(t
, "waldo"));
1674 assert_se(isempty(p
));
1676 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1678 assert_se(isempty(p
));
1680 p
= original
= "\"foo\\";
1681 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
) == -EINVAL
);
1682 assert_se(p
== original
+ 5);
1684 p
= original
= "\"foo\\";
1685 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1686 assert_se(streq(t
, "foo\\"));
1688 assert_se(isempty(p
));
1690 p
= original
= "\"foo\\";
1691 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1692 assert_se(streq(t
, "foo\\"));
1694 assert_se(isempty(p
));
1696 p
= original
= "fooo\\ bar quux";
1697 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1698 assert_se(streq(t
, "fooo bar"));
1700 assert_se(p
== original
+ 10);
1702 p
= original
= "fooo\\ bar quux";
1703 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1704 assert_se(streq(t
, "fooo bar"));
1706 assert_se(p
== original
+ 10);
1708 p
= original
= "fooo\\ bar quux";
1709 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1710 assert_se(streq(t
, "fooo bar"));
1712 assert_se(p
== original
+ 10);
1714 p
= original
= "fooo\\ bar quux";
1715 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1716 assert_se(p
== original
+ 5);
1718 p
= original
= "fooo\\ bar quux";
1719 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1720 assert_se(streq(t
, "fooo\\ bar"));
1722 assert_se(p
== original
+ 10);
1724 p
= original
= "\\w+@\\K[\\d.]+";
1725 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1726 assert_se(p
== original
+ 1);
1728 p
= original
= "\\w+@\\K[\\d.]+";
1729 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1730 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1732 assert_se(isempty(p
));
1734 p
= original
= "\\w+\\b";
1735 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1736 assert_se(streq(t
, "\\w+\b"));
1738 assert_se(isempty(p
));
1740 p
= original
= "-N ''";
1741 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1742 assert_se(streq(t
, "-N"));
1744 assert_se(p
== original
+ 3);
1746 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1747 assert_se(streq(t
, ""));
1749 assert_se(isempty(p
));
1751 p
= original
= ":foo\\:bar::waldo:";
1752 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1754 assert_se(streq(t
, ""));
1756 assert_se(p
== original
+ 1);
1758 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1759 assert_se(streq(t
, "foo:bar"));
1761 assert_se(p
== original
+ 10);
1763 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1765 assert_se(streq(t
, ""));
1767 assert_se(p
== original
+ 11);
1769 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1770 assert_se(streq(t
, "waldo"));
1772 assert_se(p
== original
+ 17);
1774 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1775 assert_se(streq(t
, ""));
1777 assert_se(p
== NULL
);
1779 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 0);
1784 static void test_extract_first_word_and_warn(void) {
1785 const char *p
, *original
;
1788 p
= original
= "foobar waldo";
1789 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1790 assert_se(streq(t
, "foobar"));
1792 assert_se(p
== original
+ 7);
1794 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1795 assert_se(streq(t
, "waldo"));
1797 assert_se(isempty(p
));
1799 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1801 assert_se(isempty(p
));
1803 p
= original
= "\"foobar\" \'waldo\'";
1804 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1805 assert_se(streq(t
, "foobar"));
1807 assert_se(p
== original
+ 9);
1809 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1810 assert_se(streq(t
, "waldo"));
1812 assert_se(isempty(p
));
1814 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1816 assert_se(isempty(p
));
1818 p
= original
= "\"";
1819 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1820 assert_se(p
== original
+ 1);
1822 p
= original
= "\'";
1823 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1824 assert_se(p
== original
+ 1);
1826 p
= original
= "\'fooo";
1827 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1828 assert_se(p
== original
+ 5);
1830 p
= original
= "\'fooo";
1831 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1832 assert_se(streq(t
, "fooo"));
1834 assert_se(isempty(p
));
1836 p
= original
= " foo\\ba\\x6ar ";
1837 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1838 assert_se(streq(t
, "foo\ba\x6ar"));
1840 assert_se(isempty(p
));
1842 p
= original
= " foo\\ba\\x6ar ";
1843 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1844 assert_se(streq(t
, "foobax6ar"));
1846 assert_se(isempty(p
));
1848 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1849 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1850 assert_se(streq(t
, "föo"));
1852 assert_se(p
== original
+ 13);
1854 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1855 assert_se(streq(t
, "pi\360\237\222\251le"));
1857 assert_se(isempty(p
));
1859 p
= original
= "fooo\\";
1860 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1861 assert_se(streq(t
, "fooo"));
1863 assert_se(isempty(p
));
1865 p
= original
= "fooo\\";
1866 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1867 assert_se(streq(t
, "fooo\\"));
1869 assert_se(isempty(p
));
1871 p
= original
= "fooo\\";
1872 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1873 assert_se(streq(t
, "fooo\\"));
1875 assert_se(isempty(p
));
1877 p
= original
= "\"foo\\";
1878 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1879 assert_se(p
== original
+ 5);
1881 p
= original
= "\"foo\\";
1882 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1883 assert_se(streq(t
, "foo"));
1885 assert_se(isempty(p
));
1887 p
= original
= "\"foo\\";
1888 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) == -EINVAL
);
1889 assert_se(p
== original
+ 5);
1891 p
= original
= "\"foo\\";
1892 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1893 assert_se(streq(t
, "foo"));
1895 assert_se(isempty(p
));
1897 p
= original
= "fooo\\ bar quux";
1898 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1899 assert_se(streq(t
, "fooo bar"));
1901 assert_se(p
== original
+ 10);
1903 p
= original
= "fooo\\ bar quux";
1904 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1905 assert_se(streq(t
, "fooo bar"));
1907 assert_se(p
== original
+ 10);
1909 p
= original
= "fooo\\ bar quux";
1910 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1911 assert_se(streq(t
, "fooo\\ bar"));
1913 assert_se(p
== original
+ 10);
1915 p
= original
= "\\w+@\\K[\\d.]+";
1916 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1917 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1919 assert_se(isempty(p
));
1921 p
= original
= "\\w+\\b";
1922 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1923 assert_se(streq(t
, "\\w+\b"));
1925 assert_se(isempty(p
));
1928 static void test_extract_many_words(void) {
1929 const char *p
, *original
;
1932 p
= original
= "foobar waldi piep";
1933 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 3);
1934 assert_se(isempty(p
));
1935 assert_se(streq_ptr(a
, "foobar"));
1936 assert_se(streq_ptr(b
, "waldi"));
1937 assert_se(streq_ptr(c
, "piep"));
1942 p
= original
= "'foobar' wa\"ld\"i ";
1943 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 2);
1944 assert_se(isempty(p
));
1945 assert_se(streq_ptr(a
, "'foobar'"));
1946 assert_se(streq_ptr(b
, "wa\"ld\"i"));
1947 assert_se(streq_ptr(c
, NULL
));
1951 p
= original
= "'foobar' wa\"ld\"i ";
1952 assert_se(extract_many_words(&p
, NULL
, EXTRACT_QUOTES
, &a
, &b
, &c
, NULL
) == 2);
1953 assert_se(isempty(p
));
1954 assert_se(streq_ptr(a
, "foobar"));
1955 assert_se(streq_ptr(b
, "waldi"));
1956 assert_se(streq_ptr(c
, NULL
));
1961 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
1962 assert_se(isempty(p
));
1963 assert_se(streq_ptr(a
, NULL
));
1964 assert_se(streq_ptr(b
, NULL
));
1965 assert_se(streq_ptr(c
, NULL
));
1968 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
1969 assert_se(isempty(p
));
1970 assert_se(streq_ptr(a
, NULL
));
1971 assert_se(streq_ptr(b
, NULL
));
1972 assert_se(streq_ptr(c
, NULL
));
1974 p
= original
= "foobar";
1975 assert_se(extract_many_words(&p
, NULL
, 0, NULL
) == 0);
1976 assert_se(p
== original
);
1978 p
= original
= "foobar waldi";
1979 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
1980 assert_se(p
== original
+7);
1981 assert_se(streq_ptr(a
, "foobar"));
1984 p
= original
= " foobar ";
1985 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
1986 assert_se(isempty(p
));
1987 assert_se(streq_ptr(a
, "foobar"));
1991 static int parse_item(const char *key
, const char *value
) {
1994 log_info("kernel cmdline option <%s> = <%s>", key
, strna(value
));
1998 static void test_parse_proc_cmdline(void) {
1999 assert_se(parse_proc_cmdline(parse_item
) >= 0);
2002 static void test_raw_clone(void) {
2003 pid_t parent
, pid
, pid2
;
2006 log_info("before clone: getpid()→"PID_FMT
, parent
);
2007 assert_se(raw_getpid() == parent
);
2009 pid
= raw_clone(0, NULL
);
2010 assert_se(pid
>= 0);
2012 pid2
= raw_getpid();
2013 log_info("raw_clone: "PID_FMT
" getpid()→"PID_FMT
" raw_getpid()→"PID_FMT
,
2014 pid
, getpid(), pid2
);
2016 assert_se(pid2
!= parent
);
2017 _exit(EXIT_SUCCESS
);
2021 assert_se(pid2
== parent
);
2022 waitpid(pid
, &status
, __WCLONE
);
2023 assert_se(WIFEXITED(status
) && WEXITSTATUS(status
) == EXIT_SUCCESS
);
2027 static void test_same_fd(void) {
2028 _cleanup_close_pair_
int p
[2] = { -1, -1 };
2029 _cleanup_close_
int a
= -1, b
= -1, c
= -1;
2031 assert_se(pipe2(p
, O_CLOEXEC
) >= 0);
2032 assert_se((a
= dup(p
[0])) >= 0);
2033 assert_se((b
= open("/dev/null", O_RDONLY
|O_CLOEXEC
)) >= 0);
2034 assert_se((c
= dup(a
)) >= 0);
2036 assert_se(same_fd(p
[0], p
[0]) > 0);
2037 assert_se(same_fd(p
[1], p
[1]) > 0);
2038 assert_se(same_fd(a
, a
) > 0);
2039 assert_se(same_fd(b
, b
) > 0);
2041 assert_se(same_fd(a
, p
[0]) > 0);
2042 assert_se(same_fd(p
[0], a
) > 0);
2043 assert_se(same_fd(c
, p
[0]) > 0);
2044 assert_se(same_fd(p
[0], c
) > 0);
2045 assert_se(same_fd(a
, c
) > 0);
2046 assert_se(same_fd(c
, a
) > 0);
2048 assert_se(same_fd(p
[0], p
[1]) == 0);
2049 assert_se(same_fd(p
[1], p
[0]) == 0);
2050 assert_se(same_fd(p
[0], b
) == 0);
2051 assert_se(same_fd(b
, p
[0]) == 0);
2052 assert_se(same_fd(p
[1], a
) == 0);
2053 assert_se(same_fd(a
, p
[1]) == 0);
2054 assert_se(same_fd(p
[1], b
) == 0);
2055 assert_se(same_fd(b
, p
[1]) == 0);
2057 assert_se(same_fd(a
, b
) == 0);
2058 assert_se(same_fd(b
, a
) == 0);
2061 static void test_uid_ptr(void) {
2063 assert_se(UID_TO_PTR(0) != NULL
);
2064 assert_se(UID_TO_PTR(1000) != NULL
);
2066 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
2067 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
2070 static void test_sparse_write_one(int fd
, const char *buffer
, size_t n
) {
2073 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2074 assert_se(ftruncate(fd
, 0) >= 0);
2075 assert_se(sparse_write(fd
, buffer
, n
, 4) == (ssize_t
) n
);
2077 assert_se(lseek(fd
, 0, SEEK_CUR
) == (off_t
) n
);
2078 assert_se(ftruncate(fd
, n
) >= 0);
2080 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2081 assert_se(read(fd
, check
, n
) == (ssize_t
) n
);
2083 assert_se(memcmp(buffer
, check
, n
) == 0);
2086 static void test_sparse_write(void) {
2087 const char test_a
[] = "test";
2088 const char test_b
[] = "\0\0\0\0test\0\0\0\0";
2089 const char test_c
[] = "\0\0test\0\0\0\0";
2090 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";
2091 const char test_e
[] = "test\0\0\0\0test";
2092 _cleanup_close_
int fd
= -1;
2093 char fn
[] = "/tmp/sparseXXXXXX";
2095 fd
= mkostemp(fn
, O_CLOEXEC
);
2099 test_sparse_write_one(fd
, test_a
, sizeof(test_a
));
2100 test_sparse_write_one(fd
, test_b
, sizeof(test_b
));
2101 test_sparse_write_one(fd
, test_c
, sizeof(test_c
));
2102 test_sparse_write_one(fd
, test_d
, sizeof(test_d
));
2103 test_sparse_write_one(fd
, test_e
, sizeof(test_e
));
2106 static void test_shell_escape_one(const char *s
, const char *bad
, const char *expected
) {
2107 _cleanup_free_
char *r
;
2109 assert_se(r
= shell_escape(s
, bad
));
2110 assert_se(streq_ptr(r
, expected
));
2113 static void test_shell_escape(void) {
2114 test_shell_escape_one("", "", "");
2115 test_shell_escape_one("\\", "", "\\\\");
2116 test_shell_escape_one("foobar", "", "foobar");
2117 test_shell_escape_one("foobar", "o", "f\\o\\obar");
2118 test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz");
2121 static void test_shell_maybe_quote_one(const char *s
, const char *expected
) {
2122 _cleanup_free_
char *r
;
2124 assert_se(r
= shell_maybe_quote(s
));
2125 assert_se(streq(r
, expected
));
2128 static void test_shell_maybe_quote(void) {
2130 test_shell_maybe_quote_one("", "");
2131 test_shell_maybe_quote_one("\\", "\"\\\\\"");
2132 test_shell_maybe_quote_one("\"", "\"\\\"\"");
2133 test_shell_maybe_quote_one("foobar", "foobar");
2134 test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
2135 test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
2136 test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
2139 static void test_parse_mode(void) {
2142 assert_se(parse_mode("-1", &m
) < 0);
2143 assert_se(parse_mode("", &m
) < 0);
2144 assert_se(parse_mode("888", &m
) < 0);
2145 assert_se(parse_mode("77777", &m
) < 0);
2147 assert_se(parse_mode("544", &m
) >= 0 && m
== 0544);
2148 assert_se(parse_mode("777", &m
) >= 0 && m
== 0777);
2149 assert_se(parse_mode("7777", &m
) >= 0 && m
== 07777);
2150 assert_se(parse_mode("0", &m
) >= 0 && m
== 0);
2153 static void test_tempfn(void) {
2154 char *ret
= NULL
, *p
;
2156 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL
, &ret
) >= 0);
2157 assert_se(streq_ptr(ret
, "/foo/bar/.#waldoXXXXXX"));
2160 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret
) >= 0);
2161 assert_se(streq_ptr(ret
, "/foo/bar/.#[miau]waldoXXXXXX"));
2164 assert_se(tempfn_random("/foo/bar/waldo", NULL
, &ret
) >= 0);
2165 assert_se(p
= startswith(ret
, "/foo/bar/.#waldo"));
2166 assert_se(strlen(p
) == 16);
2167 assert_se(in_charset(p
, "0123456789abcdef"));
2170 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret
) >= 0);
2171 assert_se(p
= startswith(ret
, "/foo/bar/.#[wuff]waldo"));
2172 assert_se(strlen(p
) == 16);
2173 assert_se(in_charset(p
, "0123456789abcdef"));
2176 assert_se(tempfn_random_child("/foo/bar/waldo", NULL
, &ret
) >= 0);
2177 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#"));
2178 assert_se(strlen(p
) == 16);
2179 assert_se(in_charset(p
, "0123456789abcdef"));
2182 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret
) >= 0);
2183 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#[kikiriki]"));
2184 assert_se(strlen(p
) == 16);
2185 assert_se(in_charset(p
, "0123456789abcdef"));
2189 static void test_strcmp_ptr(void) {
2190 assert_se(strcmp_ptr(NULL
, NULL
) == 0);
2191 assert_se(strcmp_ptr("", NULL
) > 0);
2192 assert_se(strcmp_ptr("foo", NULL
) > 0);
2193 assert_se(strcmp_ptr(NULL
, "") < 0);
2194 assert_se(strcmp_ptr(NULL
, "bar") < 0);
2195 assert_se(strcmp_ptr("foo", "bar") > 0);
2196 assert_se(strcmp_ptr("bar", "baz") < 0);
2197 assert_se(strcmp_ptr("foo", "foo") == 0);
2198 assert_se(strcmp_ptr("", "") == 0);
2201 int main(int argc
, char *argv
[]) {
2202 log_parse_environment();
2206 test_align_power2();
2208 test_container_of();
2210 test_div_round_up();
2213 test_parse_boolean();
2222 test_delete_chars();
2226 test_base32hexchar();
2227 test_unbase32hexchar();
2229 test_unbase64char();
2235 test_base32hexmem();
2236 test_unbase32hexmem();
2241 test_foreach_word();
2242 test_foreach_word_quoted();
2243 test_memdup_multiply();
2245 test_protect_errno();
2247 test_config_parse_iec_off();
2251 test_fstab_node_to_udev_node();
2252 test_get_files_in_directory();
2254 test_writing_tmpfile();
2257 test_foreach_string();
2258 test_filename_is_valid();
2259 test_string_has_cc();
2260 test_ascii_strlower();
2262 test_is_valid_documentation_url();
2263 test_file_in_same_dir();
2265 test_endswith_no_case();
2266 test_close_nointr();
2267 test_unlink_noerrno();
2268 test_readlink_and_make_absolute();
2269 test_ignore_signals();
2273 test_search_and_fopen();
2274 test_search_and_fopen_nulstr();
2276 test_execute_directory();
2277 test_extract_first_word();
2278 test_extract_first_word_and_warn();
2279 test_extract_many_words();
2280 test_parse_proc_cmdline();
2284 test_sparse_write();
2285 test_shell_escape();
2286 test_shell_maybe_quote();