chiark / gitweb /
5a6af9ba82fb6693ed64af2e8f5d1533f571bda0
[elogind.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 #if 0 /// UNNEEDED by elogind
165 static void test_parse_range(void) {
166         unsigned lower, upper;
167
168         /* Successful cases */
169         assert_se(parse_range("111", &lower, &upper) == 0);
170         assert_se(lower == 111);
171         assert_se(upper == 111);
172
173         assert_se(parse_range("111-123", &lower, &upper) == 0);
174         assert_se(lower == 111);
175         assert_se(upper == 123);
176
177         assert_se(parse_range("123-111", &lower, &upper) == 0);
178         assert_se(lower == 123);
179         assert_se(upper == 111);
180
181         assert_se(parse_range("123-123", &lower, &upper) == 0);
182         assert_se(lower == 123);
183         assert_se(upper == 123);
184
185         assert_se(parse_range("0", &lower, &upper) == 0);
186         assert_se(lower == 0);
187         assert_se(upper == 0);
188
189         assert_se(parse_range("0-15", &lower, &upper) == 0);
190         assert_se(lower == 0);
191         assert_se(upper == 15);
192
193         assert_se(parse_range("15-0", &lower, &upper) == 0);
194         assert_se(lower == 15);
195         assert_se(upper == 0);
196
197         assert_se(parse_range("128-65535", &lower, &upper) == 0);
198         assert_se(lower == 128);
199         assert_se(upper == 65535);
200
201         assert_se(parse_range("1024-4294967295", &lower, &upper) == 0);
202         assert_se(lower == 1024);
203         assert_se(upper == 4294967295);
204
205         /* Leading whitespace is acceptable */
206         assert_se(parse_range(" 111", &lower, &upper) == 0);
207         assert_se(lower == 111);
208         assert_se(upper == 111);
209
210         assert_se(parse_range(" 111-123", &lower, &upper) == 0);
211         assert_se(lower == 111);
212         assert_se(upper == 123);
213
214         assert_se(parse_range("111- 123", &lower, &upper) == 0);
215         assert_se(lower == 111);
216         assert_se(upper == 123);
217
218         assert_se(parse_range("\t111-\t123", &lower, &upper) == 0);
219         assert_se(lower == 111);
220         assert_se(upper == 123);
221
222         assert_se(parse_range(" \t 111- \t 123", &lower, &upper) == 0);
223         assert_se(lower == 111);
224         assert_se(upper == 123);
225
226         /* Error cases, make sure they fail as expected */
227         lower = upper = 9999;
228         assert_se(parse_range("111garbage", &lower, &upper) == -EINVAL);
229         assert_se(lower == 9999);
230         assert_se(upper == 9999);
231
232         assert_se(parse_range("garbage111", &lower, &upper) == -EINVAL);
233         assert_se(lower == 9999);
234         assert_se(upper == 9999);
235
236         assert_se(parse_range("garbage", &lower, &upper) == -EINVAL);
237         assert_se(lower == 9999);
238         assert_se(upper == 9999);
239
240         assert_se(parse_range("111-123garbage", &lower, &upper) == -EINVAL);
241         assert_se(lower == 9999);
242         assert_se(upper == 9999);
243
244         assert_se(parse_range("111garbage-123", &lower, &upper) == -EINVAL);
245         assert_se(lower == 9999);
246         assert_se(upper == 9999);
247
248         /* Empty string */
249         lower = upper = 9999;
250         assert_se(parse_range("", &lower, &upper) == -EINVAL);
251         assert_se(lower == 9999);
252         assert_se(upper == 9999);
253
254         /* 111--123 will pass -123 to safe_atou which returns -ERANGE for negative */
255         assert_se(parse_range("111--123", &lower, &upper) == -ERANGE);
256         assert_se(lower == 9999);
257         assert_se(upper == 9999);
258
259         assert_se(parse_range("-123", &lower, &upper) == -EINVAL);
260         assert_se(lower == 9999);
261         assert_se(upper == 9999);
262
263         assert_se(parse_range("-111-123", &lower, &upper) == -EINVAL);
264         assert_se(lower == 9999);
265         assert_se(upper == 9999);
266
267         assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
268         assert_se(lower == 9999);
269         assert_se(upper == 9999);
270
271         assert_se(parse_range("111.4-123", &lower, &upper) == -EINVAL);
272         assert_se(lower == 9999);
273         assert_se(upper == 9999);
274
275         assert_se(parse_range("111-123.4", &lower, &upper) == -EINVAL);
276         assert_se(lower == 9999);
277         assert_se(upper == 9999);
278
279         assert_se(parse_range("111,4-123", &lower, &upper) == -EINVAL);
280         assert_se(lower == 9999);
281         assert_se(upper == 9999);
282
283         assert_se(parse_range("111-123,4", &lower, &upper) == -EINVAL);
284         assert_se(lower == 9999);
285         assert_se(upper == 9999);
286
287         /* Error on trailing dash */
288         assert_se(parse_range("111-", &lower, &upper) == -EINVAL);
289         assert_se(lower == 9999);
290         assert_se(upper == 9999);
291
292         assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
293         assert_se(lower == 9999);
294         assert_se(upper == 9999);
295
296         assert_se(parse_range("111--", &lower, &upper) == -EINVAL);
297         assert_se(lower == 9999);
298         assert_se(upper == 9999);
299
300         assert_se(parse_range("111- ", &lower, &upper) == -EINVAL);
301         assert_se(lower == 9999);
302         assert_se(upper == 9999);
303
304         /* Whitespace is not a separator */
305         assert_se(parse_range("111 123", &lower, &upper) == -EINVAL);
306         assert_se(lower == 9999);
307         assert_se(upper == 9999);
308
309         assert_se(parse_range("111\t123", &lower, &upper) == -EINVAL);
310         assert_se(lower == 9999);
311         assert_se(upper == 9999);
312
313         assert_se(parse_range("111 \t 123", &lower, &upper) == -EINVAL);
314         assert_se(lower == 9999);
315         assert_se(upper == 9999);
316
317         /* Trailing whitespace is invalid (from safe_atou) */
318         assert_se(parse_range("111 ", &lower, &upper) == -EINVAL);
319         assert_se(lower == 9999);
320         assert_se(upper == 9999);
321
322         assert_se(parse_range("111-123 ", &lower, &upper) == -EINVAL);
323         assert_se(lower == 9999);
324         assert_se(upper == 9999);
325
326         assert_se(parse_range("111 -123", &lower, &upper) == -EINVAL);
327         assert_se(lower == 9999);
328         assert_se(upper == 9999);
329
330         assert_se(parse_range("111 -123 ", &lower, &upper) == -EINVAL);
331         assert_se(lower == 9999);
332         assert_se(upper == 9999);
333
334         assert_se(parse_range("111\t-123\t", &lower, &upper) == -EINVAL);
335         assert_se(lower == 9999);
336         assert_se(upper == 9999);
337
338         assert_se(parse_range("111 \t -123 \t ", &lower, &upper) == -EINVAL);
339         assert_se(lower == 9999);
340         assert_se(upper == 9999);
341
342         /* Out of the "unsigned" range, this is 1<<64 */
343         assert_se(parse_range("0-18446744073709551616", &lower, &upper) == -ERANGE);
344         assert_se(lower == 9999);
345         assert_se(upper == 9999);
346 }
347 #endif // 0
348
349 static void test_safe_atolli(void) {
350         int r;
351         long long l;
352
353         r = safe_atolli("12345", &l);
354         assert_se(r == 0);
355         assert_se(l == 12345);
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("12345678901234567890", &l);
370         assert_se(r == -ERANGE);
371
372         r = safe_atolli("-12345678901234567890", &l);
373         assert_se(r == -ERANGE);
374
375         r = safe_atolli("junk", &l);
376         assert_se(r == -EINVAL);
377
378         r = safe_atolli("123x", &l);
379         assert_se(r == -EINVAL);
380
381         r = safe_atolli("12.3", &l);
382         assert_se(r == -EINVAL);
383
384         r = safe_atolli("", &l);
385         assert_se(r == -EINVAL);
386 }
387
388 static void test_safe_atou16(void) {
389         int r;
390         uint16_t l;
391
392         r = safe_atou16("12345", &l);
393         assert_se(r == 0);
394         assert_se(l == 12345);
395
396         r = safe_atou16("  12345", &l);
397         assert_se(r == 0);
398         assert_se(l == 12345);
399
400         r = safe_atou16("123456", &l);
401         assert_se(r == -ERANGE);
402
403         r = safe_atou16("-1", &l);
404         assert_se(r == -ERANGE);
405
406         r = safe_atou16("  -1", &l);
407         assert_se(r == -ERANGE);
408
409         r = safe_atou16("junk", &l);
410         assert_se(r == -EINVAL);
411
412         r = safe_atou16("123x", &l);
413         assert_se(r == -EINVAL);
414
415         r = safe_atou16("12.3", &l);
416         assert_se(r == -EINVAL);
417
418         r = safe_atou16("", &l);
419         assert_se(r == -EINVAL);
420 }
421
422 static void test_safe_atoi16(void) {
423         int r;
424         int16_t l;
425
426         r = safe_atoi16("-12345", &l);
427         assert_se(r == 0);
428         assert_se(l == -12345);
429
430         r = safe_atoi16("  -12345", &l);
431         assert_se(r == 0);
432         assert_se(l == -12345);
433
434         r = safe_atoi16("32767", &l);
435         assert_se(r == 0);
436         assert_se(l == 32767);
437
438         r = safe_atoi16("  32767", &l);
439         assert_se(r == 0);
440         assert_se(l == 32767);
441
442         r = safe_atoi16("36536", &l);
443         assert_se(r == -ERANGE);
444
445         r = safe_atoi16("-32769", &l);
446         assert_se(r == -ERANGE);
447
448         r = safe_atoi16("junk", &l);
449         assert_se(r == -EINVAL);
450
451         r = safe_atoi16("123x", &l);
452         assert_se(r == -EINVAL);
453
454         r = safe_atoi16("12.3", &l);
455         assert_se(r == -EINVAL);
456
457         r = safe_atoi16("", &l);
458         assert_se(r == -EINVAL);
459 }
460
461 static void test_safe_atoux16(void) {
462         int r;
463         uint16_t l;
464
465         r = safe_atoux16("1234", &l);
466         assert_se(r == 0);
467         assert_se(l == 0x1234);
468
469         r = safe_atoux16("abcd", &l);
470         assert_se(r == 0);
471         assert_se(l == 0xabcd);
472
473         r = safe_atoux16("  1234", &l);
474         assert_se(r == 0);
475         assert_se(l == 0x1234);
476
477         r = safe_atoux16("12345", &l);
478         assert_se(r == -ERANGE);
479
480         r = safe_atoux16("-1", &l);
481         assert_se(r == -ERANGE);
482
483         r = safe_atoux16("  -1", &l);
484         assert_se(r == -ERANGE);
485
486         r = safe_atoux16("junk", &l);
487         assert_se(r == -EINVAL);
488
489         r = safe_atoux16("123x", &l);
490         assert_se(r == -EINVAL);
491
492         r = safe_atoux16("12.3", &l);
493         assert_se(r == -EINVAL);
494
495         r = safe_atoux16("", &l);
496         assert_se(r == -EINVAL);
497 }
498
499 static void test_safe_atou64(void) {
500         int r;
501         uint64_t l;
502
503         r = safe_atou64("12345", &l);
504         assert_se(r == 0);
505         assert_se(l == 12345);
506
507         r = safe_atou64("  12345", &l);
508         assert_se(r == 0);
509         assert_se(l == 12345);
510
511         r = safe_atou64("18446744073709551617", &l);
512         assert_se(r == -ERANGE);
513
514         r = safe_atou64("-1", &l);
515         assert_se(r == -ERANGE);
516
517         r = safe_atou64("  -1", &l);
518         assert_se(r == -ERANGE);
519
520         r = safe_atou64("junk", &l);
521         assert_se(r == -EINVAL);
522
523         r = safe_atou64("123x", &l);
524         assert_se(r == -EINVAL);
525
526         r = safe_atou64("12.3", &l);
527         assert_se(r == -EINVAL);
528
529         r = safe_atou64("", &l);
530         assert_se(r == -EINVAL);
531 }
532
533 static void test_safe_atoi64(void) {
534         int r;
535         int64_t l;
536
537         r = safe_atoi64("-12345", &l);
538         assert_se(r == 0);
539         assert_se(l == -12345);
540
541         r = safe_atoi64("  -12345", &l);
542         assert_se(r == 0);
543         assert_se(l == -12345);
544
545         r = safe_atoi64("32767", &l);
546         assert_se(r == 0);
547         assert_se(l == 32767);
548
549         r = safe_atoi64("  32767", &l);
550         assert_se(r == 0);
551         assert_se(l == 32767);
552
553         r = safe_atoi64("9223372036854775813", &l);
554         assert_se(r == -ERANGE);
555
556         r = safe_atoi64("-9223372036854775813", &l);
557         assert_se(r == -ERANGE);
558
559         r = safe_atoi64("junk", &l);
560         assert_se(r == -EINVAL);
561
562         r = safe_atoi64("123x", &l);
563         assert_se(r == -EINVAL);
564
565         r = safe_atoi64("12.3", &l);
566         assert_se(r == -EINVAL);
567
568         r = safe_atoi64("", &l);
569         assert_se(r == -EINVAL);
570 }
571
572 static void test_safe_atod(void) {
573         int r;
574         double d;
575         char *e;
576
577         r = safe_atod("junk", &d);
578         assert_se(r == -EINVAL);
579
580         r = safe_atod("0.2244", &d);
581         assert_se(r == 0);
582         assert_se(fabs(d - 0.2244) < 0.000001);
583
584         r = safe_atod("0,5", &d);
585         assert_se(r == -EINVAL);
586
587         errno = 0;
588         strtod("0,5", &e);
589         assert_se(*e == ',');
590
591         r = safe_atod("", &d);
592         assert_se(r == -EINVAL);
593
594         /* Check if this really is locale independent */
595         if (setlocale(LC_NUMERIC, "de_DE.utf8")) {
596
597                 r = safe_atod("0.2244", &d);
598                 assert_se(r == 0);
599                 assert_se(fabs(d - 0.2244) < 0.000001);
600
601                 r = safe_atod("0,5", &d);
602                 assert_se(r == -EINVAL);
603
604                 errno = 0;
605 /// elogind supports musl_libc, and their strtod doesn't seem to use the set locale.
606 #if defined(__GLIBC__)
607                 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
608 #endif // __GLIBC__
609
610                 r = safe_atod("", &d);
611                 assert_se(r == -EINVAL);
612         }
613
614         /* And check again, reset */
615         assert_se(setlocale(LC_NUMERIC, "C"));
616
617         r = safe_atod("0.2244", &d);
618         assert_se(r == 0);
619         assert_se(fabs(d - 0.2244) < 0.000001);
620
621         r = safe_atod("0,5", &d);
622         assert_se(r == -EINVAL);
623
624         errno = 0;
625         strtod("0,5", &e);
626         assert_se(*e == ',');
627
628         r = safe_atod("", &d);
629         assert_se(r == -EINVAL);
630 }
631
632 static void test_parse_percent(void) {
633         assert_se(parse_percent("") == -EINVAL);
634         assert_se(parse_percent("foo") == -EINVAL);
635         assert_se(parse_percent("0") == -EINVAL);
636         assert_se(parse_percent("50") == -EINVAL);
637         assert_se(parse_percent("100") == -EINVAL);
638         assert_se(parse_percent("-1") == -EINVAL);
639         assert_se(parse_percent("0%") == 0);
640         assert_se(parse_percent("55%") == 55);
641         assert_se(parse_percent("100%") == 100);
642         assert_se(parse_percent("-7%") == -ERANGE);
643         assert_se(parse_percent("107%") == -ERANGE);
644         assert_se(parse_percent("%") == -EINVAL);
645         assert_se(parse_percent("%%") == -EINVAL);
646         assert_se(parse_percent("%1") == -EINVAL);
647         assert_se(parse_percent("1%%") == -EINVAL);
648         assert_se(parse_percent("3.2%") == -EINVAL);
649 }
650
651 static void test_parse_percent_unbounded(void) {
652         assert_se(parse_percent_unbounded("101%") == 101);
653         assert_se(parse_percent_unbounded("400%") == 400);
654 }
655
656 static void test_parse_permille(void) {
657         assert_se(parse_permille("") == -EINVAL);
658         assert_se(parse_permille("foo") == -EINVAL);
659         assert_se(parse_permille("0") == -EINVAL);
660         assert_se(parse_permille("50") == -EINVAL);
661         assert_se(parse_permille("100") == -EINVAL);
662         assert_se(parse_permille("-1") == -EINVAL);
663
664         assert_se(parse_permille("0‰") == 0);
665         assert_se(parse_permille("555‰") == 555);
666         assert_se(parse_permille("1000‰") == 1000);
667         assert_se(parse_permille("-7‰") == -ERANGE);
668         assert_se(parse_permille("1007‰") == -ERANGE);
669         assert_se(parse_permille("‰") == -EINVAL);
670         assert_se(parse_permille("‰‰") == -EINVAL);
671         assert_se(parse_permille("‰1") == -EINVAL);
672         assert_se(parse_permille("1‰‰") == -EINVAL);
673         assert_se(parse_permille("3.2‰") == -EINVAL);
674
675         assert_se(parse_permille("0%") == 0);
676         assert_se(parse_permille("55%") == 550);
677         assert_se(parse_permille("55.5%") == 555);
678         assert_se(parse_permille("100%") == 1000);
679         assert_se(parse_permille("-7%") == -ERANGE);
680         assert_se(parse_permille("107%") == -ERANGE);
681         assert_se(parse_permille("%") == -EINVAL);
682         assert_se(parse_permille("%%") == -EINVAL);
683         assert_se(parse_permille("%1") == -EINVAL);
684         assert_se(parse_permille("1%%") == -EINVAL);
685         assert_se(parse_permille("3.21%") == -EINVAL);
686 }
687
688 static void test_parse_permille_unbounded(void) {
689         assert_se(parse_permille_unbounded("1001‰") == 1001);
690         assert_se(parse_permille_unbounded("4000‰") == 4000);
691         assert_se(parse_permille_unbounded("2147483647‰") == 2147483647);
692         assert_se(parse_permille_unbounded("2147483648‰") == -ERANGE);
693         assert_se(parse_permille_unbounded("4294967295‰") == -ERANGE);
694         assert_se(parse_permille_unbounded("4294967296‰") == -ERANGE);
695
696         assert_se(parse_permille_unbounded("101%") == 1010);
697         assert_se(parse_permille_unbounded("400%") == 4000);
698         assert_se(parse_permille_unbounded("214748364.7%") == 2147483647);
699         assert_se(parse_permille_unbounded("214748364.8%") == -ERANGE);
700         assert_se(parse_permille_unbounded("429496729.5%") == -ERANGE);
701         assert_se(parse_permille_unbounded("429496729.6%") == -ERANGE);
702 }
703
704 #if 0 /// UNNEEDED by elogind
705 static void test_parse_nice(void) {
706         int n;
707
708         assert_se(parse_nice("0", &n) >= 0 && n == 0);
709         assert_se(parse_nice("+0", &n) >= 0 && n == 0);
710         assert_se(parse_nice("-1", &n) >= 0 && n == -1);
711         assert_se(parse_nice("-2", &n) >= 0 && n == -2);
712         assert_se(parse_nice("1", &n) >= 0 && n == 1);
713         assert_se(parse_nice("2", &n) >= 0 && n == 2);
714         assert_se(parse_nice("+1", &n) >= 0 && n == 1);
715         assert_se(parse_nice("+2", &n) >= 0 && n == 2);
716         assert_se(parse_nice("-20", &n) >= 0 && n == -20);
717         assert_se(parse_nice("19", &n) >= 0 && n == 19);
718         assert_se(parse_nice("+19", &n) >= 0 && n == 19);
719
720         assert_se(parse_nice("", &n) == -EINVAL);
721         assert_se(parse_nice("-", &n) == -EINVAL);
722         assert_se(parse_nice("+", &n) == -EINVAL);
723         assert_se(parse_nice("xx", &n) == -EINVAL);
724         assert_se(parse_nice("-50", &n) == -ERANGE);
725         assert_se(parse_nice("50", &n) == -ERANGE);
726         assert_se(parse_nice("+50", &n) == -ERANGE);
727         assert_se(parse_nice("-21", &n) == -ERANGE);
728         assert_se(parse_nice("20", &n) == -ERANGE);
729         assert_se(parse_nice("+20", &n) == -ERANGE);
730 }
731 #endif // 0
732
733 static void test_parse_dev(void) {
734         dev_t dev;
735
736         assert_se(parse_dev("", &dev) == -EINVAL);
737         assert_se(parse_dev("junk", &dev) == -EINVAL);
738         assert_se(parse_dev("0", &dev) == -EINVAL);
739         assert_se(parse_dev("5", &dev) == -EINVAL);
740         assert_se(parse_dev("5:", &dev) == -EINVAL);
741         assert_se(parse_dev(":5", &dev) == -EINVAL);
742 #if SIZEOF_DEV_T < 8
743         assert_se(parse_dev("4294967295:4294967295", &dev) == -EINVAL);
744 #endif
745         assert_se(parse_dev("8:11", &dev) >= 0 && major(dev) == 8 && minor(dev) == 11);
746 }
747
748 static void test_parse_errno(void) {
749         assert_se(parse_errno("EILSEQ") == EILSEQ);
750         assert_se(parse_errno("EINVAL") == EINVAL);
751         assert_se(parse_errno("0") == 0);
752         assert_se(parse_errno("1") == 1);
753         assert_se(parse_errno("4095") == 4095);
754
755         assert_se(parse_errno("-1") == -ERANGE);
756         assert_se(parse_errno("-3") == -ERANGE);
757         assert_se(parse_errno("4096") == -ERANGE);
758
759         assert_se(parse_errno("") == -EINVAL);
760         assert_se(parse_errno("12.3") == -EINVAL);
761         assert_se(parse_errno("123junk") == -EINVAL);
762         assert_se(parse_errno("junk123") == -EINVAL);
763         assert_se(parse_errno("255EILSEQ") == -EINVAL);
764         assert_se(parse_errno("EINVAL12") == -EINVAL);
765         assert_se(parse_errno("-EINVAL") == -EINVAL);
766         assert_se(parse_errno("EINVALaaa") == -EINVAL);
767 }
768
769 static void test_parse_syscall_and_errno(void) {
770         _cleanup_free_ char *n = NULL;
771         int e;
772
773         assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
774         assert_se(streq(n, "uname"));
775         assert_se(e == errno_from_name("EILSEQ") && e >= 0);
776         n = mfree(n);
777
778         assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
779         assert_se(streq(n, "uname"));
780         assert_se(e == errno_from_name("EINVAL") && e >= 0);
781         n = mfree(n);
782
783         assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
784         assert_se(streq(n, "@sync"));
785         assert_se(e == 4095);
786         n = mfree(n);
787
788         /* If errno is omitted, then e is set to -1 */
789         assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
790         assert_se(streq(n, "mount"));
791         assert_se(e == -1);
792         n = mfree(n);
793
794         /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
795         assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
796         assert_se(streq(n, "hoge"));
797         assert_se(e == 255);
798         n = mfree(n);
799
800         /* The function checks the syscall name is empty or not. */
801         assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
802         assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
803
804         /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095 */
805         assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
806         assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
807         assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
808         assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
809         assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
810         assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
811         assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
812         assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
813         assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
814 }
815
816 static void test_parse_mtu(void) {
817         uint32_t mtu = 0;
818
819         assert_se(parse_mtu(AF_UNSPEC, "1500", &mtu) >= 0 && mtu == 1500);
820         assert_se(parse_mtu(AF_UNSPEC, "1400", &mtu) >= 0 && mtu == 1400);
821         assert_se(parse_mtu(AF_UNSPEC, "65535", &mtu) >= 0 && mtu == 65535);
822         assert_se(parse_mtu(AF_UNSPEC, "65536", &mtu) >= 0 && mtu == 65536);
823         assert_se(parse_mtu(AF_UNSPEC, "4294967295", &mtu) >= 0 && mtu == 4294967295);
824         assert_se(parse_mtu(AF_UNSPEC, "500", &mtu) >= 0 && mtu == 500);
825         assert_se(parse_mtu(AF_UNSPEC, "1280", &mtu) >= 0 && mtu == 1280);
826         assert_se(parse_mtu(AF_INET6, "1280", &mtu) >= 0 && mtu == 1280);
827         assert_se(parse_mtu(AF_INET6, "1279", &mtu) == -ERANGE);
828         assert_se(parse_mtu(AF_UNSPEC, "4294967296", &mtu) == -ERANGE);
829         assert_se(parse_mtu(AF_INET6, "4294967296", &mtu) == -ERANGE);
830         assert_se(parse_mtu(AF_INET6, "68", &mtu) == -ERANGE);
831         assert_se(parse_mtu(AF_UNSPEC, "68", &mtu) >= 0 && mtu == 68);
832         assert_se(parse_mtu(AF_UNSPEC, "67", &mtu) == -ERANGE);
833         assert_se(parse_mtu(AF_UNSPEC, "0", &mtu) == -ERANGE);
834         assert_se(parse_mtu(AF_UNSPEC, "", &mtu) == -EINVAL);
835 }
836
837 int main(int argc, char *argv[]) {
838         log_parse_environment();
839         log_open();
840
841         test_parse_boolean();
842         test_parse_pid();
843         test_parse_mode();
844         test_parse_size();
845 #if 0 /// UNNEEDED by elogind
846         test_parse_range();
847 #endif // 0
848         test_safe_atolli();
849         test_safe_atou16();
850         test_safe_atoi16();
851         test_safe_atoux16();
852         test_safe_atou64();
853         test_safe_atoi64();
854         test_safe_atod();
855         test_parse_percent();
856         test_parse_percent_unbounded();
857         test_parse_permille();
858         test_parse_permille_unbounded();
859 #if 0 /// UNNEEDED by elogind
860         test_parse_nice();
861 #endif // 0
862         test_parse_dev();
863         test_parse_errno();
864         test_parse_syscall_and_errno();
865         test_parse_mtu();
866
867         return 0;
868 }