]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-parse-util.c
license: LGPL-2.1+ -> LGPL-2.1-or-later
[thirdparty/systemd.git] / src / test / test-parse-util.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include <errno.h>
4 #include <linux/loadavg.h>
5 #include <locale.h>
6 #include <math.h>
7 #include <sys/socket.h>
8
9 #include "alloc-util.h"
10 #include "errno-list.h"
11 #include "log.h"
12 #include "parse-util.h"
13 #include "string-util.h"
14 #if HAVE_SECCOMP
15 #include "seccomp-util.h"
16 #endif
17
18 static void test_parse_boolean(void) {
19 assert_se(parse_boolean("1") == 1);
20 assert_se(parse_boolean("y") == 1);
21 assert_se(parse_boolean("Y") == 1);
22 assert_se(parse_boolean("yes") == 1);
23 assert_se(parse_boolean("YES") == 1);
24 assert_se(parse_boolean("true") == 1);
25 assert_se(parse_boolean("TRUE") == 1);
26 assert_se(parse_boolean("on") == 1);
27 assert_se(parse_boolean("ON") == 1);
28
29 assert_se(parse_boolean("0") == 0);
30 assert_se(parse_boolean("n") == 0);
31 assert_se(parse_boolean("N") == 0);
32 assert_se(parse_boolean("no") == 0);
33 assert_se(parse_boolean("NO") == 0);
34 assert_se(parse_boolean("false") == 0);
35 assert_se(parse_boolean("FALSE") == 0);
36 assert_se(parse_boolean("off") == 0);
37 assert_se(parse_boolean("OFF") == 0);
38
39 assert_se(parse_boolean("garbage") < 0);
40 assert_se(parse_boolean("") < 0);
41 assert_se(parse_boolean("full") < 0);
42 }
43
44 static void test_parse_pid(void) {
45 int r;
46 pid_t pid;
47
48 r = parse_pid("100", &pid);
49 assert_se(r == 0);
50 assert_se(pid == 100);
51
52 r = parse_pid("0x7FFFFFFF", &pid);
53 assert_se(r == 0);
54 assert_se(pid == 2147483647);
55
56 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
57 r = parse_pid("0", &pid);
58 assert_se(r == -ERANGE);
59 assert_se(pid == 65);
60
61 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
62 r = parse_pid("-100", &pid);
63 assert_se(r == -ERANGE);
64 assert_se(pid == 65);
65
66 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
67 r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
68 assert_se(r == -ERANGE);
69 assert_se(pid == 65);
70
71 r = parse_pid("junk", &pid);
72 assert_se(r == -EINVAL);
73
74 r = parse_pid("", &pid);
75 assert_se(r == -EINVAL);
76 }
77
78 static void test_parse_mode(void) {
79 mode_t m;
80
81 assert_se(parse_mode("-1", &m) < 0);
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("0544", &m) >= 0 && m == 0544);
89 assert_se(parse_mode("00544", &m) >= 0 && m == 0544);
90 assert_se(parse_mode("777", &m) >= 0 && m == 0777);
91 assert_se(parse_mode("0777", &m) >= 0 && m == 0777);
92 assert_se(parse_mode("00777", &m) >= 0 && m == 0777);
93 assert_se(parse_mode("7777", &m) >= 0 && m == 07777);
94 assert_se(parse_mode("07777", &m) >= 0 && m == 07777);
95 assert_se(parse_mode("007777", &m) >= 0 && m == 07777);
96 assert_se(parse_mode("0", &m) >= 0 && m == 0);
97 assert_se(parse_mode(" 1", &m) >= 0 && m == 1);
98 }
99
100 static void test_parse_size(void) {
101 uint64_t bytes;
102
103 assert_se(parse_size("", 1024, &bytes) == -EINVAL);
104
105 assert_se(parse_size("111", 1024, &bytes) == 0);
106 assert_se(bytes == 111);
107
108 assert_se(parse_size("111.4", 1024, &bytes) == 0);
109 assert_se(bytes == 111);
110
111 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
112 assert_se(bytes == 112);
113
114 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
115 assert_se(bytes == 112);
116
117 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
118 assert_se(bytes == 3*1024 + 512);
119
120 assert_se(parse_size("3. K", 1024, &bytes) == 0);
121 assert_se(bytes == 3*1024);
122
123 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
124 assert_se(bytes == 3*1024);
125
126 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
127
128 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
129 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
130
131 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
132
133 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
134 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
135
136 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
137 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
138
139 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
140
141 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
142 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
143
144 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
145 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
146
147 assert_se(parse_size("12P", 1024, &bytes) == 0);
148 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
149
150 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
151
152 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
153 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
154
155 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
156
157 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
158
159 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
160
161 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
162 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
163 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
164
165 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
166
167 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
168 }
169
170 static void test_parse_range(void) {
171 unsigned lower, upper;
172
173 /* Successful cases */
174 assert_se(parse_range("111", &lower, &upper) == 0);
175 assert_se(lower == 111);
176 assert_se(upper == 111);
177
178 assert_se(parse_range("111-123", &lower, &upper) == 0);
179 assert_se(lower == 111);
180 assert_se(upper == 123);
181
182 assert_se(parse_range("123-111", &lower, &upper) == 0);
183 assert_se(lower == 123);
184 assert_se(upper == 111);
185
186 assert_se(parse_range("123-123", &lower, &upper) == 0);
187 assert_se(lower == 123);
188 assert_se(upper == 123);
189
190 assert_se(parse_range("0", &lower, &upper) == 0);
191 assert_se(lower == 0);
192 assert_se(upper == 0);
193
194 assert_se(parse_range("0-15", &lower, &upper) == 0);
195 assert_se(lower == 0);
196 assert_se(upper == 15);
197
198 assert_se(parse_range("15-0", &lower, &upper) == 0);
199 assert_se(lower == 15);
200 assert_se(upper == 0);
201
202 assert_se(parse_range("128-65535", &lower, &upper) == 0);
203 assert_se(lower == 128);
204 assert_se(upper == 65535);
205
206 assert_se(parse_range("1024-4294967295", &lower, &upper) == 0);
207 assert_se(lower == 1024);
208 assert_se(upper == 4294967295);
209
210 /* Leading whitespace is acceptable */
211 assert_se(parse_range(" 111", &lower, &upper) == 0);
212 assert_se(lower == 111);
213 assert_se(upper == 111);
214
215 assert_se(parse_range(" 111-123", &lower, &upper) == 0);
216 assert_se(lower == 111);
217 assert_se(upper == 123);
218
219 assert_se(parse_range("111- 123", &lower, &upper) == 0);
220 assert_se(lower == 111);
221 assert_se(upper == 123);
222
223 assert_se(parse_range("\t111-\t123", &lower, &upper) == 0);
224 assert_se(lower == 111);
225 assert_se(upper == 123);
226
227 assert_se(parse_range(" \t 111- \t 123", &lower, &upper) == 0);
228 assert_se(lower == 111);
229 assert_se(upper == 123);
230
231 /* Error cases, make sure they fail as expected */
232 lower = upper = 9999;
233 assert_se(parse_range("111garbage", &lower, &upper) == -EINVAL);
234 assert_se(lower == 9999);
235 assert_se(upper == 9999);
236
237 assert_se(parse_range("garbage111", &lower, &upper) == -EINVAL);
238 assert_se(lower == 9999);
239 assert_se(upper == 9999);
240
241 assert_se(parse_range("garbage", &lower, &upper) == -EINVAL);
242 assert_se(lower == 9999);
243 assert_se(upper == 9999);
244
245 assert_se(parse_range("111-123garbage", &lower, &upper) == -EINVAL);
246 assert_se(lower == 9999);
247 assert_se(upper == 9999);
248
249 assert_se(parse_range("111garbage-123", &lower, &upper) == -EINVAL);
250 assert_se(lower == 9999);
251 assert_se(upper == 9999);
252
253 /* Empty string */
254 lower = upper = 9999;
255 assert_se(parse_range("", &lower, &upper) == -EINVAL);
256 assert_se(lower == 9999);
257 assert_se(upper == 9999);
258
259 /* 111--123 will pass -123 to safe_atou which returns -ERANGE for negative */
260 assert_se(parse_range("111--123", &lower, &upper) == -ERANGE);
261 assert_se(lower == 9999);
262 assert_se(upper == 9999);
263
264 assert_se(parse_range("-123", &lower, &upper) == -EINVAL);
265 assert_se(lower == 9999);
266 assert_se(upper == 9999);
267
268 assert_se(parse_range("-111-123", &lower, &upper) == -EINVAL);
269 assert_se(lower == 9999);
270 assert_se(upper == 9999);
271
272 assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
273 assert_se(lower == 9999);
274 assert_se(upper == 9999);
275
276 assert_se(parse_range("111.4-123", &lower, &upper) == -EINVAL);
277 assert_se(lower == 9999);
278 assert_se(upper == 9999);
279
280 assert_se(parse_range("111-123.4", &lower, &upper) == -EINVAL);
281 assert_se(lower == 9999);
282 assert_se(upper == 9999);
283
284 assert_se(parse_range("111,4-123", &lower, &upper) == -EINVAL);
285 assert_se(lower == 9999);
286 assert_se(upper == 9999);
287
288 assert_se(parse_range("111-123,4", &lower, &upper) == -EINVAL);
289 assert_se(lower == 9999);
290 assert_se(upper == 9999);
291
292 /* Error on trailing dash */
293 assert_se(parse_range("111-", &lower, &upper) == -EINVAL);
294 assert_se(lower == 9999);
295 assert_se(upper == 9999);
296
297 assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
298 assert_se(lower == 9999);
299 assert_se(upper == 9999);
300
301 assert_se(parse_range("111--", &lower, &upper) == -EINVAL);
302 assert_se(lower == 9999);
303 assert_se(upper == 9999);
304
305 assert_se(parse_range("111- ", &lower, &upper) == -EINVAL);
306 assert_se(lower == 9999);
307 assert_se(upper == 9999);
308
309 /* Whitespace is not a separator */
310 assert_se(parse_range("111 123", &lower, &upper) == -EINVAL);
311 assert_se(lower == 9999);
312 assert_se(upper == 9999);
313
314 assert_se(parse_range("111\t123", &lower, &upper) == -EINVAL);
315 assert_se(lower == 9999);
316 assert_se(upper == 9999);
317
318 assert_se(parse_range("111 \t 123", &lower, &upper) == -EINVAL);
319 assert_se(lower == 9999);
320 assert_se(upper == 9999);
321
322 /* Trailing whitespace is invalid (from safe_atou) */
323 assert_se(parse_range("111 ", &lower, &upper) == -EINVAL);
324 assert_se(lower == 9999);
325 assert_se(upper == 9999);
326
327 assert_se(parse_range("111-123 ", &lower, &upper) == -EINVAL);
328 assert_se(lower == 9999);
329 assert_se(upper == 9999);
330
331 assert_se(parse_range("111 -123", &lower, &upper) == -EINVAL);
332 assert_se(lower == 9999);
333 assert_se(upper == 9999);
334
335 assert_se(parse_range("111 -123 ", &lower, &upper) == -EINVAL);
336 assert_se(lower == 9999);
337 assert_se(upper == 9999);
338
339 assert_se(parse_range("111\t-123\t", &lower, &upper) == -EINVAL);
340 assert_se(lower == 9999);
341 assert_se(upper == 9999);
342
343 assert_se(parse_range("111 \t -123 \t ", &lower, &upper) == -EINVAL);
344 assert_se(lower == 9999);
345 assert_se(upper == 9999);
346
347 /* Out of the "unsigned" range, this is 1<<64 */
348 assert_se(parse_range("0-18446744073709551616", &lower, &upper) == -ERANGE);
349 assert_se(lower == 9999);
350 assert_se(upper == 9999);
351 }
352
353 static void test_safe_atolli(void) {
354 int r;
355 long long l;
356
357 r = safe_atolli("12345", &l);
358 assert_se(r == 0);
359 assert_se(l == 12345);
360
361 r = safe_atolli(" 12345", &l);
362 assert_se(r == 0);
363 assert_se(l == 12345);
364
365 r = safe_atolli("-12345", &l);
366 assert_se(r == 0);
367 assert_se(l == -12345);
368
369 r = safe_atolli(" -12345", &l);
370 assert_se(r == 0);
371 assert_se(l == -12345);
372
373 r = safe_atolli("0x5", &l);
374 assert_se(r == 0);
375 assert_se(l == 5);
376
377 r = safe_atolli("0o6", &l);
378 assert_se(r == 0);
379 assert_se(l == 6);
380
381 r = safe_atolli("0B101", &l);
382 assert_se(r == 0);
383 assert_se(l == 5);
384
385 r = safe_atolli("12345678901234567890", &l);
386 assert_se(r == -ERANGE);
387
388 r = safe_atolli("-12345678901234567890", &l);
389 assert_se(r == -ERANGE);
390
391 r = safe_atolli("junk", &l);
392 assert_se(r == -EINVAL);
393
394 r = safe_atolli("123x", &l);
395 assert_se(r == -EINVAL);
396
397 r = safe_atolli("12.3", &l);
398 assert_se(r == -EINVAL);
399
400 r = safe_atolli("", &l);
401 assert_se(r == -EINVAL);
402 }
403
404 static void test_safe_atou16(void) {
405 int r;
406 uint16_t l;
407
408 r = safe_atou16("12345", &l);
409 assert_se(r == 0);
410 assert_se(l == 12345);
411
412 r = safe_atou16(" 12345", &l);
413 assert_se(r == 0);
414 assert_se(l == 12345);
415
416 r = safe_atou16("123456", &l);
417 assert_se(r == -ERANGE);
418
419 r = safe_atou16("-1", &l);
420 assert_se(r == -ERANGE);
421
422 r = safe_atou16(" -1", &l);
423 assert_se(r == -ERANGE);
424
425 r = safe_atou16("junk", &l);
426 assert_se(r == -EINVAL);
427
428 r = safe_atou16("123x", &l);
429 assert_se(r == -EINVAL);
430
431 r = safe_atou16("12.3", &l);
432 assert_se(r == -EINVAL);
433
434 r = safe_atou16("", &l);
435 assert_se(r == -EINVAL);
436 }
437
438 static void test_safe_atoi16(void) {
439 int r;
440 int16_t l;
441
442 r = safe_atoi16("-12345", &l);
443 assert_se(r == 0);
444 assert_se(l == -12345);
445
446 r = safe_atoi16(" -12345", &l);
447 assert_se(r == 0);
448 assert_se(l == -12345);
449
450 r = safe_atoi16("32767", &l);
451 assert_se(r == 0);
452 assert_se(l == 32767);
453
454 r = safe_atoi16(" 32767", &l);
455 assert_se(r == 0);
456 assert_se(l == 32767);
457
458 r = safe_atoi16("0o11", &l);
459 assert_se(r == 0);
460 assert_se(l == 9);
461
462 r = safe_atoi16("0B110", &l);
463 assert_se(r == 0);
464 assert_se(l == 6);
465
466 r = safe_atoi16("36536", &l);
467 assert_se(r == -ERANGE);
468
469 r = safe_atoi16("-32769", &l);
470 assert_se(r == -ERANGE);
471
472 r = safe_atoi16("junk", &l);
473 assert_se(r == -EINVAL);
474
475 r = safe_atoi16("123x", &l);
476 assert_se(r == -EINVAL);
477
478 r = safe_atoi16("12.3", &l);
479 assert_se(r == -EINVAL);
480
481 r = safe_atoi16("", &l);
482 assert_se(r == -EINVAL);
483 }
484
485 static void test_safe_atoux16(void) {
486 int r;
487 uint16_t l;
488
489 r = safe_atoux16("1234", &l);
490 assert_se(r == 0);
491 assert_se(l == 0x1234);
492
493 r = safe_atoux16("abcd", &l);
494 assert_se(r == 0);
495 assert_se(l == 0xabcd);
496
497 r = safe_atoux16(" 1234", &l);
498 assert_se(r == 0);
499 assert_se(l == 0x1234);
500
501 r = safe_atoux16("12345", &l);
502 assert_se(r == -ERANGE);
503
504 r = safe_atoux16("-1", &l);
505 assert_se(r == -ERANGE);
506
507 r = safe_atoux16(" -1", &l);
508 assert_se(r == -ERANGE);
509
510 r = safe_atoux16("0b1", &l);
511 assert_se(r == 0);
512 assert_se(l == 177);
513
514 r = safe_atoux16("0o70", &l);
515 assert_se(r == -EINVAL);
516
517 r = safe_atoux16("junk", &l);
518 assert_se(r == -EINVAL);
519
520 r = safe_atoux16("123x", &l);
521 assert_se(r == -EINVAL);
522
523 r = safe_atoux16("12.3", &l);
524 assert_se(r == -EINVAL);
525
526 r = safe_atoux16("", &l);
527 assert_se(r == -EINVAL);
528 }
529
530 static void test_safe_atou64(void) {
531 int r;
532 uint64_t l;
533
534 r = safe_atou64("12345", &l);
535 assert_se(r == 0);
536 assert_se(l == 12345);
537
538 r = safe_atou64(" 12345", &l);
539 assert_se(r == 0);
540 assert_se(l == 12345);
541
542 r = safe_atou64("0o11", &l);
543 assert_se(r == 0);
544 assert_se(l == 9);
545
546 r = safe_atou64("0b11", &l);
547 assert_se(r == 0);
548 assert_se(l == 3);
549
550 r = safe_atou64("18446744073709551617", &l);
551 assert_se(r == -ERANGE);
552
553 r = safe_atou64("-1", &l);
554 assert_se(r == -ERANGE);
555
556 r = safe_atou64(" -1", &l);
557 assert_se(r == -ERANGE);
558
559 r = safe_atou64("junk", &l);
560 assert_se(r == -EINVAL);
561
562 r = safe_atou64("123x", &l);
563 assert_se(r == -EINVAL);
564
565 r = safe_atou64("12.3", &l);
566 assert_se(r == -EINVAL);
567
568 r = safe_atou64("", &l);
569 assert_se(r == -EINVAL);
570 }
571
572 static void test_safe_atoi64(void) {
573 int r;
574 int64_t l;
575
576 r = safe_atoi64("-12345", &l);
577 assert_se(r == 0);
578 assert_se(l == -12345);
579
580 r = safe_atoi64(" -12345", &l);
581 assert_se(r == 0);
582 assert_se(l == -12345);
583
584 r = safe_atoi64("32767", &l);
585 assert_se(r == 0);
586 assert_se(l == 32767);
587
588 r = safe_atoi64(" 32767", &l);
589 assert_se(r == 0);
590 assert_se(l == 32767);
591
592 r = safe_atoi64(" 0o20", &l);
593 assert_se(r == 0);
594 assert_se(l == 16);
595
596 r = safe_atoi64(" 0b01010", &l);
597 assert_se(r == 0);
598 assert_se(l == 10);
599
600 r = safe_atoi64("9223372036854775813", &l);
601 assert_se(r == -ERANGE);
602
603 r = safe_atoi64("-9223372036854775813", &l);
604 assert_se(r == -ERANGE);
605
606 r = safe_atoi64("junk", &l);
607 assert_se(r == -EINVAL);
608
609 r = safe_atoi64("123x", &l);
610 assert_se(r == -EINVAL);
611
612 r = safe_atoi64("12.3", &l);
613 assert_se(r == -EINVAL);
614
615 r = safe_atoi64("", &l);
616 assert_se(r == -EINVAL);
617 }
618
619 static void test_safe_atoux64(void) {
620 int r;
621 uint64_t l;
622
623 r = safe_atoux64("12345", &l);
624 assert_se(r == 0);
625 assert_se(l == 0x12345);
626
627 r = safe_atoux64(" 12345", &l);
628 assert_se(r == 0);
629 assert_se(l == 0x12345);
630
631 r = safe_atoux64("0x12345", &l);
632 assert_se(r == 0);
633 assert_se(l == 0x12345);
634
635 r = safe_atoux64("0b11011", &l);
636 assert_se(r == 0);
637 assert_se(l == 11603985);
638
639 r = safe_atoux64("0o11011", &l);
640 assert_se(r == -EINVAL);
641
642 r = safe_atoux64("18446744073709551617", &l);
643 assert_se(r == -ERANGE);
644
645 r = safe_atoux64("-1", &l);
646 assert_se(r == -ERANGE);
647
648 r = safe_atoux64(" -1", &l);
649 assert_se(r == -ERANGE);
650
651 r = safe_atoux64("junk", &l);
652 assert_se(r == -EINVAL);
653
654 r = safe_atoux64("123x", &l);
655 assert_se(r == -EINVAL);
656
657 r = safe_atoux64("12.3", &l);
658 assert_se(r == -EINVAL);
659
660 r = safe_atoux64("", &l);
661 assert_se(r == -EINVAL);
662 }
663
664 static void test_safe_atod(void) {
665 int r;
666 double d;
667 char *e;
668
669 r = safe_atod("junk", &d);
670 assert_se(r == -EINVAL);
671
672 r = safe_atod("0.2244", &d);
673 assert_se(r == 0);
674 assert_se(fabs(d - 0.2244) < 0.000001);
675
676 r = safe_atod("0,5", &d);
677 assert_se(r == -EINVAL);
678
679 errno = 0;
680 strtod("0,5", &e);
681 assert_se(*e == ',');
682
683 r = safe_atod("", &d);
684 assert_se(r == -EINVAL);
685
686 /* Check if this really is locale independent */
687 if (setlocale(LC_NUMERIC, "de_DE.utf8")) {
688
689 r = safe_atod("0.2244", &d);
690 assert_se(r == 0);
691 assert_se(fabs(d - 0.2244) < 0.000001);
692
693 r = safe_atod("0,5", &d);
694 assert_se(r == -EINVAL);
695
696 errno = 0;
697 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
698
699 r = safe_atod("", &d);
700 assert_se(r == -EINVAL);
701 }
702
703 /* And check again, reset */
704 assert_se(setlocale(LC_NUMERIC, "C"));
705
706 r = safe_atod("0.2244", &d);
707 assert_se(r == 0);
708 assert_se(fabs(d - 0.2244) < 0.000001);
709
710 r = safe_atod("0,5", &d);
711 assert_se(r == -EINVAL);
712
713 errno = 0;
714 strtod("0,5", &e);
715 assert_se(*e == ',');
716
717 r = safe_atod("", &d);
718 assert_se(r == -EINVAL);
719 }
720
721 static void test_parse_percent(void) {
722 assert_se(parse_percent("") == -EINVAL);
723 assert_se(parse_percent("foo") == -EINVAL);
724 assert_se(parse_percent("0") == -EINVAL);
725 assert_se(parse_percent("50") == -EINVAL);
726 assert_se(parse_percent("100") == -EINVAL);
727 assert_se(parse_percent("-1") == -EINVAL);
728 assert_se(parse_percent("0%") == 0);
729 assert_se(parse_percent("55%") == 55);
730 assert_se(parse_percent("100%") == 100);
731 assert_se(parse_percent("-7%") == -ERANGE);
732 assert_se(parse_percent("107%") == -ERANGE);
733 assert_se(parse_percent("%") == -EINVAL);
734 assert_se(parse_percent("%%") == -EINVAL);
735 assert_se(parse_percent("%1") == -EINVAL);
736 assert_se(parse_percent("1%%") == -EINVAL);
737 assert_se(parse_percent("3.2%") == -EINVAL);
738 }
739
740 static void test_parse_percent_unbounded(void) {
741 assert_se(parse_percent_unbounded("101%") == 101);
742 assert_se(parse_percent_unbounded("400%") == 400);
743 }
744
745 static void test_parse_permille(void) {
746 assert_se(parse_permille("") == -EINVAL);
747 assert_se(parse_permille("foo") == -EINVAL);
748 assert_se(parse_permille("0") == -EINVAL);
749 assert_se(parse_permille("50") == -EINVAL);
750 assert_se(parse_permille("100") == -EINVAL);
751 assert_se(parse_permille("-1") == -EINVAL);
752
753 assert_se(parse_permille("0‰") == 0);
754 assert_se(parse_permille("555‰") == 555);
755 assert_se(parse_permille("1000‰") == 1000);
756 assert_se(parse_permille("-7‰") == -ERANGE);
757 assert_se(parse_permille("1007‰") == -ERANGE);
758 assert_se(parse_permille("‰") == -EINVAL);
759 assert_se(parse_permille("‰‰") == -EINVAL);
760 assert_se(parse_permille("‰1") == -EINVAL);
761 assert_se(parse_permille("1‰‰") == -EINVAL);
762 assert_se(parse_permille("3.2‰") == -EINVAL);
763
764 assert_se(parse_permille("0%") == 0);
765 assert_se(parse_permille("55%") == 550);
766 assert_se(parse_permille("55.5%") == 555);
767 assert_se(parse_permille("100%") == 1000);
768 assert_se(parse_permille("-7%") == -ERANGE);
769 assert_se(parse_permille("107%") == -ERANGE);
770 assert_se(parse_permille("%") == -EINVAL);
771 assert_se(parse_permille("%%") == -EINVAL);
772 assert_se(parse_permille("%1") == -EINVAL);
773 assert_se(parse_permille("1%%") == -EINVAL);
774 assert_se(parse_permille("3.21%") == -EINVAL);
775 }
776
777 static void test_parse_permille_unbounded(void) {
778 assert_se(parse_permille_unbounded("1001‰") == 1001);
779 assert_se(parse_permille_unbounded("4000‰") == 4000);
780 assert_se(parse_permille_unbounded("2147483647‰") == 2147483647);
781 assert_se(parse_permille_unbounded("2147483648‰") == -ERANGE);
782 assert_se(parse_permille_unbounded("4294967295‰") == -ERANGE);
783 assert_se(parse_permille_unbounded("4294967296‰") == -ERANGE);
784
785 assert_se(parse_permille_unbounded("101%") == 1010);
786 assert_se(parse_permille_unbounded("400%") == 4000);
787 assert_se(parse_permille_unbounded("214748364.7%") == 2147483647);
788 assert_se(parse_permille_unbounded("214748364.8%") == -ERANGE);
789 assert_se(parse_permille_unbounded("429496729.5%") == -ERANGE);
790 assert_se(parse_permille_unbounded("429496729.6%") == -ERANGE);
791 }
792
793 static void test_parse_nice(void) {
794 int n;
795
796 assert_se(parse_nice("0", &n) >= 0 && n == 0);
797 assert_se(parse_nice("+0", &n) >= 0 && n == 0);
798 assert_se(parse_nice("-1", &n) >= 0 && n == -1);
799 assert_se(parse_nice("-2", &n) >= 0 && n == -2);
800 assert_se(parse_nice("1", &n) >= 0 && n == 1);
801 assert_se(parse_nice("2", &n) >= 0 && n == 2);
802 assert_se(parse_nice("+1", &n) >= 0 && n == 1);
803 assert_se(parse_nice("+2", &n) >= 0 && n == 2);
804 assert_se(parse_nice("-20", &n) >= 0 && n == -20);
805 assert_se(parse_nice("19", &n) >= 0 && n == 19);
806 assert_se(parse_nice("+19", &n) >= 0 && n == 19);
807
808 assert_se(parse_nice("", &n) == -EINVAL);
809 assert_se(parse_nice("-", &n) == -EINVAL);
810 assert_se(parse_nice("+", &n) == -EINVAL);
811 assert_se(parse_nice("xx", &n) == -EINVAL);
812 assert_se(parse_nice("-50", &n) == -ERANGE);
813 assert_se(parse_nice("50", &n) == -ERANGE);
814 assert_se(parse_nice("+50", &n) == -ERANGE);
815 assert_se(parse_nice("-21", &n) == -ERANGE);
816 assert_se(parse_nice("20", &n) == -ERANGE);
817 assert_se(parse_nice("+20", &n) == -ERANGE);
818 }
819
820 static void test_parse_dev(void) {
821 dev_t dev;
822
823 assert_se(parse_dev("", &dev) == -EINVAL);
824 assert_se(parse_dev("junk", &dev) == -EINVAL);
825 assert_se(parse_dev("0", &dev) == -EINVAL);
826 assert_se(parse_dev("5", &dev) == -EINVAL);
827 assert_se(parse_dev("5:", &dev) == -EINVAL);
828 assert_se(parse_dev(":5", &dev) == -EINVAL);
829 assert_se(parse_dev("-1:-1", &dev) == -EINVAL);
830 #if SIZEOF_DEV_T < 8
831 assert_se(parse_dev("4294967295:4294967295", &dev) == -EINVAL);
832 #endif
833 assert_se(parse_dev("8:11", &dev) >= 0 && major(dev) == 8 && minor(dev) == 11);
834 assert_se(parse_dev("0:0", &dev) >= 0 && major(dev) == 0 && minor(dev) == 0);
835 }
836
837 static void test_parse_errno(void) {
838 assert_se(parse_errno("EILSEQ") == EILSEQ);
839 assert_se(parse_errno("EINVAL") == EINVAL);
840 assert_se(parse_errno("0") == 0);
841 assert_se(parse_errno("1") == 1);
842 assert_se(parse_errno("4095") == 4095);
843
844 assert_se(parse_errno("-1") == -ERANGE);
845 assert_se(parse_errno("-3") == -ERANGE);
846 assert_se(parse_errno("4096") == -ERANGE);
847
848 assert_se(parse_errno("") == -EINVAL);
849 assert_se(parse_errno("12.3") == -EINVAL);
850 assert_se(parse_errno("123junk") == -EINVAL);
851 assert_se(parse_errno("junk123") == -EINVAL);
852 assert_se(parse_errno("255EILSEQ") == -EINVAL);
853 assert_se(parse_errno("EINVAL12") == -EINVAL);
854 assert_se(parse_errno("-EINVAL") == -EINVAL);
855 assert_se(parse_errno("EINVALaaa") == -EINVAL);
856 }
857
858 static void test_parse_syscall_and_errno(void) {
859 #if HAVE_SECCOMP
860 _cleanup_free_ char *n = NULL;
861 int e;
862
863 assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
864 assert_se(streq(n, "uname"));
865 assert_se(e == errno_from_name("EILSEQ") && e >= 0);
866 n = mfree(n);
867
868 assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
869 assert_se(streq(n, "uname"));
870 assert_se(e == errno_from_name("EINVAL") && e >= 0);
871 n = mfree(n);
872
873 assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
874 assert_se(streq(n, "@sync"));
875 assert_se(e == 4095);
876 n = mfree(n);
877
878 /* If errno is omitted, then e is set to -1 */
879 assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
880 assert_se(streq(n, "mount"));
881 assert_se(e == -1);
882 n = mfree(n);
883
884 /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
885 assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
886 assert_se(streq(n, "hoge"));
887 assert_se(e == 255);
888 n = mfree(n);
889
890 assert_se(parse_syscall_and_errno("hoge:kill", &n, &e) >= 0);
891 assert_se(streq(n, "hoge"));
892 assert_se(e == SECCOMP_ERROR_NUMBER_KILL);
893 n = mfree(n);
894
895 /* The function checks the syscall name is empty or not. */
896 assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
897 assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
898
899 /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095, or "kill" */
900 assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
901 assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
902 assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
903 assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
904 assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
905 assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
906 assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
907 assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
908 assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
909 #endif
910 }
911
912 static void test_parse_mtu(void) {
913 uint32_t mtu = 0;
914
915 assert_se(parse_mtu(AF_UNSPEC, "1500", &mtu) >= 0 && mtu == 1500);
916 assert_se(parse_mtu(AF_UNSPEC, "1400", &mtu) >= 0 && mtu == 1400);
917 assert_se(parse_mtu(AF_UNSPEC, "65535", &mtu) >= 0 && mtu == 65535);
918 assert_se(parse_mtu(AF_UNSPEC, "65536", &mtu) >= 0 && mtu == 65536);
919 assert_se(parse_mtu(AF_UNSPEC, "4294967295", &mtu) >= 0 && mtu == 4294967295);
920 assert_se(parse_mtu(AF_UNSPEC, "500", &mtu) >= 0 && mtu == 500);
921 assert_se(parse_mtu(AF_UNSPEC, "1280", &mtu) >= 0 && mtu == 1280);
922 assert_se(parse_mtu(AF_INET6, "1280", &mtu) >= 0 && mtu == 1280);
923 assert_se(parse_mtu(AF_INET6, "1279", &mtu) == -ERANGE);
924 assert_se(parse_mtu(AF_UNSPEC, "4294967296", &mtu) == -ERANGE);
925 assert_se(parse_mtu(AF_INET6, "4294967296", &mtu) == -ERANGE);
926 assert_se(parse_mtu(AF_INET6, "68", &mtu) == -ERANGE);
927 assert_se(parse_mtu(AF_UNSPEC, "68", &mtu) >= 0 && mtu == 68);
928 assert_se(parse_mtu(AF_UNSPEC, "67", &mtu) == -ERANGE);
929 assert_se(parse_mtu(AF_UNSPEC, "0", &mtu) == -ERANGE);
930 assert_se(parse_mtu(AF_UNSPEC, "", &mtu) == -EINVAL);
931 }
932
933 static void test_parse_loadavg_fixed_point(void) {
934 loadavg_t fp;
935
936 assert_se(parse_loadavg_fixed_point("1.23", &fp) == 0);
937 assert_se(LOAD_INT(fp) == 1);
938 assert_se(LOAD_FRAC(fp) == 23);
939
940 assert_se(parse_loadavg_fixed_point("1.80", &fp) == 0);
941 assert_se(LOAD_INT(fp) == 1);
942 assert_se(LOAD_FRAC(fp) == 80);
943
944 assert_se(parse_loadavg_fixed_point("0.07", &fp) == 0);
945 assert_se(LOAD_INT(fp) == 0);
946 assert_se(LOAD_FRAC(fp) == 7);
947
948 assert_se(parse_loadavg_fixed_point("0.00", &fp) == 0);
949 assert_se(LOAD_INT(fp) == 0);
950 assert_se(LOAD_FRAC(fp) == 0);
951
952 assert_se(parse_loadavg_fixed_point("4096.57", &fp) == 0);
953 assert_se(LOAD_INT(fp) == 4096);
954 assert_se(LOAD_FRAC(fp) == 57);
955
956 /* Caps out at 2 digit fracs */
957 assert_se(parse_loadavg_fixed_point("1.100", &fp) == -ERANGE);
958
959 assert_se(parse_loadavg_fixed_point("4096.4096", &fp) == -ERANGE);
960 assert_se(parse_loadavg_fixed_point("-4000.5", &fp) == -ERANGE);
961 assert_se(parse_loadavg_fixed_point("18446744073709551615.5", &fp) == -ERANGE);
962 assert_se(parse_loadavg_fixed_point("foobar", &fp) == -EINVAL);
963 assert_se(parse_loadavg_fixed_point("3333", &fp) == -EINVAL);
964 assert_se(parse_loadavg_fixed_point("1.2.3", &fp) == -EINVAL);
965 assert_se(parse_loadavg_fixed_point(".", &fp) == -EINVAL);
966 assert_se(parse_loadavg_fixed_point("", &fp) == -EINVAL);
967 }
968
969 int main(int argc, char *argv[]) {
970 log_parse_environment();
971 log_open();
972
973 test_parse_boolean();
974 test_parse_pid();
975 test_parse_mode();
976 test_parse_size();
977 test_parse_range();
978 test_safe_atolli();
979 test_safe_atou16();
980 test_safe_atoi16();
981 test_safe_atoux16();
982 test_safe_atou64();
983 test_safe_atoi64();
984 test_safe_atoux64();
985 test_safe_atod();
986 test_parse_percent();
987 test_parse_percent_unbounded();
988 test_parse_permille();
989 test_parse_permille_unbounded();
990 test_parse_nice();
991 test_parse_dev();
992 test_parse_errno();
993 test_parse_syscall_and_errno();
994 test_parse_mtu();
995 test_parse_loadavg_fixed_point();
996
997 return 0;
998 }