]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-parse-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
6 #include <sys/socket.h>
8 #include "alloc-util.h"
9 #include "errno-list.h"
11 #include "parse-util.h"
12 #include "string-util.h"
14 static void test_parse_boolean(void) {
15 assert_se(parse_boolean("1") == 1);
16 assert_se(parse_boolean("y") == 1);
17 assert_se(parse_boolean("Y") == 1);
18 assert_se(parse_boolean("yes") == 1);
19 assert_se(parse_boolean("YES") == 1);
20 assert_se(parse_boolean("true") == 1);
21 assert_se(parse_boolean("TRUE") == 1);
22 assert_se(parse_boolean("on") == 1);
23 assert_se(parse_boolean("ON") == 1);
25 assert_se(parse_boolean("0") == 0);
26 assert_se(parse_boolean("n") == 0);
27 assert_se(parse_boolean("N") == 0);
28 assert_se(parse_boolean("no") == 0);
29 assert_se(parse_boolean("NO") == 0);
30 assert_se(parse_boolean("false") == 0);
31 assert_se(parse_boolean("FALSE") == 0);
32 assert_se(parse_boolean("off") == 0);
33 assert_se(parse_boolean("OFF") == 0);
35 assert_se(parse_boolean("garbage") < 0);
36 assert_se(parse_boolean("") < 0);
37 assert_se(parse_boolean("full") < 0);
40 static void test_parse_pid(void) {
44 r
= parse_pid("100", &pid
);
46 assert_se(pid
== 100);
48 r
= parse_pid("0x7FFFFFFF", &pid
);
50 assert_se(pid
== 2147483647);
52 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
53 r
= parse_pid("0", &pid
);
54 assert_se(r
== -ERANGE
);
57 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
58 r
= parse_pid("-100", &pid
);
59 assert_se(r
== -ERANGE
);
62 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
63 r
= parse_pid("0xFFFFFFFFFFFFFFFFF", &pid
);
64 assert_se(r
== -ERANGE
);
67 r
= parse_pid("junk", &pid
);
68 assert_se(r
== -EINVAL
);
70 r
= parse_pid("", &pid
);
71 assert_se(r
== -EINVAL
);
74 static void test_parse_mode(void) {
77 assert_se(parse_mode("-1", &m
) < 0);
78 assert_se(parse_mode("+1", &m
) < 0);
79 assert_se(parse_mode("", &m
) < 0);
80 assert_se(parse_mode("888", &m
) < 0);
81 assert_se(parse_mode("77777", &m
) < 0);
83 assert_se(parse_mode("544", &m
) >= 0 && m
== 0544);
84 assert_se(parse_mode("0544", &m
) >= 0 && m
== 0544);
85 assert_se(parse_mode("00544", &m
) >= 0 && m
== 0544);
86 assert_se(parse_mode("777", &m
) >= 0 && m
== 0777);
87 assert_se(parse_mode("0777", &m
) >= 0 && m
== 0777);
88 assert_se(parse_mode("00777", &m
) >= 0 && m
== 0777);
89 assert_se(parse_mode("7777", &m
) >= 0 && m
== 07777);
90 assert_se(parse_mode("07777", &m
) >= 0 && m
== 07777);
91 assert_se(parse_mode("007777", &m
) >= 0 && m
== 07777);
92 assert_se(parse_mode("0", &m
) >= 0 && m
== 0);
93 assert_se(parse_mode(" 1", &m
) >= 0 && m
== 1);
96 static void test_parse_size(void) {
99 assert_se(parse_size("", 1024, &bytes
) == -EINVAL
);
101 assert_se(parse_size("111", 1024, &bytes
) == 0);
102 assert_se(bytes
== 111);
104 assert_se(parse_size("111.4", 1024, &bytes
) == 0);
105 assert_se(bytes
== 111);
107 assert_se(parse_size(" 112 B", 1024, &bytes
) == 0);
108 assert_se(bytes
== 112);
110 assert_se(parse_size(" 112.6 B", 1024, &bytes
) == 0);
111 assert_se(bytes
== 112);
113 assert_se(parse_size("3.5 K", 1024, &bytes
) == 0);
114 assert_se(bytes
== 3*1024 + 512);
116 assert_se(parse_size("3. K", 1024, &bytes
) == 0);
117 assert_se(bytes
== 3*1024);
119 assert_se(parse_size("3.0 K", 1024, &bytes
) == 0);
120 assert_se(bytes
== 3*1024);
122 assert_se(parse_size("3. 0 K", 1024, &bytes
) == -EINVAL
);
124 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes
) == 0);
125 assert_se(bytes
== 4*1024*1024 + 11 * 1024 + 512);
127 assert_se(parse_size("3B3.5G", 1024, &bytes
) == -EINVAL
);
129 assert_se(parse_size("3.5G3B", 1024, &bytes
) == 0);
130 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
132 assert_se(parse_size("3.5G 4B", 1024, &bytes
) == 0);
133 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
135 assert_se(parse_size("3B3G4T", 1024, &bytes
) == -EINVAL
);
137 assert_se(parse_size("4T3G3B", 1024, &bytes
) == 0);
138 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
140 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes
) == 0);
141 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
143 assert_se(parse_size("12P", 1024, &bytes
) == 0);
144 assert_se(bytes
== 12ULL * 1024*1024*1024*1024*1024);
146 assert_se(parse_size("12P12P", 1024, &bytes
) == -EINVAL
);
148 assert_se(parse_size("3E 2P", 1024, &bytes
) == 0);
149 assert_se(bytes
== (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
151 assert_se(parse_size("12X", 1024, &bytes
) == -EINVAL
);
153 assert_se(parse_size("12.5X", 1024, &bytes
) == -EINVAL
);
155 assert_se(parse_size("12.5e3", 1024, &bytes
) == -EINVAL
);
157 assert_se(parse_size("1024E", 1024, &bytes
) == -ERANGE
);
158 assert_se(parse_size("-1", 1024, &bytes
) == -ERANGE
);
159 assert_se(parse_size("-1024E", 1024, &bytes
) == -ERANGE
);
161 assert_se(parse_size("-1024P", 1024, &bytes
) == -ERANGE
);
163 assert_se(parse_size("-10B 20K", 1024, &bytes
) == -ERANGE
);
166 static void test_parse_range(void) {
167 unsigned lower
, upper
;
169 /* Successful cases */
170 assert_se(parse_range("111", &lower
, &upper
) == 0);
171 assert_se(lower
== 111);
172 assert_se(upper
== 111);
174 assert_se(parse_range("111-123", &lower
, &upper
) == 0);
175 assert_se(lower
== 111);
176 assert_se(upper
== 123);
178 assert_se(parse_range("123-111", &lower
, &upper
) == 0);
179 assert_se(lower
== 123);
180 assert_se(upper
== 111);
182 assert_se(parse_range("123-123", &lower
, &upper
) == 0);
183 assert_se(lower
== 123);
184 assert_se(upper
== 123);
186 assert_se(parse_range("0", &lower
, &upper
) == 0);
187 assert_se(lower
== 0);
188 assert_se(upper
== 0);
190 assert_se(parse_range("0-15", &lower
, &upper
) == 0);
191 assert_se(lower
== 0);
192 assert_se(upper
== 15);
194 assert_se(parse_range("15-0", &lower
, &upper
) == 0);
195 assert_se(lower
== 15);
196 assert_se(upper
== 0);
198 assert_se(parse_range("128-65535", &lower
, &upper
) == 0);
199 assert_se(lower
== 128);
200 assert_se(upper
== 65535);
202 assert_se(parse_range("1024-4294967295", &lower
, &upper
) == 0);
203 assert_se(lower
== 1024);
204 assert_se(upper
== 4294967295);
206 /* Leading whitespace is acceptable */
207 assert_se(parse_range(" 111", &lower
, &upper
) == 0);
208 assert_se(lower
== 111);
209 assert_se(upper
== 111);
211 assert_se(parse_range(" 111-123", &lower
, &upper
) == 0);
212 assert_se(lower
== 111);
213 assert_se(upper
== 123);
215 assert_se(parse_range("111- 123", &lower
, &upper
) == 0);
216 assert_se(lower
== 111);
217 assert_se(upper
== 123);
219 assert_se(parse_range("\t111-\t123", &lower
, &upper
) == 0);
220 assert_se(lower
== 111);
221 assert_se(upper
== 123);
223 assert_se(parse_range(" \t 111- \t 123", &lower
, &upper
) == 0);
224 assert_se(lower
== 111);
225 assert_se(upper
== 123);
227 /* Error cases, make sure they fail as expected */
228 lower
= upper
= 9999;
229 assert_se(parse_range("111garbage", &lower
, &upper
) == -EINVAL
);
230 assert_se(lower
== 9999);
231 assert_se(upper
== 9999);
233 assert_se(parse_range("garbage111", &lower
, &upper
) == -EINVAL
);
234 assert_se(lower
== 9999);
235 assert_se(upper
== 9999);
237 assert_se(parse_range("garbage", &lower
, &upper
) == -EINVAL
);
238 assert_se(lower
== 9999);
239 assert_se(upper
== 9999);
241 assert_se(parse_range("111-123garbage", &lower
, &upper
) == -EINVAL
);
242 assert_se(lower
== 9999);
243 assert_se(upper
== 9999);
245 assert_se(parse_range("111garbage-123", &lower
, &upper
) == -EINVAL
);
246 assert_se(lower
== 9999);
247 assert_se(upper
== 9999);
250 lower
= upper
= 9999;
251 assert_se(parse_range("", &lower
, &upper
) == -EINVAL
);
252 assert_se(lower
== 9999);
253 assert_se(upper
== 9999);
255 /* 111--123 will pass -123 to safe_atou which returns -ERANGE for negative */
256 assert_se(parse_range("111--123", &lower
, &upper
) == -ERANGE
);
257 assert_se(lower
== 9999);
258 assert_se(upper
== 9999);
260 assert_se(parse_range("-123", &lower
, &upper
) == -EINVAL
);
261 assert_se(lower
== 9999);
262 assert_se(upper
== 9999);
264 assert_se(parse_range("-111-123", &lower
, &upper
) == -EINVAL
);
265 assert_se(lower
== 9999);
266 assert_se(upper
== 9999);
268 assert_se(parse_range("111-123-", &lower
, &upper
) == -EINVAL
);
269 assert_se(lower
== 9999);
270 assert_se(upper
== 9999);
272 assert_se(parse_range("111.4-123", &lower
, &upper
) == -EINVAL
);
273 assert_se(lower
== 9999);
274 assert_se(upper
== 9999);
276 assert_se(parse_range("111-123.4", &lower
, &upper
) == -EINVAL
);
277 assert_se(lower
== 9999);
278 assert_se(upper
== 9999);
280 assert_se(parse_range("111,4-123", &lower
, &upper
) == -EINVAL
);
281 assert_se(lower
== 9999);
282 assert_se(upper
== 9999);
284 assert_se(parse_range("111-123,4", &lower
, &upper
) == -EINVAL
);
285 assert_se(lower
== 9999);
286 assert_se(upper
== 9999);
288 /* Error on trailing dash */
289 assert_se(parse_range("111-", &lower
, &upper
) == -EINVAL
);
290 assert_se(lower
== 9999);
291 assert_se(upper
== 9999);
293 assert_se(parse_range("111-123-", &lower
, &upper
) == -EINVAL
);
294 assert_se(lower
== 9999);
295 assert_se(upper
== 9999);
297 assert_se(parse_range("111--", &lower
, &upper
) == -EINVAL
);
298 assert_se(lower
== 9999);
299 assert_se(upper
== 9999);
301 assert_se(parse_range("111- ", &lower
, &upper
) == -EINVAL
);
302 assert_se(lower
== 9999);
303 assert_se(upper
== 9999);
305 /* Whitespace is not a separator */
306 assert_se(parse_range("111 123", &lower
, &upper
) == -EINVAL
);
307 assert_se(lower
== 9999);
308 assert_se(upper
== 9999);
310 assert_se(parse_range("111\t123", &lower
, &upper
) == -EINVAL
);
311 assert_se(lower
== 9999);
312 assert_se(upper
== 9999);
314 assert_se(parse_range("111 \t 123", &lower
, &upper
) == -EINVAL
);
315 assert_se(lower
== 9999);
316 assert_se(upper
== 9999);
318 /* Trailing whitespace is invalid (from safe_atou) */
319 assert_se(parse_range("111 ", &lower
, &upper
) == -EINVAL
);
320 assert_se(lower
== 9999);
321 assert_se(upper
== 9999);
323 assert_se(parse_range("111-123 ", &lower
, &upper
) == -EINVAL
);
324 assert_se(lower
== 9999);
325 assert_se(upper
== 9999);
327 assert_se(parse_range("111 -123", &lower
, &upper
) == -EINVAL
);
328 assert_se(lower
== 9999);
329 assert_se(upper
== 9999);
331 assert_se(parse_range("111 -123 ", &lower
, &upper
) == -EINVAL
);
332 assert_se(lower
== 9999);
333 assert_se(upper
== 9999);
335 assert_se(parse_range("111\t-123\t", &lower
, &upper
) == -EINVAL
);
336 assert_se(lower
== 9999);
337 assert_se(upper
== 9999);
339 assert_se(parse_range("111 \t -123 \t ", &lower
, &upper
) == -EINVAL
);
340 assert_se(lower
== 9999);
341 assert_se(upper
== 9999);
343 /* Out of the "unsigned" range, this is 1<<64 */
344 assert_se(parse_range("0-18446744073709551616", &lower
, &upper
) == -ERANGE
);
345 assert_se(lower
== 9999);
346 assert_se(upper
== 9999);
349 static void test_safe_atolli(void) {
353 r
= safe_atolli("12345", &l
);
355 assert_se(l
== 12345);
357 r
= safe_atolli(" 12345", &l
);
359 assert_se(l
== 12345);
361 r
= safe_atolli("-12345", &l
);
363 assert_se(l
== -12345);
365 r
= safe_atolli(" -12345", &l
);
367 assert_se(l
== -12345);
369 r
= safe_atolli("0x5", &l
);
373 r
= safe_atolli("0o6", &l
);
377 r
= safe_atolli("0B101", &l
);
381 r
= safe_atolli("12345678901234567890", &l
);
382 assert_se(r
== -ERANGE
);
384 r
= safe_atolli("-12345678901234567890", &l
);
385 assert_se(r
== -ERANGE
);
387 r
= safe_atolli("junk", &l
);
388 assert_se(r
== -EINVAL
);
390 r
= safe_atolli("123x", &l
);
391 assert_se(r
== -EINVAL
);
393 r
= safe_atolli("12.3", &l
);
394 assert_se(r
== -EINVAL
);
396 r
= safe_atolli("", &l
);
397 assert_se(r
== -EINVAL
);
400 static void test_safe_atou16(void) {
404 r
= safe_atou16("12345", &l
);
406 assert_se(l
== 12345);
408 r
= safe_atou16(" 12345", &l
);
410 assert_se(l
== 12345);
412 r
= safe_atou16("123456", &l
);
413 assert_se(r
== -ERANGE
);
415 r
= safe_atou16("-1", &l
);
416 assert_se(r
== -ERANGE
);
418 r
= safe_atou16(" -1", &l
);
419 assert_se(r
== -ERANGE
);
421 r
= safe_atou16("junk", &l
);
422 assert_se(r
== -EINVAL
);
424 r
= safe_atou16("123x", &l
);
425 assert_se(r
== -EINVAL
);
427 r
= safe_atou16("12.3", &l
);
428 assert_se(r
== -EINVAL
);
430 r
= safe_atou16("", &l
);
431 assert_se(r
== -EINVAL
);
434 static void test_safe_atoi16(void) {
438 r
= safe_atoi16("-12345", &l
);
440 assert_se(l
== -12345);
442 r
= safe_atoi16(" -12345", &l
);
444 assert_se(l
== -12345);
446 r
= safe_atoi16("32767", &l
);
448 assert_se(l
== 32767);
450 r
= safe_atoi16(" 32767", &l
);
452 assert_se(l
== 32767);
454 r
= safe_atoi16("0o11", &l
);
458 r
= safe_atoi16("0B110", &l
);
462 r
= safe_atoi16("36536", &l
);
463 assert_se(r
== -ERANGE
);
465 r
= safe_atoi16("-32769", &l
);
466 assert_se(r
== -ERANGE
);
468 r
= safe_atoi16("junk", &l
);
469 assert_se(r
== -EINVAL
);
471 r
= safe_atoi16("123x", &l
);
472 assert_se(r
== -EINVAL
);
474 r
= safe_atoi16("12.3", &l
);
475 assert_se(r
== -EINVAL
);
477 r
= safe_atoi16("", &l
);
478 assert_se(r
== -EINVAL
);
481 static void test_safe_atoux16(void) {
485 r
= safe_atoux16("1234", &l
);
487 assert_se(l
== 0x1234);
489 r
= safe_atoux16("abcd", &l
);
491 assert_se(l
== 0xabcd);
493 r
= safe_atoux16(" 1234", &l
);
495 assert_se(l
== 0x1234);
497 r
= safe_atoux16("12345", &l
);
498 assert_se(r
== -ERANGE
);
500 r
= safe_atoux16("-1", &l
);
501 assert_se(r
== -ERANGE
);
503 r
= safe_atoux16(" -1", &l
);
504 assert_se(r
== -ERANGE
);
506 r
= safe_atoux16("0b1", &l
);
510 r
= safe_atoux16("0o70", &l
);
511 assert_se(r
== -EINVAL
);
513 r
= safe_atoux16("junk", &l
);
514 assert_se(r
== -EINVAL
);
516 r
= safe_atoux16("123x", &l
);
517 assert_se(r
== -EINVAL
);
519 r
= safe_atoux16("12.3", &l
);
520 assert_se(r
== -EINVAL
);
522 r
= safe_atoux16("", &l
);
523 assert_se(r
== -EINVAL
);
526 static void test_safe_atou64(void) {
530 r
= safe_atou64("12345", &l
);
532 assert_se(l
== 12345);
534 r
= safe_atou64(" 12345", &l
);
536 assert_se(l
== 12345);
538 r
= safe_atou64("0o11", &l
);
542 r
= safe_atou64("0b11", &l
);
546 r
= safe_atou64("18446744073709551617", &l
);
547 assert_se(r
== -ERANGE
);
549 r
= safe_atou64("-1", &l
);
550 assert_se(r
== -ERANGE
);
552 r
= safe_atou64(" -1", &l
);
553 assert_se(r
== -ERANGE
);
555 r
= safe_atou64("junk", &l
);
556 assert_se(r
== -EINVAL
);
558 r
= safe_atou64("123x", &l
);
559 assert_se(r
== -EINVAL
);
561 r
= safe_atou64("12.3", &l
);
562 assert_se(r
== -EINVAL
);
564 r
= safe_atou64("", &l
);
565 assert_se(r
== -EINVAL
);
568 static void test_safe_atoi64(void) {
572 r
= safe_atoi64("-12345", &l
);
574 assert_se(l
== -12345);
576 r
= safe_atoi64(" -12345", &l
);
578 assert_se(l
== -12345);
580 r
= safe_atoi64("32767", &l
);
582 assert_se(l
== 32767);
584 r
= safe_atoi64(" 32767", &l
);
586 assert_se(l
== 32767);
588 r
= safe_atoi64(" 0o20", &l
);
592 r
= safe_atoi64(" 0b01010", &l
);
596 r
= safe_atoi64("9223372036854775813", &l
);
597 assert_se(r
== -ERANGE
);
599 r
= safe_atoi64("-9223372036854775813", &l
);
600 assert_se(r
== -ERANGE
);
602 r
= safe_atoi64("junk", &l
);
603 assert_se(r
== -EINVAL
);
605 r
= safe_atoi64("123x", &l
);
606 assert_se(r
== -EINVAL
);
608 r
= safe_atoi64("12.3", &l
);
609 assert_se(r
== -EINVAL
);
611 r
= safe_atoi64("", &l
);
612 assert_se(r
== -EINVAL
);
615 static void test_safe_atoux64(void) {
619 r
= safe_atoux64("12345", &l
);
621 assert_se(l
== 0x12345);
623 r
= safe_atoux64(" 12345", &l
);
625 assert_se(l
== 0x12345);
627 r
= safe_atoux64("0x12345", &l
);
629 assert_se(l
== 0x12345);
631 r
= safe_atoux64("0b11011", &l
);
633 assert_se(l
== 11603985);
635 r
= safe_atoux64("0o11011", &l
);
636 assert_se(r
== -EINVAL
);
638 r
= safe_atoux64("18446744073709551617", &l
);
639 assert_se(r
== -ERANGE
);
641 r
= safe_atoux64("-1", &l
);
642 assert_se(r
== -ERANGE
);
644 r
= safe_atoux64(" -1", &l
);
645 assert_se(r
== -ERANGE
);
647 r
= safe_atoux64("junk", &l
);
648 assert_se(r
== -EINVAL
);
650 r
= safe_atoux64("123x", &l
);
651 assert_se(r
== -EINVAL
);
653 r
= safe_atoux64("12.3", &l
);
654 assert_se(r
== -EINVAL
);
656 r
= safe_atoux64("", &l
);
657 assert_se(r
== -EINVAL
);
660 static void test_safe_atod(void) {
665 r
= safe_atod("junk", &d
);
666 assert_se(r
== -EINVAL
);
668 r
= safe_atod("0.2244", &d
);
670 assert_se(fabs(d
- 0.2244) < 0.000001);
672 r
= safe_atod("0,5", &d
);
673 assert_se(r
== -EINVAL
);
677 assert_se(*e
== ',');
679 r
= safe_atod("", &d
);
680 assert_se(r
== -EINVAL
);
682 /* Check if this really is locale independent */
683 if (setlocale(LC_NUMERIC
, "de_DE.utf8")) {
685 r
= safe_atod("0.2244", &d
);
687 assert_se(fabs(d
- 0.2244) < 0.000001);
689 r
= safe_atod("0,5", &d
);
690 assert_se(r
== -EINVAL
);
693 assert_se(fabs(strtod("0,5", &e
) - 0.5) < 0.00001);
695 r
= safe_atod("", &d
);
696 assert_se(r
== -EINVAL
);
699 /* And check again, reset */
700 assert_se(setlocale(LC_NUMERIC
, "C"));
702 r
= safe_atod("0.2244", &d
);
704 assert_se(fabs(d
- 0.2244) < 0.000001);
706 r
= safe_atod("0,5", &d
);
707 assert_se(r
== -EINVAL
);
711 assert_se(*e
== ',');
713 r
= safe_atod("", &d
);
714 assert_se(r
== -EINVAL
);
717 static void test_parse_percent(void) {
718 assert_se(parse_percent("") == -EINVAL
);
719 assert_se(parse_percent("foo") == -EINVAL
);
720 assert_se(parse_percent("0") == -EINVAL
);
721 assert_se(parse_percent("50") == -EINVAL
);
722 assert_se(parse_percent("100") == -EINVAL
);
723 assert_se(parse_percent("-1") == -EINVAL
);
724 assert_se(parse_percent("0%") == 0);
725 assert_se(parse_percent("55%") == 55);
726 assert_se(parse_percent("100%") == 100);
727 assert_se(parse_percent("-7%") == -ERANGE
);
728 assert_se(parse_percent("107%") == -ERANGE
);
729 assert_se(parse_percent("%") == -EINVAL
);
730 assert_se(parse_percent("%%") == -EINVAL
);
731 assert_se(parse_percent("%1") == -EINVAL
);
732 assert_se(parse_percent("1%%") == -EINVAL
);
733 assert_se(parse_percent("3.2%") == -EINVAL
);
736 static void test_parse_percent_unbounded(void) {
737 assert_se(parse_percent_unbounded("101%") == 101);
738 assert_se(parse_percent_unbounded("400%") == 400);
741 static void test_parse_permille(void) {
742 assert_se(parse_permille("") == -EINVAL
);
743 assert_se(parse_permille("foo") == -EINVAL
);
744 assert_se(parse_permille("0") == -EINVAL
);
745 assert_se(parse_permille("50") == -EINVAL
);
746 assert_se(parse_permille("100") == -EINVAL
);
747 assert_se(parse_permille("-1") == -EINVAL
);
749 assert_se(parse_permille("0‰") == 0);
750 assert_se(parse_permille("555‰") == 555);
751 assert_se(parse_permille("1000‰") == 1000);
752 assert_se(parse_permille("-7‰") == -ERANGE
);
753 assert_se(parse_permille("1007‰") == -ERANGE
);
754 assert_se(parse_permille("‰") == -EINVAL
);
755 assert_se(parse_permille("‰‰") == -EINVAL
);
756 assert_se(parse_permille("‰1") == -EINVAL
);
757 assert_se(parse_permille("1‰‰") == -EINVAL
);
758 assert_se(parse_permille("3.2‰") == -EINVAL
);
760 assert_se(parse_permille("0%") == 0);
761 assert_se(parse_permille("55%") == 550);
762 assert_se(parse_permille("55.5%") == 555);
763 assert_se(parse_permille("100%") == 1000);
764 assert_se(parse_permille("-7%") == -ERANGE
);
765 assert_se(parse_permille("107%") == -ERANGE
);
766 assert_se(parse_permille("%") == -EINVAL
);
767 assert_se(parse_permille("%%") == -EINVAL
);
768 assert_se(parse_permille("%1") == -EINVAL
);
769 assert_se(parse_permille("1%%") == -EINVAL
);
770 assert_se(parse_permille("3.21%") == -EINVAL
);
773 static void test_parse_permille_unbounded(void) {
774 assert_se(parse_permille_unbounded("1001‰") == 1001);
775 assert_se(parse_permille_unbounded("4000‰") == 4000);
776 assert_se(parse_permille_unbounded("2147483647‰") == 2147483647);
777 assert_se(parse_permille_unbounded("2147483648‰") == -ERANGE
);
778 assert_se(parse_permille_unbounded("4294967295‰") == -ERANGE
);
779 assert_se(parse_permille_unbounded("4294967296‰") == -ERANGE
);
781 assert_se(parse_permille_unbounded("101%") == 1010);
782 assert_se(parse_permille_unbounded("400%") == 4000);
783 assert_se(parse_permille_unbounded("214748364.7%") == 2147483647);
784 assert_se(parse_permille_unbounded("214748364.8%") == -ERANGE
);
785 assert_se(parse_permille_unbounded("429496729.5%") == -ERANGE
);
786 assert_se(parse_permille_unbounded("429496729.6%") == -ERANGE
);
789 static void test_parse_nice(void) {
792 assert_se(parse_nice("0", &n
) >= 0 && n
== 0);
793 assert_se(parse_nice("+0", &n
) >= 0 && n
== 0);
794 assert_se(parse_nice("-1", &n
) >= 0 && n
== -1);
795 assert_se(parse_nice("-2", &n
) >= 0 && n
== -2);
796 assert_se(parse_nice("1", &n
) >= 0 && n
== 1);
797 assert_se(parse_nice("2", &n
) >= 0 && n
== 2);
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("-20", &n
) >= 0 && n
== -20);
801 assert_se(parse_nice("19", &n
) >= 0 && n
== 19);
802 assert_se(parse_nice("+19", &n
) >= 0 && n
== 19);
804 assert_se(parse_nice("", &n
) == -EINVAL
);
805 assert_se(parse_nice("-", &n
) == -EINVAL
);
806 assert_se(parse_nice("+", &n
) == -EINVAL
);
807 assert_se(parse_nice("xx", &n
) == -EINVAL
);
808 assert_se(parse_nice("-50", &n
) == -ERANGE
);
809 assert_se(parse_nice("50", &n
) == -ERANGE
);
810 assert_se(parse_nice("+50", &n
) == -ERANGE
);
811 assert_se(parse_nice("-21", &n
) == -ERANGE
);
812 assert_se(parse_nice("20", &n
) == -ERANGE
);
813 assert_se(parse_nice("+20", &n
) == -ERANGE
);
816 static void test_parse_dev(void) {
819 assert_se(parse_dev("", &dev
) == -EINVAL
);
820 assert_se(parse_dev("junk", &dev
) == -EINVAL
);
821 assert_se(parse_dev("0", &dev
) == -EINVAL
);
822 assert_se(parse_dev("5", &dev
) == -EINVAL
);
823 assert_se(parse_dev("5:", &dev
) == -EINVAL
);
824 assert_se(parse_dev(":5", &dev
) == -EINVAL
);
825 assert_se(parse_dev("-1:-1", &dev
) == -EINVAL
);
827 assert_se(parse_dev("4294967295:4294967295", &dev
) == -EINVAL
);
829 assert_se(parse_dev("8:11", &dev
) >= 0 && major(dev
) == 8 && minor(dev
) == 11);
830 assert_se(parse_dev("0:0", &dev
) >= 0 && major(dev
) == 0 && minor(dev
) == 0);
833 static void test_parse_errno(void) {
834 assert_se(parse_errno("EILSEQ") == EILSEQ
);
835 assert_se(parse_errno("EINVAL") == EINVAL
);
836 assert_se(parse_errno("0") == 0);
837 assert_se(parse_errno("1") == 1);
838 assert_se(parse_errno("4095") == 4095);
840 assert_se(parse_errno("-1") == -ERANGE
);
841 assert_se(parse_errno("-3") == -ERANGE
);
842 assert_se(parse_errno("4096") == -ERANGE
);
844 assert_se(parse_errno("") == -EINVAL
);
845 assert_se(parse_errno("12.3") == -EINVAL
);
846 assert_se(parse_errno("123junk") == -EINVAL
);
847 assert_se(parse_errno("junk123") == -EINVAL
);
848 assert_se(parse_errno("255EILSEQ") == -EINVAL
);
849 assert_se(parse_errno("EINVAL12") == -EINVAL
);
850 assert_se(parse_errno("-EINVAL") == -EINVAL
);
851 assert_se(parse_errno("EINVALaaa") == -EINVAL
);
854 static void test_parse_syscall_and_errno(void) {
855 _cleanup_free_
char *n
= NULL
;
858 assert_se(parse_syscall_and_errno("uname:EILSEQ", &n
, &e
) >= 0);
859 assert_se(streq(n
, "uname"));
860 assert_se(e
== errno_from_name("EILSEQ") && e
>= 0);
863 assert_se(parse_syscall_and_errno("uname:EINVAL", &n
, &e
) >= 0);
864 assert_se(streq(n
, "uname"));
865 assert_se(e
== errno_from_name("EINVAL") && e
>= 0);
868 assert_se(parse_syscall_and_errno("@sync:4095", &n
, &e
) >= 0);
869 assert_se(streq(n
, "@sync"));
870 assert_se(e
== 4095);
873 /* If errno is omitted, then e is set to -1 */
874 assert_se(parse_syscall_and_errno("mount", &n
, &e
) >= 0);
875 assert_se(streq(n
, "mount"));
879 /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
880 assert_se(parse_syscall_and_errno("hoge:255", &n
, &e
) >= 0);
881 assert_se(streq(n
, "hoge"));
885 /* The function checks the syscall name is empty or not. */
886 assert_se(parse_syscall_and_errno("", &n
, &e
) == -EINVAL
);
887 assert_se(parse_syscall_and_errno(":255", &n
, &e
) == -EINVAL
);
889 /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095 */
890 assert_se(parse_syscall_and_errno("hoge:4096", &n
, &e
) == -ERANGE
);
891 assert_se(parse_syscall_and_errno("hoge:-3", &n
, &e
) == -ERANGE
);
892 assert_se(parse_syscall_and_errno("hoge:12.3", &n
, &e
) == -EINVAL
);
893 assert_se(parse_syscall_and_errno("hoge:123junk", &n
, &e
) == -EINVAL
);
894 assert_se(parse_syscall_and_errno("hoge:junk123", &n
, &e
) == -EINVAL
);
895 assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n
, &e
) == -EINVAL
);
896 assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n
, &e
) == -EINVAL
);
897 assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n
, &e
) == -EINVAL
);
898 assert_se(parse_syscall_and_errno("hoge:", &n
, &e
) == -EINVAL
);
901 static void test_parse_mtu(void) {
904 assert_se(parse_mtu(AF_UNSPEC
, "1500", &mtu
) >= 0 && mtu
== 1500);
905 assert_se(parse_mtu(AF_UNSPEC
, "1400", &mtu
) >= 0 && mtu
== 1400);
906 assert_se(parse_mtu(AF_UNSPEC
, "65535", &mtu
) >= 0 && mtu
== 65535);
907 assert_se(parse_mtu(AF_UNSPEC
, "65536", &mtu
) >= 0 && mtu
== 65536);
908 assert_se(parse_mtu(AF_UNSPEC
, "4294967295", &mtu
) >= 0 && mtu
== 4294967295);
909 assert_se(parse_mtu(AF_UNSPEC
, "500", &mtu
) >= 0 && mtu
== 500);
910 assert_se(parse_mtu(AF_UNSPEC
, "1280", &mtu
) >= 0 && mtu
== 1280);
911 assert_se(parse_mtu(AF_INET6
, "1280", &mtu
) >= 0 && mtu
== 1280);
912 assert_se(parse_mtu(AF_INET6
, "1279", &mtu
) == -ERANGE
);
913 assert_se(parse_mtu(AF_UNSPEC
, "4294967296", &mtu
) == -ERANGE
);
914 assert_se(parse_mtu(AF_INET6
, "4294967296", &mtu
) == -ERANGE
);
915 assert_se(parse_mtu(AF_INET6
, "68", &mtu
) == -ERANGE
);
916 assert_se(parse_mtu(AF_UNSPEC
, "68", &mtu
) >= 0 && mtu
== 68);
917 assert_se(parse_mtu(AF_UNSPEC
, "67", &mtu
) == -ERANGE
);
918 assert_se(parse_mtu(AF_UNSPEC
, "0", &mtu
) == -ERANGE
);
919 assert_se(parse_mtu(AF_UNSPEC
, "", &mtu
) == -EINVAL
);
922 int main(int argc
, char *argv
[]) {
923 log_parse_environment();
926 test_parse_boolean();
939 test_parse_percent();
940 test_parse_percent_unbounded();
941 test_parse_permille();
942 test_parse_permille_unbounded();
946 test_parse_syscall_and_errno();