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