]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-util.c
Merge pull request #2509 from bengal/dhcp-nak-delay-v4
[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 <signal.h>
26 #include <string.h>
27 #include <sys/types.h>
28 #include <sys/wait.h>
29 #include <sys/xattr.h>
30 #include <unistd.h>
31
32 #include "alloc-util.h"
33 #include "conf-parser.h"
34 #include "cpu-set-util.h"
35 #include "def.h"
36 #include "escape.h"
37 #include "fd-util.h"
38 #include "fileio.h"
39 #include "fs-util.h"
40 #include "fstab-util.h"
41 #include "glob-util.h"
42 #include "hexdecoct.h"
43 #include "io-util.h"
44 #include "mkdir.h"
45 #include "parse-util.h"
46 #include "path-util.h"
47 #include "proc-cmdline.h"
48 #include "process-util.h"
49 #include "rm-rf.h"
50 #include "signal-util.h"
51 #include "special.h"
52 #include "stat-util.h"
53 #include "string-util.h"
54 #include "strv.h"
55 #include "user-util.h"
56 #include "util.h"
57 #include "virt.h"
58 #include "web-util.h"
59 #include "xattr-util.h"
60
61 static void test_streq_ptr(void) {
62 assert_se(streq_ptr(NULL, NULL));
63 assert_se(!streq_ptr("abc", "cdef"));
64 }
65
66 static void test_align_power2(void) {
67 unsigned long i, p2;
68
69 assert_se(ALIGN_POWER2(0) == 0);
70 assert_se(ALIGN_POWER2(1) == 1);
71 assert_se(ALIGN_POWER2(2) == 2);
72 assert_se(ALIGN_POWER2(3) == 4);
73 assert_se(ALIGN_POWER2(12) == 16);
74
75 assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
76 assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
77 assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
78 assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
79 assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
80
81 for (i = 1; i < 131071; ++i) {
82 for (p2 = 1; p2 < i; p2 <<= 1)
83 /* empty */ ;
84
85 assert_se(ALIGN_POWER2(i) == p2);
86 }
87
88 for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
89 for (p2 = 1; p2 && p2 < i; p2 <<= 1)
90 /* empty */ ;
91
92 assert_se(ALIGN_POWER2(i) == p2);
93 }
94 }
95
96 static void test_max(void) {
97 static const struct {
98 int a;
99 int b[CONST_MAX(10, 100)];
100 } val1 = {
101 .a = CONST_MAX(10, 100),
102 };
103 int d = 0;
104
105 assert_cc(sizeof(val1.b) == sizeof(int) * 100);
106
107 /* CONST_MAX returns (void) instead of a value if the passed arguments
108 * are not of the same type or not constant expressions. */
109 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
110 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
111
112 assert_se(val1.a == 100);
113 assert_se(MAX(++d, 0) == 1);
114 assert_se(d == 1);
115
116 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
117 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
118 assert_cc(MAXSIZE(char, long) == sizeof(long));
119
120 assert_se(MAX(-5, 5) == 5);
121 assert_se(MAX(5, 5) == 5);
122 assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
123 assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
124 assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
125 assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
126 assert_se(LESS_BY(8, 4) == 4);
127 assert_se(LESS_BY(8, 8) == 0);
128 assert_se(LESS_BY(4, 8) == 0);
129 assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
130 assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
131 assert_se(CLAMP(-5, 0, 1) == 0);
132 assert_se(CLAMP(5, 0, 1) == 1);
133 assert_se(CLAMP(5, -10, 1) == 1);
134 assert_se(CLAMP(5, -10, 10) == 5);
135 assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
136 }
137
138 static void test_container_of(void) {
139 struct mytype {
140 uint8_t pad1[3];
141 uint64_t v1;
142 uint8_t pad2[2];
143 uint32_t v2;
144 } _packed_ myval = { };
145
146 assert_cc(sizeof(myval) == 17);
147 assert_se(container_of(&myval.v1, struct mytype, v1) == &myval);
148 assert_se(container_of(&myval.v2, struct mytype, v2) == &myval);
149 assert_se(container_of(&container_of(&myval.v2,
150 struct mytype,
151 v2)->v1,
152 struct mytype,
153 v1) == &myval);
154 }
155
156 static void test_alloca(void) {
157 static const uint8_t zero[997] = { };
158 char *t;
159
160 t = alloca_align(17, 512);
161 assert_se(!((uintptr_t)t & 0xff));
162 memzero(t, 17);
163
164 t = alloca0_align(997, 1024);
165 assert_se(!((uintptr_t)t & 0x1ff));
166 assert_se(!memcmp(t, zero, 997));
167 }
168
169 static void test_div_round_up(void) {
170 int div;
171
172 /* basic tests */
173 assert_se(DIV_ROUND_UP(0, 8) == 0);
174 assert_se(DIV_ROUND_UP(1, 8) == 1);
175 assert_se(DIV_ROUND_UP(8, 8) == 1);
176 assert_se(DIV_ROUND_UP(12, 8) == 2);
177 assert_se(DIV_ROUND_UP(16, 8) == 2);
178
179 /* test multiple evaluation */
180 div = 0;
181 assert_se(DIV_ROUND_UP(div++, 8) == 0 && div == 1);
182 assert_se(DIV_ROUND_UP(++div, 8) == 1 && div == 2);
183 assert_se(DIV_ROUND_UP(8, div++) == 4 && div == 3);
184 assert_se(DIV_ROUND_UP(8, ++div) == 2 && div == 4);
185
186 /* overflow test with exact division */
187 assert_se(sizeof(0U) == 4);
188 assert_se(0xfffffffaU % 10U == 0U);
189 assert_se(0xfffffffaU / 10U == 429496729U);
190 assert_se(DIV_ROUND_UP(0xfffffffaU, 10U) == 429496729U);
191 assert_se((0xfffffffaU + 10U - 1U) / 10U == 0U);
192 assert_se(0xfffffffaU / 10U + !!(0xfffffffaU % 10U) == 429496729U);
193
194 /* overflow test with rounded division */
195 assert_se(0xfffffffdU % 10U == 3U);
196 assert_se(0xfffffffdU / 10U == 429496729U);
197 assert_se(DIV_ROUND_UP(0xfffffffdU, 10U) == 429496730U);
198 assert_se((0xfffffffdU + 10U - 1U) / 10U == 0U);
199 assert_se(0xfffffffdU / 10U + !!(0xfffffffdU % 10U) == 429496730U);
200 }
201
202 static void test_first_word(void) {
203 assert_se(first_word("Hello", ""));
204 assert_se(first_word("Hello", "Hello"));
205 assert_se(first_word("Hello world", "Hello"));
206 assert_se(first_word("Hello\tworld", "Hello"));
207 assert_se(first_word("Hello\nworld", "Hello"));
208 assert_se(first_word("Hello\rworld", "Hello"));
209 assert_se(first_word("Hello ", "Hello"));
210
211 assert_se(!first_word("Hello", "Hellooo"));
212 assert_se(!first_word("Hello", "xxxxx"));
213 assert_se(!first_word("Hellooo", "Hello"));
214 }
215
216 static void test_close_many(void) {
217 int fds[3];
218 char name0[] = "/tmp/test-close-many.XXXXXX";
219 char name1[] = "/tmp/test-close-many.XXXXXX";
220 char name2[] = "/tmp/test-close-many.XXXXXX";
221
222 fds[0] = mkostemp_safe(name0, O_RDWR|O_CLOEXEC);
223 fds[1] = mkostemp_safe(name1, O_RDWR|O_CLOEXEC);
224 fds[2] = mkostemp_safe(name2, O_RDWR|O_CLOEXEC);
225
226 close_many(fds, 2);
227
228 assert_se(fcntl(fds[0], F_GETFD) == -1);
229 assert_se(fcntl(fds[1], F_GETFD) == -1);
230 assert_se(fcntl(fds[2], F_GETFD) >= 0);
231
232 safe_close(fds[2]);
233
234 unlink(name0);
235 unlink(name1);
236 unlink(name2);
237 }
238
239 static void test_parse_uid(void) {
240 int r;
241 uid_t uid;
242
243 r = parse_uid("100", &uid);
244 assert_se(r == 0);
245 assert_se(uid == 100);
246
247 r = parse_uid("65535", &uid);
248 assert_se(r == -ENXIO);
249
250 r = parse_uid("asdsdas", &uid);
251 assert_se(r == -EINVAL);
252 }
253
254 static void test_strappend(void) {
255 _cleanup_free_ char *t1, *t2, *t3, *t4;
256
257 t1 = strappend(NULL, NULL);
258 assert_se(streq(t1, ""));
259
260 t2 = strappend(NULL, "suf");
261 assert_se(streq(t2, "suf"));
262
263 t3 = strappend("pre", NULL);
264 assert_se(streq(t3, "pre"));
265
266 t4 = strappend("pre", "suf");
267 assert_se(streq(t4, "presuf"));
268 }
269
270 static void test_strstrip(void) {
271 char *r;
272 char input[] = " hello, waldo. ";
273
274 r = strstrip(input);
275 assert_se(streq(r, "hello, waldo."));
276 }
277
278 static void test_delete_chars(void) {
279 char *r;
280 char input[] = " hello, waldo. abc";
281
282 r = delete_chars(input, WHITESPACE);
283 assert_se(streq(r, "hello,waldo.abc"));
284 }
285
286 static void test_in_charset(void) {
287 assert_se(in_charset("dddaaabbbcccc", "abcd"));
288 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
289 }
290
291 static void test_hexchar(void) {
292 assert_se(hexchar(0xa) == 'a');
293 assert_se(hexchar(0x0) == '0');
294 }
295
296 static void test_unhexchar(void) {
297 assert_se(unhexchar('a') == 0xA);
298 assert_se(unhexchar('A') == 0xA);
299 assert_se(unhexchar('0') == 0x0);
300 }
301
302 static void test_base32hexchar(void) {
303 assert_se(base32hexchar(0) == '0');
304 assert_se(base32hexchar(9) == '9');
305 assert_se(base32hexchar(10) == 'A');
306 assert_se(base32hexchar(31) == 'V');
307 }
308
309 static void test_unbase32hexchar(void) {
310 assert_se(unbase32hexchar('0') == 0);
311 assert_se(unbase32hexchar('9') == 9);
312 assert_se(unbase32hexchar('A') == 10);
313 assert_se(unbase32hexchar('V') == 31);
314 assert_se(unbase32hexchar('=') == -EINVAL);
315 }
316
317 static void test_base64char(void) {
318 assert_se(base64char(0) == 'A');
319 assert_se(base64char(26) == 'a');
320 assert_se(base64char(63) == '/');
321 }
322
323 static void test_unbase64char(void) {
324 assert_se(unbase64char('A') == 0);
325 assert_se(unbase64char('Z') == 25);
326 assert_se(unbase64char('a') == 26);
327 assert_se(unbase64char('z') == 51);
328 assert_se(unbase64char('0') == 52);
329 assert_se(unbase64char('9') == 61);
330 assert_se(unbase64char('+') == 62);
331 assert_se(unbase64char('/') == 63);
332 assert_se(unbase64char('=') == -EINVAL);
333 }
334
335 static void test_octchar(void) {
336 assert_se(octchar(00) == '0');
337 assert_se(octchar(07) == '7');
338 }
339
340 static void test_unoctchar(void) {
341 assert_se(unoctchar('0') == 00);
342 assert_se(unoctchar('7') == 07);
343 }
344
345 static void test_decchar(void) {
346 assert_se(decchar(0) == '0');
347 assert_se(decchar(9) == '9');
348 }
349
350 static void test_undecchar(void) {
351 assert_se(undecchar('0') == 0);
352 assert_se(undecchar('9') == 9);
353 }
354
355 static void test_unhexmem(void) {
356 const char *hex = "efa214921";
357 const char *hex_invalid = "efa214921o";
358 _cleanup_free_ char *hex2 = NULL;
359 _cleanup_free_ void *mem = NULL;
360 size_t len;
361
362 assert_se(unhexmem(hex, strlen(hex), &mem, &len) == 0);
363 assert_se(unhexmem(hex, strlen(hex) + 1, &mem, &len) == -EINVAL);
364 assert_se(unhexmem(hex_invalid, strlen(hex_invalid), &mem, &len) == -EINVAL);
365
366 assert_se((hex2 = hexmem(mem, len)));
367
368 free(mem);
369
370 assert_se(memcmp(hex, hex2, strlen(hex)) == 0);
371
372 free(hex2);
373
374 assert_se(unhexmem(hex, strlen(hex) - 1, &mem, &len) == 0);
375 assert_se((hex2 = hexmem(mem, len)));
376 assert_se(memcmp(hex, hex2, strlen(hex) - 1) == 0);
377 }
378
379 /* https://tools.ietf.org/html/rfc4648#section-10 */
380 static void test_base32hexmem(void) {
381 char *b32;
382
383 b32 = base32hexmem("", strlen(""), true);
384 assert_se(b32);
385 assert_se(streq(b32, ""));
386 free(b32);
387
388 b32 = base32hexmem("f", strlen("f"), true);
389 assert_se(b32);
390 assert_se(streq(b32, "CO======"));
391 free(b32);
392
393 b32 = base32hexmem("fo", strlen("fo"), true);
394 assert_se(b32);
395 assert_se(streq(b32, "CPNG===="));
396 free(b32);
397
398 b32 = base32hexmem("foo", strlen("foo"), true);
399 assert_se(b32);
400 assert_se(streq(b32, "CPNMU==="));
401 free(b32);
402
403 b32 = base32hexmem("foob", strlen("foob"), true);
404 assert_se(b32);
405 assert_se(streq(b32, "CPNMUOG="));
406 free(b32);
407
408 b32 = base32hexmem("fooba", strlen("fooba"), true);
409 assert_se(b32);
410 assert_se(streq(b32, "CPNMUOJ1"));
411 free(b32);
412
413 b32 = base32hexmem("foobar", strlen("foobar"), true);
414 assert_se(b32);
415 assert_se(streq(b32, "CPNMUOJ1E8======"));
416 free(b32);
417
418 b32 = base32hexmem("", strlen(""), false);
419 assert_se(b32);
420 assert_se(streq(b32, ""));
421 free(b32);
422
423 b32 = base32hexmem("f", strlen("f"), false);
424 assert_se(b32);
425 assert_se(streq(b32, "CO"));
426 free(b32);
427
428 b32 = base32hexmem("fo", strlen("fo"), false);
429 assert_se(b32);
430 assert_se(streq(b32, "CPNG"));
431 free(b32);
432
433 b32 = base32hexmem("foo", strlen("foo"), false);
434 assert_se(b32);
435 assert_se(streq(b32, "CPNMU"));
436 free(b32);
437
438 b32 = base32hexmem("foob", strlen("foob"), false);
439 assert_se(b32);
440 assert_se(streq(b32, "CPNMUOG"));
441 free(b32);
442
443 b32 = base32hexmem("fooba", strlen("fooba"), false);
444 assert_se(b32);
445 assert_se(streq(b32, "CPNMUOJ1"));
446 free(b32);
447
448 b32 = base32hexmem("foobar", strlen("foobar"), false);
449 assert_se(b32);
450 assert_se(streq(b32, "CPNMUOJ1E8"));
451 free(b32);
452 }
453
454 static void test_unbase32hexmem(void) {
455 void *mem;
456 size_t len;
457
458 assert_se(unbase32hexmem("", strlen(""), true, &mem, &len) == 0);
459 assert_se(streq(strndupa(mem, len), ""));
460 free(mem);
461
462 assert_se(unbase32hexmem("CO======", strlen("CO======"), true, &mem, &len) == 0);
463 assert_se(streq(strndupa(mem, len), "f"));
464 free(mem);
465
466 assert_se(unbase32hexmem("CPNG====", strlen("CPNG===="), true, &mem, &len) == 0);
467 assert_se(streq(strndupa(mem, len), "fo"));
468 free(mem);
469
470 assert_se(unbase32hexmem("CPNMU===", strlen("CPNMU==="), true, &mem, &len) == 0);
471 assert_se(streq(strndupa(mem, len), "foo"));
472 free(mem);
473
474 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), true, &mem, &len) == 0);
475 assert_se(streq(strndupa(mem, len), "foob"));
476 free(mem);
477
478 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == 0);
479 assert_se(streq(strndupa(mem, len), "fooba"));
480 free(mem);
481
482 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), true, &mem, &len) == 0);
483 assert_se(streq(strndupa(mem, len), "foobar"));
484 free(mem);
485
486 assert_se(unbase32hexmem("A", strlen("A"), true, &mem, &len) == -EINVAL);
487 assert_se(unbase32hexmem("A=======", strlen("A======="), true, &mem, &len) == -EINVAL);
488 assert_se(unbase32hexmem("AAA=====", strlen("AAA====="), true, &mem, &len) == -EINVAL);
489 assert_se(unbase32hexmem("AAAAAA==", strlen("AAAAAA=="), true, &mem, &len) == -EINVAL);
490 assert_se(unbase32hexmem("AB======", strlen("AB======"), true, &mem, &len) == -EINVAL);
491 assert_se(unbase32hexmem("AAAB====", strlen("AAAB===="), true, &mem, &len) == -EINVAL);
492 assert_se(unbase32hexmem("AAAAB===", strlen("AAAAB==="), true, &mem, &len) == -EINVAL);
493 assert_se(unbase32hexmem("AAAAAAB=", strlen("AAAAAAB="), true, &mem, &len) == -EINVAL);
494
495 assert_se(unbase32hexmem("XPNMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
496 assert_se(unbase32hexmem("CXNMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
497 assert_se(unbase32hexmem("CPXMUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
498 assert_se(unbase32hexmem("CPNXUOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
499 assert_se(unbase32hexmem("CPNMXOJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
500 assert_se(unbase32hexmem("CPNMUXJ1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
501 assert_se(unbase32hexmem("CPNMUOX1", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
502 assert_se(unbase32hexmem("CPNMUOJX", strlen("CPNMUOJ1"), true, &mem, &len) == -EINVAL);
503
504 assert_se(unbase32hexmem("", strlen(""), false, &mem, &len) == 0);
505 assert_se(streq(strndupa(mem, len), ""));
506 free(mem);
507
508 assert_se(unbase32hexmem("CO", strlen("CO"), false, &mem, &len) == 0);
509 assert_se(streq(strndupa(mem, len), "f"));
510 free(mem);
511
512 assert_se(unbase32hexmem("CPNG", strlen("CPNG"), false, &mem, &len) == 0);
513 assert_se(streq(strndupa(mem, len), "fo"));
514 free(mem);
515
516 assert_se(unbase32hexmem("CPNMU", strlen("CPNMU"), false, &mem, &len) == 0);
517 assert_se(streq(strndupa(mem, len), "foo"));
518 free(mem);
519
520 assert_se(unbase32hexmem("CPNMUOG", strlen("CPNMUOG"), false, &mem, &len) == 0);
521 assert_se(streq(strndupa(mem, len), "foob"));
522 free(mem);
523
524 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), false, &mem, &len) == 0);
525 assert_se(streq(strndupa(mem, len), "fooba"));
526 free(mem);
527
528 assert_se(unbase32hexmem("CPNMUOJ1E8", strlen("CPNMUOJ1E8"), false, &mem, &len) == 0);
529 assert_se(streq(strndupa(mem, len), "foobar"));
530 free(mem);
531
532 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), false, &mem, &len) == -EINVAL);
533 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), false, &mem, &len) == -EINVAL);
534 assert_se(unbase32hexmem("A", strlen("A"), false, &mem, &len) == -EINVAL);
535 assert_se(unbase32hexmem("A", strlen("A"), false, &mem, &len) == -EINVAL);
536 assert_se(unbase32hexmem("AAA", strlen("AAA"), false, &mem, &len) == -EINVAL);
537 assert_se(unbase32hexmem("AAAAAA", strlen("AAAAAA"), false, &mem, &len) == -EINVAL);
538 assert_se(unbase32hexmem("AB", strlen("AB"), false, &mem, &len) == -EINVAL);
539 assert_se(unbase32hexmem("AAAB", strlen("AAAB"), false, &mem, &len) == -EINVAL);
540 assert_se(unbase32hexmem("AAAAB", strlen("AAAAB"), false, &mem, &len) == -EINVAL);
541 assert_se(unbase32hexmem("AAAAAAB", strlen("AAAAAAB"), false, &mem, &len) == -EINVAL);
542 }
543
544 /* https://tools.ietf.org/html/rfc4648#section-10 */
545 static void test_base64mem(void) {
546 char *b64;
547
548 assert_se(base64mem("", strlen(""), &b64) == 0);
549 assert_se(streq(b64, ""));
550 free(b64);
551
552 assert_se(base64mem("f", strlen("f"), &b64) == 4);
553 assert_se(streq(b64, "Zg=="));
554 free(b64);
555
556 assert_se(base64mem("fo", strlen("fo"), &b64) == 4);
557 assert_se(streq(b64, "Zm8="));
558 free(b64);
559
560 assert_se(base64mem("foo", strlen("foo"), &b64) == 4);
561 assert_se(streq(b64, "Zm9v"));
562 free(b64);
563
564 assert_se(base64mem("foob", strlen("foob"), &b64) == 8);
565 assert_se(streq(b64, "Zm9vYg=="));
566 free(b64);
567
568 assert_se(base64mem("fooba", strlen("fooba"), &b64) == 8);
569 assert_se(streq(b64, "Zm9vYmE="));
570 free(b64);
571
572 assert_se(base64mem("foobar", strlen("foobar"), &b64) == 8);
573 assert_se(streq(b64, "Zm9vYmFy"));
574 free(b64);
575 }
576
577 static void test_unbase64mem(void) {
578 void *mem;
579 size_t len;
580
581 assert_se(unbase64mem("", strlen(""), &mem, &len) == 0);
582 assert_se(streq(strndupa(mem, len), ""));
583 free(mem);
584
585 assert_se(unbase64mem("Zg==", strlen("Zg=="), &mem, &len) == 0);
586 assert_se(streq(strndupa(mem, len), "f"));
587 free(mem);
588
589 assert_se(unbase64mem("Zm8=", strlen("Zm8="), &mem, &len) == 0);
590 assert_se(streq(strndupa(mem, len), "fo"));
591 free(mem);
592
593 assert_se(unbase64mem("Zm9v", strlen("Zm9v"), &mem, &len) == 0);
594 assert_se(streq(strndupa(mem, len), "foo"));
595 free(mem);
596
597 assert_se(unbase64mem("Zm9vYg==", strlen("Zm9vYg=="), &mem, &len) == 0);
598 assert_se(streq(strndupa(mem, len), "foob"));
599 free(mem);
600
601 assert_se(unbase64mem("Zm9vYmE=", strlen("Zm9vYmE="), &mem, &len) == 0);
602 assert_se(streq(strndupa(mem, len), "fooba"));
603 free(mem);
604
605 assert_se(unbase64mem("Zm9vYmFy", strlen("Zm9vYmFy"), &mem, &len) == 0);
606 assert_se(streq(strndupa(mem, len), "foobar"));
607 free(mem);
608
609 assert_se(unbase64mem("A", strlen("A"), &mem, &len) == -EINVAL);
610 assert_se(unbase64mem("A====", strlen("A===="), &mem, &len) == -EINVAL);
611 assert_se(unbase64mem("AAB==", strlen("AAB=="), &mem, &len) == -EINVAL);
612 assert_se(unbase64mem("AAAB=", strlen("AAAB="), &mem, &len) == -EINVAL);
613 }
614
615 static void test_cescape(void) {
616 _cleanup_free_ char *escaped;
617
618 assert_se(escaped = cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
619 assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
620 }
621
622 static void test_cunescape(void) {
623 _cleanup_free_ char *unescaped;
624
625 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", 0, &unescaped) < 0);
626 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", UNESCAPE_RELAX, &unescaped) >= 0);
627 assert_se(streq_ptr(unescaped, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
628 unescaped = mfree(unescaped);
629
630 /* incomplete sequences */
631 assert_se(cunescape("\\x0", 0, &unescaped) < 0);
632 assert_se(cunescape("\\x0", UNESCAPE_RELAX, &unescaped) >= 0);
633 assert_se(streq_ptr(unescaped, "\\x0"));
634 unescaped = mfree(unescaped);
635
636 assert_se(cunescape("\\x", 0, &unescaped) < 0);
637 assert_se(cunescape("\\x", UNESCAPE_RELAX, &unescaped) >= 0);
638 assert_se(streq_ptr(unescaped, "\\x"));
639 unescaped = mfree(unescaped);
640
641 assert_se(cunescape("\\", 0, &unescaped) < 0);
642 assert_se(cunescape("\\", UNESCAPE_RELAX, &unescaped) >= 0);
643 assert_se(streq_ptr(unescaped, "\\"));
644 unescaped = mfree(unescaped);
645
646 assert_se(cunescape("\\11", 0, &unescaped) < 0);
647 assert_se(cunescape("\\11", UNESCAPE_RELAX, &unescaped) >= 0);
648 assert_se(streq_ptr(unescaped, "\\11"));
649 unescaped = mfree(unescaped);
650
651 assert_se(cunescape("\\1", 0, &unescaped) < 0);
652 assert_se(cunescape("\\1", UNESCAPE_RELAX, &unescaped) >= 0);
653 assert_se(streq_ptr(unescaped, "\\1"));
654 unescaped = mfree(unescaped);
655
656 assert_se(cunescape("\\u0000", 0, &unescaped) < 0);
657 assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX, &unescaped) >= 0);
658 assert_se(streq_ptr(unescaped, "ßßΠA"));
659 unescaped = mfree(unescaped);
660
661 assert_se(cunescape("\\073", 0, &unescaped) >= 0);
662 assert_se(streq_ptr(unescaped, ";"));
663 }
664
665 static void test_foreach_word(void) {
666 const char *word, *state;
667 size_t l;
668 int i = 0;
669 const char test[] = "test abc d\te f ";
670 const char * const expected[] = {
671 "test",
672 "abc",
673 "d",
674 "e",
675 "f",
676 "",
677 NULL
678 };
679
680 FOREACH_WORD(word, l, test, state)
681 assert_se(strneq(expected[i++], word, l));
682 }
683
684 static void check(const char *test, char** expected, bool trailing) {
685 const char *word, *state;
686 size_t l;
687 int i = 0;
688
689 printf("<<<%s>>>\n", test);
690 FOREACH_WORD_QUOTED(word, l, test, state) {
691 _cleanup_free_ char *t = NULL;
692
693 assert_se(t = strndup(word, l));
694 assert_se(strneq(expected[i++], word, l));
695 printf("<%s>\n", t);
696 }
697 printf("<<<%s>>>\n", state);
698 assert_se(expected[i] == NULL);
699 assert_se(isempty(state) == !trailing);
700 }
701
702 static void test_foreach_word_quoted(void) {
703 check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
704 STRV_MAKE("test",
705 "a",
706 "b",
707 "c",
708 "d",
709 "e",
710 "",
711 "",
712 "hhh",
713 "",
714 "",
715 "a b c"),
716 false);
717
718 check("test \"xxx",
719 STRV_MAKE("test"),
720 true);
721
722 check("test\\",
723 STRV_MAKE_EMPTY,
724 true);
725 }
726
727 static void test_memdup_multiply(void) {
728 int org[] = {1, 2, 3};
729 int *dup;
730
731 dup = (int*)memdup_multiply(org, sizeof(int), 3);
732
733 assert_se(dup);
734 assert_se(dup[0] == 1);
735 assert_se(dup[1] == 2);
736 assert_se(dup[2] == 3);
737 free(dup);
738 }
739
740 static void test_u64log2(void) {
741 assert_se(u64log2(0) == 0);
742 assert_se(u64log2(8) == 3);
743 assert_se(u64log2(9) == 3);
744 assert_se(u64log2(15) == 3);
745 assert_se(u64log2(16) == 4);
746 assert_se(u64log2(1024*1024) == 20);
747 assert_se(u64log2(1024*1024+5) == 20);
748 }
749
750 static void test_protect_errno(void) {
751 errno = 12;
752 {
753 PROTECT_ERRNO;
754 errno = 11;
755 }
756 assert_se(errno == 12);
757 }
758
759 static void test_parse_cpu_set(void) {
760 cpu_set_t *c = NULL;
761 int ncpus;
762 int cpu;
763
764 /* Simple range (from CPUAffinity example) */
765 ncpus = parse_cpu_set_and_warn("1 2", &c, NULL, "fake", 1, "CPUAffinity");
766 assert_se(ncpus >= 1024);
767 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus), c));
768 assert_se(CPU_ISSET_S(2, CPU_ALLOC_SIZE(ncpus), c));
769 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 2);
770 c = mfree(c);
771
772 /* A more interesting range */
773 ncpus = parse_cpu_set_and_warn("0 1 2 3 8 9 10 11", &c, NULL, "fake", 1, "CPUAffinity");
774 assert_se(ncpus >= 1024);
775 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
776 for (cpu = 0; cpu < 4; cpu++)
777 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
778 for (cpu = 8; cpu < 12; cpu++)
779 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
780 c = mfree(c);
781
782 /* Quoted strings */
783 ncpus = parse_cpu_set_and_warn("8 '9' 10 \"11\"", &c, NULL, "fake", 1, "CPUAffinity");
784 assert_se(ncpus >= 1024);
785 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 4);
786 for (cpu = 8; cpu < 12; cpu++)
787 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
788 c = mfree(c);
789
790 /* Use commas as separators */
791 ncpus = parse_cpu_set_and_warn("0,1,2,3 8,9,10,11", &c, NULL, "fake", 1, "CPUAffinity");
792 assert_se(ncpus >= 1024);
793 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
794 for (cpu = 0; cpu < 4; cpu++)
795 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
796 for (cpu = 8; cpu < 12; cpu++)
797 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
798 c = mfree(c);
799
800 /* Commas with spaces (and trailing comma, space) */
801 ncpus = parse_cpu_set_and_warn("0, 1, 2, 3, 4, 5, 6, 7, ", &c, NULL, "fake", 1, "CPUAffinity");
802 assert_se(ncpus >= 1024);
803 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
804 for (cpu = 0; cpu < 8; cpu++)
805 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
806 c = mfree(c);
807
808 /* Ranges */
809 ncpus = parse_cpu_set_and_warn("0-3,8-11", &c, NULL, "fake", 1, "CPUAffinity");
810 assert_se(ncpus >= 1024);
811 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
812 for (cpu = 0; cpu < 4; cpu++)
813 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
814 for (cpu = 8; cpu < 12; cpu++)
815 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
816 c = mfree(c);
817
818 /* Ranges with trailing comma, space */
819 ncpus = parse_cpu_set_and_warn("0-3 8-11, ", &c, NULL, "fake", 1, "CPUAffinity");
820 assert_se(ncpus >= 1024);
821 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
822 for (cpu = 0; cpu < 4; cpu++)
823 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
824 for (cpu = 8; cpu < 12; cpu++)
825 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
826 c = mfree(c);
827
828 /* Negative range (returns empty cpu_set) */
829 ncpus = parse_cpu_set_and_warn("3-0", &c, NULL, "fake", 1, "CPUAffinity");
830 assert_se(ncpus >= 1024);
831 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 0);
832 c = mfree(c);
833
834 /* Overlapping ranges */
835 ncpus = parse_cpu_set_and_warn("0-7 4-11", &c, NULL, "fake", 1, "CPUAffinity");
836 assert_se(ncpus >= 1024);
837 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 12);
838 for (cpu = 0; cpu < 12; cpu++)
839 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
840 c = mfree(c);
841
842 /* Mix ranges and individual CPUs */
843 ncpus = parse_cpu_set_and_warn("0,1 4-11", &c, NULL, "fake", 1, "CPUAffinity");
844 assert_se(ncpus >= 1024);
845 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 10);
846 assert_se(CPU_ISSET_S(0, CPU_ALLOC_SIZE(ncpus), c));
847 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus), c));
848 for (cpu = 4; cpu < 12; cpu++)
849 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
850 c = mfree(c);
851
852 /* Garbage */
853 ncpus = parse_cpu_set_and_warn("0 1 2 3 garbage", &c, NULL, "fake", 1, "CPUAffinity");
854 assert_se(ncpus < 0);
855 assert_se(!c);
856
857 /* Range with garbage */
858 ncpus = parse_cpu_set_and_warn("0-3 8-garbage", &c, NULL, "fake", 1, "CPUAffinity");
859 assert_se(ncpus < 0);
860 assert_se(!c);
861
862 /* Empty string */
863 c = NULL;
864 ncpus = parse_cpu_set_and_warn("", &c, NULL, "fake", 1, "CPUAffinity");
865 assert_se(ncpus == 0); /* empty string returns 0 */
866 assert_se(!c);
867
868 /* Runnaway quoted string */
869 ncpus = parse_cpu_set_and_warn("0 1 2 3 \"4 5 6 7 ", &c, NULL, "fake", 1, "CPUAffinity");
870 assert_se(ncpus < 0);
871 assert_se(!c);
872 }
873
874 static void test_config_parse_iec_uint64(void) {
875 uint64_t offset = 0;
876 assert_se(config_parse_iec_uint64(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset, NULL) == 0);
877 assert_se(offset == 4 * 1024 * 1024);
878
879 assert_se(config_parse_iec_uint64(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset, NULL) == 0);
880 }
881
882 static void test_strextend(void) {
883 _cleanup_free_ char *str = strdup("0123");
884 strextend(&str, "456", "78", "9", NULL);
885 assert_se(streq(str, "0123456789"));
886 }
887
888 static void test_strrep(void) {
889 _cleanup_free_ char *one, *three, *zero;
890 one = strrep("waldo", 1);
891 three = strrep("waldo", 3);
892 zero = strrep("waldo", 0);
893
894 assert_se(streq(one, "waldo"));
895 assert_se(streq(three, "waldowaldowaldo"));
896 assert_se(streq(zero, ""));
897 }
898
899 static void test_split_pair(void) {
900 _cleanup_free_ char *a = NULL, *b = NULL;
901
902 assert_se(split_pair("", "", &a, &b) == -EINVAL);
903 assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
904 assert_se(split_pair("", "=", &a, &b) == -EINVAL);
905 assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
906 assert_se(streq(a, "foo"));
907 assert_se(streq(b, "bar"));
908 free(a);
909 free(b);
910 assert_se(split_pair("==", "==", &a, &b) >= 0);
911 assert_se(streq(a, ""));
912 assert_se(streq(b, ""));
913 free(a);
914 free(b);
915
916 assert_se(split_pair("===", "==", &a, &b) >= 0);
917 assert_se(streq(a, ""));
918 assert_se(streq(b, "="));
919 }
920
921 static void test_fstab_node_to_udev_node(void) {
922 char *n;
923
924 n = fstab_node_to_udev_node("LABEL=applé/jack");
925 puts(n);
926 assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack"));
927 free(n);
928
929 n = fstab_node_to_udev_node("PARTLABEL=pinkié pie");
930 puts(n);
931 assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie"));
932 free(n);
933
934 n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
935 puts(n);
936 assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
937 free(n);
938
939 n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
940 puts(n);
941 assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
942 free(n);
943
944 n = fstab_node_to_udev_node("PONIES=awesome");
945 puts(n);
946 assert_se(streq(n, "PONIES=awesome"));
947 free(n);
948
949 n = fstab_node_to_udev_node("/dev/xda1");
950 puts(n);
951 assert_se(streq(n, "/dev/xda1"));
952 free(n);
953 }
954
955 static void test_get_files_in_directory(void) {
956 _cleanup_strv_free_ char **l = NULL, **t = NULL;
957
958 assert_se(get_files_in_directory("/tmp", &l) >= 0);
959 assert_se(get_files_in_directory(".", &t) >= 0);
960 assert_se(get_files_in_directory(".", NULL) >= 0);
961 }
962
963 static void test_in_set(void) {
964 assert_se(IN_SET(1, 1));
965 assert_se(IN_SET(1, 1, 2, 3, 4));
966 assert_se(IN_SET(2, 1, 2, 3, 4));
967 assert_se(IN_SET(3, 1, 2, 3, 4));
968 assert_se(IN_SET(4, 1, 2, 3, 4));
969 assert_se(!IN_SET(0, 1));
970 assert_se(!IN_SET(0, 1, 2, 3, 4));
971 }
972
973 static void test_writing_tmpfile(void) {
974 char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
975 _cleanup_free_ char *contents = NULL;
976 size_t size;
977 int fd, r;
978 struct iovec iov[3];
979
980 IOVEC_SET_STRING(iov[0], "abc\n");
981 IOVEC_SET_STRING(iov[1], ALPHANUMERICAL "\n");
982 IOVEC_SET_STRING(iov[2], "");
983
984 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
985 printf("tmpfile: %s", name);
986
987 r = writev(fd, iov, 3);
988 assert_se(r >= 0);
989
990 r = read_full_file(name, &contents, &size);
991 assert_se(r == 0);
992 printf("contents: %s", contents);
993 assert_se(streq(contents, "abc\n" ALPHANUMERICAL "\n"));
994
995 unlink(name);
996 }
997
998 static void test_hexdump(void) {
999 uint8_t data[146];
1000 unsigned i;
1001
1002 hexdump(stdout, NULL, 0);
1003 hexdump(stdout, "", 0);
1004 hexdump(stdout, "", 1);
1005 hexdump(stdout, "x", 1);
1006 hexdump(stdout, "x", 2);
1007 hexdump(stdout, "foobar", 7);
1008 hexdump(stdout, "f\nobar", 7);
1009 hexdump(stdout, "xxxxxxxxxxxxxxxxxxxxyz", 23);
1010
1011 for (i = 0; i < ELEMENTSOF(data); i++)
1012 data[i] = i*2;
1013
1014 hexdump(stdout, data, sizeof(data));
1015 }
1016
1017 static void test_log2i(void) {
1018 assert_se(log2i(1) == 0);
1019 assert_se(log2i(2) == 1);
1020 assert_se(log2i(3) == 1);
1021 assert_se(log2i(4) == 2);
1022 assert_se(log2i(32) == 5);
1023 assert_se(log2i(33) == 5);
1024 assert_se(log2i(63) == 5);
1025 assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
1026 }
1027
1028 static void test_foreach_string(void) {
1029 const char * const t[] = {
1030 "foo",
1031 "bar",
1032 "waldo",
1033 NULL
1034 };
1035 const char *x;
1036 unsigned i = 0;
1037
1038 FOREACH_STRING(x, "foo", "bar", "waldo")
1039 assert_se(streq_ptr(t[i++], x));
1040
1041 assert_se(i == 3);
1042
1043 FOREACH_STRING(x, "zzz")
1044 assert_se(streq(x, "zzz"));
1045 }
1046
1047 static void test_filename_is_valid(void) {
1048 char foo[FILENAME_MAX+2];
1049 int i;
1050
1051 assert_se(!filename_is_valid(""));
1052 assert_se(!filename_is_valid("/bar/foo"));
1053 assert_se(!filename_is_valid("/"));
1054 assert_se(!filename_is_valid("."));
1055 assert_se(!filename_is_valid(".."));
1056
1057 for (i=0; i<FILENAME_MAX+1; i++)
1058 foo[i] = 'a';
1059 foo[FILENAME_MAX+1] = '\0';
1060
1061 assert_se(!filename_is_valid(foo));
1062
1063 assert_se(filename_is_valid("foo_bar-333"));
1064 assert_se(filename_is_valid("o.o"));
1065 }
1066
1067 static void test_string_has_cc(void) {
1068 assert_se(string_has_cc("abc\1", NULL));
1069 assert_se(string_has_cc("abc\x7f", NULL));
1070 assert_se(string_has_cc("abc\x7f", NULL));
1071 assert_se(string_has_cc("abc\t\x7f", "\t"));
1072 assert_se(string_has_cc("abc\t\x7f", "\t"));
1073 assert_se(string_has_cc("\x7f", "\t"));
1074 assert_se(string_has_cc("\x7f", "\t\a"));
1075
1076 assert_se(!string_has_cc("abc\t\t", "\t"));
1077 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
1078 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
1079 }
1080
1081 static void test_ascii_strlower(void) {
1082 char a[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
1083 assert_se(streq(ascii_strlower(a), "aabbcc jk ii od lkjjj kkd lk"));
1084 }
1085
1086 static void test_files_same(void) {
1087 _cleanup_close_ int fd = -1;
1088 char name[] = "/tmp/test-files_same.XXXXXX";
1089 char name_alias[] = "/tmp/test-files_same.alias";
1090
1091 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1092 assert_se(fd >= 0);
1093 assert_se(symlink(name, name_alias) >= 0);
1094
1095 assert_se(files_same(name, name));
1096 assert_se(files_same(name, name_alias));
1097
1098 unlink(name);
1099 unlink(name_alias);
1100 }
1101
1102 static void test_is_valid_documentation_url(void) {
1103 assert_se(documentation_url_is_valid("http://www.freedesktop.org/wiki/Software/systemd"));
1104 assert_se(documentation_url_is_valid("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
1105 assert_se(documentation_url_is_valid("file:/foo/foo"));
1106 assert_se(documentation_url_is_valid("man:systemd.special(7)"));
1107 assert_se(documentation_url_is_valid("info:bar"));
1108
1109 assert_se(!documentation_url_is_valid("foo:"));
1110 assert_se(!documentation_url_is_valid("info:"));
1111 assert_se(!documentation_url_is_valid(""));
1112 }
1113
1114 static void test_file_in_same_dir(void) {
1115 char *t;
1116
1117 t = file_in_same_dir("/", "a");
1118 assert_se(streq(t, "/a"));
1119 free(t);
1120
1121 t = file_in_same_dir("/", "/a");
1122 assert_se(streq(t, "/a"));
1123 free(t);
1124
1125 t = file_in_same_dir("", "a");
1126 assert_se(streq(t, "a"));
1127 free(t);
1128
1129 t = file_in_same_dir("a/", "a");
1130 assert_se(streq(t, "a/a"));
1131 free(t);
1132
1133 t = file_in_same_dir("bar/foo", "bar");
1134 assert_se(streq(t, "bar/bar"));
1135 free(t);
1136 }
1137
1138 static void test_endswith(void) {
1139 assert_se(endswith("foobar", "bar"));
1140 assert_se(endswith("foobar", ""));
1141 assert_se(endswith("foobar", "foobar"));
1142 assert_se(endswith("", ""));
1143
1144 assert_se(!endswith("foobar", "foo"));
1145 assert_se(!endswith("foobar", "foobarfoofoo"));
1146 }
1147
1148 static void test_endswith_no_case(void) {
1149 assert_se(endswith_no_case("fooBAR", "bar"));
1150 assert_se(endswith_no_case("foobar", ""));
1151 assert_se(endswith_no_case("foobar", "FOOBAR"));
1152 assert_se(endswith_no_case("", ""));
1153
1154 assert_se(!endswith_no_case("foobar", "FOO"));
1155 assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
1156 }
1157
1158 static void test_close_nointr(void) {
1159 char name[] = "/tmp/test-test-close_nointr.XXXXXX";
1160 int fd;
1161
1162 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1163 assert_se(fd >= 0);
1164 assert_se(close_nointr(fd) >= 0);
1165 assert_se(close_nointr(fd) < 0);
1166
1167 unlink(name);
1168 }
1169
1170
1171 static void test_unlink_noerrno(void) {
1172 char name[] = "/tmp/test-close_nointr.XXXXXX";
1173 int fd;
1174
1175 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1176 assert_se(fd >= 0);
1177 assert_se(close_nointr(fd) >= 0);
1178
1179 {
1180 PROTECT_ERRNO;
1181 errno = -42;
1182 assert_se(unlink_noerrno(name) >= 0);
1183 assert_se(errno == -42);
1184 assert_se(unlink_noerrno(name) < 0);
1185 assert_se(errno == -42);
1186 }
1187 }
1188
1189 static void test_readlink_and_make_absolute(void) {
1190 char tempdir[] = "/tmp/test-readlink_and_make_absolute";
1191 char name[] = "/tmp/test-readlink_and_make_absolute/original";
1192 char name2[] = "test-readlink_and_make_absolute/original";
1193 char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
1194 char *r = NULL;
1195
1196 assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
1197 assert_se(touch(name) >= 0);
1198
1199 assert_se(symlink(name, name_alias) >= 0);
1200 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
1201 assert_se(streq(r, name));
1202 free(r);
1203 assert_se(unlink(name_alias) >= 0);
1204
1205 assert_se(chdir(tempdir) >= 0);
1206 assert_se(symlink(name2, name_alias) >= 0);
1207 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
1208 assert_se(streq(r, name));
1209 free(r);
1210 assert_se(unlink(name_alias) >= 0);
1211
1212 assert_se(rm_rf(tempdir, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
1213 }
1214
1215 static void test_ignore_signals(void) {
1216 assert_se(ignore_signals(SIGINT, -1) >= 0);
1217 assert_se(kill(getpid(), SIGINT) >= 0);
1218 assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
1219 assert_se(kill(getpid(), SIGUSR1) >= 0);
1220 assert_se(kill(getpid(), SIGUSR2) >= 0);
1221 assert_se(kill(getpid(), SIGTERM) >= 0);
1222 assert_se(kill(getpid(), SIGPIPE) >= 0);
1223 assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
1224 }
1225
1226 static void test_strshorten(void) {
1227 char s[] = "foobar";
1228
1229 assert_se(strlen(strshorten(s, 6)) == 6);
1230 assert_se(strlen(strshorten(s, 12)) == 6);
1231 assert_se(strlen(strshorten(s, 2)) == 2);
1232 assert_se(strlen(strshorten(s, 0)) == 0);
1233 }
1234
1235 static void test_strjoina(void) {
1236 char *actual;
1237
1238 actual = strjoina("", "foo", "bar");
1239 assert_se(streq(actual, "foobar"));
1240
1241 actual = strjoina("foo", "bar", "baz");
1242 assert_se(streq(actual, "foobarbaz"));
1243
1244 actual = strjoina("foo", "", "bar", "baz");
1245 assert_se(streq(actual, "foobarbaz"));
1246
1247 actual = strjoina("foo");
1248 assert_se(streq(actual, "foo"));
1249
1250 actual = strjoina(NULL);
1251 assert_se(streq(actual, ""));
1252
1253 actual = strjoina(NULL, "foo");
1254 assert_se(streq(actual, ""));
1255
1256 actual = strjoina("foo", NULL, "bar");
1257 assert_se(streq(actual, "foo"));
1258 }
1259
1260 static void test_is_symlink(void) {
1261 char name[] = "/tmp/test-is_symlink.XXXXXX";
1262 char name_link[] = "/tmp/test-is_symlink.link";
1263 _cleanup_close_ int fd = -1;
1264
1265 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1266 assert_se(fd >= 0);
1267 assert_se(symlink(name, name_link) >= 0);
1268
1269 assert_se(is_symlink(name) == 0);
1270 assert_se(is_symlink(name_link) == 1);
1271 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
1272
1273
1274 unlink(name);
1275 unlink(name_link);
1276 }
1277
1278 static void test_search_and_fopen(void) {
1279 const char *dirs[] = {"/tmp/foo/bar", "/tmp", NULL};
1280 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
1281 int fd = -1;
1282 int r;
1283 FILE *f;
1284
1285 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1286 assert_se(fd >= 0);
1287 close(fd);
1288
1289 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
1290 assert_se(r >= 0);
1291 fclose(f);
1292
1293 r = search_and_fopen(name, "r", NULL, dirs, &f);
1294 assert_se(r >= 0);
1295 fclose(f);
1296
1297 r = search_and_fopen(basename(name), "r", "/", dirs, &f);
1298 assert_se(r >= 0);
1299 fclose(f);
1300
1301 r = search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
1302 assert_se(r < 0);
1303 r = search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
1304 assert_se(r < 0);
1305
1306 r = unlink(name);
1307 assert_se(r == 0);
1308
1309 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
1310 assert_se(r < 0);
1311 }
1312
1313
1314 static void test_search_and_fopen_nulstr(void) {
1315 const char dirs[] = "/tmp/foo/bar\0/tmp\0";
1316 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
1317 int fd = -1;
1318 int r;
1319 FILE *f;
1320
1321 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1322 assert_se(fd >= 0);
1323 close(fd);
1324
1325 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
1326 assert_se(r >= 0);
1327 fclose(f);
1328
1329 r = search_and_fopen_nulstr(name, "r", NULL, dirs, &f);
1330 assert_se(r >= 0);
1331 fclose(f);
1332
1333 r = search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
1334 assert_se(r < 0);
1335 r = search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
1336 assert_se(r < 0);
1337
1338 r = unlink(name);
1339 assert_se(r == 0);
1340
1341 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
1342 assert_se(r < 0);
1343 }
1344
1345 static void test_glob_exists(void) {
1346 char name[] = "/tmp/test-glob_exists.XXXXXX";
1347 int fd = -1;
1348 int r;
1349
1350 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
1351 assert_se(fd >= 0);
1352 close(fd);
1353
1354 r = glob_exists("/tmp/test-glob_exists*");
1355 assert_se(r == 1);
1356
1357 r = unlink(name);
1358 assert_se(r == 0);
1359 r = glob_exists("/tmp/test-glob_exists*");
1360 assert_se(r == 0);
1361 }
1362
1363 static void test_execute_directory(void) {
1364 char template_lo[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
1365 char template_hi[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
1366 const char * dirs[] = {template_hi, template_lo, NULL};
1367 const char *name, *name2, *name3, *overridden, *override, *masked, *mask;
1368
1369 assert_se(mkdtemp(template_lo));
1370 assert_se(mkdtemp(template_hi));
1371
1372 name = strjoina(template_lo, "/script");
1373 name2 = strjoina(template_hi, "/script2");
1374 name3 = strjoina(template_lo, "/useless");
1375 overridden = strjoina(template_lo, "/overridden");
1376 override = strjoina(template_hi, "/overridden");
1377 masked = strjoina(template_lo, "/masked");
1378 mask = strjoina(template_hi, "/masked");
1379
1380 assert_se(write_string_file(name, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE) == 0);
1381 assert_se(write_string_file(name2, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE) == 0);
1382 assert_se(write_string_file(overridden, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
1383 assert_se(write_string_file(override, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE) == 0);
1384 assert_se(write_string_file(masked, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
1385 assert_se(symlink("/dev/null", mask) == 0);
1386 assert_se(chmod(name, 0755) == 0);
1387 assert_se(chmod(name2, 0755) == 0);
1388 assert_se(chmod(overridden, 0755) == 0);
1389 assert_se(chmod(override, 0755) == 0);
1390 assert_se(chmod(masked, 0755) == 0);
1391 assert_se(touch(name3) >= 0);
1392
1393 execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL);
1394
1395 assert_se(chdir(template_lo) == 0);
1396 assert_se(access("it_works", F_OK) >= 0);
1397 assert_se(access("failed", F_OK) < 0);
1398
1399 assert_se(chdir(template_hi) == 0);
1400 assert_se(access("it_works2", F_OK) >= 0);
1401 assert_se(access("failed", F_OK) < 0);
1402
1403 (void) rm_rf(template_lo, REMOVE_ROOT|REMOVE_PHYSICAL);
1404 (void) rm_rf(template_hi, REMOVE_ROOT|REMOVE_PHYSICAL);
1405 }
1406
1407 static int parse_item(const char *key, const char *value) {
1408 assert_se(key);
1409
1410 log_info("kernel cmdline option <%s> = <%s>", key, strna(value));
1411 return 0;
1412 }
1413
1414 static void test_parse_proc_cmdline(void) {
1415 assert_se(parse_proc_cmdline(parse_item) >= 0);
1416 }
1417
1418 static void test_raw_clone(void) {
1419 pid_t parent, pid, pid2;
1420
1421 parent = getpid();
1422 log_info("before clone: getpid()→"PID_FMT, parent);
1423 assert_se(raw_getpid() == parent);
1424
1425 pid = raw_clone(0, NULL);
1426 assert_se(pid >= 0);
1427
1428 pid2 = raw_getpid();
1429 log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT,
1430 pid, getpid(), pid2);
1431 if (pid == 0) {
1432 assert_se(pid2 != parent);
1433 _exit(EXIT_SUCCESS);
1434 } else {
1435 int status;
1436
1437 assert_se(pid2 == parent);
1438 waitpid(pid, &status, __WCLONE);
1439 assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
1440 }
1441 }
1442
1443 static void test_same_fd(void) {
1444 _cleanup_close_pair_ int p[2] = { -1, -1 };
1445 _cleanup_close_ int a = -1, b = -1, c = -1;
1446
1447 assert_se(pipe2(p, O_CLOEXEC) >= 0);
1448 assert_se((a = dup(p[0])) >= 0);
1449 assert_se((b = open("/dev/null", O_RDONLY|O_CLOEXEC)) >= 0);
1450 assert_se((c = dup(a)) >= 0);
1451
1452 assert_se(same_fd(p[0], p[0]) > 0);
1453 assert_se(same_fd(p[1], p[1]) > 0);
1454 assert_se(same_fd(a, a) > 0);
1455 assert_se(same_fd(b, b) > 0);
1456
1457 assert_se(same_fd(a, p[0]) > 0);
1458 assert_se(same_fd(p[0], a) > 0);
1459 assert_se(same_fd(c, p[0]) > 0);
1460 assert_se(same_fd(p[0], c) > 0);
1461 assert_se(same_fd(a, c) > 0);
1462 assert_se(same_fd(c, a) > 0);
1463
1464 assert_se(same_fd(p[0], p[1]) == 0);
1465 assert_se(same_fd(p[1], p[0]) == 0);
1466 assert_se(same_fd(p[0], b) == 0);
1467 assert_se(same_fd(b, p[0]) == 0);
1468 assert_se(same_fd(p[1], a) == 0);
1469 assert_se(same_fd(a, p[1]) == 0);
1470 assert_se(same_fd(p[1], b) == 0);
1471 assert_se(same_fd(b, p[1]) == 0);
1472
1473 assert_se(same_fd(a, b) == 0);
1474 assert_se(same_fd(b, a) == 0);
1475 }
1476
1477 static void test_uid_ptr(void) {
1478
1479 assert_se(UID_TO_PTR(0) != NULL);
1480 assert_se(UID_TO_PTR(1000) != NULL);
1481
1482 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
1483 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
1484 }
1485
1486 static void test_sparse_write_one(int fd, const char *buffer, size_t n) {
1487 char check[n];
1488
1489 assert_se(lseek(fd, 0, SEEK_SET) == 0);
1490 assert_se(ftruncate(fd, 0) >= 0);
1491 assert_se(sparse_write(fd, buffer, n, 4) == (ssize_t) n);
1492
1493 assert_se(lseek(fd, 0, SEEK_CUR) == (off_t) n);
1494 assert_se(ftruncate(fd, n) >= 0);
1495
1496 assert_se(lseek(fd, 0, SEEK_SET) == 0);
1497 assert_se(read(fd, check, n) == (ssize_t) n);
1498
1499 assert_se(memcmp(buffer, check, n) == 0);
1500 }
1501
1502 static void test_sparse_write(void) {
1503 const char test_a[] = "test";
1504 const char test_b[] = "\0\0\0\0test\0\0\0\0";
1505 const char test_c[] = "\0\0test\0\0\0\0";
1506 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";
1507 const char test_e[] = "test\0\0\0\0test";
1508 _cleanup_close_ int fd = -1;
1509 char fn[] = "/tmp/sparseXXXXXX";
1510
1511 fd = mkostemp(fn, O_CLOEXEC);
1512 assert_se(fd >= 0);
1513 unlink(fn);
1514
1515 test_sparse_write_one(fd, test_a, sizeof(test_a));
1516 test_sparse_write_one(fd, test_b, sizeof(test_b));
1517 test_sparse_write_one(fd, test_c, sizeof(test_c));
1518 test_sparse_write_one(fd, test_d, sizeof(test_d));
1519 test_sparse_write_one(fd, test_e, sizeof(test_e));
1520 }
1521
1522 static void test_shell_escape_one(const char *s, const char *bad, const char *expected) {
1523 _cleanup_free_ char *r;
1524
1525 assert_se(r = shell_escape(s, bad));
1526 assert_se(streq_ptr(r, expected));
1527 }
1528
1529 static void test_shell_escape(void) {
1530 test_shell_escape_one("", "", "");
1531 test_shell_escape_one("\\", "", "\\\\");
1532 test_shell_escape_one("foobar", "", "foobar");
1533 test_shell_escape_one("foobar", "o", "f\\o\\obar");
1534 test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz");
1535 }
1536
1537 static void test_shell_maybe_quote_one(const char *s, const char *expected) {
1538 _cleanup_free_ char *r;
1539
1540 assert_se(r = shell_maybe_quote(s));
1541 assert_se(streq(r, expected));
1542 }
1543
1544 static void test_shell_maybe_quote(void) {
1545
1546 test_shell_maybe_quote_one("", "");
1547 test_shell_maybe_quote_one("\\", "\"\\\\\"");
1548 test_shell_maybe_quote_one("\"", "\"\\\"\"");
1549 test_shell_maybe_quote_one("foobar", "foobar");
1550 test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
1551 test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
1552 test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
1553 }
1554
1555 static void test_tempfn(void) {
1556 char *ret = NULL, *p;
1557
1558 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL, &ret) >= 0);
1559 assert_se(streq_ptr(ret, "/foo/bar/.#waldoXXXXXX"));
1560 free(ret);
1561
1562 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret) >= 0);
1563 assert_se(streq_ptr(ret, "/foo/bar/.#[miau]waldoXXXXXX"));
1564 free(ret);
1565
1566 assert_se(tempfn_random("/foo/bar/waldo", NULL, &ret) >= 0);
1567 assert_se(p = startswith(ret, "/foo/bar/.#waldo"));
1568 assert_se(strlen(p) == 16);
1569 assert_se(in_charset(p, "0123456789abcdef"));
1570 free(ret);
1571
1572 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret) >= 0);
1573 assert_se(p = startswith(ret, "/foo/bar/.#[wuff]waldo"));
1574 assert_se(strlen(p) == 16);
1575 assert_se(in_charset(p, "0123456789abcdef"));
1576 free(ret);
1577
1578 assert_se(tempfn_random_child("/foo/bar/waldo", NULL, &ret) >= 0);
1579 assert_se(p = startswith(ret, "/foo/bar/waldo/.#"));
1580 assert_se(strlen(p) == 16);
1581 assert_se(in_charset(p, "0123456789abcdef"));
1582 free(ret);
1583
1584 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret) >= 0);
1585 assert_se(p = startswith(ret, "/foo/bar/waldo/.#[kikiriki]"));
1586 assert_se(strlen(p) == 16);
1587 assert_se(in_charset(p, "0123456789abcdef"));
1588 free(ret);
1589 }
1590
1591 static void test_strcmp_ptr(void) {
1592 assert_se(strcmp_ptr(NULL, NULL) == 0);
1593 assert_se(strcmp_ptr("", NULL) > 0);
1594 assert_se(strcmp_ptr("foo", NULL) > 0);
1595 assert_se(strcmp_ptr(NULL, "") < 0);
1596 assert_se(strcmp_ptr(NULL, "bar") < 0);
1597 assert_se(strcmp_ptr("foo", "bar") > 0);
1598 assert_se(strcmp_ptr("bar", "baz") < 0);
1599 assert_se(strcmp_ptr("foo", "foo") == 0);
1600 assert_se(strcmp_ptr("", "") == 0);
1601 }
1602
1603 static void test_fgetxattrat_fake(void) {
1604 char t[] = "/var/tmp/xattrtestXXXXXX";
1605 _cleanup_close_ int fd = -1;
1606 const char *x;
1607 char v[3] = {};
1608 int r;
1609
1610 assert_se(mkdtemp(t));
1611 x = strjoina(t, "/test");
1612 assert_se(touch(x) >= 0);
1613
1614 r = setxattr(x, "user.foo", "bar", 3, 0);
1615 if (r < 0 && errno == EOPNOTSUPP) /* no xattrs supported on /var/tmp... */
1616 goto cleanup;
1617 assert_se(r >= 0);
1618
1619 fd = open(t, O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOCTTY);
1620 assert_se(fd >= 0);
1621
1622 assert_se(fgetxattrat_fake(fd, "test", "user.foo", v, 3, 0) >= 0);
1623 assert_se(memcmp(v, "bar", 3) == 0);
1624
1625 safe_close(fd);
1626 fd = open("/", O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOCTTY);
1627 assert_se(fd >= 0);
1628 assert_se(fgetxattrat_fake(fd, "usr", "user.idontexist", v, 3, 0) == -ENODATA);
1629
1630 cleanup:
1631 assert_se(unlink(x) >= 0);
1632 assert_se(rmdir(t) >= 0);
1633 }
1634
1635 static void test_runlevel_to_target(void) {
1636 assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
1637 assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
1638 assert_se(streq_ptr(runlevel_to_target("3"), SPECIAL_MULTI_USER_TARGET));
1639 }
1640
1641 int main(int argc, char *argv[]) {
1642 log_parse_environment();
1643 log_open();
1644
1645 test_streq_ptr();
1646 test_align_power2();
1647 test_max();
1648 test_container_of();
1649 test_alloca();
1650 test_div_round_up();
1651 test_first_word();
1652 test_close_many();
1653 test_parse_uid();
1654 test_strappend();
1655 test_strstrip();
1656 test_delete_chars();
1657 test_in_charset();
1658 test_hexchar();
1659 test_unhexchar();
1660 test_base32hexchar();
1661 test_unbase32hexchar();
1662 test_base64char();
1663 test_unbase64char();
1664 test_octchar();
1665 test_unoctchar();
1666 test_decchar();
1667 test_undecchar();
1668 test_unhexmem();
1669 test_base32hexmem();
1670 test_unbase32hexmem();
1671 test_base64mem();
1672 test_unbase64mem();
1673 test_cescape();
1674 test_cunescape();
1675 test_foreach_word();
1676 test_foreach_word_quoted();
1677 test_memdup_multiply();
1678 test_u64log2();
1679 test_protect_errno();
1680 test_parse_cpu_set();
1681 test_config_parse_iec_uint64();
1682 test_strextend();
1683 test_strrep();
1684 test_split_pair();
1685 test_fstab_node_to_udev_node();
1686 test_get_files_in_directory();
1687 test_in_set();
1688 test_writing_tmpfile();
1689 test_hexdump();
1690 test_log2i();
1691 test_foreach_string();
1692 test_filename_is_valid();
1693 test_string_has_cc();
1694 test_ascii_strlower();
1695 test_files_same();
1696 test_is_valid_documentation_url();
1697 test_file_in_same_dir();
1698 test_endswith();
1699 test_endswith_no_case();
1700 test_close_nointr();
1701 test_unlink_noerrno();
1702 test_readlink_and_make_absolute();
1703 test_ignore_signals();
1704 test_strshorten();
1705 test_strjoina();
1706 test_is_symlink();
1707 test_search_and_fopen();
1708 test_search_and_fopen_nulstr();
1709 test_glob_exists();
1710 test_execute_directory();
1711 test_parse_proc_cmdline();
1712 test_raw_clone();
1713 test_same_fd();
1714 test_uid_ptr();
1715 test_sparse_write();
1716 test_shell_escape();
1717 test_shell_maybe_quote();
1718 test_tempfn();
1719 test_strcmp_ptr();
1720 test_fgetxattrat_fake();
1721 test_runlevel_to_target();
1722
1723 return 0;
1724 }