chiark / gitweb /
671eea16548b3066948ab076983756029edb015e
[elogind.git] / src / test / test-parse-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3   Copyright 2010 Lennart Poettering
4   Copyright 2013 Thomas H.P. Andersen
5 ***/
6
7 #include <errno.h>
8 #include <locale.h>
9 #include <math.h>
10 //#include <sys/socket.h>
11
12 #include "alloc-util.h"
13 #include "errno-list.h"
14 #include "log.h"
15 #include "parse-util.h"
16 #include "string-util.h"
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("", &m) < 0);
83         assert_se(parse_mode("888", &m) < 0);
84         assert_se(parse_mode("77777", &m) < 0);
85
86         assert_se(parse_mode("544", &m) >= 0 && m == 0544);
87         assert_se(parse_mode("777", &m) >= 0 && m == 0777);
88         assert_se(parse_mode("7777", &m) >= 0 && m == 07777);
89         assert_se(parse_mode("0", &m) >= 0 && m == 0);
90 }
91
92 static void test_parse_size(void) {
93         uint64_t bytes;
94
95         assert_se(parse_size("", 1024, &bytes) == -EINVAL);
96
97         assert_se(parse_size("111", 1024, &bytes) == 0);
98         assert_se(bytes == 111);
99
100         assert_se(parse_size("111.4", 1024, &bytes) == 0);
101         assert_se(bytes == 111);
102
103         assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
104         assert_se(bytes == 112);
105
106         assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
107         assert_se(bytes == 112);
108
109         assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
110         assert_se(bytes == 3*1024 + 512);
111
112         assert_se(parse_size("3. K", 1024, &bytes) == 0);
113         assert_se(bytes == 3*1024);
114
115         assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
116         assert_se(bytes == 3*1024);
117
118         assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
119
120         assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
121         assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
122
123         assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
124
125         assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
126         assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
127
128         assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
129         assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
130
131         assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
132
133         assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
134         assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
135
136         assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
137         assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
138
139         assert_se(parse_size("12P", 1024, &bytes) == 0);
140         assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
141
142         assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
143
144         assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
145         assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
146
147         assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
148
149         assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
150
151         assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
152
153         assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
154         assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
155         assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
156
157         assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
158
159         assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
160 }
161
162 #if 0 /// UNNEEDED by elogind
163 static 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
257         assert_se(parse_range("-123", &lower, &upper) == -EINVAL);
258         assert_se(lower == 9999);
259         assert_se(upper == 9999);
260
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 #endif // 0
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 /// elogind supports musl_libc, and their strtod doesn't seem to use the set locale.
604 #if defined(__GLIBC__)
605                 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
606 #endif // __GLIBC__
607
608                 r = safe_atod("", &d);
609                 assert_se(r == -EINVAL);
610         }
611
612         /* And check again, reset */
613         assert_se(setlocale(LC_NUMERIC, "C"));
614
615         r = safe_atod("0.2244", &d);
616         assert_se(r == 0);
617         assert_se(fabs(d - 0.2244) < 0.000001);
618
619         r = safe_atod("0,5", &d);
620         assert_se(r == -EINVAL);
621
622         errno = 0;
623         strtod("0,5", &e);
624         assert_se(*e == ',');
625
626         r = safe_atod("", &d);
627         assert_se(r == -EINVAL);
628 }
629
630 static void test_parse_percent(void) {
631         assert_se(parse_percent("") == -EINVAL);
632         assert_se(parse_percent("foo") == -EINVAL);
633         assert_se(parse_percent("0") == -EINVAL);
634         assert_se(parse_percent("50") == -EINVAL);
635         assert_se(parse_percent("100") == -EINVAL);
636         assert_se(parse_percent("-1") == -EINVAL);
637         assert_se(parse_percent("0%") == 0);
638         assert_se(parse_percent("55%") == 55);
639         assert_se(parse_percent("100%") == 100);
640         assert_se(parse_percent("-7%") == -ERANGE);
641         assert_se(parse_percent("107%") == -ERANGE);
642         assert_se(parse_percent("%") == -EINVAL);
643         assert_se(parse_percent("%%") == -EINVAL);
644         assert_se(parse_percent("%1") == -EINVAL);
645         assert_se(parse_percent("1%%") == -EINVAL);
646         assert_se(parse_percent("3.2%") == -EINVAL);
647 }
648
649 static void test_parse_percent_unbounded(void) {
650         assert_se(parse_percent_unbounded("101%") == 101);
651         assert_se(parse_percent_unbounded("400%") == 400);
652 }
653
654 static void test_parse_permille(void) {
655         assert_se(parse_permille("") == -EINVAL);
656         assert_se(parse_permille("foo") == -EINVAL);
657         assert_se(parse_permille("0") == -EINVAL);
658         assert_se(parse_permille("50") == -EINVAL);
659         assert_se(parse_permille("100") == -EINVAL);
660         assert_se(parse_permille("-1") == -EINVAL);
661
662         assert_se(parse_permille("0‰") == 0);
663         assert_se(parse_permille("555‰") == 555);
664         assert_se(parse_permille("1000‰") == 1000);
665         assert_se(parse_permille("-7‰") == -ERANGE);
666         assert_se(parse_permille("1007‰") == -ERANGE);
667         assert_se(parse_permille("‰") == -EINVAL);
668         assert_se(parse_permille("‰‰") == -EINVAL);
669         assert_se(parse_permille("‰1") == -EINVAL);
670         assert_se(parse_permille("1‰‰") == -EINVAL);
671         assert_se(parse_permille("3.2‰") == -EINVAL);
672
673         assert_se(parse_permille("0%") == 0);
674         assert_se(parse_permille("55%") == 550);
675         assert_se(parse_permille("55.5%") == 555);
676         assert_se(parse_permille("100%") == 1000);
677         assert_se(parse_permille("-7%") == -ERANGE);
678         assert_se(parse_permille("107%") == -ERANGE);
679         assert_se(parse_permille("%") == -EINVAL);
680         assert_se(parse_permille("%%") == -EINVAL);
681         assert_se(parse_permille("%1") == -EINVAL);
682         assert_se(parse_permille("1%%") == -EINVAL);
683         assert_se(parse_permille("3.21%") == -EINVAL);
684 }
685
686 static void test_parse_permille_unbounded(void) {
687         assert_se(parse_permille_unbounded("1001‰") == 1001);
688         assert_se(parse_permille_unbounded("4000‰") == 4000);
689         assert_se(parse_permille_unbounded("2147483647‰") == 2147483647);
690         assert_se(parse_permille_unbounded("2147483648‰") == -ERANGE);
691         assert_se(parse_permille_unbounded("4294967295‰") == -ERANGE);
692         assert_se(parse_permille_unbounded("4294967296‰") == -ERANGE);
693
694         assert_se(parse_permille_unbounded("101%") == 1010);
695         assert_se(parse_permille_unbounded("400%") == 4000);
696         assert_se(parse_permille_unbounded("214748364.7%") == 2147483647);
697         assert_se(parse_permille_unbounded("214748364.8%") == -ERANGE);
698         assert_se(parse_permille_unbounded("429496729.5%") == -ERANGE);
699         assert_se(parse_permille_unbounded("429496729.6%") == -ERANGE);
700 }
701
702 #if 0 /// UNNEEDED by elogind
703 static void test_parse_nice(void) {
704         int n;
705
706         assert_se(parse_nice("0", &n) >= 0 && n == 0);
707         assert_se(parse_nice("+0", &n) >= 0 && n == 0);
708         assert_se(parse_nice("-1", &n) >= 0 && n == -1);
709         assert_se(parse_nice("-2", &n) >= 0 && n == -2);
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("-20", &n) >= 0 && n == -20);
715         assert_se(parse_nice("19", &n) >= 0 && n == 19);
716         assert_se(parse_nice("+19", &n) >= 0 && n == 19);
717
718         assert_se(parse_nice("", &n) == -EINVAL);
719         assert_se(parse_nice("-", &n) == -EINVAL);
720         assert_se(parse_nice("+", &n) == -EINVAL);
721         assert_se(parse_nice("xx", &n) == -EINVAL);
722         assert_se(parse_nice("-50", &n) == -ERANGE);
723         assert_se(parse_nice("50", &n) == -ERANGE);
724         assert_se(parse_nice("+50", &n) == -ERANGE);
725         assert_se(parse_nice("-21", &n) == -ERANGE);
726         assert_se(parse_nice("20", &n) == -ERANGE);
727         assert_se(parse_nice("+20", &n) == -ERANGE);
728 }
729 #endif // 0
730
731 static void test_parse_dev(void) {
732         dev_t dev;
733
734         assert_se(parse_dev("", &dev) == -EINVAL);
735         assert_se(parse_dev("junk", &dev) == -EINVAL);
736         assert_se(parse_dev("0", &dev) == -EINVAL);
737         assert_se(parse_dev("5", &dev) == -EINVAL);
738         assert_se(parse_dev("5:", &dev) == -EINVAL);
739         assert_se(parse_dev(":5", &dev) == -EINVAL);
740 #if SIZEOF_DEV_T < 8
741         assert_se(parse_dev("4294967295:4294967295", &dev) == -EINVAL);
742 #endif
743         assert_se(parse_dev("8:11", &dev) >= 0 && major(dev) == 8 && minor(dev) == 11);
744 }
745
746 static void test_parse_errno(void) {
747         assert_se(parse_errno("EILSEQ") == EILSEQ);
748         assert_se(parse_errno("EINVAL") == EINVAL);
749         assert_se(parse_errno("0") == 0);
750         assert_se(parse_errno("1") == 1);
751         assert_se(parse_errno("4095") == 4095);
752
753         assert_se(parse_errno("-1") == -ERANGE);
754         assert_se(parse_errno("-3") == -ERANGE);
755         assert_se(parse_errno("4096") == -ERANGE);
756
757         assert_se(parse_errno("") == -EINVAL);
758         assert_se(parse_errno("12.3") == -EINVAL);
759         assert_se(parse_errno("123junk") == -EINVAL);
760         assert_se(parse_errno("junk123") == -EINVAL);
761         assert_se(parse_errno("255EILSEQ") == -EINVAL);
762         assert_se(parse_errno("EINVAL12") == -EINVAL);
763         assert_se(parse_errno("-EINVAL") == -EINVAL);
764         assert_se(parse_errno("EINVALaaa") == -EINVAL);
765 }
766
767 static void test_parse_syscall_and_errno(void) {
768         _cleanup_free_ char *n = NULL;
769         int e;
770
771         assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
772         assert_se(streq(n, "uname"));
773         assert_se(e == errno_from_name("EILSEQ") && e >= 0);
774         n = mfree(n);
775
776         assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
777         assert_se(streq(n, "uname"));
778         assert_se(e == errno_from_name("EINVAL") && e >= 0);
779         n = mfree(n);
780
781         assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
782         assert_se(streq(n, "@sync"));
783         assert_se(e == 4095);
784         n = mfree(n);
785
786         /* If errno is omitted, then e is set to -1 */
787         assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
788         assert_se(streq(n, "mount"));
789         assert_se(e == -1);
790         n = mfree(n);
791
792         /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
793         assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
794         assert_se(streq(n, "hoge"));
795         assert_se(e == 255);
796         n = mfree(n);
797
798         /* The function checks the syscall name is empty or not. */
799         assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
800         assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
801
802         /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095 */
803         assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
804         assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
805         assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
806         assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
807         assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
808         assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
809         assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
810         assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
811         assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
812 }
813
814 static void test_parse_mtu(void) {
815         uint32_t mtu = 0;
816
817         assert_se(parse_mtu(AF_UNSPEC, "1500", &mtu) >= 0 && mtu == 1500);
818         assert_se(parse_mtu(AF_UNSPEC, "1400", &mtu) >= 0 && mtu == 1400);
819         assert_se(parse_mtu(AF_UNSPEC, "65535", &mtu) >= 0 && mtu == 65535);
820         assert_se(parse_mtu(AF_UNSPEC, "65536", &mtu) >= 0 && mtu == 65536);
821         assert_se(parse_mtu(AF_UNSPEC, "4294967295", &mtu) >= 0 && mtu == 4294967295);
822         assert_se(parse_mtu(AF_UNSPEC, "500", &mtu) >= 0 && mtu == 500);
823         assert_se(parse_mtu(AF_UNSPEC, "1280", &mtu) >= 0 && mtu == 1280);
824         assert_se(parse_mtu(AF_INET6, "1280", &mtu) >= 0 && mtu == 1280);
825         assert_se(parse_mtu(AF_INET6, "1279", &mtu) == -ERANGE);
826         assert_se(parse_mtu(AF_UNSPEC, "4294967296", &mtu) == -ERANGE);
827         assert_se(parse_mtu(AF_INET6, "4294967296", &mtu) == -ERANGE);
828         assert_se(parse_mtu(AF_INET6, "68", &mtu) == -ERANGE);
829         assert_se(parse_mtu(AF_UNSPEC, "68", &mtu) >= 0 && mtu == 68);
830         assert_se(parse_mtu(AF_UNSPEC, "67", &mtu) == -ERANGE);
831         assert_se(parse_mtu(AF_UNSPEC, "0", &mtu) == -ERANGE);
832         assert_se(parse_mtu(AF_UNSPEC, "", &mtu) == -EINVAL);
833 }
834
835 int main(int argc, char *argv[]) {
836         log_parse_environment();
837         log_open();
838
839         test_parse_boolean();
840         test_parse_pid();
841         test_parse_mode();
842         test_parse_size();
843 #if 0 /// UNNEEDED by elogind
844         test_parse_range();
845 #endif // 0
846         test_safe_atolli();
847         test_safe_atou16();
848         test_safe_atoi16();
849         test_safe_atoux16();
850         test_safe_atou64();
851         test_safe_atoi64();
852         test_safe_atod();
853         test_parse_percent();
854         test_parse_percent_unbounded();
855         test_parse_permille();
856         test_parse_permille_unbounded();
857 #if 0 /// UNNEEDED by elogind
858         test_parse_nice();
859 #endif // 0
860         test_parse_dev();
861         test_parse_errno();
862         test_parse_syscall_and_errno();
863         test_parse_mtu();
864
865         return 0;
866 }