]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-parse-util.c
Merge pull request #8776 from poettering/mtu-cleanup
[thirdparty/systemd.git] / src / test / test-parse-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3 This file is part of systemd.
4
5 Copyright 2010 Lennart Poettering
6 Copyright 2013 Thomas H.P. Andersen
7 ***/
8
9 #include <errno.h>
10 #include <locale.h>
11 #include <math.h>
12 #include <sys/socket.h>
13
14 #include "alloc-util.h"
15 #include "errno-list.h"
16 #include "log.h"
17 #include "parse-util.h"
18 #include "string-util.h"
19
20 static void test_parse_boolean(void) {
21 assert_se(parse_boolean("1") == 1);
22 assert_se(parse_boolean("y") == 1);
23 assert_se(parse_boolean("Y") == 1);
24 assert_se(parse_boolean("yes") == 1);
25 assert_se(parse_boolean("YES") == 1);
26 assert_se(parse_boolean("true") == 1);
27 assert_se(parse_boolean("TRUE") == 1);
28 assert_se(parse_boolean("on") == 1);
29 assert_se(parse_boolean("ON") == 1);
30
31 assert_se(parse_boolean("0") == 0);
32 assert_se(parse_boolean("n") == 0);
33 assert_se(parse_boolean("N") == 0);
34 assert_se(parse_boolean("no") == 0);
35 assert_se(parse_boolean("NO") == 0);
36 assert_se(parse_boolean("false") == 0);
37 assert_se(parse_boolean("FALSE") == 0);
38 assert_se(parse_boolean("off") == 0);
39 assert_se(parse_boolean("OFF") == 0);
40
41 assert_se(parse_boolean("garbage") < 0);
42 assert_se(parse_boolean("") < 0);
43 assert_se(parse_boolean("full") < 0);
44 }
45
46 static void test_parse_pid(void) {
47 int r;
48 pid_t pid;
49
50 r = parse_pid("100", &pid);
51 assert_se(r == 0);
52 assert_se(pid == 100);
53
54 r = parse_pid("0x7FFFFFFF", &pid);
55 assert_se(r == 0);
56 assert_se(pid == 2147483647);
57
58 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
59 r = parse_pid("0", &pid);
60 assert_se(r == -ERANGE);
61 assert_se(pid == 65);
62
63 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
64 r = parse_pid("-100", &pid);
65 assert_se(r == -ERANGE);
66 assert_se(pid == 65);
67
68 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
69 r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
70 assert_se(r == -ERANGE);
71 assert_se(pid == 65);
72
73 r = parse_pid("junk", &pid);
74 assert_se(r == -EINVAL);
75
76 r = parse_pid("", &pid);
77 assert_se(r == -EINVAL);
78 }
79
80 static void test_parse_mode(void) {
81 mode_t m;
82
83 assert_se(parse_mode("-1", &m) < 0);
84 assert_se(parse_mode("", &m) < 0);
85 assert_se(parse_mode("888", &m) < 0);
86 assert_se(parse_mode("77777", &m) < 0);
87
88 assert_se(parse_mode("544", &m) >= 0 && m == 0544);
89 assert_se(parse_mode("777", &m) >= 0 && m == 0777);
90 assert_se(parse_mode("7777", &m) >= 0 && m == 07777);
91 assert_se(parse_mode("0", &m) >= 0 && m == 0);
92 }
93
94 static void test_parse_size(void) {
95 uint64_t bytes;
96
97 assert_se(parse_size("", 1024, &bytes) == -EINVAL);
98
99 assert_se(parse_size("111", 1024, &bytes) == 0);
100 assert_se(bytes == 111);
101
102 assert_se(parse_size("111.4", 1024, &bytes) == 0);
103 assert_se(bytes == 111);
104
105 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
106 assert_se(bytes == 112);
107
108 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
109 assert_se(bytes == 112);
110
111 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
112 assert_se(bytes == 3*1024 + 512);
113
114 assert_se(parse_size("3. K", 1024, &bytes) == 0);
115 assert_se(bytes == 3*1024);
116
117 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
118 assert_se(bytes == 3*1024);
119
120 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
121
122 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
123 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
124
125 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
126
127 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
128 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
129
130 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
131 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
132
133 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
134
135 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
136 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
137
138 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
139 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
140
141 assert_se(parse_size("12P", 1024, &bytes) == 0);
142 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
143
144 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
145
146 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
147 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
148
149 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
150
151 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
152
153 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
154
155 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
156 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
157 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
158
159 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
160
161 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
162 }
163
164 static void test_parse_range(void) {
165 unsigned lower, upper;
166
167 /* Successful cases */
168 assert_se(parse_range("111", &lower, &upper) == 0);
169 assert_se(lower == 111);
170 assert_se(upper == 111);
171
172 assert_se(parse_range("111-123", &lower, &upper) == 0);
173 assert_se(lower == 111);
174 assert_se(upper == 123);
175
176 assert_se(parse_range("123-111", &lower, &upper) == 0);
177 assert_se(lower == 123);
178 assert_se(upper == 111);
179
180 assert_se(parse_range("123-123", &lower, &upper) == 0);
181 assert_se(lower == 123);
182 assert_se(upper == 123);
183
184 assert_se(parse_range("0", &lower, &upper) == 0);
185 assert_se(lower == 0);
186 assert_se(upper == 0);
187
188 assert_se(parse_range("0-15", &lower, &upper) == 0);
189 assert_se(lower == 0);
190 assert_se(upper == 15);
191
192 assert_se(parse_range("15-0", &lower, &upper) == 0);
193 assert_se(lower == 15);
194 assert_se(upper == 0);
195
196 assert_se(parse_range("128-65535", &lower, &upper) == 0);
197 assert_se(lower == 128);
198 assert_se(upper == 65535);
199
200 assert_se(parse_range("1024-4294967295", &lower, &upper) == 0);
201 assert_se(lower == 1024);
202 assert_se(upper == 4294967295);
203
204 /* Leading whitespace is acceptable */
205 assert_se(parse_range(" 111", &lower, &upper) == 0);
206 assert_se(lower == 111);
207 assert_se(upper == 111);
208
209 assert_se(parse_range(" 111-123", &lower, &upper) == 0);
210 assert_se(lower == 111);
211 assert_se(upper == 123);
212
213 assert_se(parse_range("111- 123", &lower, &upper) == 0);
214 assert_se(lower == 111);
215 assert_se(upper == 123);
216
217 assert_se(parse_range("\t111-\t123", &lower, &upper) == 0);
218 assert_se(lower == 111);
219 assert_se(upper == 123);
220
221 assert_se(parse_range(" \t 111- \t 123", &lower, &upper) == 0);
222 assert_se(lower == 111);
223 assert_se(upper == 123);
224
225 /* Error cases, make sure they fail as expected */
226 lower = upper = 9999;
227 assert_se(parse_range("111garbage", &lower, &upper) == -EINVAL);
228 assert_se(lower == 9999);
229 assert_se(upper == 9999);
230
231 assert_se(parse_range("garbage111", &lower, &upper) == -EINVAL);
232 assert_se(lower == 9999);
233 assert_se(upper == 9999);
234
235 assert_se(parse_range("garbage", &lower, &upper) == -EINVAL);
236 assert_se(lower == 9999);
237 assert_se(upper == 9999);
238
239 assert_se(parse_range("111-123garbage", &lower, &upper) == -EINVAL);
240 assert_se(lower == 9999);
241 assert_se(upper == 9999);
242
243 assert_se(parse_range("111garbage-123", &lower, &upper) == -EINVAL);
244 assert_se(lower == 9999);
245 assert_se(upper == 9999);
246
247 /* Empty string */
248 lower = upper = 9999;
249 assert_se(parse_range("", &lower, &upper) == -EINVAL);
250 assert_se(lower == 9999);
251 assert_se(upper == 9999);
252
253 /* 111--123 will pass -123 to safe_atou which returns -ERANGE for negative */
254 assert_se(parse_range("111--123", &lower, &upper) == -ERANGE);
255 assert_se(lower == 9999);
256 assert_se(upper == 9999);
257
258 assert_se(parse_range("-123", &lower, &upper) == -EINVAL);
259 assert_se(lower == 9999);
260 assert_se(upper == 9999);
261
262 assert_se(parse_range("-111-123", &lower, &upper) == -EINVAL);
263 assert_se(lower == 9999);
264 assert_se(upper == 9999);
265
266 assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
267 assert_se(lower == 9999);
268 assert_se(upper == 9999);
269
270 assert_se(parse_range("111.4-123", &lower, &upper) == -EINVAL);
271 assert_se(lower == 9999);
272 assert_se(upper == 9999);
273
274 assert_se(parse_range("111-123.4", &lower, &upper) == -EINVAL);
275 assert_se(lower == 9999);
276 assert_se(upper == 9999);
277
278 assert_se(parse_range("111,4-123", &lower, &upper) == -EINVAL);
279 assert_se(lower == 9999);
280 assert_se(upper == 9999);
281
282 assert_se(parse_range("111-123,4", &lower, &upper) == -EINVAL);
283 assert_se(lower == 9999);
284 assert_se(upper == 9999);
285
286 /* Error on trailing dash */
287 assert_se(parse_range("111-", &lower, &upper) == -EINVAL);
288 assert_se(lower == 9999);
289 assert_se(upper == 9999);
290
291 assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
292 assert_se(lower == 9999);
293 assert_se(upper == 9999);
294
295 assert_se(parse_range("111--", &lower, &upper) == -EINVAL);
296 assert_se(lower == 9999);
297 assert_se(upper == 9999);
298
299 assert_se(parse_range("111- ", &lower, &upper) == -EINVAL);
300 assert_se(lower == 9999);
301 assert_se(upper == 9999);
302
303 /* Whitespace is not a separator */
304 assert_se(parse_range("111 123", &lower, &upper) == -EINVAL);
305 assert_se(lower == 9999);
306 assert_se(upper == 9999);
307
308 assert_se(parse_range("111\t123", &lower, &upper) == -EINVAL);
309 assert_se(lower == 9999);
310 assert_se(upper == 9999);
311
312 assert_se(parse_range("111 \t 123", &lower, &upper) == -EINVAL);
313 assert_se(lower == 9999);
314 assert_se(upper == 9999);
315
316 /* Trailing whitespace is invalid (from safe_atou) */
317 assert_se(parse_range("111 ", &lower, &upper) == -EINVAL);
318 assert_se(lower == 9999);
319 assert_se(upper == 9999);
320
321 assert_se(parse_range("111-123 ", &lower, &upper) == -EINVAL);
322 assert_se(lower == 9999);
323 assert_se(upper == 9999);
324
325 assert_se(parse_range("111 -123", &lower, &upper) == -EINVAL);
326 assert_se(lower == 9999);
327 assert_se(upper == 9999);
328
329 assert_se(parse_range("111 -123 ", &lower, &upper) == -EINVAL);
330 assert_se(lower == 9999);
331 assert_se(upper == 9999);
332
333 assert_se(parse_range("111\t-123\t", &lower, &upper) == -EINVAL);
334 assert_se(lower == 9999);
335 assert_se(upper == 9999);
336
337 assert_se(parse_range("111 \t -123 \t ", &lower, &upper) == -EINVAL);
338 assert_se(lower == 9999);
339 assert_se(upper == 9999);
340
341 /* Out of the "unsigned" range, this is 1<<64 */
342 assert_se(parse_range("0-18446744073709551616", &lower, &upper) == -ERANGE);
343 assert_se(lower == 9999);
344 assert_se(upper == 9999);
345 }
346
347 static void test_safe_atolli(void) {
348 int r;
349 long long l;
350
351 r = safe_atolli("12345", &l);
352 assert_se(r == 0);
353 assert_se(l == 12345);
354
355 r = safe_atolli(" 12345", &l);
356 assert_se(r == 0);
357 assert_se(l == 12345);
358
359 r = safe_atolli("-12345", &l);
360 assert_se(r == 0);
361 assert_se(l == -12345);
362
363 r = safe_atolli(" -12345", &l);
364 assert_se(r == 0);
365 assert_se(l == -12345);
366
367 r = safe_atolli("12345678901234567890", &l);
368 assert_se(r == -ERANGE);
369
370 r = safe_atolli("-12345678901234567890", &l);
371 assert_se(r == -ERANGE);
372
373 r = safe_atolli("junk", &l);
374 assert_se(r == -EINVAL);
375
376 r = safe_atolli("123x", &l);
377 assert_se(r == -EINVAL);
378
379 r = safe_atolli("12.3", &l);
380 assert_se(r == -EINVAL);
381
382 r = safe_atolli("", &l);
383 assert_se(r == -EINVAL);
384 }
385
386 static void test_safe_atou16(void) {
387 int r;
388 uint16_t l;
389
390 r = safe_atou16("12345", &l);
391 assert_se(r == 0);
392 assert_se(l == 12345);
393
394 r = safe_atou16(" 12345", &l);
395 assert_se(r == 0);
396 assert_se(l == 12345);
397
398 r = safe_atou16("123456", &l);
399 assert_se(r == -ERANGE);
400
401 r = safe_atou16("-1", &l);
402 assert_se(r == -ERANGE);
403
404 r = safe_atou16(" -1", &l);
405 assert_se(r == -ERANGE);
406
407 r = safe_atou16("junk", &l);
408 assert_se(r == -EINVAL);
409
410 r = safe_atou16("123x", &l);
411 assert_se(r == -EINVAL);
412
413 r = safe_atou16("12.3", &l);
414 assert_se(r == -EINVAL);
415
416 r = safe_atou16("", &l);
417 assert_se(r == -EINVAL);
418 }
419
420 static void test_safe_atoi16(void) {
421 int r;
422 int16_t l;
423
424 r = safe_atoi16("-12345", &l);
425 assert_se(r == 0);
426 assert_se(l == -12345);
427
428 r = safe_atoi16(" -12345", &l);
429 assert_se(r == 0);
430 assert_se(l == -12345);
431
432 r = safe_atoi16("32767", &l);
433 assert_se(r == 0);
434 assert_se(l == 32767);
435
436 r = safe_atoi16(" 32767", &l);
437 assert_se(r == 0);
438 assert_se(l == 32767);
439
440 r = safe_atoi16("36536", &l);
441 assert_se(r == -ERANGE);
442
443 r = safe_atoi16("-32769", &l);
444 assert_se(r == -ERANGE);
445
446 r = safe_atoi16("junk", &l);
447 assert_se(r == -EINVAL);
448
449 r = safe_atoi16("123x", &l);
450 assert_se(r == -EINVAL);
451
452 r = safe_atoi16("12.3", &l);
453 assert_se(r == -EINVAL);
454
455 r = safe_atoi16("", &l);
456 assert_se(r == -EINVAL);
457 }
458
459 static void test_safe_atoux16(void) {
460 int r;
461 uint16_t l;
462
463 r = safe_atoux16("1234", &l);
464 assert_se(r == 0);
465 assert_se(l == 0x1234);
466
467 r = safe_atoux16("abcd", &l);
468 assert_se(r == 0);
469 assert_se(l == 0xabcd);
470
471 r = safe_atoux16(" 1234", &l);
472 assert_se(r == 0);
473 assert_se(l == 0x1234);
474
475 r = safe_atoux16("12345", &l);
476 assert_se(r == -ERANGE);
477
478 r = safe_atoux16("-1", &l);
479 assert_se(r == -ERANGE);
480
481 r = safe_atoux16(" -1", &l);
482 assert_se(r == -ERANGE);
483
484 r = safe_atoux16("junk", &l);
485 assert_se(r == -EINVAL);
486
487 r = safe_atoux16("123x", &l);
488 assert_se(r == -EINVAL);
489
490 r = safe_atoux16("12.3", &l);
491 assert_se(r == -EINVAL);
492
493 r = safe_atoux16("", &l);
494 assert_se(r == -EINVAL);
495 }
496
497 static void test_safe_atou64(void) {
498 int r;
499 uint64_t l;
500
501 r = safe_atou64("12345", &l);
502 assert_se(r == 0);
503 assert_se(l == 12345);
504
505 r = safe_atou64(" 12345", &l);
506 assert_se(r == 0);
507 assert_se(l == 12345);
508
509 r = safe_atou64("18446744073709551617", &l);
510 assert_se(r == -ERANGE);
511
512 r = safe_atou64("-1", &l);
513 assert_se(r == -ERANGE);
514
515 r = safe_atou64(" -1", &l);
516 assert_se(r == -ERANGE);
517
518 r = safe_atou64("junk", &l);
519 assert_se(r == -EINVAL);
520
521 r = safe_atou64("123x", &l);
522 assert_se(r == -EINVAL);
523
524 r = safe_atou64("12.3", &l);
525 assert_se(r == -EINVAL);
526
527 r = safe_atou64("", &l);
528 assert_se(r == -EINVAL);
529 }
530
531 static void test_safe_atoi64(void) {
532 int r;
533 int64_t l;
534
535 r = safe_atoi64("-12345", &l);
536 assert_se(r == 0);
537 assert_se(l == -12345);
538
539 r = safe_atoi64(" -12345", &l);
540 assert_se(r == 0);
541 assert_se(l == -12345);
542
543 r = safe_atoi64("32767", &l);
544 assert_se(r == 0);
545 assert_se(l == 32767);
546
547 r = safe_atoi64(" 32767", &l);
548 assert_se(r == 0);
549 assert_se(l == 32767);
550
551 r = safe_atoi64("9223372036854775813", &l);
552 assert_se(r == -ERANGE);
553
554 r = safe_atoi64("-9223372036854775813", &l);
555 assert_se(r == -ERANGE);
556
557 r = safe_atoi64("junk", &l);
558 assert_se(r == -EINVAL);
559
560 r = safe_atoi64("123x", &l);
561 assert_se(r == -EINVAL);
562
563 r = safe_atoi64("12.3", &l);
564 assert_se(r == -EINVAL);
565
566 r = safe_atoi64("", &l);
567 assert_se(r == -EINVAL);
568 }
569
570 static void test_safe_atod(void) {
571 int r;
572 double d;
573 char *e;
574
575 r = safe_atod("junk", &d);
576 assert_se(r == -EINVAL);
577
578 r = safe_atod("0.2244", &d);
579 assert_se(r == 0);
580 assert_se(fabs(d - 0.2244) < 0.000001);
581
582 r = safe_atod("0,5", &d);
583 assert_se(r == -EINVAL);
584
585 errno = 0;
586 strtod("0,5", &e);
587 assert_se(*e == ',');
588
589 r = safe_atod("", &d);
590 assert_se(r == -EINVAL);
591
592 /* Check if this really is locale independent */
593 if (setlocale(LC_NUMERIC, "de_DE.utf8")) {
594
595 r = safe_atod("0.2244", &d);
596 assert_se(r == 0);
597 assert_se(fabs(d - 0.2244) < 0.000001);
598
599 r = safe_atod("0,5", &d);
600 assert_se(r == -EINVAL);
601
602 errno = 0;
603 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
604
605 r = safe_atod("", &d);
606 assert_se(r == -EINVAL);
607 }
608
609 /* And check again, reset */
610 assert_se(setlocale(LC_NUMERIC, "C"));
611
612 r = safe_atod("0.2244", &d);
613 assert_se(r == 0);
614 assert_se(fabs(d - 0.2244) < 0.000001);
615
616 r = safe_atod("0,5", &d);
617 assert_se(r == -EINVAL);
618
619 errno = 0;
620 strtod("0,5", &e);
621 assert_se(*e == ',');
622
623 r = safe_atod("", &d);
624 assert_se(r == -EINVAL);
625 }
626
627 static void test_parse_percent(void) {
628 assert_se(parse_percent("") == -EINVAL);
629 assert_se(parse_percent("foo") == -EINVAL);
630 assert_se(parse_percent("0") == -EINVAL);
631 assert_se(parse_percent("50") == -EINVAL);
632 assert_se(parse_percent("100") == -EINVAL);
633 assert_se(parse_percent("-1") == -EINVAL);
634 assert_se(parse_percent("0%") == 0);
635 assert_se(parse_percent("55%") == 55);
636 assert_se(parse_percent("100%") == 100);
637 assert_se(parse_percent("-7%") == -ERANGE);
638 assert_se(parse_percent("107%") == -ERANGE);
639 assert_se(parse_percent("%") == -EINVAL);
640 assert_se(parse_percent("%%") == -EINVAL);
641 assert_se(parse_percent("%1") == -EINVAL);
642 assert_se(parse_percent("1%%") == -EINVAL);
643 assert_se(parse_percent("3.2%") == -EINVAL);
644 }
645
646 static void test_parse_percent_unbounded(void) {
647 assert_se(parse_percent_unbounded("101%") == 101);
648 assert_se(parse_percent_unbounded("400%") == 400);
649 }
650
651 static void test_parse_nice(void) {
652 int n;
653
654 assert_se(parse_nice("0", &n) >= 0 && n == 0);
655 assert_se(parse_nice("+0", &n) >= 0 && n == 0);
656 assert_se(parse_nice("-1", &n) >= 0 && n == -1);
657 assert_se(parse_nice("-2", &n) >= 0 && n == -2);
658 assert_se(parse_nice("1", &n) >= 0 && n == 1);
659 assert_se(parse_nice("2", &n) >= 0 && n == 2);
660 assert_se(parse_nice("+1", &n) >= 0 && n == 1);
661 assert_se(parse_nice("+2", &n) >= 0 && n == 2);
662 assert_se(parse_nice("-20", &n) >= 0 && n == -20);
663 assert_se(parse_nice("19", &n) >= 0 && n == 19);
664 assert_se(parse_nice("+19", &n) >= 0 && n == 19);
665
666 assert_se(parse_nice("", &n) == -EINVAL);
667 assert_se(parse_nice("-", &n) == -EINVAL);
668 assert_se(parse_nice("+", &n) == -EINVAL);
669 assert_se(parse_nice("xx", &n) == -EINVAL);
670 assert_se(parse_nice("-50", &n) == -ERANGE);
671 assert_se(parse_nice("50", &n) == -ERANGE);
672 assert_se(parse_nice("+50", &n) == -ERANGE);
673 assert_se(parse_nice("-21", &n) == -ERANGE);
674 assert_se(parse_nice("20", &n) == -ERANGE);
675 assert_se(parse_nice("+20", &n) == -ERANGE);
676 }
677
678 static void test_parse_dev(void) {
679 dev_t dev;
680
681 assert_se(parse_dev("", &dev) == -EINVAL);
682 assert_se(parse_dev("junk", &dev) == -EINVAL);
683 assert_se(parse_dev("0", &dev) == -EINVAL);
684 assert_se(parse_dev("5", &dev) == -EINVAL);
685 assert_se(parse_dev("5:", &dev) == -EINVAL);
686 assert_se(parse_dev(":5", &dev) == -EINVAL);
687 #if SIZEOF_DEV_T < 8
688 assert_se(parse_dev("4294967295:4294967295", &dev) == -EINVAL);
689 #endif
690 assert_se(parse_dev("8:11", &dev) >= 0 && major(dev) == 8 && minor(dev) == 11);
691 }
692
693 static void test_parse_errno(void) {
694 assert_se(parse_errno("EILSEQ") == EILSEQ);
695 assert_se(parse_errno("EINVAL") == EINVAL);
696 assert_se(parse_errno("0") == 0);
697 assert_se(parse_errno("1") == 1);
698 assert_se(parse_errno("4095") == 4095);
699
700 assert_se(parse_errno("-1") == -ERANGE);
701 assert_se(parse_errno("-3") == -ERANGE);
702 assert_se(parse_errno("4096") == -ERANGE);
703
704 assert_se(parse_errno("") == -EINVAL);
705 assert_se(parse_errno("12.3") == -EINVAL);
706 assert_se(parse_errno("123junk") == -EINVAL);
707 assert_se(parse_errno("junk123") == -EINVAL);
708 assert_se(parse_errno("255EILSEQ") == -EINVAL);
709 assert_se(parse_errno("EINVAL12") == -EINVAL);
710 assert_se(parse_errno("-EINVAL") == -EINVAL);
711 assert_se(parse_errno("EINVALaaa") == -EINVAL);
712 }
713
714 static void test_parse_syscall_and_errno(void) {
715 _cleanup_free_ char *n = NULL;
716 int e;
717
718 assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
719 assert_se(streq(n, "uname"));
720 assert_se(e == errno_from_name("EILSEQ") && e >= 0);
721 n = mfree(n);
722
723 assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
724 assert_se(streq(n, "uname"));
725 assert_se(e == errno_from_name("EINVAL") && e >= 0);
726 n = mfree(n);
727
728 assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
729 assert_se(streq(n, "@sync"));
730 assert_se(e == 4095);
731 n = mfree(n);
732
733 /* If errno is omitted, then e is set to -1 */
734 assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
735 assert_se(streq(n, "mount"));
736 assert_se(e == -1);
737 n = mfree(n);
738
739 /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
740 assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
741 assert_se(streq(n, "hoge"));
742 assert_se(e == 255);
743 n = mfree(n);
744
745 /* The function checks the syscall name is empty or not. */
746 assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
747 assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
748
749 /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095 */
750 assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
751 assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
752 assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
753 assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
754 assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
755 assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
756 assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
757 assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
758 assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
759 }
760
761 static void test_parse_mtu(void) {
762 uint32_t mtu = 0;
763
764 assert_se(parse_mtu(AF_UNSPEC, "1500", &mtu) >= 0 && mtu == 1500);
765 assert_se(parse_mtu(AF_UNSPEC, "1400", &mtu) >= 0 && mtu == 1400);
766 assert_se(parse_mtu(AF_UNSPEC, "65535", &mtu) >= 0 && mtu == 65535);
767 assert_se(parse_mtu(AF_UNSPEC, "65536", &mtu) >= 0 && mtu == 65536);
768 assert_se(parse_mtu(AF_UNSPEC, "4294967295", &mtu) >= 0 && mtu == 4294967295);
769 assert_se(parse_mtu(AF_UNSPEC, "500", &mtu) >= 0 && mtu == 500);
770 assert_se(parse_mtu(AF_UNSPEC, "1280", &mtu) >= 0 && mtu == 1280);
771 assert_se(parse_mtu(AF_INET6, "1280", &mtu) >= 0 && mtu == 1280);
772 assert_se(parse_mtu(AF_INET6, "1279", &mtu) == -ERANGE);
773 assert_se(parse_mtu(AF_UNSPEC, "4294967296", &mtu) == -ERANGE);
774 assert_se(parse_mtu(AF_INET6, "4294967296", &mtu) == -ERANGE);
775 assert_se(parse_mtu(AF_INET6, "68", &mtu) == -ERANGE);
776 assert_se(parse_mtu(AF_UNSPEC, "68", &mtu) >= 0 && mtu == 68);
777 assert_se(parse_mtu(AF_UNSPEC, "67", &mtu) == -ERANGE);
778 assert_se(parse_mtu(AF_UNSPEC, "0", &mtu) == -ERANGE);
779 assert_se(parse_mtu(AF_UNSPEC, "", &mtu) == -EINVAL);
780 }
781
782 int main(int argc, char *argv[]) {
783 log_parse_environment();
784 log_open();
785
786 test_parse_boolean();
787 test_parse_pid();
788 test_parse_mode();
789 test_parse_size();
790 test_parse_range();
791 test_safe_atolli();
792 test_safe_atou16();
793 test_safe_atoi16();
794 test_safe_atoux16();
795 test_safe_atou64();
796 test_safe_atoi64();
797 test_safe_atod();
798 test_parse_percent();
799 test_parse_percent_unbounded();
800 test_parse_nice();
801 test_parse_dev();
802 test_parse_errno();
803 test_parse_syscall_and_errno();
804 test_parse_mtu();
805
806 return 0;
807 }