]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-util.c
Merge pull request #1406 from blaskovic/journal-remote-typo
[thirdparty/systemd.git] / src / test / test-util.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7 Copyright 2013 Thomas H.P. Andersen
8
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.
13
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.
18
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/>.
21 ***/
22
23 #include <errno.h>
24 #include <fcntl.h>
25 #include <locale.h>
26 #include <math.h>
27 #include <signal.h>
28 #include <string.h>
29 #include <sys/wait.h>
30 #include <unistd.h>
31
32 #include "conf-parser.h"
33 #include "cpu-set-util.h"
34 #include "def.h"
35 #include "fileio.h"
36 #include "mkdir.h"
37 #include "process-util.h"
38 #include "rm-rf.h"
39 #include "signal-util.h"
40 #include "strv.h"
41 #include "util.h"
42 #include "virt.h"
43
44 static void test_streq_ptr(void) {
45 assert_se(streq_ptr(NULL, NULL));
46 assert_se(!streq_ptr("abc", "cdef"));
47 }
48
49 static void test_align_power2(void) {
50 unsigned long i, p2;
51
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);
57
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);
63
64 for (i = 1; i < 131071; ++i) {
65 for (p2 = 1; p2 < i; p2 <<= 1)
66 /* empty */ ;
67
68 assert_se(ALIGN_POWER2(i) == p2);
69 }
70
71 for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
72 for (p2 = 1; p2 && p2 < i; p2 <<= 1)
73 /* empty */ ;
74
75 assert_se(ALIGN_POWER2(i) == p2);
76 }
77 }
78
79 static void test_max(void) {
80 static const struct {
81 int a;
82 int b[CONST_MAX(10, 100)];
83 } val1 = {
84 .a = CONST_MAX(10, 100),
85 };
86 int d = 0;
87
88 assert_cc(sizeof(val1.b) == sizeof(int) * 100);
89
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));
94
95 assert_se(val1.a == 100);
96 assert_se(MAX(++d, 0) == 1);
97 assert_se(d == 1);
98
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));
102
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);
119 }
120
121 static void test_container_of(void) {
122 struct mytype {
123 uint8_t pad1[3];
124 uint64_t v1;
125 uint8_t pad2[2];
126 uint32_t v2;
127 } _packed_ myval = { };
128
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,
133 struct mytype,
134 v2)->v1,
135 struct mytype,
136 v1) == &myval);
137 }
138
139 static void test_alloca(void) {
140 static const uint8_t zero[997] = { };
141 char *t;
142
143 t = alloca_align(17, 512);
144 assert_se(!((uintptr_t)t & 0xff));
145 memzero(t, 17);
146
147 t = alloca0_align(997, 1024);
148 assert_se(!((uintptr_t)t & 0x1ff));
149 assert_se(!memcmp(t, zero, 997));
150 }
151
152 static void test_div_round_up(void) {
153 int div;
154
155 /* basic tests */
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);
161
162 /* test multiple evaluation */
163 div = 0;
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);
168
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);
176
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);
183 }
184
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"));
193
194 assert_se(!first_word("Hello", "Hellooo"));
195 assert_se(!first_word("Hello", "xxxxx"));
196 assert_se(!first_word("Hellooo", "Hello"));
197 }
198
199 static void test_close_many(void) {
200 int fds[3];
201 char name0[] = "/tmp/test-close-many.XXXXXX";
202 char name1[] = "/tmp/test-close-many.XXXXXX";
203 char name2[] = "/tmp/test-close-many.XXXXXX";
204
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);
208
209 close_many(fds, 2);
210
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);
214
215 safe_close(fds[2]);
216
217 unlink(name0);
218 unlink(name1);
219 unlink(name2);
220 }
221
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);
232
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);
242
243 assert_se(parse_boolean("garbage") < 0);
244 assert_se(parse_boolean("") < 0);
245 assert_se(parse_boolean("full") < 0);
246 }
247
248 static void test_parse_pid(void) {
249 int r;
250 pid_t pid;
251
252 r = parse_pid("100", &pid);
253 assert_se(r == 0);
254 assert_se(pid == 100);
255
256 r = parse_pid("0x7FFFFFFF", &pid);
257 assert_se(r == 0);
258 assert_se(pid == 2147483647);
259
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);
264
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);
269
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);
274
275 r = parse_pid("junk", &pid);
276 assert_se(r == -EINVAL);
277 }
278
279 static void test_parse_uid(void) {
280 int r;
281 uid_t uid;
282
283 r = parse_uid("100", &uid);
284 assert_se(r == 0);
285 assert_se(uid == 100);
286
287 r = parse_uid("65535", &uid);
288 assert_se(r == -ENXIO);
289
290 r = parse_uid("asdsdas", &uid);
291 assert_se(r == -EINVAL);
292 }
293
294 static void test_safe_atou16(void) {
295 int r;
296 uint16_t l;
297
298 r = safe_atou16("12345", &l);
299 assert_se(r == 0);
300 assert_se(l == 12345);
301
302 r = safe_atou16("123456", &l);
303 assert_se(r == -ERANGE);
304
305 r = safe_atou16("junk", &l);
306 assert_se(r == -EINVAL);
307 }
308
309 static void test_safe_atoi16(void) {
310 int r;
311 int16_t l;
312
313 r = safe_atoi16("-12345", &l);
314 assert_se(r == 0);
315 assert_se(l == -12345);
316
317 r = safe_atoi16("36536", &l);
318 assert_se(r == -ERANGE);
319
320 r = safe_atoi16("junk", &l);
321 assert_se(r == -EINVAL);
322 }
323
324 static void test_safe_atolli(void) {
325 int r;
326 long long l;
327
328 r = safe_atolli("12345", &l);
329 assert_se(r == 0);
330 assert_se(l == 12345);
331
332 r = safe_atolli("junk", &l);
333 assert_se(r == -EINVAL);
334 }
335
336 static void test_safe_atod(void) {
337 int r;
338 double d;
339 char *e;
340
341 r = safe_atod("junk", &d);
342 assert_se(r == -EINVAL);
343
344 r = safe_atod("0.2244", &d);
345 assert_se(r == 0);
346 assert_se(fabs(d - 0.2244) < 0.000001);
347
348 r = safe_atod("0,5", &d);
349 assert_se(r == -EINVAL);
350
351 errno = 0;
352 strtod("0,5", &e);
353 assert_se(*e == ',');
354
355 /* Check if this really is locale independent */
356 if (setlocale(LC_NUMERIC, "de_DE.utf8")) {
357
358 r = safe_atod("0.2244", &d);
359 assert_se(r == 0);
360 assert_se(fabs(d - 0.2244) < 0.000001);
361
362 r = safe_atod("0,5", &d);
363 assert_se(r == -EINVAL);
364
365 errno = 0;
366 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
367 }
368
369 /* And check again, reset */
370 assert_se(setlocale(LC_NUMERIC, "C"));
371
372 r = safe_atod("0.2244", &d);
373 assert_se(r == 0);
374 assert_se(fabs(d - 0.2244) < 0.000001);
375
376 r = safe_atod("0,5", &d);
377 assert_se(r == -EINVAL);
378
379 errno = 0;
380 strtod("0,5", &e);
381 assert_se(*e == ',');
382 }
383
384 static void test_strappend(void) {
385 _cleanup_free_ char *t1, *t2, *t3, *t4;
386
387 t1 = strappend(NULL, NULL);
388 assert_se(streq(t1, ""));
389
390 t2 = strappend(NULL, "suf");
391 assert_se(streq(t2, "suf"));
392
393 t3 = strappend("pre", NULL);
394 assert_se(streq(t3, "pre"));
395
396 t4 = strappend("pre", "suf");
397 assert_se(streq(t4, "presuf"));
398 }
399
400 static void test_strstrip(void) {
401 char *r;
402 char input[] = " hello, waldo. ";
403
404 r = strstrip(input);
405 assert_se(streq(r, "hello, waldo."));
406 }
407
408 static void test_delete_chars(void) {
409 char *r;
410 char input[] = " hello, waldo. abc";
411
412 r = delete_chars(input, WHITESPACE);
413 assert_se(streq(r, "hello,waldo.abc"));
414 }
415
416 static void test_in_charset(void) {
417 assert_se(in_charset("dddaaabbbcccc", "abcd"));
418 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
419 }
420
421 static void test_hexchar(void) {
422 assert_se(hexchar(0xa) == 'a');
423 assert_se(hexchar(0x0) == '0');
424 }
425
426 static void test_unhexchar(void) {
427 assert_se(unhexchar('a') == 0xA);
428 assert_se(unhexchar('A') == 0xA);
429 assert_se(unhexchar('0') == 0x0);
430 }
431
432 static void test_base32hexchar(void) {
433 assert_se(base32hexchar(0) == '0');
434 assert_se(base32hexchar(9) == '9');
435 assert_se(base32hexchar(10) == 'A');
436 assert_se(base32hexchar(31) == 'V');
437 }
438
439 static void test_unbase32hexchar(void) {
440 assert_se(unbase32hexchar('0') == 0);
441 assert_se(unbase32hexchar('9') == 9);
442 assert_se(unbase32hexchar('A') == 10);
443 assert_se(unbase32hexchar('V') == 31);
444 assert_se(unbase32hexchar('=') == -EINVAL);
445 }
446
447 static void test_base64char(void) {
448 assert_se(base64char(0) == 'A');
449 assert_se(base64char(26) == 'a');
450 assert_se(base64char(63) == '/');
451 }
452
453 static void test_unbase64char(void) {
454 assert_se(unbase64char('A') == 0);
455 assert_se(unbase64char('Z') == 25);
456 assert_se(unbase64char('a') == 26);
457 assert_se(unbase64char('z') == 51);
458 assert_se(unbase64char('0') == 52);
459 assert_se(unbase64char('9') == 61);
460 assert_se(unbase64char('+') == 62);
461 assert_se(unbase64char('/') == 63);
462 assert_se(unbase64char('=') == -EINVAL);
463 }
464
465 static void test_octchar(void) {
466 assert_se(octchar(00) == '0');
467 assert_se(octchar(07) == '7');
468 }
469
470 static void test_unoctchar(void) {
471 assert_se(unoctchar('0') == 00);
472 assert_se(unoctchar('7') == 07);
473 }
474
475 static void test_decchar(void) {
476 assert_se(decchar(0) == '0');
477 assert_se(decchar(9) == '9');
478 }
479
480 static void test_undecchar(void) {
481 assert_se(undecchar('0') == 0);
482 assert_se(undecchar('9') == 9);
483 }
484
485 static void test_unhexmem(void) {
486 const char *hex = "efa214921";
487 const char *hex_invalid = "efa214921o";
488 _cleanup_free_ char *hex2 = NULL;
489 _cleanup_free_ void *mem = NULL;
490 size_t len;
491
492 assert_se(unhexmem(hex, strlen(hex), &mem, &len) == 0);
493 assert_se(unhexmem(hex, strlen(hex) + 1, &mem, &len) == -EINVAL);
494 assert_se(unhexmem(hex_invalid, strlen(hex_invalid), &mem, &len) == -EINVAL);
495
496 assert_se((hex2 = hexmem(mem, len)));
497
498 free(mem);
499
500 assert_se(memcmp(hex, hex2, strlen(hex)) == 0);
501
502 free(hex2);
503
504 assert_se(unhexmem(hex, strlen(hex) - 1, &mem, &len) == 0);
505 assert_se((hex2 = hexmem(mem, len)));
506 assert_se(memcmp(hex, hex2, strlen(hex) - 1) == 0);
507 }
508
509 /* https://tools.ietf.org/html/rfc4648#section-10 */
510 static void test_base32hexmem(void) {
511 char *b32;
512
513 b32 = base32hexmem("", strlen(""), true);
514 assert_se(b32);
515 assert_se(streq(b32, ""));
516 free(b32);
517
518 b32 = base32hexmem("f", strlen("f"), true);
519 assert_se(b32);
520 assert_se(streq(b32, "CO======"));
521 free(b32);
522
523 b32 = base32hexmem("fo", strlen("fo"), true);
524 assert_se(b32);
525 assert_se(streq(b32, "CPNG===="));
526 free(b32);
527
528 b32 = base32hexmem("foo", strlen("foo"), true);
529 assert_se(b32);
530 assert_se(streq(b32, "CPNMU==="));
531 free(b32);
532
533 b32 = base32hexmem("foob", strlen("foob"), true);
534 assert_se(b32);
535 assert_se(streq(b32, "CPNMUOG="));
536 free(b32);
537
538 b32 = base32hexmem("fooba", strlen("fooba"), true);
539 assert_se(b32);
540 assert_se(streq(b32, "CPNMUOJ1"));
541 free(b32);
542
543 b32 = base32hexmem("foobar", strlen("foobar"), true);
544 assert_se(b32);
545 assert_se(streq(b32, "CPNMUOJ1E8======"));
546 free(b32);
547
548 b32 = base32hexmem("", strlen(""), false);
549 assert_se(b32);
550 assert_se(streq(b32, ""));
551 free(b32);
552
553 b32 = base32hexmem("f", strlen("f"), false);
554 assert_se(b32);
555 assert_se(streq(b32, "CO"));
556 free(b32);
557
558 b32 = base32hexmem("fo", strlen("fo"), false);
559 assert_se(b32);
560 assert_se(streq(b32, "CPNG"));
561 free(b32);
562
563 b32 = base32hexmem("foo", strlen("foo"), false);
564 assert_se(b32);
565 assert_se(streq(b32, "CPNMU"));
566 free(b32);
567
568 b32 = base32hexmem("foob", strlen("foob"), false);
569 assert_se(b32);
570 assert_se(streq(b32, "CPNMUOG"));
571 free(b32);
572
573 b32 = base32hexmem("fooba", strlen("fooba"), false);
574 assert_se(b32);
575 assert_se(streq(b32, "CPNMUOJ1"));
576 free(b32);
577
578 b32 = base32hexmem("foobar", strlen("foobar"), false);
579 assert_se(b32);
580 assert_se(streq(b32, "CPNMUOJ1E8"));
581 free(b32);
582 }
583
584 static void test_unbase32hexmem(void) {
585 void *mem;
586 size_t len;
587
588 assert_se(unbase32hexmem("", strlen(""), true, &mem, &len) == 0);
589 assert_se(streq(strndupa(mem, len), ""));
590 free(mem);
591
592 assert_se(unbase32hexmem("CO======", strlen("CO======"), true, &mem, &len) == 0);
593 assert_se(streq(strndupa(mem, len), "f"));
594 free(mem);
595
596 assert_se(unbase32hexmem("CPNG====", strlen("CPNG===="), true, &mem, &len) == 0);
597 assert_se(streq(strndupa(mem, len), "fo"));
598 free(mem);
599
600 assert_se(unbase32hexmem("CPNMU===", strlen("CPNMU==="), true, &mem, &len) == 0);
601 assert_se(streq(strndupa(mem, len), "foo"));
602 free(mem);
603
604 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), true, &mem, &len) == 0);
605 assert_se(streq(strndupa(mem, len), "foob"));
606 free(mem);
607
608 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == 0);
609 assert_se(streq(strndupa(mem, len), "fooba"));
610 free(mem);
611
612 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), true, &mem, &len) == 0);
613 assert_se(streq(strndupa(mem, len), "foobar"));
614 free(mem);
615
616 assert_se(unbase32hexmem("A", strlen("A"), true, &mem, &len) == -EINVAL);
617 assert_se(unbase32hexmem("A=======", strlen("A======="), true, &mem, &len) == -EINVAL);
618 assert_se(unbase32hexmem("AAA=====", strlen("AAA====="), true, &mem, &len) == -EINVAL);
619 assert_se(unbase32hexmem("AAAAAA==", strlen("AAAAAA=="), true, &mem, &len) == -EINVAL);
620 assert_se(unbase32hexmem("AB======", strlen("AB======"), true, &mem, &len) == -EINVAL);
621 assert_se(unbase32hexmem("AAAB====", strlen("AAAB===="), true, &mem, &len) == -EINVAL);
622 assert_se(unbase32hexmem("AAAAB===", strlen("AAAAB==="), true, &mem, &len) == -EINVAL);
623 assert_se(unbase32hexmem("AAAAAAB=", strlen("AAAAAAB="), true, &mem, &len) == -EINVAL);
624
625 assert_se(unbase32hexmem("XPNMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
626 assert_se(unbase32hexmem("CXNMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
627 assert_se(unbase32hexmem("CPXMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
628 assert_se(unbase32hexmem("CPNXUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
629 assert_se(unbase32hexmem("CPNMXOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
630 assert_se(unbase32hexmem("CPNMUXJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
631 assert_se(unbase32hexmem("CPNMUOX1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
632 assert_se(unbase32hexmem("CPNMUOJX", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
633
634 assert_se(unbase32hexmem("", strlen(""), false, &mem, &len) == 0);
635 assert_se(streq(strndupa(mem, len), ""));
636 free(mem);
637
638 assert_se(unbase32hexmem("CO", strlen("CO"), false, &mem, &len) == 0);
639 assert_se(streq(strndupa(mem, len), "f"));
640 free(mem);
641
642 assert_se(unbase32hexmem("CPNG", strlen("CPNG"), false, &mem, &len) == 0);
643 assert_se(streq(strndupa(mem, len), "fo"));
644 free(mem);
645
646 assert_se(unbase32hexmem("CPNMU", strlen("CPNMU"), false, &mem, &len) == 0);
647 assert_se(streq(strndupa(mem, len), "foo"));
648 free(mem);
649
650 assert_se(unbase32hexmem("CPNMUOG", strlen("CPNMUOG"), false, &mem, &len) == 0);
651 assert_se(streq(strndupa(mem, len), "foob"));
652 free(mem);
653
654 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), false, &mem, &len) == 0);
655 assert_se(streq(strndupa(mem, len), "fooba"));
656 free(mem);
657
658 assert_se(unbase32hexmem("CPNMUOJ1E8", strlen("CPNMUOJ1E8"), false, &mem, &len) == 0);
659 assert_se(streq(strndupa(mem, len), "foobar"));
660 free(mem);
661
662 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), false, &mem, &len) == -EINVAL);
663 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), false, &mem, &len) == -EINVAL);
664 assert_se(unbase32hexmem("A", strlen("A"), false, &mem, &len) == -EINVAL);
665 assert_se(unbase32hexmem("A", strlen("A"), false, &mem, &len) == -EINVAL);
666 assert_se(unbase32hexmem("AAA", strlen("AAA"), false, &mem, &len) == -EINVAL);
667 assert_se(unbase32hexmem("AAAAAA", strlen("AAAAAA"), false, &mem, &len) == -EINVAL);
668 assert_se(unbase32hexmem("AB", strlen("AB"), false, &mem, &len) == -EINVAL);
669 assert_se(unbase32hexmem("AAAB", strlen("AAAB"), false, &mem, &len) == -EINVAL);
670 assert_se(unbase32hexmem("AAAAB", strlen("AAAAB"), false, &mem, &len) == -EINVAL);
671 assert_se(unbase32hexmem("AAAAAAB", strlen("AAAAAAB"), false, &mem, &len) == -EINVAL);
672 }
673
674 /* https://tools.ietf.org/html/rfc4648#section-10 */
675 static void test_base64mem(void) {
676 char *b64;
677
678 b64 = base64mem("", strlen(""));
679 assert_se(b64);
680 assert_se(streq(b64, ""));
681 free(b64);
682
683 b64 = base64mem("f", strlen("f"));
684 assert_se(b64);
685 assert_se(streq(b64, "Zg=="));
686 free(b64);
687
688 b64 = base64mem("fo", strlen("fo"));
689 assert_se(b64);
690 assert_se(streq(b64, "Zm8="));
691 free(b64);
692
693 b64 = base64mem("foo", strlen("foo"));
694 assert_se(b64);
695 assert_se(streq(b64, "Zm9v"));
696 free(b64);
697
698 b64 = base64mem("foob", strlen("foob"));
699 assert_se(b64);
700 assert_se(streq(b64, "Zm9vYg=="));
701 free(b64);
702
703 b64 = base64mem("fooba", strlen("fooba"));
704 assert_se(b64);
705 assert_se(streq(b64, "Zm9vYmE="));
706 free(b64);
707
708 b64 = base64mem("foobar", strlen("foobar"));
709 assert_se(b64);
710 assert_se(streq(b64, "Zm9vYmFy"));
711 free(b64);
712 }
713
714 static void test_unbase64mem(void) {
715 void *mem;
716 size_t len;
717
718 assert_se(unbase64mem("", strlen(""), &mem, &len) == 0);
719 assert_se(streq(strndupa(mem, len), ""));
720 free(mem);
721
722 assert_se(unbase64mem("Zg==", strlen("Zg=="), &mem, &len) == 0);
723 assert_se(streq(strndupa(mem, len), "f"));
724 free(mem);
725
726 assert_se(unbase64mem("Zm8=", strlen("Zm8="), &mem, &len) == 0);
727 assert_se(streq(strndupa(mem, len), "fo"));
728 free(mem);
729
730 assert_se(unbase64mem("Zm9v", strlen("Zm9v"), &mem, &len) == 0);
731 assert_se(streq(strndupa(mem, len), "foo"));
732 free(mem);
733
734 assert_se(unbase64mem("Zm9vYg==", strlen("Zm9vYg=="), &mem, &len) == 0);
735 assert_se(streq(strndupa(mem, len), "foob"));
736 free(mem);
737
738 assert_se(unbase64mem("Zm9vYmE=", strlen("Zm9vYmE="), &mem, &len) == 0);
739 assert_se(streq(strndupa(mem, len), "fooba"));
740 free(mem);
741
742 assert_se(unbase64mem("Zm9vYmFy", strlen("Zm9vYmFy"), &mem, &len) == 0);
743 assert_se(streq(strndupa(mem, len), "foobar"));
744 free(mem);
745
746 assert_se(unbase64mem("A", strlen("A"), &mem, &len) == -EINVAL);
747 assert_se(unbase64mem("A====", strlen("A===="), &mem, &len) == -EINVAL);
748 assert_se(unbase64mem("AAB==", strlen("AAB=="), &mem, &len) == -EINVAL);
749 assert_se(unbase64mem("AAAB=", strlen("AAAB="), &mem, &len) == -EINVAL);
750 }
751
752 static void test_cescape(void) {
753 _cleanup_free_ char *escaped;
754
755 assert_se(escaped = cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
756 assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
757 }
758
759 static void test_cunescape(void) {
760 _cleanup_free_ char *unescaped;
761
762 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", 0, &unescaped) < 0);
763 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", UNESCAPE_RELAX, &unescaped) >= 0);
764 assert_se(streq_ptr(unescaped, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
765 unescaped = mfree(unescaped);
766
767 /* incomplete sequences */
768 assert_se(cunescape("\\x0", 0, &unescaped) < 0);
769 assert_se(cunescape("\\x0", UNESCAPE_RELAX, &unescaped) >= 0);
770 assert_se(streq_ptr(unescaped, "\\x0"));
771 unescaped = mfree(unescaped);
772
773 assert_se(cunescape("\\x", 0, &unescaped) < 0);
774 assert_se(cunescape("\\x", UNESCAPE_RELAX, &unescaped) >= 0);
775 assert_se(streq_ptr(unescaped, "\\x"));
776 unescaped = mfree(unescaped);
777
778 assert_se(cunescape("\\", 0, &unescaped) < 0);
779 assert_se(cunescape("\\", UNESCAPE_RELAX, &unescaped) >= 0);
780 assert_se(streq_ptr(unescaped, "\\"));
781 unescaped = mfree(unescaped);
782
783 assert_se(cunescape("\\11", 0, &unescaped) < 0);
784 assert_se(cunescape("\\11", UNESCAPE_RELAX, &unescaped) >= 0);
785 assert_se(streq_ptr(unescaped, "\\11"));
786 unescaped = mfree(unescaped);
787
788 assert_se(cunescape("\\1", 0, &unescaped) < 0);
789 assert_se(cunescape("\\1", UNESCAPE_RELAX, &unescaped) >= 0);
790 assert_se(streq_ptr(unescaped, "\\1"));
791 unescaped = mfree(unescaped);
792
793 assert_se(cunescape("\\u0000", 0, &unescaped) < 0);
794 assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX, &unescaped) >= 0);
795 assert_se(streq_ptr(unescaped, "ßßΠA"));
796 unescaped = mfree(unescaped);
797
798 assert_se(cunescape("\\073", 0, &unescaped) >= 0);
799 assert_se(streq_ptr(unescaped, ";"));
800 }
801
802 static void test_foreach_word(void) {
803 const char *word, *state;
804 size_t l;
805 int i = 0;
806 const char test[] = "test abc d\te f ";
807 const char * const expected[] = {
808 "test",
809 "abc",
810 "d",
811 "e",
812 "f",
813 "",
814 NULL
815 };
816
817 FOREACH_WORD(word, l, test, state)
818 assert_se(strneq(expected[i++], word, l));
819 }
820
821 static void check(const char *test, char** expected, bool trailing) {
822 const char *word, *state;
823 size_t l;
824 int i = 0;
825
826 printf("<<<%s>>>\n", test);
827 FOREACH_WORD_QUOTED(word, l, test, state) {
828 _cleanup_free_ char *t = NULL;
829
830 assert_se(t = strndup(word, l));
831 assert_se(strneq(expected[i++], word, l));
832 printf("<%s>\n", t);
833 }
834 printf("<<<%s>>>\n", state);
835 assert_se(expected[i] == NULL);
836 assert_se(isempty(state) == !trailing);
837 }
838
839 static void test_foreach_word_quoted(void) {
840 check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
841 STRV_MAKE("test",
842 "a",
843 "b",
844 "c",
845 "d",
846 "e",
847 "",
848 "",
849 "hhh",
850 "",
851 "",
852 "a b c"),
853 false);
854
855 check("test \"xxx",
856 STRV_MAKE("test"),
857 true);
858
859 check("test\\",
860 STRV_MAKE_EMPTY,
861 true);
862 }
863
864 static void test_memdup_multiply(void) {
865 int org[] = {1, 2, 3};
866 int *dup;
867
868 dup = (int*)memdup_multiply(org, sizeof(int), 3);
869
870 assert_se(dup);
871 assert_se(dup[0] == 1);
872 assert_se(dup[1] == 2);
873 assert_se(dup[2] == 3);
874 free(dup);
875 }
876
877 static void test_u64log2(void) {
878 assert_se(u64log2(0) == 0);
879 assert_se(u64log2(8) == 3);
880 assert_se(u64log2(9) == 3);
881 assert_se(u64log2(15) == 3);
882 assert_se(u64log2(16) == 4);
883 assert_se(u64log2(1024*1024) == 20);
884 assert_se(u64log2(1024*1024+5) == 20);
885 }
886
887 static void test_protect_errno(void) {
888 errno = 12;
889 {
890 PROTECT_ERRNO;
891 errno = 11;
892 }
893 assert_se(errno == 12);
894 }
895
896 static void test_parse_size(void) {
897 uint64_t bytes;
898
899 assert_se(parse_size("111", 1024, &bytes) == 0);
900 assert_se(bytes == 111);
901
902 assert_se(parse_size("111.4", 1024, &bytes) == 0);
903 assert_se(bytes == 111);
904
905 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
906 assert_se(bytes == 112);
907
908 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
909 assert_se(bytes == 112);
910
911 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
912 assert_se(bytes == 3*1024 + 512);
913
914 assert_se(parse_size("3. K", 1024, &bytes) == 0);
915 assert_se(bytes == 3*1024);
916
917 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
918 assert_se(bytes == 3*1024);
919
920 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
921
922 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
923 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
924
925 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
926
927 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
928 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
929
930 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
931 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
932
933 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
934
935 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
936 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
937
938 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
939 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
940
941 assert_se(parse_size("12P", 1024, &bytes) == 0);
942 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
943
944 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
945
946 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
947 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
948
949 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
950
951 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
952
953 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
954
955 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
956 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
957 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
958
959 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
960
961 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
962 }
963
964 static void test_parse_cpu_set(void) {
965 cpu_set_t *c = NULL;
966 int ncpus;
967 int cpu;
968
969 /* Simple range (from CPUAffinity example) */
970 ncpus = parse_cpu_set_and_warn("1 2", &c, NULL, "fake", 1, "CPUAffinity");
971 assert_se(ncpus >= 1024);
972 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus), c));
973 assert_se(CPU_ISSET_S(2, CPU_ALLOC_SIZE(ncpus), c));
974 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 2);
975 c = mfree(c);
976
977 /* A more interesting range */
978 ncpus = parse_cpu_set_and_warn("0 1 2 3 8 9 10 11", &c, NULL, "fake", 1, "CPUAffinity");
979 assert_se(ncpus >= 1024);
980 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
981 for (cpu = 0; cpu < 4; cpu++)
982 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
983 for (cpu = 8; cpu < 12; cpu++)
984 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
985 c = mfree(c);
986
987 /* Quoted strings */
988 ncpus = parse_cpu_set_and_warn("8 '9' 10 \"11\"", &c, NULL, "fake", 1, "CPUAffinity");
989 assert_se(ncpus >= 1024);
990 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 4);
991 for (cpu = 8; cpu < 12; cpu++)
992 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
993 c = mfree(c);
994
995 /* Use commas as separators */
996 ncpus = parse_cpu_set_and_warn("0,1,2,3 8,9,10,11", &c, NULL, "fake", 1, "CPUAffinity");
997 assert_se(ncpus < 0);
998 assert_se(!c);
999
1000 /* Ranges */
1001 ncpus = parse_cpu_set_and_warn("0-3,8-11", &c, NULL, "fake", 1, "CPUAffinity");
1002 assert_se(ncpus < 0);
1003 assert_se(!c);
1004
1005 /* Garbage */
1006 ncpus = parse_cpu_set_and_warn("0 1 2 3 garbage", &c, NULL, "fake", 1, "CPUAffinity");
1007 assert_se(ncpus < 0);
1008 assert_se(!c);
1009
1010 /* Empty string */
1011 c = NULL;
1012 ncpus = parse_cpu_set_and_warn("", &c, NULL, "fake", 1, "CPUAffinity");
1013 assert_se(ncpus == 0); /* empty string returns 0 */
1014 assert_se(!c);
1015
1016 /* Runnaway quoted string */
1017 ncpus = parse_cpu_set_and_warn("0 1 2 3 \"4 5 6 7 ", &c, NULL, "fake", 1, "CPUAffinity");
1018 assert_se(ncpus < 0);
1019 assert_se(!c);
1020 }
1021
1022 static void test_config_parse_iec_uint64(void) {
1023 uint64_t offset = 0;
1024 assert_se(config_parse_iec_uint64(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset, NULL) == 0);
1025 assert_se(offset == 4 * 1024 * 1024);
1026
1027 assert_se(config_parse_iec_uint64(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset, NULL) == 0);
1028 }
1029
1030 static void test_strextend(void) {
1031 _cleanup_free_ char *str = strdup("0123");
1032 strextend(&str, "456", "78", "9", NULL);
1033 assert_se(streq(str, "0123456789"));
1034 }
1035
1036 static void test_strrep(void) {
1037 _cleanup_free_ char *one, *three, *zero;
1038 one = strrep("waldo", 1);
1039 three = strrep("waldo", 3);
1040 zero = strrep("waldo", 0);
1041
1042 assert_se(streq(one, "waldo"));
1043 assert_se(streq(three, "waldowaldowaldo"));
1044 assert_se(streq(zero, ""));
1045 }
1046
1047 static void test_split_pair(void) {
1048 _cleanup_free_ char *a = NULL, *b = NULL;
1049
1050 assert_se(split_pair("", "", &a, &b) == -EINVAL);
1051 assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
1052 assert_se(split_pair("", "=", &a, &b) == -EINVAL);
1053 assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
1054 assert_se(streq(a, "foo"));
1055 assert_se(streq(b, "bar"));
1056 free(a);
1057 free(b);
1058 assert_se(split_pair("==", "==", &a, &b) >= 0);
1059 assert_se(streq(a, ""));
1060 assert_se(streq(b, ""));
1061 free(a);
1062 free(b);
1063
1064 assert_se(split_pair("===", "==", &a, &b) >= 0);
1065 assert_se(streq(a, ""));
1066 assert_se(streq(b, "="));
1067 }
1068
1069 static void test_fstab_node_to_udev_node(void) {
1070 char *n;
1071
1072 n = fstab_node_to_udev_node("LABEL=applé/jack");
1073 puts(n);
1074 assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack"));
1075 free(n);
1076
1077 n = fstab_node_to_udev_node("PARTLABEL=pinkié pie");
1078 puts(n);
1079 assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie"));
1080 free(n);
1081
1082 n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1083 puts(n);
1084 assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1085 free(n);
1086
1087 n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1088 puts(n);
1089 assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1090 free(n);
1091
1092 n = fstab_node_to_udev_node("PONIES=awesome");
1093 puts(n);
1094 assert_se(streq(n, "PONIES=awesome"));
1095 free(n);
1096
1097 n = fstab_node_to_udev_node("/dev/xda1");
1098 puts(n);
1099 assert_se(streq(n, "/dev/xda1"));
1100 free(n);
1101 }
1102
1103 static void test_get_files_in_directory(void) {
1104 _cleanup_strv_free_ char **l = NULL, **t = NULL;
1105
1106 assert_se(get_files_in_directory("/tmp", &l) >= 0);
1107 assert_se(get_files_in_directory(".", &t) >= 0);
1108 assert_se(get_files_in_directory(".", NULL) >= 0);
1109 }
1110
1111 static void test_in_set(void) {
1112 assert_se(IN_SET(1, 1));
1113 assert_se(IN_SET(1, 1, 2, 3, 4));
1114 assert_se(IN_SET(2, 1, 2, 3, 4));
1115 assert_se(IN_SET(3, 1, 2, 3, 4));
1116 assert_se(IN_SET(4, 1, 2, 3, 4));
1117 assert_se(!IN_SET(0, 1));
1118 assert_se(!IN_SET(0, 1, 2, 3, 4));
1119 }
1120
1121 static void test_writing_tmpfile(void) {
1122 char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
1123 _cleanup_free_ char *contents = NULL;
1124 size_t size;
1125 int fd, r;
1126 struct iovec iov[3];
1127
1128 IOVEC_SET_STRING(iov[0], "abc\n");
1129 IOVEC_SET_STRING(iov[1], ALPHANUMERICAL "\n");
1130 IOVEC_SET_STRING(iov[2], "");
1131
1132 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1133 printf("tmpfile: %s", name);
1134
1135 r = writev(fd, iov, 3);
1136 assert_se(r >= 0);
1137
1138 r = read_full_file(name, &contents, &size);
1139 assert_se(r == 0);
1140 printf("contents: %s", contents);
1141 assert_se(streq(contents, "abc\n" ALPHANUMERICAL "\n"));
1142
1143 unlink(name);
1144 }
1145
1146 static void test_hexdump(void) {
1147 uint8_t data[146];
1148 unsigned i;
1149
1150 hexdump(stdout, NULL, 0);
1151 hexdump(stdout, "", 0);
1152 hexdump(stdout, "", 1);
1153 hexdump(stdout, "x", 1);
1154 hexdump(stdout, "x", 2);
1155 hexdump(stdout, "foobar", 7);
1156 hexdump(stdout, "f\nobar", 7);
1157 hexdump(stdout, "xxxxxxxxxxxxxxxxxxxxyz", 23);
1158
1159 for (i = 0; i < ELEMENTSOF(data); i++)
1160 data[i] = i*2;
1161
1162 hexdump(stdout, data, sizeof(data));
1163 }
1164
1165 static void test_log2i(void) {
1166 assert_se(log2i(1) == 0);
1167 assert_se(log2i(2) == 1);
1168 assert_se(log2i(3) == 1);
1169 assert_se(log2i(4) == 2);
1170 assert_se(log2i(32) == 5);
1171 assert_se(log2i(33) == 5);
1172 assert_se(log2i(63) == 5);
1173 assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
1174 }
1175
1176 static void test_foreach_string(void) {
1177 const char * const t[] = {
1178 "foo",
1179 "bar",
1180 "waldo",
1181 NULL
1182 };
1183 const char *x;
1184 unsigned i = 0;
1185
1186 FOREACH_STRING(x, "foo", "bar", "waldo")
1187 assert_se(streq_ptr(t[i++], x));
1188
1189 assert_se(i == 3);
1190
1191 FOREACH_STRING(x, "zzz")
1192 assert_se(streq(x, "zzz"));
1193 }
1194
1195 static void test_filename_is_valid(void) {
1196 char foo[FILENAME_MAX+2];
1197 int i;
1198
1199 assert_se(!filename_is_valid(""));
1200 assert_se(!filename_is_valid("/bar/foo"));
1201 assert_se(!filename_is_valid("/"));
1202 assert_se(!filename_is_valid("."));
1203 assert_se(!filename_is_valid(".."));
1204
1205 for (i=0; i<FILENAME_MAX+1; i++)
1206 foo[i] = 'a';
1207 foo[FILENAME_MAX+1] = '\0';
1208
1209 assert_se(!filename_is_valid(foo));
1210
1211 assert_se(filename_is_valid("foo_bar-333"));
1212 assert_se(filename_is_valid("o.o"));
1213 }
1214
1215 static void test_string_has_cc(void) {
1216 assert_se(string_has_cc("abc\1", NULL));
1217 assert_se(string_has_cc("abc\x7f", NULL));
1218 assert_se(string_has_cc("abc\x7f", NULL));
1219 assert_se(string_has_cc("abc\t\x7f", "\t"));
1220 assert_se(string_has_cc("abc\t\x7f", "\t"));
1221 assert_se(string_has_cc("\x7f", "\t"));
1222 assert_se(string_has_cc("\x7f", "\t\a"));
1223
1224 assert_se(!string_has_cc("abc\t\t", "\t"));
1225 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
1226 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
1227 }
1228
1229 static void test_ascii_strlower(void) {
1230 char a[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
1231 assert_se(streq(ascii_strlower(a), "aabbcc jk ii od lkjjj kkd lk"));
1232 }
1233
1234 static void test_files_same(void) {
1235 _cleanup_close_ int fd = -1;
1236 char name[] = "/tmp/test-files_same.XXXXXX";
1237 char name_alias[] = "/tmp/test-files_same.alias";
1238
1239 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1240 assert_se(fd >= 0);
1241 assert_se(symlink(name, name_alias) >= 0);
1242
1243 assert_se(files_same(name, name));
1244 assert_se(files_same(name, name_alias));
1245
1246 unlink(name);
1247 unlink(name_alias);
1248 }
1249
1250 static void test_is_valid_documentation_url(void) {
1251 assert_se(documentation_url_is_valid("http://www.freedesktop.org/wiki/Software/systemd"));
1252 assert_se(documentation_url_is_valid("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
1253 assert_se(documentation_url_is_valid("file:/foo/foo"));
1254 assert_se(documentation_url_is_valid("man:systemd.special(7)"));
1255 assert_se(documentation_url_is_valid("info:bar"));
1256
1257 assert_se(!documentation_url_is_valid("foo:"));
1258 assert_se(!documentation_url_is_valid("info:"));
1259 assert_se(!documentation_url_is_valid(""));
1260 }
1261
1262 static void test_file_in_same_dir(void) {
1263 char *t;
1264
1265 t = file_in_same_dir("/", "a");
1266 assert_se(streq(t, "/a"));
1267 free(t);
1268
1269 t = file_in_same_dir("/", "/a");
1270 assert_se(streq(t, "/a"));
1271 free(t);
1272
1273 t = file_in_same_dir("", "a");
1274 assert_se(streq(t, "a"));
1275 free(t);
1276
1277 t = file_in_same_dir("a/", "a");
1278 assert_se(streq(t, "a/a"));
1279 free(t);
1280
1281 t = file_in_same_dir("bar/foo", "bar");
1282 assert_se(streq(t, "bar/bar"));
1283 free(t);
1284 }
1285
1286 static void test_endswith(void) {
1287 assert_se(endswith("foobar", "bar"));
1288 assert_se(endswith("foobar", ""));
1289 assert_se(endswith("foobar", "foobar"));
1290 assert_se(endswith("", ""));
1291
1292 assert_se(!endswith("foobar", "foo"));
1293 assert_se(!endswith("foobar", "foobarfoofoo"));
1294 }
1295
1296 static void test_endswith_no_case(void) {
1297 assert_se(endswith_no_case("fooBAR", "bar"));
1298 assert_se(endswith_no_case("foobar", ""));
1299 assert_se(endswith_no_case("foobar", "FOOBAR"));
1300 assert_se(endswith_no_case("", ""));
1301
1302 assert_se(!endswith_no_case("foobar", "FOO"));
1303 assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
1304 }
1305
1306 static void test_close_nointr(void) {
1307 char name[] = "/tmp/test-test-close_nointr.XXXXXX";
1308 int fd;
1309
1310 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1311 assert_se(fd >= 0);
1312 assert_se(close_nointr(fd) >= 0);
1313 assert_se(close_nointr(fd) < 0);
1314
1315 unlink(name);
1316 }
1317
1318
1319 static void test_unlink_noerrno(void) {
1320 char name[] = "/tmp/test-close_nointr.XXXXXX";
1321 int fd;
1322
1323 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1324 assert_se(fd >= 0);
1325 assert_se(close_nointr(fd) >= 0);
1326
1327 {
1328 PROTECT_ERRNO;
1329 errno = -42;
1330 assert_se(unlink_noerrno(name) >= 0);
1331 assert_se(errno == -42);
1332 assert_se(unlink_noerrno(name) < 0);
1333 assert_se(errno == -42);
1334 }
1335 }
1336
1337 static void test_readlink_and_make_absolute(void) {
1338 char tempdir[] = "/tmp/test-readlink_and_make_absolute";
1339 char name[] = "/tmp/test-readlink_and_make_absolute/original";
1340 char name2[] = "test-readlink_and_make_absolute/original";
1341 char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
1342 char *r = NULL;
1343
1344 assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
1345 assert_se(touch(name) >= 0);
1346
1347 assert_se(symlink(name, name_alias) >= 0);
1348 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
1349 assert_se(streq(r, name));
1350 free(r);
1351 assert_se(unlink(name_alias) >= 0);
1352
1353 assert_se(chdir(tempdir) >= 0);
1354 assert_se(symlink(name2, name_alias) >= 0);
1355 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
1356 assert_se(streq(r, name));
1357 free(r);
1358 assert_se(unlink(name_alias) >= 0);
1359
1360 assert_se(rm_rf(tempdir, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
1361 }
1362
1363 static void test_ignore_signals(void) {
1364 assert_se(ignore_signals(SIGINT, -1) >= 0);
1365 assert_se(kill(getpid(), SIGINT) >= 0);
1366 assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
1367 assert_se(kill(getpid(), SIGUSR1) >= 0);
1368 assert_se(kill(getpid(), SIGUSR2) >= 0);
1369 assert_se(kill(getpid(), SIGTERM) >= 0);
1370 assert_se(kill(getpid(), SIGPIPE) >= 0);
1371 assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
1372 }
1373
1374 static void test_strshorten(void) {
1375 char s[] = "foobar";
1376
1377 assert_se(strlen(strshorten(s, 6)) == 6);
1378 assert_se(strlen(strshorten(s, 12)) == 6);
1379 assert_se(strlen(strshorten(s, 2)) == 2);
1380 assert_se(strlen(strshorten(s, 0)) == 0);
1381 }
1382
1383 static void test_strjoina(void) {
1384 char *actual;
1385
1386 actual = strjoina("", "foo", "bar");
1387 assert_se(streq(actual, "foobar"));
1388
1389 actual = strjoina("foo", "bar", "baz");
1390 assert_se(streq(actual, "foobarbaz"));
1391
1392 actual = strjoina("foo", "", "bar", "baz");
1393 assert_se(streq(actual, "foobarbaz"));
1394
1395 actual = strjoina("foo");
1396 assert_se(streq(actual, "foo"));
1397
1398 actual = strjoina(NULL);
1399 assert_se(streq(actual, ""));
1400
1401 actual = strjoina(NULL, "foo");
1402 assert_se(streq(actual, ""));
1403
1404 actual = strjoina("foo", NULL, "bar");
1405 assert_se(streq(actual, "foo"));
1406 }
1407
1408 static void test_is_symlink(void) {
1409 char name[] = "/tmp/test-is_symlink.XXXXXX";
1410 char name_link[] = "/tmp/test-is_symlink.link";
1411 _cleanup_close_ int fd = -1;
1412
1413 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1414 assert_se(fd >= 0);
1415 assert_se(symlink(name, name_link) >= 0);
1416
1417 assert_se(is_symlink(name) == 0);
1418 assert_se(is_symlink(name_link) == 1);
1419 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
1420
1421
1422 unlink(name);
1423 unlink(name_link);
1424 }
1425
1426 static void test_search_and_fopen(void) {
1427 const char *dirs[] = {"/tmp/foo/bar", "/tmp", NULL};
1428 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
1429 int fd = -1;
1430 int r;
1431 FILE *f;
1432
1433 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1434 assert_se(fd >= 0);
1435 close(fd);
1436
1437 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
1438 assert_se(r >= 0);
1439 fclose(f);
1440
1441 r = search_and_fopen(name, "r", NULL, dirs, &f);
1442 assert_se(r >= 0);
1443 fclose(f);
1444
1445 r = search_and_fopen(basename(name), "r", "/", dirs, &f);
1446 assert_se(r >= 0);
1447 fclose(f);
1448
1449 r = search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
1450 assert_se(r < 0);
1451 r = search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
1452 assert_se(r < 0);
1453
1454 r = unlink(name);
1455 assert_se(r == 0);
1456
1457 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
1458 assert_se(r < 0);
1459 }
1460
1461
1462 static void test_search_and_fopen_nulstr(void) {
1463 const char dirs[] = "/tmp/foo/bar\0/tmp\0";
1464 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
1465 int fd = -1;
1466 int r;
1467 FILE *f;
1468
1469 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1470 assert_se(fd >= 0);
1471 close(fd);
1472
1473 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
1474 assert_se(r >= 0);
1475 fclose(f);
1476
1477 r = search_and_fopen_nulstr(name, "r", NULL, dirs, &f);
1478 assert_se(r >= 0);
1479 fclose(f);
1480
1481 r = search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
1482 assert_se(r < 0);
1483 r = search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
1484 assert_se(r < 0);
1485
1486 r = unlink(name);
1487 assert_se(r == 0);
1488
1489 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
1490 assert_se(r < 0);
1491 }
1492
1493 static void test_glob_exists(void) {
1494 char name[] = "/tmp/test-glob_exists.XXXXXX";
1495 int fd = -1;
1496 int r;
1497
1498 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1499 assert_se(fd >= 0);
1500 close(fd);
1501
1502 r = glob_exists("/tmp/test-glob_exists*");
1503 assert_se(r == 1);
1504
1505 r = unlink(name);
1506 assert_se(r == 0);
1507 r = glob_exists("/tmp/test-glob_exists*");
1508 assert_se(r == 0);
1509 }
1510
1511 static void test_execute_directory(void) {
1512 char template_lo[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
1513 char template_hi[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
1514 const char * dirs[] = {template_hi, template_lo, NULL};
1515 const char *name, *name2, *name3, *overridden, *override, *masked, *mask;
1516
1517 assert_se(mkdtemp(template_lo));
1518 assert_se(mkdtemp(template_hi));
1519
1520 name = strjoina(template_lo, "/script");
1521 name2 = strjoina(template_hi, "/script2");
1522 name3 = strjoina(template_lo, "/useless");
1523 overridden = strjoina(template_lo, "/overridden");
1524 override = strjoina(template_hi, "/overridden");
1525 masked = strjoina(template_lo, "/masked");
1526 mask = strjoina(template_hi, "/masked");
1527
1528 assert_se(write_string_file(name, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE) == 0);
1529 assert_se(write_string_file(name2, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE) == 0);
1530 assert_se(write_string_file(overridden, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
1531 assert_se(write_string_file(override, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE) == 0);
1532 assert_se(write_string_file(masked, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
1533 assert_se(symlink("/dev/null", mask) == 0);
1534 assert_se(chmod(name, 0755) == 0);
1535 assert_se(chmod(name2, 0755) == 0);
1536 assert_se(chmod(overridden, 0755) == 0);
1537 assert_se(chmod(override, 0755) == 0);
1538 assert_se(chmod(masked, 0755) == 0);
1539 assert_se(touch(name3) >= 0);
1540
1541 execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL);
1542
1543 assert_se(chdir(template_lo) == 0);
1544 assert_se(access("it_works", F_OK) >= 0);
1545 assert_se(access("failed", F_OK) < 0);
1546
1547 assert_se(chdir(template_hi) == 0);
1548 assert_se(access("it_works2", F_OK) >= 0);
1549 assert_se(access("failed", F_OK) < 0);
1550
1551 (void) rm_rf(template_lo, REMOVE_ROOT|REMOVE_PHYSICAL);
1552 (void) rm_rf(template_hi, REMOVE_ROOT|REMOVE_PHYSICAL);
1553 }
1554
1555 static void test_extract_first_word(void) {
1556 const char *p, *original;
1557 char *t;
1558
1559 p = original = "foobar waldo";
1560 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1561 assert_se(streq(t, "foobar"));
1562 free(t);
1563 assert_se(p == original + 7);
1564
1565 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1566 assert_se(streq(t, "waldo"));
1567 free(t);
1568 assert_se(isempty(p));
1569
1570 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
1571 assert_se(!t);
1572 assert_se(isempty(p));
1573
1574 p = original = "\"foobar\" \'waldo\'";
1575 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1576 assert_se(streq(t, "\"foobar\""));
1577 free(t);
1578 assert_se(p == original + 9);
1579
1580 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1581 assert_se(streq(t, "\'waldo\'"));
1582 free(t);
1583 assert_se(isempty(p));
1584
1585 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
1586 assert_se(!t);
1587 assert_se(isempty(p));
1588
1589 p = original = "\"foobar\" \'waldo\'";
1590 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1591 assert_se(streq(t, "foobar"));
1592 free(t);
1593 assert_se(p == original + 9);
1594
1595 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1596 assert_se(streq(t, "waldo"));
1597 free(t);
1598 assert_se(isempty(p));
1599
1600 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
1601 assert_se(!t);
1602 assert_se(isempty(p));
1603
1604 p = original = "\"";
1605 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
1606 assert_se(streq(t, "\""));
1607 free(t);
1608 assert_se(isempty(p));
1609
1610 p = original = "\"";
1611 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) == -EINVAL);
1612 assert_se(p == original + 1);
1613
1614 p = original = "\'";
1615 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
1616 assert_se(streq(t, "\'"));
1617 free(t);
1618 assert_se(isempty(p));
1619
1620 p = original = "\'";
1621 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) == -EINVAL);
1622 assert_se(p == original + 1);
1623
1624 p = original = "\'fooo";
1625 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
1626 assert_se(streq(t, "\'fooo"));
1627 free(t);
1628 assert_se(isempty(p));
1629
1630 p = original = "\'fooo";
1631 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) == -EINVAL);
1632 assert_se(p == original + 5);
1633
1634 p = original = "\'fooo";
1635 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX) > 0);
1636 assert_se(streq(t, "fooo"));
1637 free(t);
1638 assert_se(isempty(p));
1639
1640 p = original = "yay\'foo\'bar";
1641 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1642 assert_se(streq(t, "yay\'foo\'bar"));
1643 free(t);
1644 assert_se(isempty(p));
1645
1646 p = original = "yay\'foo\'bar";
1647 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1648 assert_se(streq(t, "yayfoobar"));
1649 free(t);
1650 assert_se(isempty(p));
1651
1652 p = original = " foobar ";
1653 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1654 assert_se(streq(t, "foobar"));
1655 free(t);
1656 assert_se(isempty(p));
1657
1658 p = original = " foo\\ba\\x6ar ";
1659 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0);
1660 assert_se(streq(t, "foo\ba\x6ar"));
1661 free(t);
1662 assert_se(isempty(p));
1663
1664 p = original = " foo\\ba\\x6ar ";
1665 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
1666 assert_se(streq(t, "foobax6ar"));
1667 free(t);
1668 assert_se(isempty(p));
1669
1670 p = original = " f\\u00f6o \"pi\\U0001F4A9le\" ";
1671 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0);
1672 assert_se(streq(t, "föo"));
1673 free(t);
1674 assert_se(p == original + 13);
1675
1676 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE) > 0);
1677 assert_se(streq(t, "pi\360\237\222\251le"));
1678 free(t);
1679 assert_se(isempty(p));
1680
1681 p = original = "fooo\\";
1682 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0);
1683 assert_se(streq(t, "fooo"));
1684 free(t);
1685 assert_se(isempty(p));
1686
1687 p = original = "fooo\\";
1688 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
1689 assert_se(streq(t, "fooo\\"));
1690 free(t);
1691 assert_se(isempty(p));
1692
1693 p = original = "fooo\\";
1694 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
1695 assert_se(streq(t, "fooo\\"));
1696 free(t);
1697 assert_se(isempty(p));
1698
1699 p = original = "fooo\\";
1700 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
1701 assert_se(streq(t, "fooo\\"));
1702 free(t);
1703 assert_se(isempty(p));
1704
1705 p = original = "\"foo\\";
1706 assert_se(extract_first_word(&p, &t, NULL, 0) == -EINVAL);
1707 assert_se(p == original + 5);
1708
1709 p = original = "\"foo\\";
1710 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX) > 0);
1711 assert_se(streq(t, "foo"));
1712 free(t);
1713 assert_se(isempty(p));
1714
1715 p = original = "foo::bar";
1716 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
1717 assert_se(streq(t, "foo"));
1718 free(t);
1719 assert_se(p == original + 5);
1720
1721 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
1722 assert_se(streq(t, "bar"));
1723 free(t);
1724 assert_se(isempty(p));
1725
1726 assert_se(extract_first_word(&p, &t, ":", 0) == 0);
1727 assert_se(!t);
1728 assert_se(isempty(p));
1729
1730 p = original = "foo\\:bar::waldo";
1731 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
1732 assert_se(streq(t, "foo:bar"));
1733 free(t);
1734 assert_se(p == original + 10);
1735
1736 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
1737 assert_se(streq(t, "waldo"));
1738 free(t);
1739 assert_se(isempty(p));
1740
1741 assert_se(extract_first_word(&p, &t, ":", 0) == 0);
1742 assert_se(!t);
1743 assert_se(isempty(p));
1744
1745 p = original = "\"foo\\";
1746 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE_RELAX) == -EINVAL);
1747 assert_se(p == original + 5);
1748
1749 p = original = "\"foo\\";
1750 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
1751 assert_se(streq(t, "foo\\"));
1752 free(t);
1753 assert_se(isempty(p));
1754
1755 p = original = "\"foo\\";
1756 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
1757 assert_se(streq(t, "foo\\"));
1758 free(t);
1759 assert_se(isempty(p));
1760
1761 p = original = "fooo\\ bar quux";
1762 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0);
1763 assert_se(streq(t, "fooo bar"));
1764 free(t);
1765 assert_se(p == original + 10);
1766
1767 p = original = "fooo\\ bar quux";
1768 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
1769 assert_se(streq(t, "fooo bar"));
1770 free(t);
1771 assert_se(p == original + 10);
1772
1773 p = original = "fooo\\ bar quux";
1774 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
1775 assert_se(streq(t, "fooo bar"));
1776 free(t);
1777 assert_se(p == original + 10);
1778
1779 p = original = "fooo\\ bar quux";
1780 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL);
1781 assert_se(p == original + 5);
1782
1783 p = original = "fooo\\ bar quux";
1784 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
1785 assert_se(streq(t, "fooo\\ bar"));
1786 free(t);
1787 assert_se(p == original + 10);
1788
1789 p = original = "\\w+@\\K[\\d.]+";
1790 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL);
1791 assert_se(p == original + 1);
1792
1793 p = original = "\\w+@\\K[\\d.]+";
1794 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
1795 assert_se(streq(t, "\\w+@\\K[\\d.]+"));
1796 free(t);
1797 assert_se(isempty(p));
1798
1799 p = original = "\\w+\\b";
1800 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
1801 assert_se(streq(t, "\\w+\b"));
1802 free(t);
1803 assert_se(isempty(p));
1804
1805 p = original = "-N ''";
1806 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1807 assert_se(streq(t, "-N"));
1808 free(t);
1809 assert_se(p == original + 3);
1810
1811 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
1812 assert_se(streq(t, ""));
1813 free(t);
1814 assert_se(isempty(p));
1815
1816 p = original = ":foo\\:bar::waldo:";
1817 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1818 assert_se(t);
1819 assert_se(streq(t, ""));
1820 free(t);
1821 assert_se(p == original + 1);
1822
1823 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1824 assert_se(streq(t, "foo:bar"));
1825 free(t);
1826 assert_se(p == original + 10);
1827
1828 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1829 assert_se(t);
1830 assert_se(streq(t, ""));
1831 free(t);
1832 assert_se(p == original + 11);
1833
1834 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1835 assert_se(streq(t, "waldo"));
1836 free(t);
1837 assert_se(p == original + 17);
1838
1839 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
1840 assert_se(streq(t, ""));
1841 free(t);
1842 assert_se(p == NULL);
1843
1844 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 0);
1845 assert_se(!t);
1846 assert_se(!p);
1847 }
1848
1849 static void test_extract_first_word_and_warn(void) {
1850 const char *p, *original;
1851 char *t;
1852
1853 p = original = "foobar waldo";
1854 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1855 assert_se(streq(t, "foobar"));
1856 free(t);
1857 assert_se(p == original + 7);
1858
1859 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1860 assert_se(streq(t, "waldo"));
1861 free(t);
1862 assert_se(isempty(p));
1863
1864 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
1865 assert_se(!t);
1866 assert_se(isempty(p));
1867
1868 p = original = "\"foobar\" \'waldo\'";
1869 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) > 0);
1870 assert_se(streq(t, "foobar"));
1871 free(t);
1872 assert_se(p == original + 9);
1873
1874 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) > 0);
1875 assert_se(streq(t, "waldo"));
1876 free(t);
1877 assert_se(isempty(p));
1878
1879 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
1880 assert_se(!t);
1881 assert_se(isempty(p));
1882
1883 p = original = "\"";
1884 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
1885 assert_se(p == original + 1);
1886
1887 p = original = "\'";
1888 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
1889 assert_se(p == original + 1);
1890
1891 p = original = "\'fooo";
1892 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
1893 assert_se(p == original + 5);
1894
1895 p = original = "\'fooo";
1896 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1897 assert_se(streq(t, "fooo"));
1898 free(t);
1899 assert_se(isempty(p));
1900
1901 p = original = " foo\\ba\\x6ar ";
1902 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1903 assert_se(streq(t, "foo\ba\x6ar"));
1904 free(t);
1905 assert_se(isempty(p));
1906
1907 p = original = " foo\\ba\\x6ar ";
1908 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1909 assert_se(streq(t, "foobax6ar"));
1910 free(t);
1911 assert_se(isempty(p));
1912
1913 p = original = " f\\u00f6o \"pi\\U0001F4A9le\" ";
1914 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1915 assert_se(streq(t, "föo"));
1916 free(t);
1917 assert_se(p == original + 13);
1918
1919 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1920 assert_se(streq(t, "pi\360\237\222\251le"));
1921 free(t);
1922 assert_se(isempty(p));
1923
1924 p = original = "fooo\\";
1925 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1926 assert_se(streq(t, "fooo"));
1927 free(t);
1928 assert_se(isempty(p));
1929
1930 p = original = "fooo\\";
1931 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1932 assert_se(streq(t, "fooo\\"));
1933 free(t);
1934 assert_se(isempty(p));
1935
1936 p = original = "fooo\\";
1937 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1938 assert_se(streq(t, "fooo\\"));
1939 free(t);
1940 assert_se(isempty(p));
1941
1942 p = original = "\"foo\\";
1943 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
1944 assert_se(p == original + 5);
1945
1946 p = original = "\"foo\\";
1947 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1948 assert_se(streq(t, "foo"));
1949 free(t);
1950 assert_se(isempty(p));
1951
1952 p = original = "\"foo\\";
1953 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) == -EINVAL);
1954 assert_se(p == original + 5);
1955
1956 p = original = "\"foo\\";
1957 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1958 assert_se(streq(t, "foo"));
1959 free(t);
1960 assert_se(isempty(p));
1961
1962 p = original = "fooo\\ bar quux";
1963 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
1964 assert_se(streq(t, "fooo bar"));
1965 free(t);
1966 assert_se(p == original + 10);
1967
1968 p = original = "fooo\\ bar quux";
1969 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
1970 assert_se(streq(t, "fooo bar"));
1971 free(t);
1972 assert_se(p == original + 10);
1973
1974 p = original = "fooo\\ bar quux";
1975 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1976 assert_se(streq(t, "fooo\\ bar"));
1977 free(t);
1978 assert_se(p == original + 10);
1979
1980 p = original = "\\w+@\\K[\\d.]+";
1981 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1982 assert_se(streq(t, "\\w+@\\K[\\d.]+"));
1983 free(t);
1984 assert_se(isempty(p));
1985
1986 p = original = "\\w+\\b";
1987 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
1988 assert_se(streq(t, "\\w+\b"));
1989 free(t);
1990 assert_se(isempty(p));
1991 }
1992
1993 static void test_extract_many_words(void) {
1994 const char *p, *original;
1995 char *a, *b, *c;
1996
1997 p = original = "foobar waldi piep";
1998 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 3);
1999 assert_se(isempty(p));
2000 assert_se(streq_ptr(a, "foobar"));
2001 assert_se(streq_ptr(b, "waldi"));
2002 assert_se(streq_ptr(c, "piep"));
2003 free(a);
2004 free(b);
2005 free(c);
2006
2007 p = original = "'foobar' wa\"ld\"i ";
2008 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 2);
2009 assert_se(isempty(p));
2010 assert_se(streq_ptr(a, "'foobar'"));
2011 assert_se(streq_ptr(b, "wa\"ld\"i"));
2012 assert_se(streq_ptr(c, NULL));
2013 free(a);
2014 free(b);
2015
2016 p = original = "'foobar' wa\"ld\"i ";
2017 assert_se(extract_many_words(&p, NULL, EXTRACT_QUOTES, &a, &b, &c, NULL) == 2);
2018 assert_se(isempty(p));
2019 assert_se(streq_ptr(a, "foobar"));
2020 assert_se(streq_ptr(b, "waldi"));
2021 assert_se(streq_ptr(c, NULL));
2022 free(a);
2023 free(b);
2024
2025 p = original = "";
2026 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
2027 assert_se(isempty(p));
2028 assert_se(streq_ptr(a, NULL));
2029 assert_se(streq_ptr(b, NULL));
2030 assert_se(streq_ptr(c, NULL));
2031
2032 p = original = " ";
2033 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
2034 assert_se(isempty(p));
2035 assert_se(streq_ptr(a, NULL));
2036 assert_se(streq_ptr(b, NULL));
2037 assert_se(streq_ptr(c, NULL));
2038
2039 p = original = "foobar";
2040 assert_se(extract_many_words(&p, NULL, 0, NULL) == 0);
2041 assert_se(p == original);
2042
2043 p = original = "foobar waldi";
2044 assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
2045 assert_se(p == original+7);
2046 assert_se(streq_ptr(a, "foobar"));
2047 free(a);
2048
2049 p = original = " foobar ";
2050 assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
2051 assert_se(isempty(p));
2052 assert_se(streq_ptr(a, "foobar"));
2053 free(a);
2054 }
2055
2056 static int parse_item(const char *key, const char *value) {
2057 assert_se(key);
2058
2059 log_info("kernel cmdline option <%s> = <%s>", key, strna(value));
2060 return 0;
2061 }
2062
2063 static void test_parse_proc_cmdline(void) {
2064 assert_se(parse_proc_cmdline(parse_item) >= 0);
2065 }
2066
2067 static void test_raw_clone(void) {
2068 pid_t parent, pid, pid2;
2069
2070 parent = getpid();
2071 log_info("before clone: getpid()→"PID_FMT, parent);
2072 assert_se(raw_getpid() == parent);
2073
2074 pid = raw_clone(0, NULL);
2075 assert_se(pid >= 0);
2076
2077 pid2 = raw_getpid();
2078 log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT,
2079 pid, getpid(), pid2);
2080 if (pid == 0) {
2081 assert_se(pid2 != parent);
2082 _exit(EXIT_SUCCESS);
2083 } else {
2084 int status;
2085
2086 assert_se(pid2 == parent);
2087 waitpid(pid, &status, __WCLONE);
2088 assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
2089 }
2090 }
2091
2092 static void test_same_fd(void) {
2093 _cleanup_close_pair_ int p[2] = { -1, -1 };
2094 _cleanup_close_ int a = -1, b = -1, c = -1;
2095
2096 assert_se(pipe2(p, O_CLOEXEC) >= 0);
2097 assert_se((a = dup(p[0])) >= 0);
2098 assert_se((b = open("/dev/null", O_RDONLY|O_CLOEXEC)) >= 0);
2099 assert_se((c = dup(a)) >= 0);
2100
2101 assert_se(same_fd(p[0], p[0]) > 0);
2102 assert_se(same_fd(p[1], p[1]) > 0);
2103 assert_se(same_fd(a, a) > 0);
2104 assert_se(same_fd(b, b) > 0);
2105
2106 assert_se(same_fd(a, p[0]) > 0);
2107 assert_se(same_fd(p[0], a) > 0);
2108 assert_se(same_fd(c, p[0]) > 0);
2109 assert_se(same_fd(p[0], c) > 0);
2110 assert_se(same_fd(a, c) > 0);
2111 assert_se(same_fd(c, a) > 0);
2112
2113 assert_se(same_fd(p[0], p[1]) == 0);
2114 assert_se(same_fd(p[1], p[0]) == 0);
2115 assert_se(same_fd(p[0], b) == 0);
2116 assert_se(same_fd(b, p[0]) == 0);
2117 assert_se(same_fd(p[1], a) == 0);
2118 assert_se(same_fd(a, p[1]) == 0);
2119 assert_se(same_fd(p[1], b) == 0);
2120 assert_se(same_fd(b, p[1]) == 0);
2121
2122 assert_se(same_fd(a, b) == 0);
2123 assert_se(same_fd(b, a) == 0);
2124 }
2125
2126 static void test_uid_ptr(void) {
2127
2128 assert_se(UID_TO_PTR(0) != NULL);
2129 assert_se(UID_TO_PTR(1000) != NULL);
2130
2131 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
2132 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
2133 }
2134
2135 static void test_sparse_write_one(int fd, const char *buffer, size_t n) {
2136 char check[n];
2137
2138 assert_se(lseek(fd, 0, SEEK_SET) == 0);
2139 assert_se(ftruncate(fd, 0) >= 0);
2140 assert_se(sparse_write(fd, buffer, n, 4) == (ssize_t) n);
2141
2142 assert_se(lseek(fd, 0, SEEK_CUR) == (off_t) n);
2143 assert_se(ftruncate(fd, n) >= 0);
2144
2145 assert_se(lseek(fd, 0, SEEK_SET) == 0);
2146 assert_se(read(fd, check, n) == (ssize_t) n);
2147
2148 assert_se(memcmp(buffer, check, n) == 0);
2149 }
2150
2151 static void test_sparse_write(void) {
2152 const char test_a[] = "test";
2153 const char test_b[] = "\0\0\0\0test\0\0\0\0";
2154 const char test_c[] = "\0\0test\0\0\0\0";
2155 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";
2156 const char test_e[] = "test\0\0\0\0test";
2157 _cleanup_close_ int fd = -1;
2158 char fn[] = "/tmp/sparseXXXXXX";
2159
2160 fd = mkostemp(fn, O_CLOEXEC);
2161 assert_se(fd >= 0);
2162 unlink(fn);
2163
2164 test_sparse_write_one(fd, test_a, sizeof(test_a));
2165 test_sparse_write_one(fd, test_b, sizeof(test_b));
2166 test_sparse_write_one(fd, test_c, sizeof(test_c));
2167 test_sparse_write_one(fd, test_d, sizeof(test_d));
2168 test_sparse_write_one(fd, test_e, sizeof(test_e));
2169 }
2170
2171 static void test_shell_escape_one(const char *s, const char *bad, const char *expected) {
2172 _cleanup_free_ char *r;
2173
2174 assert_se(r = shell_escape(s, bad));
2175 assert_se(streq_ptr(r, expected));
2176 }
2177
2178 static void test_shell_escape(void) {
2179 test_shell_escape_one("", "", "");
2180 test_shell_escape_one("\\", "", "\\\\");
2181 test_shell_escape_one("foobar", "", "foobar");
2182 test_shell_escape_one("foobar", "o", "f\\o\\obar");
2183 test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz");
2184 }
2185
2186 static void test_shell_maybe_quote_one(const char *s, const char *expected) {
2187 _cleanup_free_ char *r;
2188
2189 assert_se(r = shell_maybe_quote(s));
2190 assert_se(streq(r, expected));
2191 }
2192
2193 static void test_shell_maybe_quote(void) {
2194
2195 test_shell_maybe_quote_one("", "");
2196 test_shell_maybe_quote_one("\\", "\"\\\\\"");
2197 test_shell_maybe_quote_one("\"", "\"\\\"\"");
2198 test_shell_maybe_quote_one("foobar", "foobar");
2199 test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
2200 test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
2201 test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
2202 }
2203
2204 static void test_parse_mode(void) {
2205 mode_t m;
2206
2207 assert_se(parse_mode("-1", &m) < 0);
2208 assert_se(parse_mode("", &m) < 0);
2209 assert_se(parse_mode("888", &m) < 0);
2210 assert_se(parse_mode("77777", &m) < 0);
2211
2212 assert_se(parse_mode("544", &m) >= 0 && m == 0544);
2213 assert_se(parse_mode("777", &m) >= 0 && m == 0777);
2214 assert_se(parse_mode("7777", &m) >= 0 && m == 07777);
2215 assert_se(parse_mode("0", &m) >= 0 && m == 0);
2216 }
2217
2218 static void test_tempfn(void) {
2219 char *ret = NULL, *p;
2220
2221 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL, &ret) >= 0);
2222 assert_se(streq_ptr(ret, "/foo/bar/.#waldoXXXXXX"));
2223 free(ret);
2224
2225 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret) >= 0);
2226 assert_se(streq_ptr(ret, "/foo/bar/.#[miau]waldoXXXXXX"));
2227 free(ret);
2228
2229 assert_se(tempfn_random("/foo/bar/waldo", NULL, &ret) >= 0);
2230 assert_se(p = startswith(ret, "/foo/bar/.#waldo"));
2231 assert_se(strlen(p) == 16);
2232 assert_se(in_charset(p, "0123456789abcdef"));
2233 free(ret);
2234
2235 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret) >= 0);
2236 assert_se(p = startswith(ret, "/foo/bar/.#[wuff]waldo"));
2237 assert_se(strlen(p) == 16);
2238 assert_se(in_charset(p, "0123456789abcdef"));
2239 free(ret);
2240
2241 assert_se(tempfn_random_child("/foo/bar/waldo", NULL, &ret) >= 0);
2242 assert_se(p = startswith(ret, "/foo/bar/waldo/.#"));
2243 assert_se(strlen(p) == 16);
2244 assert_se(in_charset(p, "0123456789abcdef"));
2245 free(ret);
2246
2247 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret) >= 0);
2248 assert_se(p = startswith(ret, "/foo/bar/waldo/.#[kikiriki]"));
2249 assert_se(strlen(p) == 16);
2250 assert_se(in_charset(p, "0123456789abcdef"));
2251 free(ret);
2252 }
2253
2254 static void test_strcmp_ptr(void) {
2255 assert_se(strcmp_ptr(NULL, NULL) == 0);
2256 assert_se(strcmp_ptr("", NULL) > 0);
2257 assert_se(strcmp_ptr("foo", NULL) > 0);
2258 assert_se(strcmp_ptr(NULL, "") < 0);
2259 assert_se(strcmp_ptr(NULL, "bar") < 0);
2260 assert_se(strcmp_ptr("foo", "bar") > 0);
2261 assert_se(strcmp_ptr("bar", "baz") < 0);
2262 assert_se(strcmp_ptr("foo", "foo") == 0);
2263 assert_se(strcmp_ptr("", "") == 0);
2264 }
2265
2266 int main(int argc, char *argv[]) {
2267 log_parse_environment();
2268 log_open();
2269
2270 test_streq_ptr();
2271 test_align_power2();
2272 test_max();
2273 test_container_of();
2274 test_alloca();
2275 test_div_round_up();
2276 test_first_word();
2277 test_close_many();
2278 test_parse_boolean();
2279 test_parse_pid();
2280 test_parse_uid();
2281 test_safe_atou16();
2282 test_safe_atoi16();
2283 test_safe_atolli();
2284 test_safe_atod();
2285 test_strappend();
2286 test_strstrip();
2287 test_delete_chars();
2288 test_in_charset();
2289 test_hexchar();
2290 test_unhexchar();
2291 test_base32hexchar();
2292 test_unbase32hexchar();
2293 test_base64char();
2294 test_unbase64char();
2295 test_octchar();
2296 test_unoctchar();
2297 test_decchar();
2298 test_undecchar();
2299 test_unhexmem();
2300 test_base32hexmem();
2301 test_unbase32hexmem();
2302 test_base64mem();
2303 test_unbase64mem();
2304 test_cescape();
2305 test_cunescape();
2306 test_foreach_word();
2307 test_foreach_word_quoted();
2308 test_memdup_multiply();
2309 test_u64log2();
2310 test_protect_errno();
2311 test_parse_size();
2312 test_parse_cpu_set();
2313 test_config_parse_iec_uint64();
2314 test_strextend();
2315 test_strrep();
2316 test_split_pair();
2317 test_fstab_node_to_udev_node();
2318 test_get_files_in_directory();
2319 test_in_set();
2320 test_writing_tmpfile();
2321 test_hexdump();
2322 test_log2i();
2323 test_foreach_string();
2324 test_filename_is_valid();
2325 test_string_has_cc();
2326 test_ascii_strlower();
2327 test_files_same();
2328 test_is_valid_documentation_url();
2329 test_file_in_same_dir();
2330 test_endswith();
2331 test_endswith_no_case();
2332 test_close_nointr();
2333 test_unlink_noerrno();
2334 test_readlink_and_make_absolute();
2335 test_ignore_signals();
2336 test_strshorten();
2337 test_strjoina();
2338 test_is_symlink();
2339 test_search_and_fopen();
2340 test_search_and_fopen_nulstr();
2341 test_glob_exists();
2342 test_execute_directory();
2343 test_extract_first_word();
2344 test_extract_first_word_and_warn();
2345 test_extract_many_words();
2346 test_parse_proc_cmdline();
2347 test_raw_clone();
2348 test_same_fd();
2349 test_uid_ptr();
2350 test_sparse_write();
2351 test_shell_escape();
2352 test_shell_maybe_quote();
2353 test_parse_mode();
2354 test_tempfn();
2355 test_strcmp_ptr();
2356
2357 return 0;
2358 }