]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-util.c
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 "hostname-util.h"
42 #include "signal-util.h"
44 static void test_streq_ptr(void) {
45 assert_se(streq_ptr(NULL
, NULL
));
46 assert_se(!streq_ptr("abc", "cdef"));
49 static void test_align_power2(void) {
52 assert_se(ALIGN_POWER2(0) == 0);
53 assert_se(ALIGN_POWER2(1) == 1);
54 assert_se(ALIGN_POWER2(2) == 2);
55 assert_se(ALIGN_POWER2(3) == 4);
56 assert_se(ALIGN_POWER2(12) == 16);
58 assert_se(ALIGN_POWER2(ULONG_MAX
) == 0);
59 assert_se(ALIGN_POWER2(ULONG_MAX
- 1) == 0);
60 assert_se(ALIGN_POWER2(ULONG_MAX
- 1024) == 0);
61 assert_se(ALIGN_POWER2(ULONG_MAX
/ 2) == ULONG_MAX
/ 2 + 1);
62 assert_se(ALIGN_POWER2(ULONG_MAX
+ 1) == 0);
64 for (i
= 1; i
< 131071; ++i
) {
65 for (p2
= 1; p2
< i
; p2
<<= 1)
68 assert_se(ALIGN_POWER2(i
) == p2
);
71 for (i
= ULONG_MAX
- 1024; i
< ULONG_MAX
; ++i
) {
72 for (p2
= 1; p2
&& p2
< i
; p2
<<= 1)
75 assert_se(ALIGN_POWER2(i
) == p2
);
79 static void test_max(void) {
82 int b
[CONST_MAX(10, 100)];
84 .a
= CONST_MAX(10, 100),
88 assert_cc(sizeof(val1
.b
) == sizeof(int) * 100);
90 /* CONST_MAX returns (void) instead of a value if the passed arguments
91 * are not of the same type or not constant expressions. */
92 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
93 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
95 assert_se(val1
.a
== 100);
96 assert_se(MAX(++d
, 0) == 1);
99 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
100 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
101 assert_cc(MAXSIZE(char, long) == sizeof(long));
103 assert_se(MAX(-5, 5) == 5);
104 assert_se(MAX(5, 5) == 5);
105 assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
106 assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
107 assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
108 assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
109 assert_se(LESS_BY(8, 4) == 4);
110 assert_se(LESS_BY(8, 8) == 0);
111 assert_se(LESS_BY(4, 8) == 0);
112 assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
113 assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
114 assert_se(CLAMP(-5, 0, 1) == 0);
115 assert_se(CLAMP(5, 0, 1) == 1);
116 assert_se(CLAMP(5, -10, 1) == 1);
117 assert_se(CLAMP(5, -10, 10) == 5);
118 assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
121 static void test_container_of(void) {
127 } _packed_ myval
= { };
129 assert_cc(sizeof(myval
) == 17);
130 assert_se(container_of(&myval
.v1
, struct mytype
, v1
) == &myval
);
131 assert_se(container_of(&myval
.v2
, struct mytype
, v2
) == &myval
);
132 assert_se(container_of(&container_of(&myval
.v2
,
139 static void test_alloca(void) {
140 static const uint8_t zero
[997] = { };
143 t
= alloca_align(17, 512);
144 assert_se(!((uintptr_t)t
& 0xff));
147 t
= alloca0_align(997, 1024);
148 assert_se(!((uintptr_t)t
& 0x1ff));
149 assert_se(!memcmp(t
, zero
, 997));
152 static void test_div_round_up(void) {
156 assert_se(DIV_ROUND_UP(0, 8) == 0);
157 assert_se(DIV_ROUND_UP(1, 8) == 1);
158 assert_se(DIV_ROUND_UP(8, 8) == 1);
159 assert_se(DIV_ROUND_UP(12, 8) == 2);
160 assert_se(DIV_ROUND_UP(16, 8) == 2);
162 /* test multiple evaluation */
164 assert_se(DIV_ROUND_UP(div
++, 8) == 0 && div
== 1);
165 assert_se(DIV_ROUND_UP(++div
, 8) == 1 && div
== 2);
166 assert_se(DIV_ROUND_UP(8, div
++) == 4 && div
== 3);
167 assert_se(DIV_ROUND_UP(8, ++div
) == 2 && div
== 4);
169 /* overflow test with exact division */
170 assert_se(sizeof(0U) == 4);
171 assert_se(0xfffffffaU
% 10U == 0U);
172 assert_se(0xfffffffaU
/ 10U == 429496729U);
173 assert_se(DIV_ROUND_UP(0xfffffffaU
, 10U) == 429496729U);
174 assert_se((0xfffffffaU
+ 10U - 1U) / 10U == 0U);
175 assert_se(0xfffffffaU
/ 10U + !!(0xfffffffaU
% 10U) == 429496729U);
177 /* overflow test with rounded division */
178 assert_se(0xfffffffdU
% 10U == 3U);
179 assert_se(0xfffffffdU
/ 10U == 429496729U);
180 assert_se(DIV_ROUND_UP(0xfffffffdU
, 10U) == 429496730U);
181 assert_se((0xfffffffdU
+ 10U - 1U) / 10U == 0U);
182 assert_se(0xfffffffdU
/ 10U + !!(0xfffffffdU
% 10U) == 429496730U);
185 static void test_first_word(void) {
186 assert_se(first_word("Hello", ""));
187 assert_se(first_word("Hello", "Hello"));
188 assert_se(first_word("Hello world", "Hello"));
189 assert_se(first_word("Hello\tworld", "Hello"));
190 assert_se(first_word("Hello\nworld", "Hello"));
191 assert_se(first_word("Hello\rworld", "Hello"));
192 assert_se(first_word("Hello ", "Hello"));
194 assert_se(!first_word("Hello", "Hellooo"));
195 assert_se(!first_word("Hello", "xxxxx"));
196 assert_se(!first_word("Hellooo", "Hello"));
199 static void test_close_many(void) {
201 char name0
[] = "/tmp/test-close-many.XXXXXX";
202 char name1
[] = "/tmp/test-close-many.XXXXXX";
203 char name2
[] = "/tmp/test-close-many.XXXXXX";
205 fds
[0] = mkostemp_safe(name0
, O_RDWR
|O_CLOEXEC
);
206 fds
[1] = mkostemp_safe(name1
, O_RDWR
|O_CLOEXEC
);
207 fds
[2] = mkostemp_safe(name2
, O_RDWR
|O_CLOEXEC
);
211 assert_se(fcntl(fds
[0], F_GETFD
) == -1);
212 assert_se(fcntl(fds
[1], F_GETFD
) == -1);
213 assert_se(fcntl(fds
[2], F_GETFD
) >= 0);
222 static void test_parse_boolean(void) {
223 assert_se(parse_boolean("1") == 1);
224 assert_se(parse_boolean("y") == 1);
225 assert_se(parse_boolean("Y") == 1);
226 assert_se(parse_boolean("yes") == 1);
227 assert_se(parse_boolean("YES") == 1);
228 assert_se(parse_boolean("true") == 1);
229 assert_se(parse_boolean("TRUE") == 1);
230 assert_se(parse_boolean("on") == 1);
231 assert_se(parse_boolean("ON") == 1);
233 assert_se(parse_boolean("0") == 0);
234 assert_se(parse_boolean("n") == 0);
235 assert_se(parse_boolean("N") == 0);
236 assert_se(parse_boolean("no") == 0);
237 assert_se(parse_boolean("NO") == 0);
238 assert_se(parse_boolean("false") == 0);
239 assert_se(parse_boolean("FALSE") == 0);
240 assert_se(parse_boolean("off") == 0);
241 assert_se(parse_boolean("OFF") == 0);
243 assert_se(parse_boolean("garbage") < 0);
244 assert_se(parse_boolean("") < 0);
245 assert_se(parse_boolean("full") < 0);
248 static void test_parse_pid(void) {
252 r
= parse_pid("100", &pid
);
254 assert_se(pid
== 100);
256 r
= parse_pid("0x7FFFFFFF", &pid
);
258 assert_se(pid
== 2147483647);
260 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
261 r
= parse_pid("0", &pid
);
262 assert_se(r
== -ERANGE
);
263 assert_se(pid
== 65);
265 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
266 r
= parse_pid("-100", &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("0xFFFFFFFFFFFFFFFFF", &pid
);
272 assert_se(r
== -ERANGE
);
273 assert_se(pid
== 65);
276 static void test_parse_uid(void) {
280 r
= parse_uid("100", &uid
);
282 assert_se(uid
== 100);
285 static void test_safe_atolli(void) {
289 r
= safe_atolli("12345", &l
);
291 assert_se(l
== 12345);
293 r
= safe_atolli("junk", &l
);
294 assert_se(r
== -EINVAL
);
297 static void test_safe_atod(void) {
302 r
= safe_atod("junk", &d
);
303 assert_se(r
== -EINVAL
);
305 r
= safe_atod("0.2244", &d
);
307 assert_se(fabs(d
- 0.2244) < 0.000001);
309 r
= safe_atod("0,5", &d
);
310 assert_se(r
== -EINVAL
);
314 assert_se(*e
== ',');
316 /* Check if this really is locale independent */
317 if (setlocale(LC_NUMERIC
, "de_DE.utf8")) {
319 r
= safe_atod("0.2244", &d
);
321 assert_se(fabs(d
- 0.2244) < 0.000001);
323 r
= safe_atod("0,5", &d
);
324 assert_se(r
== -EINVAL
);
327 assert_se(fabs(strtod("0,5", &e
) - 0.5) < 0.00001);
330 /* And check again, reset */
331 assert_se(setlocale(LC_NUMERIC
, "C"));
333 r
= safe_atod("0.2244", &d
);
335 assert_se(fabs(d
- 0.2244) < 0.000001);
337 r
= safe_atod("0,5", &d
);
338 assert_se(r
== -EINVAL
);
342 assert_se(*e
== ',');
345 static void test_strappend(void) {
346 _cleanup_free_
char *t1
, *t2
, *t3
, *t4
;
348 t1
= strappend(NULL
, NULL
);
349 assert_se(streq(t1
, ""));
351 t2
= strappend(NULL
, "suf");
352 assert_se(streq(t2
, "suf"));
354 t3
= strappend("pre", NULL
);
355 assert_se(streq(t3
, "pre"));
357 t4
= strappend("pre", "suf");
358 assert_se(streq(t4
, "presuf"));
361 static void test_strstrip(void) {
363 char input
[] = " hello, waldo. ";
366 assert_se(streq(r
, "hello, waldo."));
369 static void test_delete_chars(void) {
371 char input
[] = " hello, waldo. abc";
373 r
= delete_chars(input
, WHITESPACE
);
374 assert_se(streq(r
, "hello,waldo.abc"));
377 static void test_in_charset(void) {
378 assert_se(in_charset("dddaaabbbcccc", "abcd"));
379 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
382 static void test_hexchar(void) {
383 assert_se(hexchar(0xa) == 'a');
384 assert_se(hexchar(0x0) == '0');
387 static void test_unhexchar(void) {
388 assert_se(unhexchar('a') == 0xA);
389 assert_se(unhexchar('A') == 0xA);
390 assert_se(unhexchar('0') == 0x0);
393 static void test_base64char(void) {
394 assert_se(base64char(0) == 'A');
395 assert_se(base64char(26) == 'a');
396 assert_se(base64char(63) == '/');
399 static void test_unbase64char(void) {
400 assert_se(unbase64char('A') == 0);
401 assert_se(unbase64char('Z') == 25);
402 assert_se(unbase64char('a') == 26);
403 assert_se(unbase64char('z') == 51);
404 assert_se(unbase64char('0') == 52);
405 assert_se(unbase64char('9') == 61);
406 assert_se(unbase64char('+') == 62);
407 assert_se(unbase64char('/') == 63);
408 assert_se(unbase64char('=') == -EINVAL
);
411 static void test_octchar(void) {
412 assert_se(octchar(00) == '0');
413 assert_se(octchar(07) == '7');
416 static void test_unoctchar(void) {
417 assert_se(unoctchar('0') == 00);
418 assert_se(unoctchar('7') == 07);
421 static void test_decchar(void) {
422 assert_se(decchar(0) == '0');
423 assert_se(decchar(9) == '9');
426 static void test_undecchar(void) {
427 assert_se(undecchar('0') == 0);
428 assert_se(undecchar('9') == 9);
431 static void test_unhexmem(void) {
432 const char *hex
= "efa214921";
433 const char *hex_invalid
= "efa214921o";
434 _cleanup_free_
char *hex2
= NULL
;
435 _cleanup_free_
void *mem
= NULL
;
438 assert_se(unhexmem(hex
, strlen(hex
), &mem
, &len
) == 0);
439 assert_se(unhexmem(hex
, strlen(hex
) + 1, &mem
, &len
) == -EINVAL
);
440 assert_se(unhexmem(hex_invalid
, strlen(hex_invalid
), &mem
, &len
) == -EINVAL
);
442 assert_se((hex2
= hexmem(mem
, len
)));
446 assert_se(memcmp(hex
, hex2
, strlen(hex
)) == 0);
450 assert_se(unhexmem(hex
, strlen(hex
) - 1, &mem
, &len
) == 0);
451 assert_se((hex2
= hexmem(mem
, len
)));
452 assert_se(memcmp(hex
, hex2
, strlen(hex
) - 1) == 0);
455 /* https://tools.ietf.org/html/rfc4648#section-10 */
456 static void test_base64mem(void) {
459 b64
= base64mem("", strlen(""));
461 assert_se(streq(b64
, ""));
464 b64
= base64mem("f", strlen("f"));
466 assert_se(streq(b64
, "Zg=="));
469 b64
= base64mem("fo", strlen("fo"));
471 assert_se(streq(b64
, "Zm8="));
474 b64
= base64mem("foo", strlen("foo"));
476 assert_se(streq(b64
, "Zm9v"));
479 b64
= base64mem("foob", strlen("foob"));
481 assert_se(streq(b64
, "Zm9vYg=="));
484 b64
= base64mem("fooba", strlen("fooba"));
486 assert_se(streq(b64
, "Zm9vYmE="));
489 b64
= base64mem("foobar", strlen("foobar"));
491 assert_se(streq(b64
, "Zm9vYmFy"));
495 static void test_unbase64mem(void) {
499 assert_se(unbase64mem("", strlen(""), &mem
, &len
) == 0);
500 assert_se(streq(strndupa(mem
, len
), ""));
503 assert_se(unbase64mem("Zg==", strlen("Zg=="), &mem
, &len
) == 0);
504 assert_se(streq(strndupa(mem
, len
), "f"));
507 assert_se(unbase64mem("Zm8=", strlen("Zm8="), &mem
, &len
) == 0);
508 assert_se(streq(strndupa(mem
, len
), "fo"));
511 assert_se(unbase64mem("Zm9v", strlen("Zm9v"), &mem
, &len
) == 0);
512 assert_se(streq(strndupa(mem
, len
), "foo"));
515 assert_se(unbase64mem("Zm9vYg==", strlen("Zm9vYg=="), &mem
, &len
) == 0);
516 assert_se(streq(strndupa(mem
, len
), "foob"));
519 assert_se(unbase64mem("Zm9vYmE=", strlen("Zm9vYmE="), &mem
, &len
) == 0);
520 assert_se(streq(strndupa(mem
, len
), "fooba"));
523 assert_se(unbase64mem("Zm9vYmFy", strlen("Zm9vYmFy"), &mem
, &len
) == 0);
524 assert_se(streq(strndupa(mem
, len
), "foobar"));
527 assert_se(unbase64mem("A", strlen("A"), &mem
, &len
) == -EINVAL
);
528 assert_se(unbase64mem("A====", strlen("A===="), &mem
, &len
) == -EINVAL
);
529 assert_se(unbase64mem("AAB==", strlen("AAB=="), &mem
, &len
) == -EINVAL
);
530 assert_se(unbase64mem("AAAB=", strlen("AAAB="), &mem
, &len
) == -EINVAL
);
533 static void test_cescape(void) {
534 _cleanup_free_
char *escaped
;
536 assert_se(escaped
= cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
537 assert_se(streq(escaped
, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
540 static void test_cunescape(void) {
541 _cleanup_free_
char *unescaped
;
543 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", 0, &unescaped
) < 0);
544 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", UNESCAPE_RELAX
, &unescaped
) >= 0);
545 assert_se(streq_ptr(unescaped
, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
549 /* incomplete sequences */
550 assert_se(cunescape("\\x0", 0, &unescaped
) < 0);
551 assert_se(cunescape("\\x0", UNESCAPE_RELAX
, &unescaped
) >= 0);
552 assert_se(streq_ptr(unescaped
, "\\x0"));
556 assert_se(cunescape("\\x", 0, &unescaped
) < 0);
557 assert_se(cunescape("\\x", UNESCAPE_RELAX
, &unescaped
) >= 0);
558 assert_se(streq_ptr(unescaped
, "\\x"));
562 assert_se(cunescape("\\", 0, &unescaped
) < 0);
563 assert_se(cunescape("\\", UNESCAPE_RELAX
, &unescaped
) >= 0);
564 assert_se(streq_ptr(unescaped
, "\\"));
568 assert_se(cunescape("\\11", 0, &unescaped
) < 0);
569 assert_se(cunescape("\\11", UNESCAPE_RELAX
, &unescaped
) >= 0);
570 assert_se(streq_ptr(unescaped
, "\\11"));
574 assert_se(cunescape("\\1", 0, &unescaped
) < 0);
575 assert_se(cunescape("\\1", UNESCAPE_RELAX
, &unescaped
) >= 0);
576 assert_se(streq_ptr(unescaped
, "\\1"));
580 assert_se(cunescape("\\u0000", 0, &unescaped
) < 0);
581 assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX
, &unescaped
) >= 0);
582 assert_se(streq_ptr(unescaped
, "ßßΠA"));
586 assert_se(cunescape("\\073", 0, &unescaped
) >= 0);
587 assert_se(streq_ptr(unescaped
, ";"));
590 static void test_foreach_word(void) {
591 const char *word
, *state
;
594 const char test
[] = "test abc d\te f ";
595 const char * const expected
[] = {
605 FOREACH_WORD(word
, l
, test
, state
)
606 assert_se(strneq(expected
[i
++], word
, l
));
609 static void check(const char *test
, char** expected
, bool trailing
) {
610 const char *word
, *state
;
614 printf("<<<%s>>>\n", test
);
615 FOREACH_WORD_QUOTED(word
, l
, test
, state
) {
616 _cleanup_free_
char *t
= NULL
;
618 assert_se(t
= strndup(word
, l
));
619 assert_se(strneq(expected
[i
++], word
, l
));
622 printf("<<<%s>>>\n", state
);
623 assert_se(expected
[i
] == NULL
);
624 assert_se(isempty(state
) == !trailing
);
627 static void test_foreach_word_quoted(void) {
628 check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
652 static void test_memdup_multiply(void) {
653 int org
[] = {1, 2, 3};
656 dup
= (int*)memdup_multiply(org
, sizeof(int), 3);
659 assert_se(dup
[0] == 1);
660 assert_se(dup
[1] == 2);
661 assert_se(dup
[2] == 3);
665 static void test_hostname_is_valid(void) {
666 assert_se(hostname_is_valid("foobar"));
667 assert_se(hostname_is_valid("foobar.com"));
668 assert_se(!hostname_is_valid("fööbar"));
669 assert_se(!hostname_is_valid(""));
670 assert_se(!hostname_is_valid("."));
671 assert_se(!hostname_is_valid(".."));
672 assert_se(!hostname_is_valid("foobar."));
673 assert_se(!hostname_is_valid(".foobar"));
674 assert_se(!hostname_is_valid("foo..bar"));
675 assert_se(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
678 static void test_read_hostname_config(void) {
679 char path
[] = "/tmp/hostname.XXXXXX";
683 fd
= mkostemp_safe(path
, O_RDWR
|O_CLOEXEC
);
687 /* simple hostname */
688 write_string_file(path
, "foo", WRITE_STRING_FILE_CREATE
);
689 assert_se(read_hostname_config(path
, &hostname
) == 0);
690 assert_se(streq(hostname
, "foo"));
695 write_string_file(path
, "# comment\nfoo", WRITE_STRING_FILE_CREATE
);
696 assert_se(read_hostname_config(path
, &hostname
) == 0);
698 assert_se(streq(hostname
, "foo"));
702 /* with comment and extra whitespace */
703 write_string_file(path
, "# comment\n\n foo ", WRITE_STRING_FILE_CREATE
);
704 assert_se(read_hostname_config(path
, &hostname
) == 0);
706 assert_se(streq(hostname
, "foo"));
711 write_string_file(path
, "!foo/bar.com", WRITE_STRING_FILE_CREATE
);
712 assert_se(read_hostname_config(path
, &hostname
) == 0);
714 assert_se(streq(hostname
, "foobar.com"));
719 hostname
= (char*) 0x1234;
720 write_string_file(path
, "# nothing here\n", WRITE_STRING_FILE_CREATE
);
721 assert_se(read_hostname_config(path
, &hostname
) == -ENOENT
);
722 assert_se(hostname
== (char*) 0x1234); /* does not touch argument on error */
724 /* nonexisting file */
725 assert_se(read_hostname_config("/non/existing", &hostname
) == -ENOENT
);
726 assert_se(hostname
== (char*) 0x1234); /* does not touch argument on error */
731 static void test_u64log2(void) {
732 assert_se(u64log2(0) == 0);
733 assert_se(u64log2(8) == 3);
734 assert_se(u64log2(9) == 3);
735 assert_se(u64log2(15) == 3);
736 assert_se(u64log2(16) == 4);
737 assert_se(u64log2(1024*1024) == 20);
738 assert_se(u64log2(1024*1024+5) == 20);
741 static void test_protect_errno(void) {
747 assert_se(errno
== 12);
750 static void test_parse_size(void) {
753 assert_se(parse_size("111", 1024, &bytes
) == 0);
754 assert_se(bytes
== 111);
756 assert_se(parse_size("111.4", 1024, &bytes
) == 0);
757 assert_se(bytes
== 111);
759 assert_se(parse_size(" 112 B", 1024, &bytes
) == 0);
760 assert_se(bytes
== 112);
762 assert_se(parse_size(" 112.6 B", 1024, &bytes
) == 0);
763 assert_se(bytes
== 112);
765 assert_se(parse_size("3.5 K", 1024, &bytes
) == 0);
766 assert_se(bytes
== 3*1024 + 512);
768 assert_se(parse_size("3. K", 1024, &bytes
) == 0);
769 assert_se(bytes
== 3*1024);
771 assert_se(parse_size("3.0 K", 1024, &bytes
) == 0);
772 assert_se(bytes
== 3*1024);
774 assert_se(parse_size("3. 0 K", 1024, &bytes
) == -EINVAL
);
776 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes
) == 0);
777 assert_se(bytes
== 4*1024*1024 + 11 * 1024 + 512);
779 assert_se(parse_size("3B3.5G", 1024, &bytes
) == -EINVAL
);
781 assert_se(parse_size("3.5G3B", 1024, &bytes
) == 0);
782 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
784 assert_se(parse_size("3.5G 4B", 1024, &bytes
) == 0);
785 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
787 assert_se(parse_size("3B3G4T", 1024, &bytes
) == -EINVAL
);
789 assert_se(parse_size("4T3G3B", 1024, &bytes
) == 0);
790 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
792 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes
) == 0);
793 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
795 assert_se(parse_size("12P", 1024, &bytes
) == 0);
796 assert_se(bytes
== 12ULL * 1024*1024*1024*1024*1024);
798 assert_se(parse_size("12P12P", 1024, &bytes
) == -EINVAL
);
800 assert_se(parse_size("3E 2P", 1024, &bytes
) == 0);
801 assert_se(bytes
== (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
803 assert_se(parse_size("12X", 1024, &bytes
) == -EINVAL
);
805 assert_se(parse_size("12.5X", 1024, &bytes
) == -EINVAL
);
807 assert_se(parse_size("12.5e3", 1024, &bytes
) == -EINVAL
);
809 assert_se(parse_size("1024E", 1024, &bytes
) == -ERANGE
);
810 assert_se(parse_size("-1", 1024, &bytes
) == -ERANGE
);
811 assert_se(parse_size("-1024E", 1024, &bytes
) == -ERANGE
);
813 assert_se(parse_size("-1024P", 1024, &bytes
) == -ERANGE
);
815 assert_se(parse_size("-10B 20K", 1024, &bytes
) == -ERANGE
);
818 static void test_config_parse_iec_off(void) {
820 assert_se(config_parse_iec_off(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset
, NULL
) == 0);
821 assert_se(offset
== 4 * 1024 * 1024);
823 assert_se(config_parse_iec_off(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset
, NULL
) == 0);
826 static void test_strextend(void) {
827 _cleanup_free_
char *str
= strdup("0123");
828 strextend(&str
, "456", "78", "9", NULL
);
829 assert_se(streq(str
, "0123456789"));
832 static void test_strrep(void) {
833 _cleanup_free_
char *one
, *three
, *zero
;
834 one
= strrep("waldo", 1);
835 three
= strrep("waldo", 3);
836 zero
= strrep("waldo", 0);
838 assert_se(streq(one
, "waldo"));
839 assert_se(streq(three
, "waldowaldowaldo"));
840 assert_se(streq(zero
, ""));
843 static void test_split_pair(void) {
844 _cleanup_free_
char *a
= NULL
, *b
= NULL
;
846 assert_se(split_pair("", "", &a
, &b
) == -EINVAL
);
847 assert_se(split_pair("foo=bar", "", &a
, &b
) == -EINVAL
);
848 assert_se(split_pair("", "=", &a
, &b
) == -EINVAL
);
849 assert_se(split_pair("foo=bar", "=", &a
, &b
) >= 0);
850 assert_se(streq(a
, "foo"));
851 assert_se(streq(b
, "bar"));
854 assert_se(split_pair("==", "==", &a
, &b
) >= 0);
855 assert_se(streq(a
, ""));
856 assert_se(streq(b
, ""));
860 assert_se(split_pair("===", "==", &a
, &b
) >= 0);
861 assert_se(streq(a
, ""));
862 assert_se(streq(b
, "="));
865 static void test_fstab_node_to_udev_node(void) {
868 n
= fstab_node_to_udev_node("LABEL=applé/jack");
870 assert_se(streq(n
, "/dev/disk/by-label/applé\\x2fjack"));
873 n
= fstab_node_to_udev_node("PARTLABEL=pinkié pie");
875 assert_se(streq(n
, "/dev/disk/by-partlabel/pinkié\\x20pie"));
878 n
= fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
880 assert_se(streq(n
, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
883 n
= fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
885 assert_se(streq(n
, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
888 n
= fstab_node_to_udev_node("PONIES=awesome");
890 assert_se(streq(n
, "PONIES=awesome"));
893 n
= fstab_node_to_udev_node("/dev/xda1");
895 assert_se(streq(n
, "/dev/xda1"));
899 static void test_get_files_in_directory(void) {
900 _cleanup_strv_free_
char **l
= NULL
, **t
= NULL
;
902 assert_se(get_files_in_directory("/tmp", &l
) >= 0);
903 assert_se(get_files_in_directory(".", &t
) >= 0);
904 assert_se(get_files_in_directory(".", NULL
) >= 0);
907 static void test_in_set(void) {
908 assert_se(IN_SET(1, 1));
909 assert_se(IN_SET(1, 1, 2, 3, 4));
910 assert_se(IN_SET(2, 1, 2, 3, 4));
911 assert_se(IN_SET(3, 1, 2, 3, 4));
912 assert_se(IN_SET(4, 1, 2, 3, 4));
913 assert_se(!IN_SET(0, 1));
914 assert_se(!IN_SET(0, 1, 2, 3, 4));
917 static void test_writing_tmpfile(void) {
918 char name
[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
919 _cleanup_free_
char *contents
= NULL
;
924 IOVEC_SET_STRING(iov
[0], "abc\n");
925 IOVEC_SET_STRING(iov
[1], ALPHANUMERICAL
"\n");
926 IOVEC_SET_STRING(iov
[2], "");
928 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
929 printf("tmpfile: %s", name
);
931 r
= writev(fd
, iov
, 3);
934 r
= read_full_file(name
, &contents
, &size
);
936 printf("contents: %s", contents
);
937 assert_se(streq(contents
, "abc\n" ALPHANUMERICAL
"\n"));
942 static void test_hexdump(void) {
946 hexdump(stdout
, NULL
, 0);
947 hexdump(stdout
, "", 0);
948 hexdump(stdout
, "", 1);
949 hexdump(stdout
, "x", 1);
950 hexdump(stdout
, "x", 2);
951 hexdump(stdout
, "foobar", 7);
952 hexdump(stdout
, "f\nobar", 7);
953 hexdump(stdout
, "xxxxxxxxxxxxxxxxxxxxyz", 23);
955 for (i
= 0; i
< ELEMENTSOF(data
); i
++)
958 hexdump(stdout
, data
, sizeof(data
));
961 static void test_log2i(void) {
962 assert_se(log2i(1) == 0);
963 assert_se(log2i(2) == 1);
964 assert_se(log2i(3) == 1);
965 assert_se(log2i(4) == 2);
966 assert_se(log2i(32) == 5);
967 assert_se(log2i(33) == 5);
968 assert_se(log2i(63) == 5);
969 assert_se(log2i(INT_MAX
) == sizeof(int)*8-2);
972 static void test_foreach_string(void) {
973 const char * const t
[] = {
982 FOREACH_STRING(x
, "foo", "bar", "waldo")
983 assert_se(streq_ptr(t
[i
++], x
));
987 FOREACH_STRING(x
, "zzz")
988 assert_se(streq(x
, "zzz"));
991 static void test_filename_is_valid(void) {
992 char foo
[FILENAME_MAX
+2];
995 assert_se(!filename_is_valid(""));
996 assert_se(!filename_is_valid("/bar/foo"));
997 assert_se(!filename_is_valid("/"));
998 assert_se(!filename_is_valid("."));
999 assert_se(!filename_is_valid(".."));
1001 for (i
=0; i
<FILENAME_MAX
+1; i
++)
1003 foo
[FILENAME_MAX
+1] = '\0';
1005 assert_se(!filename_is_valid(foo
));
1007 assert_se(filename_is_valid("foo_bar-333"));
1008 assert_se(filename_is_valid("o.o"));
1011 static void test_string_has_cc(void) {
1012 assert_se(string_has_cc("abc\1", NULL
));
1013 assert_se(string_has_cc("abc\x7f", NULL
));
1014 assert_se(string_has_cc("abc\x7f", NULL
));
1015 assert_se(string_has_cc("abc\t\x7f", "\t"));
1016 assert_se(string_has_cc("abc\t\x7f", "\t"));
1017 assert_se(string_has_cc("\x7f", "\t"));
1018 assert_se(string_has_cc("\x7f", "\t\a"));
1020 assert_se(!string_has_cc("abc\t\t", "\t"));
1021 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
1022 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
1025 static void test_ascii_strlower(void) {
1026 char a
[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
1027 assert_se(streq(ascii_strlower(a
), "aabbcc jk ii od lkjjj kkd lk"));
1030 static void test_files_same(void) {
1031 _cleanup_close_
int fd
= -1;
1032 char name
[] = "/tmp/test-files_same.XXXXXX";
1033 char name_alias
[] = "/tmp/test-files_same.alias";
1035 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1037 assert_se(symlink(name
, name_alias
) >= 0);
1039 assert_se(files_same(name
, name
));
1040 assert_se(files_same(name
, name_alias
));
1046 static void test_is_valid_documentation_url(void) {
1047 assert_se(documentation_url_is_valid("http://www.freedesktop.org/wiki/Software/systemd"));
1048 assert_se(documentation_url_is_valid("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
1049 assert_se(documentation_url_is_valid("file:/foo/foo"));
1050 assert_se(documentation_url_is_valid("man:systemd.special(7)"));
1051 assert_se(documentation_url_is_valid("info:bar"));
1053 assert_se(!documentation_url_is_valid("foo:"));
1054 assert_se(!documentation_url_is_valid("info:"));
1055 assert_se(!documentation_url_is_valid(""));
1058 static void test_file_in_same_dir(void) {
1061 t
= file_in_same_dir("/", "a");
1062 assert_se(streq(t
, "/a"));
1065 t
= file_in_same_dir("/", "/a");
1066 assert_se(streq(t
, "/a"));
1069 t
= file_in_same_dir("", "a");
1070 assert_se(streq(t
, "a"));
1073 t
= file_in_same_dir("a/", "a");
1074 assert_se(streq(t
, "a/a"));
1077 t
= file_in_same_dir("bar/foo", "bar");
1078 assert_se(streq(t
, "bar/bar"));
1082 static void test_endswith(void) {
1083 assert_se(endswith("foobar", "bar"));
1084 assert_se(endswith("foobar", ""));
1085 assert_se(endswith("foobar", "foobar"));
1086 assert_se(endswith("", ""));
1088 assert_se(!endswith("foobar", "foo"));
1089 assert_se(!endswith("foobar", "foobarfoofoo"));
1092 static void test_close_nointr(void) {
1093 char name
[] = "/tmp/test-test-close_nointr.XXXXXX";
1096 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1098 assert_se(close_nointr(fd
) >= 0);
1099 assert_se(close_nointr(fd
) < 0);
1105 static void test_unlink_noerrno(void) {
1106 char name
[] = "/tmp/test-close_nointr.XXXXXX";
1109 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1111 assert_se(close_nointr(fd
) >= 0);
1116 assert_se(unlink_noerrno(name
) >= 0);
1117 assert_se(errno
== -42);
1118 assert_se(unlink_noerrno(name
) < 0);
1119 assert_se(errno
== -42);
1123 static void test_readlink_and_make_absolute(void) {
1124 char tempdir
[] = "/tmp/test-readlink_and_make_absolute";
1125 char name
[] = "/tmp/test-readlink_and_make_absolute/original";
1126 char name2
[] = "test-readlink_and_make_absolute/original";
1127 char name_alias
[] = "/tmp/test-readlink_and_make_absolute-alias";
1130 assert_se(mkdir_safe(tempdir
, 0755, getuid(), getgid()) >= 0);
1131 assert_se(touch(name
) >= 0);
1133 assert_se(symlink(name
, name_alias
) >= 0);
1134 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1135 assert_se(streq(r
, name
));
1137 assert_se(unlink(name_alias
) >= 0);
1139 assert_se(chdir(tempdir
) >= 0);
1140 assert_se(symlink(name2
, name_alias
) >= 0);
1141 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1142 assert_se(streq(r
, name
));
1144 assert_se(unlink(name_alias
) >= 0);
1146 assert_se(rm_rf(tempdir
, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);
1149 static void test_ignore_signals(void) {
1150 assert_se(ignore_signals(SIGINT
, -1) >= 0);
1151 assert_se(kill(getpid(), SIGINT
) >= 0);
1152 assert_se(ignore_signals(SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1153 assert_se(kill(getpid(), SIGUSR1
) >= 0);
1154 assert_se(kill(getpid(), SIGUSR2
) >= 0);
1155 assert_se(kill(getpid(), SIGTERM
) >= 0);
1156 assert_se(kill(getpid(), SIGPIPE
) >= 0);
1157 assert_se(default_signals(SIGINT
, SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1160 static void test_strshorten(void) {
1161 char s
[] = "foobar";
1163 assert_se(strlen(strshorten(s
, 6)) == 6);
1164 assert_se(strlen(strshorten(s
, 12)) == 6);
1165 assert_se(strlen(strshorten(s
, 2)) == 2);
1166 assert_se(strlen(strshorten(s
, 0)) == 0);
1169 static void test_strjoina(void) {
1172 actual
= strjoina("", "foo", "bar");
1173 assert_se(streq(actual
, "foobar"));
1175 actual
= strjoina("foo", "bar", "baz");
1176 assert_se(streq(actual
, "foobarbaz"));
1178 actual
= strjoina("foo", "", "bar", "baz");
1179 assert_se(streq(actual
, "foobarbaz"));
1181 actual
= strjoina("foo");
1182 assert_se(streq(actual
, "foo"));
1184 actual
= strjoina(NULL
);
1185 assert_se(streq(actual
, ""));
1187 actual
= strjoina(NULL
, "foo");
1188 assert_se(streq(actual
, ""));
1190 actual
= strjoina("foo", NULL
, "bar");
1191 assert_se(streq(actual
, "foo"));
1194 static void test_is_symlink(void) {
1195 char name
[] = "/tmp/test-is_symlink.XXXXXX";
1196 char name_link
[] = "/tmp/test-is_symlink.link";
1197 _cleanup_close_
int fd
= -1;
1199 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1201 assert_se(symlink(name
, name_link
) >= 0);
1203 assert_se(is_symlink(name
) == 0);
1204 assert_se(is_symlink(name_link
) == 1);
1205 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
1212 static void test_search_and_fopen(void) {
1213 const char *dirs
[] = {"/tmp/foo/bar", "/tmp", NULL
};
1214 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1219 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1223 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1227 r
= search_and_fopen(name
, "r", NULL
, dirs
, &f
);
1231 r
= search_and_fopen(basename(name
), "r", "/", dirs
, &f
);
1235 r
= search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1237 r
= search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1243 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1248 static void test_search_and_fopen_nulstr(void) {
1249 const char dirs
[] = "/tmp/foo/bar\0/tmp\0";
1250 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1255 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1259 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1263 r
= search_and_fopen_nulstr(name
, "r", NULL
, dirs
, &f
);
1267 r
= search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1269 r
= search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1275 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1279 static void test_glob_exists(void) {
1280 char name
[] = "/tmp/test-glob_exists.XXXXXX";
1284 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1288 r
= glob_exists("/tmp/test-glob_exists*");
1293 r
= glob_exists("/tmp/test-glob_exists*");
1297 static void test_execute_directory(void) {
1298 char template_lo
[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
1299 char template_hi
[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
1300 const char * dirs
[] = {template_hi
, template_lo
, NULL
};
1301 const char *name
, *name2
, *name3
, *overridden
, *override
, *masked
, *mask
;
1303 assert_se(mkdtemp(template_lo
));
1304 assert_se(mkdtemp(template_hi
));
1306 name
= strjoina(template_lo
, "/script");
1307 name2
= strjoina(template_hi
, "/script2");
1308 name3
= strjoina(template_lo
, "/useless");
1309 overridden
= strjoina(template_lo
, "/overridden");
1310 override
= strjoina(template_hi
, "/overridden");
1311 masked
= strjoina(template_lo
, "/masked");
1312 mask
= strjoina(template_hi
, "/masked");
1314 assert_se(write_string_file(name
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE
) == 0);
1315 assert_se(write_string_file(name2
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE
) == 0);
1316 assert_se(write_string_file(overridden
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1317 assert_se(write_string_file(override
, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE
) == 0);
1318 assert_se(write_string_file(masked
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1319 assert_se(symlink("/dev/null", mask
) == 0);
1320 assert_se(chmod(name
, 0755) == 0);
1321 assert_se(chmod(name2
, 0755) == 0);
1322 assert_se(chmod(overridden
, 0755) == 0);
1323 assert_se(chmod(override
, 0755) == 0);
1324 assert_se(chmod(masked
, 0755) == 0);
1325 assert_se(touch(name3
) >= 0);
1327 execute_directories(dirs
, DEFAULT_TIMEOUT_USEC
, NULL
);
1329 assert_se(chdir(template_lo
) == 0);
1330 assert_se(access("it_works", F_OK
) >= 0);
1331 assert_se(access("failed", F_OK
) < 0);
1333 assert_se(chdir(template_hi
) == 0);
1334 assert_se(access("it_works2", F_OK
) >= 0);
1335 assert_se(access("failed", F_OK
) < 0);
1337 (void) rm_rf(template_lo
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1338 (void) rm_rf(template_hi
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1341 static void test_unquote_first_word(void) {
1342 const char *p
, *original
;
1345 p
= original
= "foobar waldo";
1346 assert_se(unquote_first_word(&p
, &t
, 0) > 0);
1347 assert_se(streq(t
, "foobar"));
1349 assert_se(p
== original
+ 7);
1351 assert_se(unquote_first_word(&p
, &t
, 0) > 0);
1352 assert_se(streq(t
, "waldo"));
1354 assert_se(p
== original
+ 12);
1356 assert_se(unquote_first_word(&p
, &t
, 0) == 0);
1358 assert_se(p
== original
+ 12);
1360 p
= original
= "\"foobar\" \'waldo\'";
1361 assert_se(unquote_first_word(&p
, &t
, 0) > 0);
1362 assert_se(streq(t
, "foobar"));
1364 assert_se(p
== original
+ 9);
1366 assert_se(unquote_first_word(&p
, &t
, 0) > 0);
1367 assert_se(streq(t
, "waldo"));
1369 assert_se(p
== original
+ 16);
1371 assert_se(unquote_first_word(&p
, &t
, 0) == 0);
1373 assert_se(p
== original
+ 16);
1375 p
= original
= "\"";
1376 assert_se(unquote_first_word(&p
, &t
, 0) == -EINVAL
);
1377 assert_se(p
== original
+ 1);
1379 p
= original
= "\'";
1380 assert_se(unquote_first_word(&p
, &t
, 0) == -EINVAL
);
1381 assert_se(p
== original
+ 1);
1383 p
= original
= "\'fooo";
1384 assert_se(unquote_first_word(&p
, &t
, 0) == -EINVAL
);
1385 assert_se(p
== original
+ 5);
1387 p
= original
= "\'fooo";
1388 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_RELAX
) > 0);
1389 assert_se(streq(t
, "fooo"));
1391 assert_se(p
== original
+ 5);
1393 p
= original
= "yay\'foo\'bar";
1394 assert_se(unquote_first_word(&p
, &t
, 0) > 0);
1395 assert_se(streq(t
, "yayfoobar"));
1397 assert_se(p
== original
+ 11);
1399 p
= original
= " foobar ";
1400 assert_se(unquote_first_word(&p
, &t
, 0) > 0);
1401 assert_se(streq(t
, "foobar"));
1403 assert_se(p
== original
+ 12);
1405 p
= original
= " foo\\ba\\x6ar ";
1406 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
) > 0);
1407 assert_se(streq(t
, "foo\ba\x6ar"));
1409 assert_se(p
== original
+ 13);
1411 p
= original
= " foo\\ba\\x6ar ";
1412 assert_se(unquote_first_word(&p
, &t
, 0) > 0);
1413 assert_se(streq(t
, "foobax6ar"));
1415 assert_se(p
== original
+ 13);
1417 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1418 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
) > 0);
1419 assert_se(streq(t
, "föo"));
1421 assert_se(p
== original
+ 13);
1423 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
) > 0);
1424 assert_se(streq(t
, "pi\360\237\222\251le"));
1426 assert_se(p
== original
+ 32);
1428 p
= original
= "fooo\\";
1429 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_RELAX
) > 0);
1430 assert_se(streq(t
, "fooo"));
1432 assert_se(p
== original
+ 5);
1434 p
= original
= "fooo\\";
1435 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE_RELAX
) > 0);
1436 assert_se(streq(t
, "fooo\\"));
1438 assert_se(p
== original
+ 5);
1440 p
= original
= "fooo\\";
1441 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE_RELAX
|UNQUOTE_RELAX
) > 0);
1442 assert_se(streq(t
, "fooo\\"));
1444 assert_se(p
== original
+ 5);
1446 p
= original
= "fooo\\";
1447 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
|UNQUOTE_CUNESCAPE_RELAX
) > 0);
1448 assert_se(streq(t
, "fooo\\"));
1450 assert_se(p
== original
+ 5);
1452 p
= original
= "\"foo\\";
1453 assert_se(unquote_first_word(&p
, &t
, 0) == -EINVAL
);
1454 assert_se(p
== original
+ 5);
1456 p
= original
= "\"foo\\";
1457 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_RELAX
) > 0);
1458 assert_se(streq(t
, "foo"));
1460 assert_se(p
== original
+ 5);
1462 p
= original
= "\"foo\\";
1463 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE_RELAX
) == -EINVAL
);
1464 assert_se(p
== original
+ 5);
1466 p
= original
= "\"foo\\";
1467 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE_RELAX
|UNQUOTE_RELAX
) > 0);
1468 assert_se(streq(t
, "foo\\"));
1470 assert_se(p
== original
+ 5);
1472 p
= original
= "\"foo\\";
1473 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
|UNQUOTE_CUNESCAPE_RELAX
|UNQUOTE_RELAX
) > 0);
1474 assert_se(streq(t
, "foo\\"));
1476 assert_se(p
== original
+ 5);
1478 p
= original
= "fooo\\ bar quux";
1479 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_RELAX
) > 0);
1480 assert_se(streq(t
, "fooo bar"));
1482 assert_se(p
== original
+ 10);
1484 p
= original
= "fooo\\ bar quux";
1485 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE_RELAX
) > 0);
1486 assert_se(streq(t
, "fooo bar"));
1488 assert_se(p
== original
+ 10);
1490 p
= original
= "fooo\\ bar quux";
1491 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE_RELAX
|UNQUOTE_RELAX
) > 0);
1492 assert_se(streq(t
, "fooo bar"));
1494 assert_se(p
== original
+ 10);
1496 p
= original
= "fooo\\ bar quux";
1497 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
) == -EINVAL
);
1498 assert_se(p
== original
+ 5);
1500 p
= original
= "fooo\\ bar quux";
1501 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
|UNQUOTE_CUNESCAPE_RELAX
) > 0);
1502 assert_se(streq(t
, "fooo\\ bar"));
1504 assert_se(p
== original
+ 10);
1506 p
= original
= "\\w+@\\K[\\d.]+";
1507 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
) == -EINVAL
);
1508 assert_se(p
== original
+ 1);
1510 p
= original
= "\\w+@\\K[\\d.]+";
1511 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
|UNQUOTE_CUNESCAPE_RELAX
) > 0);
1512 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1514 assert_se(p
== original
+ 12);
1516 p
= original
= "\\w+\\b";
1517 assert_se(unquote_first_word(&p
, &t
, UNQUOTE_CUNESCAPE
|UNQUOTE_CUNESCAPE_RELAX
) > 0);
1518 assert_se(streq(t
, "\\w+\b"));
1520 assert_se(p
== original
+ 5);
1523 static void test_unquote_first_word_and_warn(void) {
1524 const char *p
, *original
;
1527 p
= original
= "foobar waldo";
1528 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) > 0);
1529 assert_se(streq(t
, "foobar"));
1531 assert_se(p
== original
+ 7);
1533 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) > 0);
1534 assert_se(streq(t
, "waldo"));
1536 assert_se(p
== original
+ 12);
1538 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) == 0);
1540 assert_se(p
== original
+ 12);
1542 p
= original
= "\"foobar\" \'waldo\'";
1543 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) > 0);
1544 assert_se(streq(t
, "foobar"));
1546 assert_se(p
== original
+ 9);
1548 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) > 0);
1549 assert_se(streq(t
, "waldo"));
1551 assert_se(p
== original
+ 16);
1553 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) == 0);
1555 assert_se(p
== original
+ 16);
1557 p
= original
= "\"";
1558 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) == -EINVAL
);
1559 assert_se(p
== original
+ 1);
1561 p
= original
= "\'";
1562 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) == -EINVAL
);
1563 assert_se(p
== original
+ 1);
1565 p
= original
= "\'fooo";
1566 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) == -EINVAL
);
1567 assert_se(p
== original
+ 5);
1569 p
= original
= "\'fooo";
1570 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_RELAX
, NULL
, "fake", 1, original
) > 0);
1571 assert_se(streq(t
, "fooo"));
1573 assert_se(p
== original
+ 5);
1575 p
= original
= " foo\\ba\\x6ar ";
1576 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1577 assert_se(streq(t
, "foo\ba\x6ar"));
1579 assert_se(p
== original
+ 13);
1581 p
= original
= " foo\\ba\\x6ar ";
1582 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) > 0);
1583 assert_se(streq(t
, "foobax6ar"));
1585 assert_se(p
== original
+ 13);
1587 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1588 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1589 assert_se(streq(t
, "föo"));
1591 assert_se(p
== original
+ 13);
1593 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1594 assert_se(streq(t
, "pi\360\237\222\251le"));
1596 assert_se(p
== original
+ 32);
1598 p
= original
= "fooo\\";
1599 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_RELAX
, NULL
, "fake", 1, original
) > 0);
1600 assert_se(streq(t
, "fooo"));
1602 assert_se(p
== original
+ 5);
1604 p
= original
= "fooo\\";
1605 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) > 0);
1606 assert_se(streq(t
, "fooo\\"));
1608 assert_se(p
== original
+ 5);
1610 p
= original
= "fooo\\";
1611 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1612 assert_se(streq(t
, "fooo\\"));
1614 assert_se(p
== original
+ 5);
1616 p
= original
= "\"foo\\";
1617 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) == -EINVAL
);
1618 assert_se(p
== original
+ 5);
1620 p
= original
= "\"foo\\";
1621 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_RELAX
, NULL
, "fake", 1, original
) > 0);
1622 assert_se(streq(t
, "foo"));
1624 assert_se(p
== original
+ 5);
1626 p
= original
= "\"foo\\";
1627 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_CUNESCAPE
, NULL
, "fake", 1, original
) == -EINVAL
);
1628 assert_se(p
== original
+ 5);
1630 p
= original
= "\"foo\\";
1631 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_CUNESCAPE
|UNQUOTE_RELAX
, NULL
, "fake", 1, original
) > 0);
1632 assert_se(streq(t
, "foo"));
1634 assert_se(p
== original
+ 5);
1636 p
= original
= "fooo\\ bar quux";
1637 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_RELAX
, NULL
, "fake", 1, original
) > 0);
1638 assert_se(streq(t
, "fooo bar"));
1640 assert_se(p
== original
+ 10);
1642 p
= original
= "fooo\\ bar quux";
1643 assert_se(unquote_first_word_and_warn(&p
, &t
, 0, NULL
, "fake", 1, original
) > 0);
1644 assert_se(streq(t
, "fooo bar"));
1646 assert_se(p
== original
+ 10);
1648 p
= original
= "fooo\\ bar quux";
1649 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1650 assert_se(streq(t
, "fooo\\ bar"));
1652 assert_se(p
== original
+ 10);
1654 p
= original
= "\\w+@\\K[\\d.]+";
1655 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1656 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1658 assert_se(p
== original
+ 12);
1660 p
= original
= "\\w+\\b";
1661 assert_se(unquote_first_word_and_warn(&p
, &t
, UNQUOTE_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1662 assert_se(streq(t
, "\\w+\b"));
1664 assert_se(p
== original
+ 5);
1667 static void test_unquote_many_words(void) {
1668 const char *p
, *original
;
1671 p
= original
= "foobar waldi piep";
1672 assert_se(unquote_many_words(&p
, 0, &a
, &b
, &c
, NULL
) == 3);
1673 assert_se(p
== original
+ 17);
1674 assert_se(streq_ptr(a
, "foobar"));
1675 assert_se(streq_ptr(b
, "waldi"));
1676 assert_se(streq_ptr(c
, "piep"));
1681 p
= original
= "'foobar' wa\"ld\"i ";
1682 assert_se(unquote_many_words(&p
, 0, &a
, &b
, &c
, NULL
) == 2);
1683 assert_se(p
== original
+ 19);
1684 assert_se(streq_ptr(a
, "foobar"));
1685 assert_se(streq_ptr(b
, "waldi"));
1686 assert_se(streq_ptr(c
, NULL
));
1691 assert_se(unquote_many_words(&p
, 0, &a
, &b
, &c
, NULL
) == 0);
1692 assert_se(p
== original
);
1693 assert_se(streq_ptr(a
, NULL
));
1694 assert_se(streq_ptr(b
, NULL
));
1695 assert_se(streq_ptr(c
, NULL
));
1698 assert_se(unquote_many_words(&p
, 0, &a
, &b
, &c
, NULL
) == 0);
1699 assert_se(p
== original
+2);
1700 assert_se(streq_ptr(a
, NULL
));
1701 assert_se(streq_ptr(b
, NULL
));
1702 assert_se(streq_ptr(c
, NULL
));
1704 p
= original
= "foobar";
1705 assert_se(unquote_many_words(&p
, 0, NULL
) == 0);
1706 assert_se(p
== original
);
1708 p
= original
= "foobar waldi";
1709 assert_se(unquote_many_words(&p
, 0, &a
, NULL
) == 1);
1710 assert_se(p
== original
+7);
1711 assert_se(streq_ptr(a
, "foobar"));
1714 p
= original
= " foobar ";
1715 assert_se(unquote_many_words(&p
, 0, &a
, NULL
) == 1);
1716 assert_se(p
== original
+15);
1717 assert_se(streq_ptr(a
, "foobar"));
1721 static int parse_item(const char *key
, const char *value
) {
1724 log_info("kernel cmdline option <%s> = <%s>", key
, strna(value
));
1728 static void test_parse_proc_cmdline(void) {
1729 assert_se(parse_proc_cmdline(parse_item
) >= 0);
1732 static void test_raw_clone(void) {
1733 pid_t parent
, pid
, pid2
;
1736 log_info("before clone: getpid()→"PID_FMT
, parent
);
1737 assert_se(raw_getpid() == parent
);
1739 pid
= raw_clone(0, NULL
);
1740 assert_se(pid
>= 0);
1742 pid2
= raw_getpid();
1743 log_info("raw_clone: "PID_FMT
" getpid()→"PID_FMT
" raw_getpid()→"PID_FMT
,
1744 pid
, getpid(), pid2
);
1746 assert_se(pid2
!= parent
);
1747 _exit(EXIT_SUCCESS
);
1751 assert_se(pid2
== parent
);
1752 waitpid(pid
, &status
, __WCLONE
);
1753 assert_se(WIFEXITED(status
) && WEXITSTATUS(status
) == EXIT_SUCCESS
);
1757 static void test_same_fd(void) {
1758 _cleanup_close_pair_
int p
[2] = { -1, -1 };
1759 _cleanup_close_
int a
= -1, b
= -1, c
= -1;
1761 assert_se(pipe2(p
, O_CLOEXEC
) >= 0);
1762 assert_se((a
= dup(p
[0])) >= 0);
1763 assert_se((b
= open("/dev/null", O_RDONLY
|O_CLOEXEC
)) >= 0);
1764 assert_se((c
= dup(a
)) >= 0);
1766 assert_se(same_fd(p
[0], p
[0]) > 0);
1767 assert_se(same_fd(p
[1], p
[1]) > 0);
1768 assert_se(same_fd(a
, a
) > 0);
1769 assert_se(same_fd(b
, b
) > 0);
1771 assert_se(same_fd(a
, p
[0]) > 0);
1772 assert_se(same_fd(p
[0], a
) > 0);
1773 assert_se(same_fd(c
, p
[0]) > 0);
1774 assert_se(same_fd(p
[0], c
) > 0);
1775 assert_se(same_fd(a
, c
) > 0);
1776 assert_se(same_fd(c
, a
) > 0);
1778 assert_se(same_fd(p
[0], p
[1]) == 0);
1779 assert_se(same_fd(p
[1], p
[0]) == 0);
1780 assert_se(same_fd(p
[0], b
) == 0);
1781 assert_se(same_fd(b
, p
[0]) == 0);
1782 assert_se(same_fd(p
[1], a
) == 0);
1783 assert_se(same_fd(a
, p
[1]) == 0);
1784 assert_se(same_fd(p
[1], b
) == 0);
1785 assert_se(same_fd(b
, p
[1]) == 0);
1787 assert_se(same_fd(a
, b
) == 0);
1788 assert_se(same_fd(b
, a
) == 0);
1791 static void test_uid_ptr(void) {
1793 assert_se(UID_TO_PTR(0) != NULL
);
1794 assert_se(UID_TO_PTR(1000) != NULL
);
1796 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
1797 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
1800 static void test_sparse_write_one(int fd
, const char *buffer
, size_t n
) {
1803 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
1804 assert_se(ftruncate(fd
, 0) >= 0);
1805 assert_se(sparse_write(fd
, buffer
, n
, 4) == (ssize_t
) n
);
1807 assert_se(lseek(fd
, 0, SEEK_CUR
) == (off_t
) n
);
1808 assert_se(ftruncate(fd
, n
) >= 0);
1810 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
1811 assert_se(read(fd
, check
, n
) == (ssize_t
) n
);
1813 assert_se(memcmp(buffer
, check
, n
) == 0);
1816 static void test_sparse_write(void) {
1817 const char test_a
[] = "test";
1818 const char test_b
[] = "\0\0\0\0test\0\0\0\0";
1819 const char test_c
[] = "\0\0test\0\0\0\0";
1820 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";
1821 const char test_e
[] = "test\0\0\0\0test";
1822 _cleanup_close_
int fd
= -1;
1823 char fn
[] = "/tmp/sparseXXXXXX";
1825 fd
= mkostemp(fn
, O_CLOEXEC
);
1829 test_sparse_write_one(fd
, test_a
, sizeof(test_a
));
1830 test_sparse_write_one(fd
, test_b
, sizeof(test_b
));
1831 test_sparse_write_one(fd
, test_c
, sizeof(test_c
));
1832 test_sparse_write_one(fd
, test_d
, sizeof(test_d
));
1833 test_sparse_write_one(fd
, test_e
, sizeof(test_e
));
1836 static void test_shell_maybe_quote_one(const char *s
, const char *expected
) {
1837 _cleanup_free_
char *r
;
1839 assert_se(r
= shell_maybe_quote(s
));
1840 assert_se(streq(r
, expected
));
1843 static void test_shell_maybe_quote(void) {
1845 test_shell_maybe_quote_one("", "");
1846 test_shell_maybe_quote_one("\\", "\"\\\\\"");
1847 test_shell_maybe_quote_one("\"", "\"\\\"\"");
1848 test_shell_maybe_quote_one("foobar", "foobar");
1849 test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
1850 test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
1851 test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
1854 static void test_parse_mode(void) {
1857 assert_se(parse_mode("-1", &m
) < 0);
1858 assert_se(parse_mode("", &m
) < 0);
1859 assert_se(parse_mode("888", &m
) < 0);
1860 assert_se(parse_mode("77777", &m
) < 0);
1862 assert_se(parse_mode("544", &m
) >= 0 && m
== 0544);
1863 assert_se(parse_mode("777", &m
) >= 0 && m
== 0777);
1864 assert_se(parse_mode("7777", &m
) >= 0 && m
== 07777);
1865 assert_se(parse_mode("0", &m
) >= 0 && m
== 0);
1868 static void test_tempfn(void) {
1869 char *ret
= NULL
, *p
;
1871 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL
, &ret
) >= 0);
1872 assert_se(streq_ptr(ret
, "/foo/bar/.#waldoXXXXXX"));
1875 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret
) >= 0);
1876 assert_se(streq_ptr(ret
, "/foo/bar/.#[miau]waldoXXXXXX"));
1879 assert_se(tempfn_random("/foo/bar/waldo", NULL
, &ret
) >= 0);
1880 assert_se(p
= startswith(ret
, "/foo/bar/.#waldo"));
1881 assert_se(strlen(p
) == 16);
1882 assert_se(in_charset(p
, "0123456789abcdef"));
1885 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret
) >= 0);
1886 assert_se(p
= startswith(ret
, "/foo/bar/.#[wuff]waldo"));
1887 assert_se(strlen(p
) == 16);
1888 assert_se(in_charset(p
, "0123456789abcdef"));
1891 assert_se(tempfn_random_child("/foo/bar/waldo", NULL
, &ret
) >= 0);
1892 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#"));
1893 assert_se(strlen(p
) == 16);
1894 assert_se(in_charset(p
, "0123456789abcdef"));
1897 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret
) >= 0);
1898 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#[kikiriki]"));
1899 assert_se(strlen(p
) == 16);
1900 assert_se(in_charset(p
, "0123456789abcdef"));
1904 int main(int argc
, char *argv
[]) {
1905 log_parse_environment();
1909 test_align_power2();
1911 test_container_of();
1913 test_div_round_up();
1916 test_parse_boolean();
1923 test_delete_chars();
1928 test_unbase64char();
1938 test_foreach_word();
1939 test_foreach_word_quoted();
1940 test_memdup_multiply();
1941 test_hostname_is_valid();
1942 test_read_hostname_config();
1944 test_protect_errno();
1946 test_config_parse_iec_off();
1950 test_fstab_node_to_udev_node();
1951 test_get_files_in_directory();
1953 test_writing_tmpfile();
1956 test_foreach_string();
1957 test_filename_is_valid();
1958 test_string_has_cc();
1959 test_ascii_strlower();
1961 test_is_valid_documentation_url();
1962 test_file_in_same_dir();
1964 test_close_nointr();
1965 test_unlink_noerrno();
1966 test_readlink_and_make_absolute();
1967 test_ignore_signals();
1971 test_search_and_fopen();
1972 test_search_and_fopen_nulstr();
1974 test_execute_directory();
1975 test_unquote_first_word();
1976 test_unquote_first_word_and_warn();
1977 test_unquote_many_words();
1978 test_parse_proc_cmdline();
1982 test_sparse_write();
1983 test_shell_maybe_quote();