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