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