]> git.proxmox.com Git - mirror_qemu.git/blob - tests/unit/test-cutils.c
8d2e057bdaa8da0580f8a6adfdf5c3710b0d29e9
[mirror_qemu.git] / tests / unit / test-cutils.c
1 /*
2 * cutils.c unit-tests
3 *
4 * Copyright Red Hat
5 *
6 * Authors:
7 * Eduardo Habkost <ehabkost@redhat.com>
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a copy
10 * of this software and associated documentation files (the "Software"), to deal
11 * in the Software without restriction, including without limitation the rights
12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 * copies of the Software, and to permit persons to whom the Software is
14 * furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 * THE SOFTWARE.
26 */
27
28 #include "qemu/osdep.h"
29 #include "qemu/cutils.h"
30 #include "qemu/units.h"
31
32 static void test_parse_uint_null(void)
33 {
34 unsigned long long i = 999;
35 char f = 'X';
36 char *endptr = &f;
37 int r;
38
39 r = parse_uint(NULL, &i, &endptr, 0);
40
41 g_assert_cmpint(r, ==, -EINVAL);
42 g_assert_cmpuint(i, ==, 0);
43 g_assert_null(endptr);
44 }
45
46 static void test_parse_uint_empty(void)
47 {
48 unsigned long long i = 999;
49 char f = 'X';
50 char *endptr = &f;
51 const char *str = "";
52 int r;
53
54 r = parse_uint(str, &i, &endptr, 0);
55
56 g_assert_cmpint(r, ==, -EINVAL);
57 g_assert_cmpuint(i, ==, 0);
58 g_assert_true(endptr == str);
59 }
60
61 static void test_parse_uint_whitespace(void)
62 {
63 unsigned long long i = 999;
64 char f = 'X';
65 char *endptr = &f;
66 const char *str = " \t ";
67 int r;
68
69 r = parse_uint(str, &i, &endptr, 0);
70
71 g_assert_cmpint(r, ==, -EINVAL);
72 g_assert_cmpuint(i, ==, 0);
73 g_assert_true(endptr == str);
74 }
75
76
77 static void test_parse_uint_invalid(void)
78 {
79 unsigned long long i = 999;
80 char f = 'X';
81 char *endptr = &f;
82 const char *str = " \t xxx";
83 int r;
84
85 r = parse_uint(str, &i, &endptr, 0);
86
87 g_assert_cmpint(r, ==, -EINVAL);
88 g_assert_cmpuint(i, ==, 0);
89 g_assert_true(endptr == str);
90 }
91
92
93 static void test_parse_uint_trailing(void)
94 {
95 unsigned long long i = 999;
96 char f = 'X';
97 char *endptr = &f;
98 const char *str = "123xxx";
99 int r;
100
101 r = parse_uint(str, &i, &endptr, 0);
102
103 g_assert_cmpint(r, ==, 0);
104 g_assert_cmpuint(i, ==, 123);
105 g_assert_true(endptr == str + 3);
106 }
107
108 static void test_parse_uint_correct(void)
109 {
110 unsigned long long i = 999;
111 char f = 'X';
112 char *endptr = &f;
113 const char *str = "123";
114 int r;
115
116 r = parse_uint(str, &i, &endptr, 0);
117
118 g_assert_cmpint(r, ==, 0);
119 g_assert_cmpuint(i, ==, 123);
120 g_assert_true(endptr == str + strlen(str));
121 }
122
123 static void test_parse_uint_octal(void)
124 {
125 unsigned long long i = 999;
126 char f = 'X';
127 char *endptr = &f;
128 const char *str = "0123";
129 int r;
130
131 r = parse_uint(str, &i, &endptr, 0);
132
133 g_assert_cmpint(r, ==, 0);
134 g_assert_cmpuint(i, ==, 0123);
135 g_assert_true(endptr == str + strlen(str));
136 }
137
138 static void test_parse_uint_decimal(void)
139 {
140 unsigned long long i = 999;
141 char f = 'X';
142 char *endptr = &f;
143 const char *str = "0123";
144 int r;
145
146 r = parse_uint(str, &i, &endptr, 10);
147
148 g_assert_cmpint(r, ==, 0);
149 g_assert_cmpuint(i, ==, 123);
150 g_assert_true(endptr == str + strlen(str));
151 }
152
153 static void test_parse_uint_llong_max(void)
154 {
155 unsigned long long i = 999;
156 char f = 'X';
157 char *endptr = &f;
158 char *str = g_strdup_printf("%llu", (unsigned long long)LLONG_MAX + 1);
159 int r;
160
161 r = parse_uint(str, &i, &endptr, 0);
162
163 g_assert_cmpint(r, ==, 0);
164 g_assert_cmpuint(i, ==, (unsigned long long)LLONG_MAX + 1);
165 g_assert_true(endptr == str + strlen(str));
166
167 g_free(str);
168 }
169
170 static void test_parse_uint_max(void)
171 {
172 unsigned long long i = 999;
173 char f = 'X';
174 char *endptr = &f;
175 char *str = g_strdup_printf("%llu", ULLONG_MAX);
176 int r;
177
178 r = parse_uint(str, &i, &endptr, 0);
179
180 g_assert_cmpint(r, ==, 0);
181 g_assert_cmpuint(i, ==, ULLONG_MAX);
182 g_assert_true(endptr == str + strlen(str));
183
184 g_free(str);
185 }
186
187 static void test_parse_uint_overflow(void)
188 {
189 unsigned long long i;
190 char f = 'X';
191 char *endptr;
192 const char *str;
193 int r;
194
195 i = 999;
196 endptr = &f;
197 str = "99999999999999999999999999999999999999";
198 r = parse_uint(str, &i, &endptr, 0);
199 g_assert_cmpint(r, ==, -ERANGE);
200 g_assert_cmpuint(i, ==, ULLONG_MAX);
201 g_assert_true(endptr == str + strlen(str));
202
203 i = 999;
204 endptr = &f;
205 str = "0x10000000000000000"; /* 65 bits, 64-bit sign bit clear */
206 r = parse_uint(str, &i, &endptr, 0);
207 g_assert_cmpint(r, ==, -ERANGE);
208 g_assert_cmpuint(i, ==, ULLONG_MAX);
209 g_assert_true(endptr == str + strlen(str));
210
211 i = 999;
212 endptr = &f;
213 str = "0x18000000080000000"; /* 65 bits, 64-bit sign bit set */
214 r = parse_uint(str, &i, &endptr, 0);
215 g_assert_cmpint(r, ==, -ERANGE);
216 g_assert_cmpuint(i, ==, ULLONG_MAX);
217 g_assert_true(endptr == str + strlen(str));
218 }
219
220 static void test_parse_uint_negative(void)
221 {
222 unsigned long long i;
223 char f = 'X';
224 char *endptr;
225 const char *str;
226 int r;
227
228 i = 999;
229 endptr = &f;
230 str = " \t -321";
231 r = parse_uint(str, &i, &endptr, 0);
232 g_assert_cmpint(r, ==, -ERANGE);
233 g_assert_cmpuint(i, ==, 0);
234 g_assert_true(endptr == str + strlen(str));
235
236 i = 999;
237 endptr = &f;
238 str = "-0xffffffff00000001";
239 r = parse_uint(str, &i, &endptr, 0);
240 g_assert_cmpint(r, ==, -ERANGE);
241 g_assert_cmpuint(i, ==, 0);
242 g_assert_true(endptr == str + strlen(str));
243 }
244
245 static void test_parse_uint_negzero(void)
246 {
247 unsigned long long i = 999;
248 char f = 'X';
249 char *endptr = &f;
250 const char *str = " -0";
251 int r;
252
253 r = parse_uint(str, &i, &endptr, 0);
254
255 g_assert_cmpint(r, ==, -ERANGE);
256 g_assert_cmpuint(i, ==, 0);
257 g_assert_true(endptr == str + strlen(str));
258 }
259
260 static void test_parse_uint_full_trailing(void)
261 {
262 unsigned long long i = 999;
263 const char *str = "123xxx";
264 int r;
265
266 r = parse_uint_full(str, &i, 0);
267
268 g_assert_cmpint(r, ==, -EINVAL);
269 g_assert_cmpuint(i, ==, 0);
270 }
271
272 static void test_parse_uint_full_correct(void)
273 {
274 unsigned long long i = 999;
275 const char *str = "123";
276 int r;
277
278 r = parse_uint_full(str, &i, 0);
279
280 g_assert_cmpint(r, ==, 0);
281 g_assert_cmpuint(i, ==, 123);
282 }
283
284 static void test_parse_uint_full_erange_junk(void)
285 {
286 /* FIXME - inconsistent with qemu_strto* which favors EINVAL */
287 unsigned long long i = 999;
288 const char *str = "-2junk";
289 int r;
290
291 r = parse_uint_full(str, &i, 0);
292
293 g_assert_cmpint(r, ==, -ERANGE /* FIXME -EINVAL */);
294 g_assert_cmpuint(i, ==, 0);
295 }
296
297 static void test_qemu_strtoi_correct(void)
298 {
299 const char *str = "12345 foo";
300 char f = 'X';
301 const char *endptr = &f;
302 int res = 999;
303 int err;
304
305 err = qemu_strtoi(str, &endptr, 0, &res);
306
307 g_assert_cmpint(err, ==, 0);
308 g_assert_cmpint(res, ==, 12345);
309 g_assert_true(endptr == str + 5);
310 }
311
312 static void test_qemu_strtoi_null(void)
313 {
314 char f = 'X';
315 const char *endptr = &f;
316 int res = 999;
317 int err;
318
319 err = qemu_strtoi(NULL, &endptr, 0, &res);
320
321 g_assert_cmpint(err, ==, -EINVAL);
322 g_assert_cmpint(res, ==, 999);
323 g_assert_null(endptr);
324 }
325
326 static void test_qemu_strtoi_empty(void)
327 {
328 const char *str = "";
329 char f = 'X';
330 const char *endptr = &f;
331 int res = 999;
332 int err;
333
334 err = qemu_strtoi(str, &endptr, 0, &res);
335
336 g_assert_cmpint(err, ==, -EINVAL);
337 g_assert_cmpint(res, ==, 0);
338 g_assert_true(endptr == str);
339 }
340
341 static void test_qemu_strtoi_whitespace(void)
342 {
343 const char *str = " \t ";
344 char f = 'X';
345 const char *endptr = &f;
346 int res = 999;
347 int err;
348
349 err = qemu_strtoi(str, &endptr, 0, &res);
350
351 g_assert_cmpint(err, ==, -EINVAL);
352 g_assert_cmpint(res, ==, 0);
353 g_assert_true(endptr == str);
354 }
355
356 static void test_qemu_strtoi_invalid(void)
357 {
358 const char *str = " xxxx \t abc";
359 char f = 'X';
360 const char *endptr = &f;
361 int res = 999;
362 int err;
363
364 err = qemu_strtoi(str, &endptr, 0, &res);
365
366 g_assert_cmpint(err, ==, -EINVAL);
367 g_assert_cmpint(res, ==, 0);
368 g_assert_true(endptr == str);
369 }
370
371 static void test_qemu_strtoi_trailing(void)
372 {
373 const char *str = "123xxx";
374 char f = 'X';
375 const char *endptr = &f;
376 int res = 999;
377 int err;
378
379 err = qemu_strtoi(str, &endptr, 0, &res);
380
381 g_assert_cmpint(err, ==, 0);
382 g_assert_cmpint(res, ==, 123);
383 g_assert_true(endptr == str + 3);
384 }
385
386 static void test_qemu_strtoi_octal(void)
387 {
388 const char *str = "0123";
389 char f = 'X';
390 const char *endptr = &f;
391 int res = 999;
392 int err;
393
394 err = qemu_strtoi(str, &endptr, 8, &res);
395
396 g_assert_cmpint(err, ==, 0);
397 g_assert_cmpint(res, ==, 0123);
398 g_assert_true(endptr == str + strlen(str));
399
400 res = 999;
401 endptr = &f;
402 err = qemu_strtoi(str, &endptr, 0, &res);
403
404 g_assert_cmpint(err, ==, 0);
405 g_assert_cmpint(res, ==, 0123);
406 g_assert_true(endptr == str + strlen(str));
407 }
408
409 static void test_qemu_strtoi_decimal(void)
410 {
411 const char *str = "0123";
412 char f = 'X';
413 const char *endptr = &f;
414 int res = 999;
415 int err;
416
417 err = qemu_strtoi(str, &endptr, 10, &res);
418
419 g_assert_cmpint(err, ==, 0);
420 g_assert_cmpint(res, ==, 123);
421 g_assert_true(endptr == str + strlen(str));
422
423 str = "123";
424 res = 999;
425 endptr = &f;
426 err = qemu_strtoi(str, &endptr, 0, &res);
427
428 g_assert_cmpint(err, ==, 0);
429 g_assert_cmpint(res, ==, 123);
430 g_assert_true(endptr == str + strlen(str));
431 }
432
433 static void test_qemu_strtoi_hex(void)
434 {
435 const char *str = "0123";
436 char f = 'X';
437 const char *endptr = &f;
438 int res = 999;
439 int err;
440
441 err = qemu_strtoi(str, &endptr, 16, &res);
442
443 g_assert_cmpint(err, ==, 0);
444 g_assert_cmpint(res, ==, 0x123);
445 g_assert_true(endptr == str + strlen(str));
446
447 str = "0x123";
448 res = 999;
449 endptr = &f;
450 err = qemu_strtoi(str, &endptr, 0, &res);
451
452 g_assert_cmpint(err, ==, 0);
453 g_assert_cmpint(res, ==, 0x123);
454 g_assert_true(endptr == str + strlen(str));
455
456 str = "0x";
457 res = 999;
458 endptr = &f;
459 err = qemu_strtoi(str, &endptr, 16, &res);
460
461 g_assert_cmpint(err, ==, 0);
462 g_assert_cmpint(res, ==, 0);
463 g_assert_true(endptr == str + 1);
464 }
465
466 static void test_qemu_strtoi_max(void)
467 {
468 char *str = g_strdup_printf("%d", INT_MAX);
469 char f = 'X';
470 const char *endptr = &f;
471 int res = 999;
472 int err;
473
474 err = qemu_strtoi(str, &endptr, 0, &res);
475
476 g_assert_cmpint(err, ==, 0);
477 g_assert_cmpint(res, ==, INT_MAX);
478 g_assert_true(endptr == str + strlen(str));
479 g_free(str);
480 }
481
482 static void test_qemu_strtoi_overflow(void)
483 {
484 const char *str;
485 const char *endptr;
486 int res;
487 int err;
488
489 str = "2147483648"; /* INT_MAX + 1ll */
490 endptr = "somewhere";
491 res = 999;
492 err = qemu_strtoi(str, &endptr, 0, &res);
493 g_assert_cmpint(err, ==, -ERANGE);
494 g_assert_cmpint(res, ==, INT_MAX);
495 g_assert_true(endptr == str + strlen(str));
496
497 str = "0x7fffffffffffffff"; /* LLONG_MAX */
498 endptr = "somewhere";
499 res = 999;
500 err = qemu_strtoi(str, &endptr, 0, &res);
501 g_assert_cmpint(err, ==, -ERANGE);
502 g_assert_cmpint(res, ==, INT_MAX);
503 g_assert_true(endptr == str + strlen(str));
504
505 str = "0x8000000000000000"; /* (uint64_t)LLONG_MIN */
506 endptr = "somewhere";
507 res = 999;
508 err = qemu_strtoi(str, &endptr, 0, &res);
509 g_assert_cmpint(err, ==, -ERANGE);
510 g_assert_cmpint(res, ==, INT_MAX);
511 g_assert_true(endptr == str + strlen(str));
512
513 str = "0x10000000000000000"; /* 65 bits, 32-bit sign bit clear */
514 endptr = "somewhere";
515 res = 999;
516 err = qemu_strtoi(str, &endptr, 0, &res);
517 g_assert_cmpint(err, ==, -ERANGE);
518 g_assert_cmpint(res, ==, INT_MAX);
519 g_assert_true(endptr == str + strlen(str));
520
521 str = "0x18000000080000000"; /* 65 bits, 32-bit sign bit set */
522 endptr = "somewhere";
523 res = 999;
524 err = qemu_strtoi(str, &endptr, 0, &res);
525 g_assert_cmpint(err, ==, -ERANGE);
526 g_assert_cmpint(res, ==, INT_MAX);
527 g_assert_true(endptr == str + strlen(str));
528 }
529
530 static void test_qemu_strtoi_min(void)
531 {
532 char *str = g_strdup_printf("%d", INT_MIN);
533 char f = 'X';
534 const char *endptr = &f;
535 int res = 999;
536 int err;
537
538 err = qemu_strtoi(str, &endptr, 0, &res);
539
540 g_assert_cmpint(err, ==, 0);
541 g_assert_cmpint(res, ==, INT_MIN);
542 g_assert_true(endptr == str + strlen(str));
543 g_free(str);
544 }
545
546 static void test_qemu_strtoi_underflow(void)
547 {
548 const char *str;
549 const char *endptr;
550 int res;
551 int err;
552
553 str = "-2147483649"; /* INT_MIN - 1ll */
554 endptr = "somewhere";
555 res = 999;
556 err = qemu_strtoi(str, &endptr, 0, &res);
557 g_assert_cmpint(err, ==, -ERANGE);
558 g_assert_cmpint(res, ==, INT_MIN);
559 g_assert_true(endptr == str + strlen(str));
560
561 str = "-0x7fffffffffffffff"; /* -LLONG_MAX */
562 endptr = "somewhere";
563 res = 999;
564 err = qemu_strtoi(str, &endptr, 0, &res);
565 g_assert_cmpint(err, ==, -ERANGE);
566 g_assert_cmpint(res, ==, INT_MIN);
567 g_assert_true(endptr == str + strlen(str));
568
569 str = "-0x8000000000000000"; /* (uint64_t)LLONG_MIN */
570 endptr = "somewhere";
571 res = 999;
572 err = qemu_strtoi(str, &endptr, 0, &res);
573 g_assert_cmpint(err, ==, -ERANGE);
574 g_assert_cmpint(res, ==, INT_MIN);
575 g_assert_true(endptr == str + strlen(str));
576
577 str = "-18446744073709551615"; /* -UINT64_MAX (not 1) */
578 endptr = "somewhere";
579 res = 999;
580 err = qemu_strtoi(str, &endptr, 0, &res);
581 g_assert_cmpint(err, ==, -ERANGE);
582 g_assert_cmpint(res, ==, INT_MIN);
583 g_assert_true(endptr == str + strlen(str));
584
585 str = "-0x10000000000000000"; /* 65 bits, 32-bit sign bit clear */
586 endptr = "somewhere";
587 res = 999;
588 err = qemu_strtoi(str, &endptr, 0, &res);
589 g_assert_cmpint(err, ==, -ERANGE);
590 g_assert_cmpint(res, ==, INT_MIN);
591 g_assert_true(endptr == str + strlen(str));
592
593 str = "-0x18000000080000000"; /* 65 bits, 32-bit sign bit set */
594 endptr = "somewhere";
595 res = 999;
596 err = qemu_strtoi(str, &endptr, 0, &res);
597 g_assert_cmpint(err, ==, -ERANGE);
598 g_assert_cmpint(res, ==, INT_MIN);
599 g_assert_true(endptr == str + strlen(str));
600 }
601
602 static void test_qemu_strtoi_negative(void)
603 {
604 const char *str;
605 const char *endptr;
606 int res;
607 int err;
608
609 str = " \t -321";
610 endptr = "somewhere";
611 res = 999;
612 err = qemu_strtoi(str, &endptr, 0, &res);
613 g_assert_cmpint(err, ==, 0);
614 g_assert_cmpint(res, ==, -321);
615 g_assert_true(endptr == str + strlen(str));
616
617 str = "-2147483648"; /* INT_MIN */
618 endptr = "somewhere";
619 res = 999;
620 err = qemu_strtoi(str, &endptr, 0, &res);
621 g_assert_cmpint(err, ==, 0);
622 g_assert_cmpint(res, ==, INT_MIN);
623 g_assert_true(endptr == str + strlen(str));
624 }
625
626 static void test_qemu_strtoi_negzero(void)
627 {
628 const char *str = " -0";
629 char f = 'X';
630 const char *endptr = &f;
631 int res = 999;
632 int err;
633
634 err = qemu_strtoi(str, &endptr, 0, &res);
635
636 g_assert_cmpint(err, ==, 0);
637 g_assert_cmpint(res, ==, 0);
638 g_assert_true(endptr == str + strlen(str));
639 }
640
641 static void test_qemu_strtoi_full_correct(void)
642 {
643 const char *str = "123";
644 int res = 999;
645 int err;
646
647 err = qemu_strtoi(str, NULL, 0, &res);
648
649 g_assert_cmpint(err, ==, 0);
650 g_assert_cmpint(res, ==, 123);
651 }
652
653 static void test_qemu_strtoi_full_null(void)
654 {
655 char f = 'X';
656 const char *endptr = &f;
657 int res = 999;
658 int err;
659
660 err = qemu_strtoi(NULL, &endptr, 0, &res);
661
662 g_assert_cmpint(err, ==, -EINVAL);
663 g_assert_cmpint(res, ==, 999);
664 g_assert_null(endptr);
665 }
666
667 static void test_qemu_strtoi_full_empty(void)
668 {
669 const char *str = "";
670 int res = 999;
671 int err;
672
673 err = qemu_strtoi(str, NULL, 0, &res);
674
675 g_assert_cmpint(err, ==, -EINVAL);
676 g_assert_cmpint(res, ==, 0);
677 }
678
679 static void test_qemu_strtoi_full_negative(void)
680 {
681 const char *str = " \t -321";
682 int res = 999;
683 int err;
684
685 err = qemu_strtoi(str, NULL, 0, &res);
686
687 g_assert_cmpint(err, ==, 0);
688 g_assert_cmpint(res, ==, -321);
689 }
690
691 static void test_qemu_strtoi_full_negzero(void)
692 {
693 const char *str = " -0";
694 int res = 999;
695 int err;
696
697 err = qemu_strtoi(str, NULL, 0, &res);
698
699 g_assert_cmpint(err, ==, 0);
700 g_assert_cmpint(res, ==, 0);
701 }
702
703 static void test_qemu_strtoi_full_trailing(void)
704 {
705 const char *str = "123xxx";
706 int res = 999;
707 int err;
708
709 err = qemu_strtoi(str, NULL, 0, &res);
710
711 g_assert_cmpint(err, ==, -EINVAL);
712 g_assert_cmpint(res, ==, 123);
713 }
714
715 static void test_qemu_strtoi_full_max(void)
716 {
717 char *str = g_strdup_printf("%d", INT_MAX);
718 int res = 999;
719 int err;
720
721 err = qemu_strtoi(str, NULL, 0, &res);
722
723 g_assert_cmpint(err, ==, 0);
724 g_assert_cmpint(res, ==, INT_MAX);
725 g_free(str);
726 }
727
728 static void test_qemu_strtoi_full_erange_junk(void)
729 {
730 /* EINVAL has priority over ERANGE */
731 const char *str = "-9999999999junk";
732 int res = 999;
733 int err;
734
735 err = qemu_strtoi(str, NULL, 0, &res);
736
737 g_assert_cmpint(err, ==, -EINVAL);
738 g_assert_cmpint(res, ==, INT_MIN);
739 }
740
741 static void test_qemu_strtoui_correct(void)
742 {
743 const char *str = "12345 foo";
744 char f = 'X';
745 const char *endptr = &f;
746 unsigned int res = 999;
747 int err;
748
749 err = qemu_strtoui(str, &endptr, 0, &res);
750
751 g_assert_cmpint(err, ==, 0);
752 g_assert_cmpuint(res, ==, 12345);
753 g_assert_true(endptr == str + 5);
754 }
755
756 static void test_qemu_strtoui_null(void)
757 {
758 char f = 'X';
759 const char *endptr = &f;
760 unsigned int res = 999;
761 int err;
762
763 err = qemu_strtoui(NULL, &endptr, 0, &res);
764
765 g_assert_cmpint(err, ==, -EINVAL);
766 g_assert_cmpuint(res, ==, 999);
767 g_assert_null(endptr);
768 }
769
770 static void test_qemu_strtoui_empty(void)
771 {
772 const char *str = "";
773 char f = 'X';
774 const char *endptr = &f;
775 unsigned int res = 999;
776 int err;
777
778 err = qemu_strtoui(str, &endptr, 0, &res);
779
780 g_assert_cmpint(err, ==, -EINVAL);
781 g_assert_cmpuint(res, ==, 0);
782 g_assert_true(endptr == str);
783 }
784
785 static void test_qemu_strtoui_whitespace(void)
786 {
787 const char *str = " \t ";
788 char f = 'X';
789 const char *endptr = &f;
790 unsigned int res = 999;
791 int err;
792
793 err = qemu_strtoui(str, &endptr, 0, &res);
794
795 g_assert_cmpint(err, ==, -EINVAL);
796 g_assert_cmpuint(res, ==, 0);
797 g_assert_true(endptr == str);
798 }
799
800 static void test_qemu_strtoui_invalid(void)
801 {
802 const char *str = " xxxx \t abc";
803 char f = 'X';
804 const char *endptr = &f;
805 unsigned int res = 999;
806 int err;
807
808 err = qemu_strtoui(str, &endptr, 0, &res);
809
810 g_assert_cmpint(err, ==, -EINVAL);
811 g_assert_cmpuint(res, ==, 0);
812 g_assert_true(endptr == str);
813 }
814
815 static void test_qemu_strtoui_trailing(void)
816 {
817 const char *str = "123xxx";
818 char f = 'X';
819 const char *endptr = &f;
820 unsigned int res = 999;
821 int err;
822
823 err = qemu_strtoui(str, &endptr, 0, &res);
824
825 g_assert_cmpint(err, ==, 0);
826 g_assert_cmpuint(res, ==, 123);
827 g_assert_true(endptr == str + 3);
828 }
829
830 static void test_qemu_strtoui_octal(void)
831 {
832 const char *str = "0123";
833 char f = 'X';
834 const char *endptr = &f;
835 unsigned int res = 999;
836 int err;
837
838 err = qemu_strtoui(str, &endptr, 8, &res);
839
840 g_assert_cmpint(err, ==, 0);
841 g_assert_cmpuint(res, ==, 0123);
842 g_assert_true(endptr == str + strlen(str));
843
844 res = 999;
845 endptr = &f;
846 err = qemu_strtoui(str, &endptr, 0, &res);
847
848 g_assert_cmpint(err, ==, 0);
849 g_assert_cmpuint(res, ==, 0123);
850 g_assert_true(endptr == str + strlen(str));
851 }
852
853 static void test_qemu_strtoui_decimal(void)
854 {
855 const char *str = "0123";
856 char f = 'X';
857 const char *endptr = &f;
858 unsigned int res = 999;
859 int err;
860
861 err = qemu_strtoui(str, &endptr, 10, &res);
862
863 g_assert_cmpint(err, ==, 0);
864 g_assert_cmpuint(res, ==, 123);
865 g_assert_true(endptr == str + strlen(str));
866
867 str = "123";
868 res = 999;
869 endptr = &f;
870 err = qemu_strtoui(str, &endptr, 0, &res);
871
872 g_assert_cmpint(err, ==, 0);
873 g_assert_cmpuint(res, ==, 123);
874 g_assert_true(endptr == str + strlen(str));
875 }
876
877 static void test_qemu_strtoui_hex(void)
878 {
879 const char *str = "0123";
880 char f = 'X';
881 const char *endptr = &f;
882 unsigned int res = 999;
883 int err;
884
885 err = qemu_strtoui(str, &endptr, 16, &res);
886
887 g_assert_cmpint(err, ==, 0);
888 g_assert_cmphex(res, ==, 0x123);
889 g_assert_true(endptr == str + strlen(str));
890
891 str = "0x123";
892 res = 999;
893 endptr = &f;
894 err = qemu_strtoui(str, &endptr, 0, &res);
895
896 g_assert_cmpint(err, ==, 0);
897 g_assert_cmphex(res, ==, 0x123);
898 g_assert_true(endptr == str + strlen(str));
899
900 str = "0x";
901 res = 999;
902 endptr = &f;
903 err = qemu_strtoui(str, &endptr, 16, &res);
904
905 g_assert_cmpint(err, ==, 0);
906 g_assert_cmphex(res, ==, 0);
907 g_assert_true(endptr == str + 1);
908 }
909
910 static void test_qemu_strtoui_wrap(void)
911 {
912 /* wraparound is consistent with 32-bit strtoul */
913 const char *str = "-4294967295"; /* 1 mod 2^32 */
914 char f = 'X';
915 const char *endptr = &f;
916 unsigned int res = 999;
917 int err;
918
919 err = qemu_strtoui(str, &endptr, 0, &res);
920
921 g_assert_cmpint(err, ==, 0);
922 g_assert_cmphex(res, ==, 1);
923 g_assert_true(endptr == str + strlen(str));
924 }
925
926 static void test_qemu_strtoui_max(void)
927 {
928 char *str = g_strdup_printf("%u", UINT_MAX);
929 char f = 'X';
930 const char *endptr = &f;
931 unsigned int res = 999;
932 int err;
933
934 err = qemu_strtoui(str, &endptr, 0, &res);
935
936 g_assert_cmpint(err, ==, 0);
937 g_assert_cmphex(res, ==, UINT_MAX);
938 g_assert_true(endptr == str + strlen(str));
939 g_free(str);
940 }
941
942 static void test_qemu_strtoui_overflow(void)
943 {
944 const char *str;
945 const char *endptr;
946 unsigned int res;
947 int err;
948
949 str = "4294967296"; /* UINT_MAX + 1ll */
950 endptr = "somewhere";
951 res = 999;
952 err = qemu_strtoui(str, &endptr, 0, &res);
953 g_assert_cmpint(err, ==, -ERANGE);
954 g_assert_cmpuint(res, ==, UINT_MAX);
955 g_assert_true(endptr == str + strlen(str));
956
957 str = "0x7fffffffffffffff"; /* LLONG_MAX */
958 endptr = "somewhere";
959 res = 999;
960 err = qemu_strtoui(str, &endptr, 0, &res);
961 g_assert_cmpint(err, ==, -ERANGE);
962 g_assert_cmpuint(res, ==, UINT_MAX);
963 g_assert_true(endptr == str + strlen(str));
964
965 str = "0x8000000000000000"; /* (uint64_t)LLONG_MIN */
966 endptr = "somewhere";
967 res = 999;
968 err = qemu_strtoui(str, &endptr, 0, &res);
969 g_assert_cmpint(err, ==, -ERANGE);
970 g_assert_cmpuint(res, ==, UINT_MAX);
971 g_assert_true(endptr == str + strlen(str));
972
973 str = "0xffffffff00000001"; /* ULLONG_MAX - UINT_MAX + 1 (not 1) */
974 endptr = "somewhere";
975 res = 999;
976 err = qemu_strtoui(str, &endptr, 0, &res);
977 g_assert_cmpint(err, ==, -ERANGE);
978 g_assert_cmpuint(res, ==, UINT_MAX);
979 g_assert_true(endptr == str + strlen(str));
980
981 str = "0xfffffffffffffffe"; /* ULLONG_MAX - 1 (not UINT_MAX - 1) */
982 endptr = "somewhere";
983 res = 999;
984 err = qemu_strtoui(str, &endptr, 0, &res);
985 g_assert_cmpint(err, ==, -ERANGE);
986 g_assert_cmpuint(res, ==, UINT_MAX);
987 g_assert_true(endptr == str + strlen(str));
988
989 str = "0x10000000000000000"; /* 65 bits, 32-bit sign bit clear */
990 endptr = "somewhere";
991 res = 999;
992 err = qemu_strtoui(str, &endptr, 0, &res);
993 g_assert_cmpint(err, ==, -ERANGE);
994 g_assert_cmpuint(res, ==, UINT_MAX);
995 g_assert_true(endptr == str + strlen(str));
996
997 str = "0x18000000080000000"; /* 65 bits, 32-bit sign bit set */
998 endptr = "somewhere";
999 res = 999;
1000 err = qemu_strtoui(str, &endptr, 0, &res);
1001 g_assert_cmpint(err, ==, -ERANGE);
1002 g_assert_cmpuint(res, ==, UINT_MAX);
1003 g_assert_true(endptr == str + strlen(str));
1004 }
1005
1006 static void test_qemu_strtoui_underflow(void)
1007 {
1008 const char *str;
1009 const char *endptr;
1010 unsigned int res;
1011 int err;
1012
1013 str = "-4294967296"; /* -(long long)UINT_MAX - 1ll */
1014 endptr = "somewhere";
1015 res = 999;
1016 err = qemu_strtoui(str, &endptr, 0, &res);
1017 g_assert_cmpint(err, ==, -ERANGE);
1018 g_assert_cmpuint(res, ==, UINT_MAX);
1019 g_assert_true(endptr == str + strlen(str));
1020
1021 str = "-18446744073709551615"; /* -UINT64_MAX (not -(-1)) */
1022 endptr = "somewhere";
1023 res = 999;
1024 err = qemu_strtoui(str, &endptr, 0, &res);
1025 g_assert_cmpint(err, ==, -ERANGE);
1026 g_assert_cmpuint(res, ==, UINT_MAX);
1027 g_assert_true(endptr == str + strlen(str));
1028
1029 str = "-0xffffffff00000002";
1030 endptr = "somewhere";
1031 res = 999;
1032 err = qemu_strtoui(str, &endptr, 0, &res);
1033 g_assert_cmpint(err, ==, -ERANGE);
1034 g_assert_cmpuint(res, ==, UINT_MAX);
1035 g_assert_true(endptr == str + strlen(str));
1036
1037 str = "-0x10000000000000000"; /* 65 bits, 32-bit sign bit clear */
1038 endptr = "somewhere";
1039 res = 999;
1040 err = qemu_strtoui(str, &endptr, 0, &res);
1041 g_assert_cmpint(err, ==, -ERANGE);
1042 g_assert_cmpuint(res, ==, UINT_MAX);
1043 g_assert_true(endptr == str + strlen(str));
1044
1045 str = "-0x18000000080000000"; /* 65 bits, 32-bit sign bit set */
1046 endptr = "somewhere";
1047 res = 999;
1048 err = qemu_strtoui(str, &endptr, 0, &res);
1049 g_assert_cmpint(err, ==, -ERANGE);
1050 g_assert_cmpuint(res, ==, UINT_MAX);
1051 g_assert_true(endptr == str + strlen(str));
1052 }
1053
1054 static void test_qemu_strtoui_negative(void)
1055 {
1056 const char *str = " \t -321";
1057 char f = 'X';
1058 const char *endptr = &f;
1059 unsigned int res = 999;
1060 int err;
1061
1062 err = qemu_strtoui(str, &endptr, 0, &res);
1063
1064 g_assert_cmpint(err, ==, 0);
1065 g_assert_cmpuint(res, ==, (unsigned int)-321);
1066 g_assert_true(endptr == str + strlen(str));
1067 }
1068
1069 static void test_qemu_strtoui_negzero(void)
1070 {
1071 const char *str = " -0";
1072 char f = 'X';
1073 const char *endptr = &f;
1074 unsigned int res = 999;
1075 int err;
1076
1077 err = qemu_strtoui(str, &endptr, 0, &res);
1078
1079 g_assert_cmpint(err, ==, 0);
1080 g_assert_cmpuint(res, ==, 0);
1081 g_assert_true(endptr == str + strlen(str));
1082 }
1083
1084 static void test_qemu_strtoui_full_correct(void)
1085 {
1086 const char *str = "123";
1087 unsigned int res = 999;
1088 int err;
1089
1090 err = qemu_strtoui(str, NULL, 0, &res);
1091
1092 g_assert_cmpint(err, ==, 0);
1093 g_assert_cmpuint(res, ==, 123);
1094 }
1095
1096 static void test_qemu_strtoui_full_null(void)
1097 {
1098 unsigned int res = 999;
1099 int err;
1100
1101 err = qemu_strtoui(NULL, NULL, 0, &res);
1102
1103 g_assert_cmpint(err, ==, -EINVAL);
1104 g_assert_cmpuint(res, ==, 999);
1105 }
1106
1107 static void test_qemu_strtoui_full_empty(void)
1108 {
1109 const char *str = "";
1110 unsigned int res = 999;
1111 int err;
1112
1113 err = qemu_strtoui(str, NULL, 0, &res);
1114
1115 g_assert_cmpint(err, ==, -EINVAL);
1116 g_assert_cmpuint(res, ==, 0);
1117 }
1118
1119 static void test_qemu_strtoui_full_negative(void)
1120 {
1121 const char *str = " \t -321";
1122 unsigned int res = 999;
1123 int err;
1124
1125 err = qemu_strtoui(str, NULL, 0, &res);
1126 g_assert_cmpint(err, ==, 0);
1127 g_assert_cmpuint(res, ==, (unsigned int)-321);
1128 }
1129
1130 static void test_qemu_strtoui_full_negzero(void)
1131 {
1132 const char *str = " -0";
1133 unsigned int res = 999;
1134 int err;
1135
1136 err = qemu_strtoui(str, NULL, 0, &res);
1137 g_assert_cmpint(err, ==, 0);
1138 g_assert_cmpuint(res, ==, 0);
1139 }
1140
1141 static void test_qemu_strtoui_full_trailing(void)
1142 {
1143 const char *str = "123xxx";
1144 unsigned int res = 999;
1145 int err;
1146
1147 err = qemu_strtoui(str, NULL, 0, &res);
1148
1149 g_assert_cmpint(err, ==, -EINVAL);
1150 g_assert_cmpuint(res, ==, 123);
1151 }
1152
1153 static void test_qemu_strtoui_full_max(void)
1154 {
1155 char *str = g_strdup_printf("%u", UINT_MAX);
1156 unsigned int res = 999;
1157 int err;
1158
1159 err = qemu_strtoui(str, NULL, 0, &res);
1160
1161 g_assert_cmpint(err, ==, 0);
1162 g_assert_cmphex(res, ==, UINT_MAX);
1163 g_free(str);
1164 }
1165
1166 static void test_qemu_strtoui_full_erange_junk(void)
1167 {
1168 /* EINVAL has priority over ERANGE */
1169 const char *str = "-9999999999junk";
1170 unsigned int res = 999;
1171 int err;
1172
1173 err = qemu_strtoui(str, NULL, 0, &res);
1174
1175 g_assert_cmpint(err, ==, -EINVAL);
1176 g_assert_cmpuint(res, ==, UINT_MAX);
1177 }
1178
1179 static void test_qemu_strtol_correct(void)
1180 {
1181 const char *str = "12345 foo";
1182 char f = 'X';
1183 const char *endptr = &f;
1184 long res = 999;
1185 int err;
1186
1187 err = qemu_strtol(str, &endptr, 0, &res);
1188
1189 g_assert_cmpint(err, ==, 0);
1190 g_assert_cmpint(res, ==, 12345);
1191 g_assert_true(endptr == str + 5);
1192 }
1193
1194 static void test_qemu_strtol_null(void)
1195 {
1196 char f = 'X';
1197 const char *endptr = &f;
1198 long res = 999;
1199 int err;
1200
1201 err = qemu_strtol(NULL, &endptr, 0, &res);
1202
1203 g_assert_cmpint(err, ==, -EINVAL);
1204 g_assert_cmpint(res, ==, 999);
1205 g_assert_null(endptr);
1206 }
1207
1208 static void test_qemu_strtol_empty(void)
1209 {
1210 const char *str = "";
1211 char f = 'X';
1212 const char *endptr = &f;
1213 long res = 999;
1214 int err;
1215
1216 err = qemu_strtol(str, &endptr, 0, &res);
1217
1218 g_assert_cmpint(err, ==, -EINVAL);
1219 g_assert_cmpint(res, ==, 0);
1220 g_assert_true(endptr == str);
1221 }
1222
1223 static void test_qemu_strtol_whitespace(void)
1224 {
1225 const char *str = " \t ";
1226 char f = 'X';
1227 const char *endptr = &f;
1228 long res = 999;
1229 int err;
1230
1231 err = qemu_strtol(str, &endptr, 0, &res);
1232
1233 g_assert_cmpint(err, ==, -EINVAL);
1234 g_assert_cmpint(res, ==, 0);
1235 g_assert_true(endptr == str);
1236 }
1237
1238 static void test_qemu_strtol_invalid(void)
1239 {
1240 const char *str = " xxxx \t abc";
1241 char f = 'X';
1242 const char *endptr = &f;
1243 long res = 999;
1244 int err;
1245
1246 err = qemu_strtol(str, &endptr, 0, &res);
1247
1248 g_assert_cmpint(err, ==, -EINVAL);
1249 g_assert_cmpint(res, ==, 0);
1250 g_assert_true(endptr == str);
1251 }
1252
1253 static void test_qemu_strtol_trailing(void)
1254 {
1255 const char *str = "123xxx";
1256 char f = 'X';
1257 const char *endptr = &f;
1258 long res = 999;
1259 int err;
1260
1261 err = qemu_strtol(str, &endptr, 0, &res);
1262
1263 g_assert_cmpint(err, ==, 0);
1264 g_assert_cmpint(res, ==, 123);
1265 g_assert_true(endptr == str + 3);
1266 }
1267
1268 static void test_qemu_strtol_octal(void)
1269 {
1270 const char *str = "0123";
1271 char f = 'X';
1272 const char *endptr = &f;
1273 long res = 999;
1274 int err;
1275
1276 err = qemu_strtol(str, &endptr, 8, &res);
1277
1278 g_assert_cmpint(err, ==, 0);
1279 g_assert_cmpint(res, ==, 0123);
1280 g_assert_true(endptr == str + strlen(str));
1281
1282 res = 999;
1283 endptr = &f;
1284 err = qemu_strtol(str, &endptr, 0, &res);
1285
1286 g_assert_cmpint(err, ==, 0);
1287 g_assert_cmpint(res, ==, 0123);
1288 g_assert_true(endptr == str + strlen(str));
1289 }
1290
1291 static void test_qemu_strtol_decimal(void)
1292 {
1293 const char *str = "0123";
1294 char f = 'X';
1295 const char *endptr = &f;
1296 long res = 999;
1297 int err;
1298
1299 err = qemu_strtol(str, &endptr, 10, &res);
1300
1301 g_assert_cmpint(err, ==, 0);
1302 g_assert_cmpint(res, ==, 123);
1303 g_assert_true(endptr == str + strlen(str));
1304
1305 str = "123";
1306 res = 999;
1307 endptr = &f;
1308 err = qemu_strtol(str, &endptr, 0, &res);
1309
1310 g_assert_cmpint(err, ==, 0);
1311 g_assert_cmpint(res, ==, 123);
1312 g_assert_true(endptr == str + strlen(str));
1313 }
1314
1315 static void test_qemu_strtol_hex(void)
1316 {
1317 const char *str = "0123";
1318 char f = 'X';
1319 const char *endptr = &f;
1320 long res = 999;
1321 int err;
1322
1323 err = qemu_strtol(str, &endptr, 16, &res);
1324
1325 g_assert_cmpint(err, ==, 0);
1326 g_assert_cmpint(res, ==, 0x123);
1327 g_assert_true(endptr == str + strlen(str));
1328
1329 str = "0x123";
1330 res = 999;
1331 endptr = &f;
1332 err = qemu_strtol(str, &endptr, 0, &res);
1333
1334 g_assert_cmpint(err, ==, 0);
1335 g_assert_cmpint(res, ==, 0x123);
1336 g_assert_true(endptr == str + strlen(str));
1337
1338 str = "0x";
1339 res = 999;
1340 endptr = &f;
1341 err = qemu_strtol(str, &endptr, 16, &res);
1342
1343 g_assert_cmpint(err, ==, 0);
1344 g_assert_cmpint(res, ==, 0);
1345 g_assert_true(endptr == str + 1);
1346 }
1347
1348 static void test_qemu_strtol_max(void)
1349 {
1350 char *str = g_strdup_printf("%ld", LONG_MAX);
1351 char f = 'X';
1352 const char *endptr = &f;
1353 long res = 999;
1354 int err;
1355
1356 err = qemu_strtol(str, &endptr, 0, &res);
1357
1358 g_assert_cmpint(err, ==, 0);
1359 g_assert_cmpint(res, ==, LONG_MAX);
1360 g_assert_true(endptr == str + strlen(str));
1361 g_free(str);
1362 }
1363
1364 static void test_qemu_strtol_overflow(void)
1365 {
1366 const char *str;
1367 const char *endptr;
1368 long res;
1369 int err;
1370
1371 /* 1 more than LONG_MAX */
1372 str = LONG_MAX == INT_MAX ? "2147483648" : "9223372036854775808";
1373 endptr = "somewhere";
1374 res = 999;
1375 err = qemu_strtol(str, &endptr, 0, &res);
1376 g_assert_cmpint(err, ==, -ERANGE);
1377 g_assert_cmpint(res, ==, LONG_MAX);
1378 g_assert_true(endptr == str + strlen(str));
1379
1380 if (LONG_MAX == INT_MAX) {
1381 str = "0xffffffff00000001"; /* ULLONG_MAX - UINT_MAX + 1 (not 1) */
1382 endptr = "somewhere";
1383 res = 999;
1384 err = qemu_strtol(str, &endptr, 0, &res);
1385 g_assert_cmpint(err, ==, -ERANGE);
1386 g_assert_cmpint(res, ==, LONG_MAX);
1387 g_assert_true(endptr == str + strlen(str));
1388 }
1389
1390 str = "0x10000000000000000"; /* 65 bits, either sign bit position clear */
1391 endptr = "somewhere";
1392 res = 999;
1393 err = qemu_strtol(str, &endptr, 0, &res);
1394 g_assert_cmpint(err, ==, -ERANGE);
1395 g_assert_cmpint(res, ==, LONG_MAX);
1396 g_assert_true(endptr == str + strlen(str));
1397
1398 str = "0x18000000080000000"; /* 65 bits, either sign bit position set */
1399 endptr = "somewhere";
1400 res = 999;
1401 err = qemu_strtol(str, &endptr, 0, &res);
1402 g_assert_cmpint(err, ==, -ERANGE);
1403 g_assert_cmpint(res, ==, LONG_MAX);
1404 g_assert_true(endptr == str + strlen(str));
1405 }
1406
1407 static void test_qemu_strtol_min(void)
1408 {
1409 char *str = g_strdup_printf("%ld", LONG_MIN);
1410 char f = 'X';
1411 const char *endptr = &f;
1412 long res = 999;
1413 int err;
1414
1415 err = qemu_strtol(str, &endptr, 0, &res);
1416
1417 g_assert_cmpint(err, ==, 0);
1418 g_assert_cmpint(res, ==, LONG_MIN);
1419 g_assert_true(endptr == str + strlen(str));
1420 g_free(str);
1421 }
1422
1423 static void test_qemu_strtol_underflow(void)
1424 {
1425 const char *str;
1426 const char *endptr;
1427 long res;
1428 int err;
1429
1430 /* 1 less than LONG_MIN */
1431 str = LONG_MIN == INT_MIN ? "-2147483649" : "-9223372036854775809";
1432 endptr = "somewhere";
1433 res = 999;
1434 err = qemu_strtol(str, &endptr, 0, &res);
1435 g_assert_cmpint(err, ==, -ERANGE);
1436 g_assert_cmpint(res, ==, LONG_MIN);
1437 g_assert_true(endptr == str + strlen(str));
1438
1439 if (LONG_MAX == INT_MAX) {
1440 str = "-18446744073709551615"; /* -UINT64_MAX (not 1) */
1441 endptr = "somewhere";
1442 res = 999;
1443 err = qemu_strtol(str, &endptr, 0, &res);
1444 g_assert_cmpint(err, ==, -ERANGE);
1445 g_assert_cmpint(res, ==, LONG_MIN);
1446 g_assert_true(endptr == str + strlen(str));
1447 }
1448
1449 str = "-0x10000000000000000"; /* 65 bits, either sign bit position clear */
1450 endptr = "somewhere";
1451 res = 999;
1452 err = qemu_strtol(str, &endptr, 0, &res);
1453 g_assert_cmpint(err, ==, -ERANGE);
1454 g_assert_cmpint(res, ==, LONG_MIN);
1455 g_assert_true(endptr == str + strlen(str));
1456
1457 str = "-0x18000000080000000"; /* 65 bits, either sign bit position set */
1458 endptr = "somewhere";
1459 res = 999;
1460 err = qemu_strtol(str, &endptr, 0, &res);
1461 g_assert_cmpint(err, ==, -ERANGE);
1462 g_assert_cmpint(res, ==, LONG_MIN);
1463 g_assert_true(endptr == str + strlen(str));
1464 }
1465
1466 static void test_qemu_strtol_negative(void)
1467 {
1468 const char *str = " \t -321";
1469 char f = 'X';
1470 const char *endptr = &f;
1471 long res = 999;
1472 int err;
1473
1474 err = qemu_strtol(str, &endptr, 0, &res);
1475
1476 g_assert_cmpint(err, ==, 0);
1477 g_assert_cmpint(res, ==, -321);
1478 g_assert_true(endptr == str + strlen(str));
1479 }
1480
1481 static void test_qemu_strtol_negzero(void)
1482 {
1483 const char *str = " -0";
1484 char f = 'X';
1485 const char *endptr = &f;
1486 long res = 999;
1487 int err;
1488
1489 err = qemu_strtol(str, &endptr, 0, &res);
1490
1491 g_assert_cmpint(err, ==, 0);
1492 g_assert_cmpint(res, ==, 0);
1493 g_assert_true(endptr == str + strlen(str));
1494 }
1495
1496 static void test_qemu_strtol_full_correct(void)
1497 {
1498 const char *str = "123";
1499 long res = 999;
1500 int err;
1501
1502 err = qemu_strtol(str, NULL, 0, &res);
1503
1504 g_assert_cmpint(err, ==, 0);
1505 g_assert_cmpint(res, ==, 123);
1506 }
1507
1508 static void test_qemu_strtol_full_null(void)
1509 {
1510 char f = 'X';
1511 const char *endptr = &f;
1512 long res = 999;
1513 int err;
1514
1515 err = qemu_strtol(NULL, &endptr, 0, &res);
1516
1517 g_assert_cmpint(err, ==, -EINVAL);
1518 g_assert_cmpint(res, ==, 999);
1519 g_assert_null(endptr);
1520 }
1521
1522 static void test_qemu_strtol_full_empty(void)
1523 {
1524 const char *str = "";
1525 long res = 999L;
1526 int err;
1527
1528 err = qemu_strtol(str, NULL, 0, &res);
1529
1530 g_assert_cmpint(err, ==, -EINVAL);
1531 g_assert_cmpint(res, ==, 0);
1532 }
1533
1534 static void test_qemu_strtol_full_negative(void)
1535 {
1536 const char *str = " \t -321";
1537 long res = 999;
1538 int err;
1539
1540 err = qemu_strtol(str, NULL, 0, &res);
1541
1542 g_assert_cmpint(err, ==, 0);
1543 g_assert_cmpint(res, ==, -321);
1544 }
1545
1546 static void test_qemu_strtol_full_negzero(void)
1547 {
1548 const char *str = " -0";
1549 long res = 999;
1550 int err;
1551
1552 err = qemu_strtol(str, NULL, 0, &res);
1553
1554 g_assert_cmpint(err, ==, 0);
1555 g_assert_cmpint(res, ==, 0);
1556 }
1557
1558 static void test_qemu_strtol_full_trailing(void)
1559 {
1560 const char *str = "123xxx";
1561 long res = 999;
1562 int err;
1563
1564 err = qemu_strtol(str, NULL, 0, &res);
1565
1566 g_assert_cmpint(err, ==, -EINVAL);
1567 g_assert_cmpint(res, ==, 123);
1568 }
1569
1570 static void test_qemu_strtol_full_max(void)
1571 {
1572 char *str = g_strdup_printf("%ld", LONG_MAX);
1573 long res = 999;
1574 int err;
1575
1576 err = qemu_strtol(str, NULL, 0, &res);
1577
1578 g_assert_cmpint(err, ==, 0);
1579 g_assert_cmpint(res, ==, LONG_MAX);
1580 g_free(str);
1581 }
1582
1583 static void test_qemu_strtol_full_erange_junk(void)
1584 {
1585 /* EINVAL has priority over ERANGE */
1586 const char *str = "-99999999999999999999junk";
1587 long res = 999;
1588 int err;
1589
1590 err = qemu_strtol(str, NULL, 0, &res);
1591
1592 g_assert_cmpint(err, ==, -EINVAL);
1593 g_assert_cmpint(res, ==, LONG_MIN);
1594 }
1595
1596 static void test_qemu_strtoul_correct(void)
1597 {
1598 const char *str = "12345 foo";
1599 char f = 'X';
1600 const char *endptr = &f;
1601 unsigned long res = 999;
1602 int err;
1603
1604 err = qemu_strtoul(str, &endptr, 0, &res);
1605
1606 g_assert_cmpint(err, ==, 0);
1607 g_assert_cmpuint(res, ==, 12345);
1608 g_assert_true(endptr == str + 5);
1609 }
1610
1611 static void test_qemu_strtoul_null(void)
1612 {
1613 char f = 'X';
1614 const char *endptr = &f;
1615 unsigned long res = 999;
1616 int err;
1617
1618 err = qemu_strtoul(NULL, &endptr, 0, &res);
1619
1620 g_assert_cmpint(err, ==, -EINVAL);
1621 g_assert_cmpuint(res, ==, 999);
1622 g_assert_null(endptr);
1623 }
1624
1625 static void test_qemu_strtoul_empty(void)
1626 {
1627 const char *str = "";
1628 char f = 'X';
1629 const char *endptr = &f;
1630 unsigned long res = 999;
1631 int err;
1632
1633 err = qemu_strtoul(str, &endptr, 0, &res);
1634
1635 g_assert_cmpint(err, ==, -EINVAL);
1636 g_assert_cmpuint(res, ==, 0);
1637 g_assert_true(endptr == str);
1638 }
1639
1640 static void test_qemu_strtoul_whitespace(void)
1641 {
1642 const char *str = " \t ";
1643 char f = 'X';
1644 const char *endptr = &f;
1645 unsigned long res = 999;
1646 int err;
1647
1648 err = qemu_strtoul(str, &endptr, 0, &res);
1649
1650 g_assert_cmpint(err, ==, -EINVAL);
1651 g_assert_cmpuint(res, ==, 0);
1652 g_assert_true(endptr == str);
1653 }
1654
1655 static void test_qemu_strtoul_invalid(void)
1656 {
1657 const char *str = " xxxx \t abc";
1658 char f = 'X';
1659 const char *endptr = &f;
1660 unsigned long res = 999;
1661 int err;
1662
1663 err = qemu_strtoul(str, &endptr, 0, &res);
1664
1665 g_assert_cmpint(err, ==, -EINVAL);
1666 g_assert_cmpuint(res, ==, 0);
1667 g_assert_true(endptr == str);
1668 }
1669
1670 static void test_qemu_strtoul_trailing(void)
1671 {
1672 const char *str = "123xxx";
1673 char f = 'X';
1674 const char *endptr = &f;
1675 unsigned long res = 999;
1676 int err;
1677
1678 err = qemu_strtoul(str, &endptr, 0, &res);
1679
1680 g_assert_cmpint(err, ==, 0);
1681 g_assert_cmpuint(res, ==, 123);
1682 g_assert_true(endptr == str + 3);
1683 }
1684
1685 static void test_qemu_strtoul_octal(void)
1686 {
1687 const char *str = "0123";
1688 char f = 'X';
1689 const char *endptr = &f;
1690 unsigned long res = 999;
1691 int err;
1692
1693 err = qemu_strtoul(str, &endptr, 8, &res);
1694
1695 g_assert_cmpint(err, ==, 0);
1696 g_assert_cmpuint(res, ==, 0123);
1697 g_assert_true(endptr == str + strlen(str));
1698
1699 res = 999;
1700 endptr = &f;
1701 err = qemu_strtoul(str, &endptr, 0, &res);
1702
1703 g_assert_cmpint(err, ==, 0);
1704 g_assert_cmpuint(res, ==, 0123);
1705 g_assert_true(endptr == str + strlen(str));
1706 }
1707
1708 static void test_qemu_strtoul_decimal(void)
1709 {
1710 const char *str = "0123";
1711 char f = 'X';
1712 const char *endptr = &f;
1713 unsigned long res = 999;
1714 int err;
1715
1716 err = qemu_strtoul(str, &endptr, 10, &res);
1717
1718 g_assert_cmpint(err, ==, 0);
1719 g_assert_cmpuint(res, ==, 123);
1720 g_assert_true(endptr == str + strlen(str));
1721
1722 str = "123";
1723 res = 999;
1724 endptr = &f;
1725 err = qemu_strtoul(str, &endptr, 0, &res);
1726
1727 g_assert_cmpint(err, ==, 0);
1728 g_assert_cmpuint(res, ==, 123);
1729 g_assert_true(endptr == str + strlen(str));
1730 }
1731
1732 static void test_qemu_strtoul_hex(void)
1733 {
1734 const char *str = "0123";
1735 char f = 'X';
1736 const char *endptr = &f;
1737 unsigned long res = 999;
1738 int err;
1739
1740 err = qemu_strtoul(str, &endptr, 16, &res);
1741
1742 g_assert_cmpint(err, ==, 0);
1743 g_assert_cmphex(res, ==, 0x123);
1744 g_assert_true(endptr == str + strlen(str));
1745
1746 str = "0x123";
1747 res = 999;
1748 endptr = &f;
1749 err = qemu_strtoul(str, &endptr, 0, &res);
1750
1751 g_assert_cmpint(err, ==, 0);
1752 g_assert_cmphex(res, ==, 0x123);
1753 g_assert_true(endptr == str + strlen(str));
1754
1755 str = "0x";
1756 res = 999;
1757 endptr = &f;
1758 err = qemu_strtoul(str, &endptr, 16, &res);
1759
1760 g_assert_cmpint(err, ==, 0);
1761 g_assert_cmphex(res, ==, 0);
1762 g_assert_true(endptr == str + 1);
1763 }
1764
1765 static void test_qemu_strtoul_wrap(void)
1766 {
1767 const char *str;
1768 char f = 'X';
1769 const char *endptr = &f;
1770 unsigned long res = 999;
1771 int err;
1772
1773 /* 1 mod 2^(sizeof(long)*8) */
1774 str = LONG_MAX == INT_MAX ? "-4294967295" : "-18446744073709551615";
1775 err = qemu_strtoul(str, &endptr, 0, &res);
1776
1777 g_assert_cmpint(err, ==, 0);
1778 g_assert_cmphex(res, ==, 1);
1779 g_assert_true(endptr == str + strlen(str));
1780 }
1781
1782 static void test_qemu_strtoul_max(void)
1783 {
1784 char *str = g_strdup_printf("%lu", ULONG_MAX);
1785 char f = 'X';
1786 const char *endptr = &f;
1787 unsigned long res = 999;
1788 int err;
1789
1790 err = qemu_strtoul(str, &endptr, 0, &res);
1791
1792 g_assert_cmpint(err, ==, 0);
1793 g_assert_cmphex(res, ==, ULONG_MAX);
1794 g_assert_true(endptr == str + strlen(str));
1795 g_free(str);
1796 }
1797
1798 static void test_qemu_strtoul_overflow(void)
1799 {
1800 const char *str;
1801 const char *endptr;
1802 unsigned long res;
1803 int err;
1804
1805 /* 1 more than ULONG_MAX */
1806 str = ULONG_MAX == UINT_MAX ? "4294967296" : "18446744073709551616";
1807 endptr = "somewhere";
1808 res = 999;
1809 err = qemu_strtoul(str, &endptr, 0, &res);
1810 g_assert_cmpint(err, ==, -ERANGE);
1811 g_assert_cmpuint(res, ==, ULONG_MAX);
1812 g_assert_true(endptr == str + strlen(str));
1813
1814 if (LONG_MAX == INT_MAX) {
1815 str = "0xffffffff00000001"; /* UINT64_MAX - UINT_MAX + 1 (not 1) */
1816 endptr = "somewhere";
1817 res = 999;
1818 err = qemu_strtoul(str, &endptr, 0, &res);
1819 g_assert_cmpint(err, ==, -ERANGE);
1820 g_assert_cmpuint(res, ==, ULONG_MAX);
1821 g_assert_true(endptr == str + strlen(str));
1822 }
1823
1824 str = "0x10000000000000000"; /* 65 bits, either sign bit position clear */
1825 endptr = "somewhere";
1826 res = 999;
1827 err = qemu_strtoul(str, &endptr, 0, &res);
1828 g_assert_cmpint(err, ==, -ERANGE);
1829 g_assert_cmpuint(res, ==, ULONG_MAX);
1830 g_assert_true(endptr == str + strlen(str));
1831
1832 str = "0x18000000080000000"; /* 65 bits, either sign bit position set */
1833 endptr = "somewhere";
1834 res = 999;
1835 err = qemu_strtoul(str, &endptr, 0, &res);
1836 g_assert_cmpint(err, ==, -ERANGE);
1837 g_assert_cmpuint(res, ==, ULONG_MAX);
1838 g_assert_true(endptr == str + strlen(str));
1839 }
1840
1841 static void test_qemu_strtoul_underflow(void)
1842 {
1843 const char *str;
1844 const char *endptr;
1845 unsigned long res;
1846 int err;
1847
1848 /* 1 less than -ULONG_MAX */
1849 str = ULONG_MAX == UINT_MAX ? "-4294967296" : "-18446744073709551616";
1850 endptr = "somewhere";
1851 res = 999;
1852 err = qemu_strtoul(str, &endptr, 0, &res);
1853 g_assert_cmpint(err, ==, -ERANGE);
1854 g_assert_cmpuint(res, ==, ULONG_MAX);
1855 g_assert_true(endptr == str + strlen(str));
1856
1857 if (LONG_MAX == INT_MAX) {
1858 str = "-0xffffffff00000002";
1859 endptr = "somewhere";
1860 res = 999;
1861 err = qemu_strtoul(str, &endptr, 0, &res);
1862 g_assert_cmpint(err, ==, -ERANGE);
1863 g_assert_cmpuint(res, ==, ULONG_MAX);
1864 g_assert_true(endptr == str + strlen(str));
1865 }
1866
1867 str = "-0x10000000000000000"; /* 65 bits, either sign bit position clear */
1868 endptr = "somewhere";
1869 res = 999;
1870 err = qemu_strtoul(str, &endptr, 0, &res);
1871 g_assert_cmpint(err, ==, -ERANGE);
1872 g_assert_cmpuint(res, ==, ULONG_MAX);
1873 g_assert_true(endptr == str + strlen(str));
1874
1875 str = "-0x18000000080000000"; /* 65 bits, either sign bit position set */
1876 endptr = "somewhere";
1877 res = 999;
1878 err = qemu_strtoul(str, &endptr, 0, &res);
1879 g_assert_cmpint(err, ==, -ERANGE);
1880 g_assert_cmpuint(res, ==, ULONG_MAX);
1881 g_assert_true(endptr == str + strlen(str));
1882 }
1883
1884 static void test_qemu_strtoul_negative(void)
1885 {
1886 const char *str = " \t -321";
1887 char f = 'X';
1888 const char *endptr = &f;
1889 unsigned long res = 999;
1890 int err;
1891
1892 err = qemu_strtoul(str, &endptr, 0, &res);
1893
1894 g_assert_cmpint(err, ==, 0);
1895 g_assert_cmpuint(res, ==, -321ul);
1896 g_assert_true(endptr == str + strlen(str));
1897 }
1898
1899 static void test_qemu_strtoul_negzero(void)
1900 {
1901 const char *str = " -0";
1902 char f = 'X';
1903 const char *endptr = &f;
1904 unsigned long res = 999;
1905 int err;
1906
1907 err = qemu_strtoul(str, &endptr, 0, &res);
1908
1909 g_assert_cmpint(err, ==, 0);
1910 g_assert_cmpuint(res, ==, 0);
1911 g_assert_true(endptr == str + strlen(str));
1912 }
1913
1914 static void test_qemu_strtoul_full_correct(void)
1915 {
1916 const char *str = "123";
1917 unsigned long res = 999;
1918 int err;
1919
1920 err = qemu_strtoul(str, NULL, 0, &res);
1921
1922 g_assert_cmpint(err, ==, 0);
1923 g_assert_cmpuint(res, ==, 123);
1924 }
1925
1926 static void test_qemu_strtoul_full_null(void)
1927 {
1928 unsigned long res = 999;
1929 int err;
1930
1931 err = qemu_strtoul(NULL, NULL, 0, &res);
1932
1933 g_assert_cmpint(err, ==, -EINVAL);
1934 g_assert_cmpuint(res, ==, 999);
1935 }
1936
1937 static void test_qemu_strtoul_full_empty(void)
1938 {
1939 const char *str = "";
1940 unsigned long res = 999;
1941 int err;
1942
1943 err = qemu_strtoul(str, NULL, 0, &res);
1944
1945 g_assert_cmpint(err, ==, -EINVAL);
1946 g_assert_cmpuint(res, ==, 0);
1947 }
1948
1949 static void test_qemu_strtoul_full_negative(void)
1950 {
1951 const char *str = " \t -321";
1952 unsigned long res = 999;
1953 int err;
1954
1955 err = qemu_strtoul(str, NULL, 0, &res);
1956 g_assert_cmpint(err, ==, 0);
1957 g_assert_cmpuint(res, ==, -321ul);
1958 }
1959
1960 static void test_qemu_strtoul_full_negzero(void)
1961 {
1962 const char *str = " -0";
1963 unsigned long res = 999;
1964 int err;
1965
1966 err = qemu_strtoul(str, NULL, 0, &res);
1967 g_assert_cmpint(err, ==, 0);
1968 g_assert_cmpuint(res, ==, 0);
1969 }
1970
1971 static void test_qemu_strtoul_full_trailing(void)
1972 {
1973 const char *str = "123xxx";
1974 unsigned long res = 999;
1975 int err;
1976
1977 err = qemu_strtoul(str, NULL, 0, &res);
1978
1979 g_assert_cmpint(err, ==, -EINVAL);
1980 g_assert_cmpuint(res, ==, 123);
1981 }
1982
1983 static void test_qemu_strtoul_full_max(void)
1984 {
1985 char *str = g_strdup_printf("%lu", ULONG_MAX);
1986 unsigned long res = 999;
1987 int err;
1988
1989 err = qemu_strtoul(str, NULL, 0, &res);
1990
1991 g_assert_cmpint(err, ==, 0);
1992 g_assert_cmphex(res, ==, ULONG_MAX);
1993 g_free(str);
1994 }
1995
1996 static void test_qemu_strtoul_full_erange_junk(void)
1997 {
1998 /* EINVAL has priority over ERANGE */
1999 const char *str = "-99999999999999999999junk";
2000 unsigned long res = 999;
2001 int err;
2002
2003 err = qemu_strtoul(str, NULL, 0, &res);
2004
2005 g_assert_cmpint(err, ==, -EINVAL);
2006 g_assert_cmpuint(res, ==, ULONG_MAX);
2007 }
2008
2009 static void test_qemu_strtoi64_correct(void)
2010 {
2011 const char *str = "12345 foo";
2012 char f = 'X';
2013 const char *endptr = &f;
2014 int64_t res = 999;
2015 int err;
2016
2017 err = qemu_strtoi64(str, &endptr, 0, &res);
2018
2019 g_assert_cmpint(err, ==, 0);
2020 g_assert_cmpint(res, ==, 12345);
2021 g_assert_true(endptr == str + 5);
2022 }
2023
2024 static void test_qemu_strtoi64_null(void)
2025 {
2026 char f = 'X';
2027 const char *endptr = &f;
2028 int64_t res = 999;
2029 int err;
2030
2031 err = qemu_strtoi64(NULL, &endptr, 0, &res);
2032
2033 g_assert_cmpint(err, ==, -EINVAL);
2034 g_assert_cmpint(res, ==, 999);
2035 g_assert_null(endptr);
2036 }
2037
2038 static void test_qemu_strtoi64_empty(void)
2039 {
2040 const char *str = "";
2041 char f = 'X';
2042 const char *endptr = &f;
2043 int64_t res = 999;
2044 int err;
2045
2046 err = qemu_strtoi64(str, &endptr, 0, &res);
2047
2048 g_assert_cmpint(err, ==, -EINVAL);
2049 g_assert_cmpint(res, ==, 0);
2050 g_assert_true(endptr == str);
2051 }
2052
2053 static void test_qemu_strtoi64_whitespace(void)
2054 {
2055 const char *str = " \t ";
2056 char f = 'X';
2057 const char *endptr = &f;
2058 int64_t res = 999;
2059 int err;
2060
2061 err = qemu_strtoi64(str, &endptr, 0, &res);
2062
2063 g_assert_cmpint(err, ==, -EINVAL);
2064 g_assert_cmpint(res, ==, 0);
2065 g_assert_true(endptr == str);
2066 }
2067
2068 static void test_qemu_strtoi64_invalid(void)
2069 {
2070 const char *str = " xxxx \t abc";
2071 char f = 'X';
2072 const char *endptr = &f;
2073 int64_t res = 999;
2074 int err;
2075
2076 err = qemu_strtoi64(str, &endptr, 0, &res);
2077
2078 g_assert_cmpint(err, ==, -EINVAL);
2079 g_assert_cmpint(res, ==, 0);
2080 g_assert_true(endptr == str);
2081 }
2082
2083 static void test_qemu_strtoi64_trailing(void)
2084 {
2085 const char *str = "123xxx";
2086 char f = 'X';
2087 const char *endptr = &f;
2088 int64_t res = 999;
2089 int err;
2090
2091 err = qemu_strtoi64(str, &endptr, 0, &res);
2092
2093 g_assert_cmpint(err, ==, 0);
2094 g_assert_cmpint(res, ==, 123);
2095 g_assert_true(endptr == str + 3);
2096 }
2097
2098 static void test_qemu_strtoi64_octal(void)
2099 {
2100 const char *str = "0123";
2101 char f = 'X';
2102 const char *endptr = &f;
2103 int64_t res = 999;
2104 int err;
2105
2106 err = qemu_strtoi64(str, &endptr, 8, &res);
2107
2108 g_assert_cmpint(err, ==, 0);
2109 g_assert_cmpint(res, ==, 0123);
2110 g_assert_true(endptr == str + strlen(str));
2111
2112 endptr = &f;
2113 res = 999;
2114 err = qemu_strtoi64(str, &endptr, 0, &res);
2115
2116 g_assert_cmpint(err, ==, 0);
2117 g_assert_cmpint(res, ==, 0123);
2118 g_assert_true(endptr == str + strlen(str));
2119 }
2120
2121 static void test_qemu_strtoi64_decimal(void)
2122 {
2123 const char *str = "0123";
2124 char f = 'X';
2125 const char *endptr = &f;
2126 int64_t res = 999;
2127 int err;
2128
2129 err = qemu_strtoi64(str, &endptr, 10, &res);
2130
2131 g_assert_cmpint(err, ==, 0);
2132 g_assert_cmpint(res, ==, 123);
2133 g_assert_true(endptr == str + strlen(str));
2134
2135 str = "123";
2136 endptr = &f;
2137 res = 999;
2138 err = qemu_strtoi64(str, &endptr, 0, &res);
2139
2140 g_assert_cmpint(err, ==, 0);
2141 g_assert_cmpint(res, ==, 123);
2142 g_assert_true(endptr == str + strlen(str));
2143 }
2144
2145 static void test_qemu_strtoi64_hex(void)
2146 {
2147 const char *str = "0123";
2148 char f = 'X';
2149 const char *endptr = &f;
2150 int64_t res = 999;
2151 int err;
2152
2153 err = qemu_strtoi64(str, &endptr, 16, &res);
2154
2155 g_assert_cmpint(err, ==, 0);
2156 g_assert_cmpint(res, ==, 0x123);
2157 g_assert_true(endptr == str + strlen(str));
2158
2159 str = "0x123";
2160 endptr = &f;
2161 res = 999;
2162 err = qemu_strtoi64(str, &endptr, 0, &res);
2163
2164 g_assert_cmpint(err, ==, 0);
2165 g_assert_cmpint(res, ==, 0x123);
2166 g_assert_true(endptr == str + strlen(str));
2167
2168 str = "0x";
2169 endptr = &f;
2170 res = 999;
2171 err = qemu_strtoi64(str, &endptr, 16, &res);
2172
2173 g_assert_cmpint(err, ==, 0);
2174 g_assert_cmpint(res, ==, 0);
2175 g_assert_true(endptr == str + 1);
2176 }
2177
2178 static void test_qemu_strtoi64_max(void)
2179 {
2180 char *str = g_strdup_printf("%lld", LLONG_MAX);
2181 char f = 'X';
2182 const char *endptr = &f;
2183 int64_t res = 999;
2184 int err;
2185
2186 err = qemu_strtoi64(str, &endptr, 0, &res);
2187
2188 g_assert_cmpint(err, ==, 0);
2189 g_assert_cmpint(res, ==, LLONG_MAX);
2190 g_assert_true(endptr == str + strlen(str));
2191 g_free(str);
2192 }
2193
2194 static void test_qemu_strtoi64_overflow(void)
2195 {
2196 const char *str;
2197 const char *endptr;
2198 int64_t res;
2199 int err;
2200
2201 str = "9223372036854775808"; /* 1 more than INT64_MAX */
2202 endptr = "somewhere";
2203 res = 999;
2204 err = qemu_strtoi64(str, &endptr, 0, &res);
2205 g_assert_cmpint(err, ==, -ERANGE);
2206 g_assert_cmpint(res, ==, INT64_MAX);
2207 g_assert_true(endptr == str + strlen(str));
2208
2209 str = "0x10000000000000000"; /* 65 bits, 64-bit sign bit clear */
2210 endptr = "somewhere";
2211 res = 999;
2212 err = qemu_strtoi64(str, &endptr, 0, &res);
2213 g_assert_cmpint(err, ==, -ERANGE);
2214 g_assert_cmpint(res, ==, INT64_MAX);
2215 g_assert_true(endptr == str + strlen(str));
2216
2217 str = "0x18000000080000000"; /* 65 bits, 64-bit sign bit set */
2218 endptr = "somewhere";
2219 res = 999;
2220 err = qemu_strtoi64(str, &endptr, 0, &res);
2221 g_assert_cmpint(err, ==, -ERANGE);
2222 g_assert_cmpint(res, ==, INT64_MAX);
2223 g_assert_true(endptr == str + strlen(str));
2224 }
2225
2226 static void test_qemu_strtoi64_min(void)
2227 {
2228 char *str = g_strdup_printf("%lld", LLONG_MIN);
2229 char f = 'X';
2230 const char *endptr = &f;
2231 int64_t res = 999;
2232 int err;
2233
2234 err = qemu_strtoi64(str, &endptr, 0, &res);
2235
2236 g_assert_cmpint(err, ==, 0);
2237 g_assert_cmpint(res, ==, LLONG_MIN);
2238 g_assert_true(endptr == str + strlen(str));
2239 g_free(str);
2240 }
2241
2242 static void test_qemu_strtoi64_underflow(void)
2243 {
2244 const char *str;
2245 const char *endptr;
2246 int64_t res;
2247 int err;
2248
2249 str = "-9223372036854775809"; /* 1 less than INT64_MIN */
2250 endptr = "somewhere";
2251 res = 999;
2252 err = qemu_strtoi64(str, &endptr, 0, &res);
2253 g_assert_cmpint(err, ==, -ERANGE);
2254 g_assert_cmpint(res, ==, INT64_MIN);
2255 g_assert_true(endptr == str + strlen(str));
2256
2257 str = "-0x10000000000000000"; /* 65 bits, 64-bit sign bit clear */
2258 endptr = "somewhere";
2259 res = 999;
2260 err = qemu_strtoi64(str, &endptr, 0, &res);
2261 g_assert_cmpint(err, ==, -ERANGE);
2262 g_assert_cmpint(res, ==, INT64_MIN);
2263 g_assert_true(endptr == str + strlen(str));
2264
2265 str = "-0x18000000080000000"; /* 65 bits, 64-bit sign bit set */
2266 endptr = "somewhere";
2267 res = 999;
2268 err = qemu_strtoi64(str, &endptr, 0, &res);
2269 g_assert_cmpint(err, ==, -ERANGE);
2270 g_assert_cmpint(res, ==, INT64_MIN);
2271 g_assert_true(endptr == str + strlen(str));
2272 }
2273
2274 static void test_qemu_strtoi64_negative(void)
2275 {
2276 const char *str = " \t -321";
2277 char f = 'X';
2278 const char *endptr = &f;
2279 int64_t res = 999;
2280 int err;
2281
2282 err = qemu_strtoi64(str, &endptr, 0, &res);
2283
2284 g_assert_cmpint(err, ==, 0);
2285 g_assert_cmpint(res, ==, -321);
2286 g_assert_true(endptr == str + strlen(str));
2287 }
2288
2289 static void test_qemu_strtoi64_negzero(void)
2290 {
2291 const char *str = " -0";
2292 char f = 'X';
2293 const char *endptr = &f;
2294 int64_t res = 999;
2295 int err;
2296
2297 err = qemu_strtoi64(str, &endptr, 0, &res);
2298
2299 g_assert_cmpint(err, ==, 0);
2300 g_assert_cmpint(res, ==, 0);
2301 g_assert_true(endptr == str + strlen(str));
2302 }
2303
2304 static void test_qemu_strtoi64_full_correct(void)
2305 {
2306 const char *str = "123";
2307 int64_t res = 999;
2308 int err;
2309
2310 err = qemu_strtoi64(str, NULL, 0, &res);
2311
2312 g_assert_cmpint(err, ==, 0);
2313 g_assert_cmpint(res, ==, 123);
2314 }
2315
2316 static void test_qemu_strtoi64_full_null(void)
2317 {
2318 int64_t res = 999;
2319 int err;
2320
2321 err = qemu_strtoi64(NULL, NULL, 0, &res);
2322
2323 g_assert_cmpint(err, ==, -EINVAL);
2324 g_assert_cmpint(res, ==, 999);
2325 }
2326
2327 static void test_qemu_strtoi64_full_empty(void)
2328 {
2329 const char *str = "";
2330 int64_t res = 999;
2331 int err;
2332
2333 err = qemu_strtoi64(str, NULL, 0, &res);
2334
2335 g_assert_cmpint(err, ==, -EINVAL);
2336 g_assert_cmpint(res, ==, 0);
2337 }
2338
2339 static void test_qemu_strtoi64_full_negative(void)
2340 {
2341 const char *str = " \t -321";
2342 int64_t res = 999;
2343 int err;
2344
2345 err = qemu_strtoi64(str, NULL, 0, &res);
2346
2347 g_assert_cmpint(err, ==, 0);
2348 g_assert_cmpint(res, ==, -321);
2349 }
2350
2351 static void test_qemu_strtoi64_full_negzero(void)
2352 {
2353 const char *str = " -0";
2354 int64_t res = 999;
2355 int err;
2356
2357 err = qemu_strtoi64(str, NULL, 0, &res);
2358
2359 g_assert_cmpint(err, ==, 0);
2360 g_assert_cmpint(res, ==, 0);
2361 }
2362
2363 static void test_qemu_strtoi64_full_trailing(void)
2364 {
2365 const char *str = "123xxx";
2366 int64_t res = 999;
2367 int err;
2368
2369 err = qemu_strtoi64(str, NULL, 0, &res);
2370
2371 g_assert_cmpint(err, ==, -EINVAL);
2372 g_assert_cmpint(res, ==, 123);
2373 }
2374
2375 static void test_qemu_strtoi64_full_max(void)
2376 {
2377
2378 char *str = g_strdup_printf("%lld", LLONG_MAX);
2379 int64_t res = 999;
2380 int err;
2381
2382 err = qemu_strtoi64(str, NULL, 0, &res);
2383
2384 g_assert_cmpint(err, ==, 0);
2385 g_assert_cmpint(res, ==, LLONG_MAX);
2386 g_free(str);
2387 }
2388
2389 static void test_qemu_strtoi64_full_erange_junk(void)
2390 {
2391 /* EINVAL has priority over ERANGE */
2392 const char *str = "-99999999999999999999junk";
2393 int64_t res = 999;
2394 int err;
2395
2396 err = qemu_strtoi64(str, NULL, 0, &res);
2397
2398 g_assert_cmpint(err, ==, -EINVAL);
2399 g_assert_cmpint(res, ==, INT64_MIN);
2400 }
2401
2402 static void test_qemu_strtou64_correct(void)
2403 {
2404 const char *str = "12345 foo";
2405 char f = 'X';
2406 const char *endptr = &f;
2407 uint64_t res = 999;
2408 int err;
2409
2410 err = qemu_strtou64(str, &endptr, 0, &res);
2411
2412 g_assert_cmpint(err, ==, 0);
2413 g_assert_cmpuint(res, ==, 12345);
2414 g_assert_true(endptr == str + 5);
2415 }
2416
2417 static void test_qemu_strtou64_null(void)
2418 {
2419 char f = 'X';
2420 const char *endptr = &f;
2421 uint64_t res = 999;
2422 int err;
2423
2424 err = qemu_strtou64(NULL, &endptr, 0, &res);
2425
2426 g_assert_cmpint(err, ==, -EINVAL);
2427 g_assert_cmpuint(res, ==, 999);
2428 g_assert_null(endptr);
2429 }
2430
2431 static void test_qemu_strtou64_empty(void)
2432 {
2433 const char *str = "";
2434 char f = 'X';
2435 const char *endptr = &f;
2436 uint64_t res = 999;
2437 int err;
2438
2439 err = qemu_strtou64(str, &endptr, 0, &res);
2440
2441 g_assert_cmpint(err, ==, -EINVAL);
2442 g_assert_cmpuint(res, ==, 0);
2443 g_assert_true(endptr == str);
2444 }
2445
2446 static void test_qemu_strtou64_whitespace(void)
2447 {
2448 const char *str = " \t ";
2449 char f = 'X';
2450 const char *endptr = &f;
2451 uint64_t res = 999;
2452 int err;
2453
2454 err = qemu_strtou64(str, &endptr, 0, &res);
2455
2456 g_assert_cmpint(err, ==, -EINVAL);
2457 g_assert_cmpuint(res, ==, 0);
2458 g_assert_true(endptr == str);
2459 }
2460
2461 static void test_qemu_strtou64_invalid(void)
2462 {
2463 const char *str = " xxxx \t abc";
2464 char f = 'X';
2465 const char *endptr = &f;
2466 uint64_t res = 999;
2467 int err;
2468
2469 err = qemu_strtou64(str, &endptr, 0, &res);
2470
2471 g_assert_cmpint(err, ==, -EINVAL);
2472 g_assert_cmpuint(res, ==, 0);
2473 g_assert_true(endptr == str);
2474 }
2475
2476 static void test_qemu_strtou64_trailing(void)
2477 {
2478 const char *str = "123xxx";
2479 char f = 'X';
2480 const char *endptr = &f;
2481 uint64_t res = 999;
2482 int err;
2483
2484 err = qemu_strtou64(str, &endptr, 0, &res);
2485
2486 g_assert_cmpint(err, ==, 0);
2487 g_assert_cmpuint(res, ==, 123);
2488 g_assert_true(endptr == str + 3);
2489 }
2490
2491 static void test_qemu_strtou64_octal(void)
2492 {
2493 const char *str = "0123";
2494 char f = 'X';
2495 const char *endptr = &f;
2496 uint64_t res = 999;
2497 int err;
2498
2499 err = qemu_strtou64(str, &endptr, 8, &res);
2500
2501 g_assert_cmpint(err, ==, 0);
2502 g_assert_cmpuint(res, ==, 0123);
2503 g_assert_true(endptr == str + strlen(str));
2504
2505 endptr = &f;
2506 res = 999;
2507 err = qemu_strtou64(str, &endptr, 0, &res);
2508
2509 g_assert_cmpint(err, ==, 0);
2510 g_assert_cmpuint(res, ==, 0123);
2511 g_assert_true(endptr == str + strlen(str));
2512 }
2513
2514 static void test_qemu_strtou64_decimal(void)
2515 {
2516 const char *str = "0123";
2517 char f = 'X';
2518 const char *endptr = &f;
2519 uint64_t res = 999;
2520 int err;
2521
2522 err = qemu_strtou64(str, &endptr, 10, &res);
2523
2524 g_assert_cmpint(err, ==, 0);
2525 g_assert_cmpuint(res, ==, 123);
2526 g_assert_true(endptr == str + strlen(str));
2527
2528 str = "123";
2529 endptr = &f;
2530 res = 999;
2531 err = qemu_strtou64(str, &endptr, 0, &res);
2532
2533 g_assert_cmpint(err, ==, 0);
2534 g_assert_cmpuint(res, ==, 123);
2535 g_assert_true(endptr == str + strlen(str));
2536 }
2537
2538 static void test_qemu_strtou64_hex(void)
2539 {
2540 const char *str = "0123";
2541 char f = 'X';
2542 const char *endptr = &f;
2543 uint64_t res = 999;
2544 int err;
2545
2546 err = qemu_strtou64(str, &endptr, 16, &res);
2547
2548 g_assert_cmpint(err, ==, 0);
2549 g_assert_cmphex(res, ==, 0x123);
2550 g_assert_true(endptr == str + strlen(str));
2551
2552 str = "0x123";
2553 endptr = &f;
2554 res = 999;
2555 err = qemu_strtou64(str, &endptr, 0, &res);
2556
2557 g_assert_cmpint(err, ==, 0);
2558 g_assert_cmphex(res, ==, 0x123);
2559 g_assert_true(endptr == str + strlen(str));
2560
2561 str = "0x";
2562 endptr = &f;
2563 res = 999;
2564 err = qemu_strtou64(str, &endptr, 16, &res);
2565
2566 g_assert_cmpint(err, ==, 0);
2567 g_assert_cmphex(res, ==, 0);
2568 g_assert_true(endptr == str + 1);
2569 }
2570
2571 static void test_qemu_strtou64_wrap(void)
2572 {
2573 const char *str = "-18446744073709551615"; /* 1 mod 2^64 */
2574 char f = 'X';
2575 const char *endptr = &f;
2576 uint64_t res = 999;
2577 int err;
2578
2579 err = qemu_strtou64(str, &endptr, 0, &res);
2580
2581 g_assert_cmpint(err, ==, 0);
2582 g_assert_cmpuint(res, ==, 1);
2583 g_assert_true(endptr == str + strlen(str));
2584 }
2585
2586 static void test_qemu_strtou64_max(void)
2587 {
2588 char *str = g_strdup_printf("%llu", ULLONG_MAX);
2589 char f = 'X';
2590 const char *endptr = &f;
2591 uint64_t res = 999;
2592 int err;
2593
2594 err = qemu_strtou64(str, &endptr, 0, &res);
2595
2596 g_assert_cmpint(err, ==, 0);
2597 g_assert_cmphex(res, ==, ULLONG_MAX);
2598 g_assert_true(endptr == str + strlen(str));
2599 g_free(str);
2600 }
2601
2602 static void test_qemu_strtou64_overflow(void)
2603 {
2604 const char *str;
2605 const char *endptr;
2606 uint64_t res;
2607 int err;
2608
2609 str = "18446744073709551616"; /* 1 more than UINT64_MAX */
2610 endptr = "somewhere";
2611 res = 999;
2612 err = qemu_strtou64(str, &endptr, 0, &res);
2613 g_assert_cmpint(err, ==, -ERANGE);
2614 g_assert_cmpuint(res, ==, UINT64_MAX);
2615 g_assert_true(endptr == str + strlen(str));
2616
2617 str = "0x10000000000000000"; /* 65 bits, 64-bit sign bit clear */
2618 endptr = "somewhere";
2619 res = 999;
2620 err = qemu_strtou64(str, &endptr, 0, &res);
2621 g_assert_cmpint(err, ==, -ERANGE);
2622 g_assert_cmpuint(res, ==, UINT64_MAX);
2623 g_assert_true(endptr == str + strlen(str));
2624
2625 str = "0x18000000080000000"; /* 65 bits, 64-bit sign bit set */
2626 endptr = "somewhere";
2627 res = 999;
2628 err = qemu_strtou64(str, &endptr, 0, &res);
2629 g_assert_cmpint(err, ==, -ERANGE);
2630 g_assert_cmpuint(res, ==, UINT64_MAX);
2631 g_assert_true(endptr == str + strlen(str));
2632 }
2633
2634 static void test_qemu_strtou64_underflow(void)
2635 {
2636 const char *str;
2637 const char *endptr;
2638 uint64_t res;
2639 int err;
2640
2641 str = "-99999999999999999999999999999999999999999999";
2642 endptr = "somewhere";
2643 res = 999;
2644 err = qemu_strtou64(str, &endptr, 0, &res);
2645 g_assert_cmpint(err, ==, -ERANGE);
2646 g_assert_cmpuint(res, ==, UINT64_MAX);
2647 g_assert_true(endptr == str + strlen(str));
2648
2649 str = "-0x10000000000000000"; /* 65 bits, 64-bit sign bit clear */
2650 endptr = "somewhere";
2651 res = 999;
2652 err = qemu_strtou64(str, &endptr, 0, &res);
2653 g_assert_cmpint(err, ==, -ERANGE);
2654 g_assert_cmpuint(res, ==, UINT64_MAX);
2655 g_assert_true(endptr == str + strlen(str));
2656
2657 str = "-0x18000000080000000"; /* 65 bits, 64-bit sign bit set */
2658 endptr = "somewhere";
2659 res = 999;
2660 err = qemu_strtou64(str, &endptr, 0, &res);
2661 g_assert_cmpint(err, ==, -ERANGE);
2662 g_assert_cmpuint(res, ==, UINT64_MAX);
2663 g_assert_true(endptr == str + strlen(str));
2664 }
2665
2666 static void test_qemu_strtou64_negative(void)
2667 {
2668 const char *str = " \t -321";
2669 char f = 'X';
2670 const char *endptr = &f;
2671 uint64_t res = 999;
2672 int err;
2673
2674 err = qemu_strtou64(str, &endptr, 0, &res);
2675
2676 g_assert_cmpint(err, ==, 0);
2677 g_assert_cmpuint(res, ==, -321ull);
2678 g_assert_true(endptr == str + strlen(str));
2679 }
2680
2681 static void test_qemu_strtou64_negzero(void)
2682 {
2683 const char *str = " -0";
2684 char f = 'X';
2685 const char *endptr = &f;
2686 uint64_t res = 999;
2687 int err;
2688
2689 err = qemu_strtou64(str, &endptr, 0, &res);
2690
2691 g_assert_cmpint(err, ==, 0);
2692 g_assert_cmpuint(res, ==, 0);
2693 g_assert_true(endptr == str + strlen(str));
2694 }
2695
2696 static void test_qemu_strtou64_full_correct(void)
2697 {
2698 const char *str = "18446744073709551614";
2699 uint64_t res = 999;
2700 int err;
2701
2702 err = qemu_strtou64(str, NULL, 0, &res);
2703
2704 g_assert_cmpint(err, ==, 0);
2705 g_assert_cmpuint(res, ==, 18446744073709551614ull);
2706 }
2707
2708 static void test_qemu_strtou64_full_null(void)
2709 {
2710 uint64_t res = 999;
2711 int err;
2712
2713 err = qemu_strtou64(NULL, NULL, 0, &res);
2714
2715 g_assert_cmpint(err, ==, -EINVAL);
2716 g_assert_cmpuint(res, ==, 999);
2717 }
2718
2719 static void test_qemu_strtou64_full_empty(void)
2720 {
2721 const char *str = "";
2722 uint64_t res = 999;
2723 int err;
2724
2725 err = qemu_strtou64(str, NULL, 0, &res);
2726
2727 g_assert_cmpint(err, ==, -EINVAL);
2728 g_assert_cmpuint(res, ==, 0);
2729 }
2730
2731 static void test_qemu_strtou64_full_negative(void)
2732 {
2733 const char *str = " \t -321";
2734 uint64_t res = 999;
2735 int err;
2736
2737 err = qemu_strtou64(str, NULL, 0, &res);
2738
2739 g_assert_cmpint(err, ==, 0);
2740 g_assert_cmpuint(res, ==, -321ull);
2741 }
2742
2743 static void test_qemu_strtou64_full_negzero(void)
2744 {
2745 const char *str = " -0";
2746 uint64_t res = 999;
2747 int err;
2748
2749 err = qemu_strtou64(str, NULL, 0, &res);
2750
2751 g_assert_cmpint(err, ==, 0);
2752 g_assert_cmpuint(res, ==, 0);
2753 }
2754
2755 static void test_qemu_strtou64_full_trailing(void)
2756 {
2757 const char *str = "18446744073709551614xxxxxx";
2758 uint64_t res = 999;
2759 int err;
2760
2761 err = qemu_strtou64(str, NULL, 0, &res);
2762
2763 g_assert_cmpint(err, ==, -EINVAL);
2764 g_assert_cmpuint(res, ==, 18446744073709551614ULL);
2765 }
2766
2767 static void test_qemu_strtou64_full_max(void)
2768 {
2769 char *str = g_strdup_printf("%lld", ULLONG_MAX);
2770 uint64_t res = 999;
2771 int err;
2772
2773 err = qemu_strtou64(str, NULL, 0, &res);
2774
2775 g_assert_cmpint(err, ==, 0);
2776 g_assert_cmphex(res, ==, ULLONG_MAX);
2777 g_free(str);
2778 }
2779
2780 static void test_qemu_strtou64_full_erange_junk(void)
2781 {
2782 /* EINVAL has priority over ERANGE */
2783 const char *str = "-99999999999999999999junk";
2784 uint64_t res = 999;
2785 int err;
2786
2787 err = qemu_strtou64(str, NULL, 0, &res);
2788
2789 g_assert_cmpint(err, ==, -EINVAL);
2790 g_assert_cmpuint(res, ==, UINT64_MAX);
2791 }
2792
2793 static void test_qemu_strtosz_simple(void)
2794 {
2795 const char *str;
2796 const char *endptr;
2797 int err;
2798 uint64_t res;
2799
2800 str = "0";
2801 endptr = str;
2802 res = 0xbaadf00d;
2803 err = qemu_strtosz(str, &endptr, &res);
2804 g_assert_cmpint(err, ==, 0);
2805 g_assert_cmpuint(res, ==, 0);
2806 g_assert_true(endptr == str + 1);
2807
2808 /* Leading 0 gives decimal results, not octal */
2809 str = "08";
2810 endptr = str;
2811 res = 0xbaadf00d;
2812 err = qemu_strtosz(str, &endptr, &res);
2813 g_assert_cmpint(err, ==, 0);
2814 g_assert_cmpuint(res, ==, 8);
2815 g_assert_true(endptr == str + 2);
2816
2817 /* Leading space is ignored */
2818 str = " 12345";
2819 endptr = str;
2820 res = 0xbaadf00d;
2821 err = qemu_strtosz(str, &endptr, &res);
2822 g_assert_cmpint(err, ==, 0);
2823 g_assert_cmpuint(res, ==, 12345);
2824 g_assert_true(endptr == str + 6);
2825
2826 res = 0xbaadf00d;
2827 err = qemu_strtosz(str, NULL, &res);
2828 g_assert_cmpint(err, ==, 0);
2829 g_assert_cmpuint(res, ==, 12345);
2830
2831 str = "9007199254740991"; /* 2^53-1 */
2832 endptr = str;
2833 res = 0xbaadf00d;
2834 err = qemu_strtosz(str, &endptr, &res);
2835 g_assert_cmpint(err, ==, 0);
2836 g_assert_cmphex(res, ==, 0x1fffffffffffffULL);
2837 g_assert_true(endptr == str + 16);
2838
2839 str = "9007199254740992"; /* 2^53 */
2840 endptr = str;
2841 res = 0xbaadf00d;
2842 err = qemu_strtosz(str, &endptr, &res);
2843 g_assert_cmpint(err, ==, 0);
2844 g_assert_cmphex(res, ==, 0x20000000000000ULL);
2845 g_assert_true(endptr == str + 16);
2846
2847 str = "9007199254740993"; /* 2^53+1 */
2848 endptr = str;
2849 res = 0xbaadf00d;
2850 err = qemu_strtosz(str, &endptr, &res);
2851 g_assert_cmpint(err, ==, 0);
2852 g_assert_cmphex(res, ==, 0x20000000000001ULL);
2853 g_assert_true(endptr == str + 16);
2854
2855 str = "18446744073709549568"; /* 0xfffffffffffff800 (53 msbs set) */
2856 endptr = str;
2857 res = 0xbaadf00d;
2858 err = qemu_strtosz(str, &endptr, &res);
2859 g_assert_cmpint(err, ==, 0);
2860 g_assert_cmphex(res, ==, 0xfffffffffffff800ULL);
2861 g_assert_true(endptr == str + 20);
2862
2863 str = "18446744073709550591"; /* 0xfffffffffffffbff */
2864 endptr = str;
2865 res = 0xbaadf00d;
2866 err = qemu_strtosz(str, &endptr, &res);
2867 g_assert_cmpint(err, ==, 0);
2868 g_assert_cmphex(res, ==, 0xfffffffffffffbffULL);
2869 g_assert_true(endptr == str + 20);
2870
2871 str = "18446744073709551615"; /* 0xffffffffffffffff */
2872 endptr = str;
2873 res = 0xbaadf00d;
2874 err = qemu_strtosz(str, &endptr, &res);
2875 g_assert_cmpint(err, ==, 0);
2876 g_assert_cmphex(res, ==, 0xffffffffffffffffULL);
2877 g_assert_true(endptr == str + 20);
2878 }
2879
2880 static void test_qemu_strtosz_hex(void)
2881 {
2882 const char *str;
2883 const char *endptr;
2884 int err;
2885 uint64_t res;
2886
2887 str = "0x0";
2888 endptr = str;
2889 res = 0xbaadf00d;
2890 err = qemu_strtosz(str, &endptr, &res);
2891 g_assert_cmpint(err, ==, 0);
2892 g_assert_cmpuint(res, ==, 0);
2893 g_assert_true(endptr == str + 3);
2894
2895 str = "0xab";
2896 endptr = str;
2897 res = 0xbaadf00d;
2898 err = qemu_strtosz(str, &endptr, &res);
2899 g_assert_cmpint(err, ==, 0);
2900 g_assert_cmpuint(res, ==, 171);
2901 g_assert_true(endptr == str + 4);
2902
2903 str = "0xae";
2904 endptr = str;
2905 res = 0xbaadf00d;
2906 err = qemu_strtosz(str, &endptr, &res);
2907 g_assert_cmpint(err, ==, 0);
2908 g_assert_cmpuint(res, ==, 174);
2909 g_assert_true(endptr == str + 4);
2910 }
2911
2912 static void test_qemu_strtosz_units(void)
2913 {
2914 const char *none = "1";
2915 const char *b = "1B";
2916 const char *k = "1K";
2917 const char *m = "1M";
2918 const char *g = "1G";
2919 const char *t = "1T";
2920 const char *p = "1P";
2921 const char *e = "1E";
2922 int err;
2923 const char *endptr;
2924 uint64_t res;
2925
2926 /* default is M */
2927 endptr = NULL;
2928 res = 0xbaadf00d;
2929 err = qemu_strtosz_MiB(none, &endptr, &res);
2930 g_assert_cmpint(err, ==, 0);
2931 g_assert_cmpuint(res, ==, MiB);
2932 g_assert_true(endptr == none + 1);
2933
2934 endptr = NULL;
2935 res = 0xbaadf00d;
2936 err = qemu_strtosz(b, &endptr, &res);
2937 g_assert_cmpint(err, ==, 0);
2938 g_assert_cmpuint(res, ==, 1);
2939 g_assert_true(endptr == b + 2);
2940
2941 endptr = NULL;
2942 res = 0xbaadf00d;
2943 err = qemu_strtosz(k, &endptr, &res);
2944 g_assert_cmpint(err, ==, 0);
2945 g_assert_cmpuint(res, ==, KiB);
2946 g_assert_true(endptr == k + 2);
2947
2948 endptr = NULL;
2949 res = 0xbaadf00d;
2950 err = qemu_strtosz(m, &endptr, &res);
2951 g_assert_cmpint(err, ==, 0);
2952 g_assert_cmpuint(res, ==, MiB);
2953 g_assert_true(endptr == m + 2);
2954
2955 endptr = NULL;
2956 res = 0xbaadf00d;
2957 err = qemu_strtosz(g, &endptr, &res);
2958 g_assert_cmpint(err, ==, 0);
2959 g_assert_cmpuint(res, ==, GiB);
2960 g_assert_true(endptr == g + 2);
2961
2962 endptr = NULL;
2963 res = 0xbaadf00d;
2964 err = qemu_strtosz(t, &endptr, &res);
2965 g_assert_cmpint(err, ==, 0);
2966 g_assert_cmpuint(res, ==, TiB);
2967 g_assert_true(endptr == t + 2);
2968
2969 endptr = NULL;
2970 res = 0xbaadf00d;
2971 err = qemu_strtosz(p, &endptr, &res);
2972 g_assert_cmpint(err, ==, 0);
2973 g_assert_cmpuint(res, ==, PiB);
2974 g_assert_true(endptr == p + 2);
2975
2976 endptr = NULL;
2977 res = 0xbaadf00d;
2978 err = qemu_strtosz(e, &endptr, &res);
2979 g_assert_cmpint(err, ==, 0);
2980 g_assert_cmpuint(res, ==, EiB);
2981 g_assert_true(endptr == e + 2);
2982 }
2983
2984 static void test_qemu_strtosz_float(void)
2985 {
2986 const char *str;
2987 int err;
2988 const char *endptr;
2989 uint64_t res;
2990
2991 str = "0.5E";
2992 endptr = str;
2993 res = 0xbaadf00d;
2994 err = qemu_strtosz(str, &endptr, &res);
2995 g_assert_cmpint(err, ==, 0);
2996 g_assert_cmpuint(res, ==, EiB / 2);
2997 g_assert_true(endptr == str + 4);
2998
2999 /* For convenience, a fraction of 0 is tolerated even on bytes */
3000 str = "1.0B";
3001 endptr = str;
3002 res = 0xbaadf00d;
3003 err = qemu_strtosz(str, &endptr, &res);
3004 g_assert_cmpint(err, ==, 0);
3005 g_assert_cmpuint(res, ==, 1);
3006 g_assert_true(endptr == str + 4);
3007
3008 /* An empty fraction is tolerated */
3009 str = "1.k";
3010 endptr = str;
3011 res = 0xbaadf00d;
3012 err = qemu_strtosz(str, &endptr, &res);
3013 g_assert_cmpint(err, ==, 0);
3014 g_assert_cmpuint(res, ==, 1024);
3015 g_assert_true(endptr == str + 3);
3016
3017 /* For convenience, we permit values that are not byte-exact */
3018 str = "12.345M";
3019 endptr = str;
3020 res = 0xbaadf00d;
3021 err = qemu_strtosz(str, &endptr, &res);
3022 g_assert_cmpint(err, ==, 0);
3023 g_assert_cmpuint(res, ==, (uint64_t) (12.345 * MiB + 0.5));
3024 g_assert_true(endptr == str + 7);
3025 }
3026
3027 static void test_qemu_strtosz_invalid(void)
3028 {
3029 const char *str;
3030 const char *endptr;
3031 int err;
3032 uint64_t res = 0xbaadf00d;
3033
3034 str = "";
3035 endptr = NULL;
3036 err = qemu_strtosz(str, &endptr, &res);
3037 g_assert_cmpint(err, ==, -EINVAL);
3038 g_assert_cmphex(res, ==, 0xbaadf00d);
3039 g_assert_true(endptr == str);
3040
3041 str = " \t ";
3042 endptr = NULL;
3043 err = qemu_strtosz(str, &endptr, &res);
3044 g_assert_cmpint(err, ==, -EINVAL);
3045 g_assert_cmphex(res, ==, 0xbaadf00d);
3046 g_assert_true(endptr == str);
3047
3048 str = "crap";
3049 endptr = NULL;
3050 err = qemu_strtosz(str, &endptr, &res);
3051 g_assert_cmpint(err, ==, -EINVAL);
3052 g_assert_cmphex(res, ==, 0xbaadf00d);
3053 g_assert_true(endptr == str);
3054
3055 str = "inf";
3056 endptr = NULL;
3057 err = qemu_strtosz(str, &endptr, &res);
3058 g_assert_cmpint(err, ==, -EINVAL);
3059 g_assert_cmphex(res, ==, 0xbaadf00d);
3060 g_assert_true(endptr == str);
3061
3062 str = "NaN";
3063 endptr = NULL;
3064 err = qemu_strtosz(str, &endptr, &res);
3065 g_assert_cmpint(err, ==, -EINVAL);
3066 g_assert_cmphex(res, ==, 0xbaadf00d);
3067 g_assert_true(endptr == str);
3068
3069 /* Fractional values require scale larger than bytes */
3070 str = "1.1B";
3071 endptr = NULL;
3072 err = qemu_strtosz(str, &endptr, &res);
3073 g_assert_cmpint(err, ==, -EINVAL);
3074 g_assert_cmphex(res, ==, 0xbaadf00d);
3075 g_assert_true(endptr == str);
3076
3077 str = "1.1";
3078 endptr = NULL;
3079 err = qemu_strtosz(str, &endptr, &res);
3080 g_assert_cmpint(err, ==, -EINVAL);
3081 g_assert_cmphex(res, ==, 0xbaadf00d);
3082 g_assert_true(endptr == str);
3083
3084 /* No floating point exponents */
3085 str = "1.5e1k";
3086 endptr = NULL;
3087 err = qemu_strtosz(str, &endptr, &res);
3088 g_assert_cmpint(err, ==, -EINVAL);
3089 g_assert_cmphex(res, ==, 0xbaadf00d);
3090 g_assert_true(endptr == str);
3091
3092 str = "1.5E+0k";
3093 endptr = NULL;
3094 err = qemu_strtosz(str, &endptr, &res);
3095 g_assert_cmpint(err, ==, -EINVAL);
3096 g_assert_cmphex(res, ==, 0xbaadf00d);
3097 g_assert_true(endptr == str);
3098
3099 /* No hex fractions */
3100 str = "0x1.8k";
3101 endptr = NULL;
3102 err = qemu_strtosz(str, &endptr, &res);
3103 g_assert_cmpint(err, ==, -EINVAL);
3104 g_assert_cmphex(res, ==, 0xbaadf00d);
3105 g_assert_true(endptr == str);
3106
3107 /* No suffixes */
3108 str = "0x18M";
3109 endptr = NULL;
3110 err = qemu_strtosz(str, &endptr, &res);
3111 g_assert_cmpint(err, ==, -EINVAL);
3112 g_assert_cmphex(res, ==, 0xbaadf00d);
3113 g_assert_true(endptr == str);
3114
3115 /* No negative values */
3116 str = "-0";
3117 endptr = NULL;
3118 err = qemu_strtosz(str, &endptr, &res);
3119 g_assert_cmpint(err, ==, -EINVAL);
3120 g_assert_cmphex(res, ==, 0xbaadf00d);
3121 g_assert_true(endptr == str);
3122
3123 str = "-1";
3124 endptr = NULL;
3125 err = qemu_strtosz(str, &endptr, &res);
3126 g_assert_cmpint(err, ==, -EINVAL);
3127 g_assert_cmphex(res, ==, 0xbaadf00d);
3128 g_assert_true(endptr == str);
3129 }
3130
3131 static void test_qemu_strtosz_trailing(void)
3132 {
3133 const char *str;
3134 const char *endptr;
3135 int err;
3136 uint64_t res;
3137
3138 str = "123xxx";
3139 endptr = NULL;
3140 res = 0xbaadf00d;
3141 err = qemu_strtosz_MiB(str, &endptr, &res);
3142 g_assert_cmpint(err, ==, 0);
3143 g_assert_cmpuint(res, ==, 123 * MiB);
3144 g_assert_true(endptr == str + 3);
3145
3146 res = 0xbaadf00d;
3147 err = qemu_strtosz(str, NULL, &res);
3148 g_assert_cmpint(err, ==, -EINVAL);
3149 g_assert_cmphex(res, ==, 0xbaadf00d);
3150
3151 str = "1kiB";
3152 endptr = NULL;
3153 res = 0xbaadf00d;
3154 err = qemu_strtosz(str, &endptr, &res);
3155 g_assert_cmpint(err, ==, 0);
3156 g_assert_cmpuint(res, ==, 1024);
3157 g_assert_true(endptr == str + 2);
3158
3159 res = 0xbaadf00d;
3160 err = qemu_strtosz(str, NULL, &res);
3161 g_assert_cmpint(err, ==, -EINVAL);
3162 g_assert_cmphex(res, ==, 0xbaadf00d);
3163
3164 str = "0x";
3165 endptr = NULL;
3166 res = 0xbaadf00d;
3167 err = qemu_strtosz(str, &endptr, &res);
3168 g_assert_cmpint(err, ==, 0);
3169 g_assert_cmpuint(res, ==, 0);
3170 g_assert_true(endptr == str + 1);
3171
3172 res = 0xbaadf00d;
3173 err = qemu_strtosz(str, NULL, &res);
3174 g_assert_cmpint(err, ==, -EINVAL);
3175 g_assert_cmphex(res, ==, 0xbaadf00d);
3176
3177 str = "0.NaN";
3178 endptr = NULL;
3179 res = 0xbaadf00d;
3180 err = qemu_strtosz(str, &endptr, &res);
3181 g_assert_cmpint(err, ==, 0);
3182 g_assert_cmpuint(res, ==, 0);
3183 g_assert_true(endptr == str + 2);
3184
3185 res = 0xbaadf00d;
3186 err = qemu_strtosz(str, NULL, &res);
3187 g_assert_cmpint(err, ==, -EINVAL);
3188 g_assert_cmphex(res, ==, 0xbaadf00d);
3189
3190 str = "123-45";
3191 endptr = NULL;
3192 res = 0xbaadf00d;
3193 err = qemu_strtosz(str, &endptr, &res);
3194 g_assert_cmpint(err, ==, 0);
3195 g_assert_cmpuint(res, ==, 123);
3196 g_assert_true(endptr == str + 3);
3197
3198 res = 0xbaadf00d;
3199 err = qemu_strtosz(str, NULL, &res);
3200 g_assert_cmpint(err, ==, -EINVAL);
3201 g_assert_cmphex(res, ==, 0xbaadf00d);
3202 }
3203
3204 static void test_qemu_strtosz_erange(void)
3205 {
3206 const char *str;
3207 const char *endptr;
3208 int err;
3209 uint64_t res = 0xbaadf00d;
3210
3211 str = "18446744073709551616"; /* 2^64; see strtosz_simple for 2^64-1 */
3212 endptr = NULL;
3213 err = qemu_strtosz(str, &endptr, &res);
3214 g_assert_cmpint(err, ==, -ERANGE);
3215 g_assert_cmphex(res, ==, 0xbaadf00d);
3216 g_assert_true(endptr == str + 20);
3217
3218 str = "20E";
3219 endptr = NULL;
3220 err = qemu_strtosz(str, &endptr, &res);
3221 g_assert_cmpint(err, ==, -ERANGE);
3222 g_assert_cmphex(res, ==, 0xbaadf00d);
3223 g_assert_true(endptr == str + 3);
3224 }
3225
3226 static void test_qemu_strtosz_metric(void)
3227 {
3228 const char *str;
3229 int err;
3230 const char *endptr;
3231 uint64_t res;
3232
3233 str = "12345k";
3234 endptr = str;
3235 res = 0xbaadf00d;
3236 err = qemu_strtosz_metric(str, &endptr, &res);
3237 g_assert_cmpint(err, ==, 0);
3238 g_assert_cmpuint(res, ==, 12345000);
3239 g_assert_true(endptr == str + 6);
3240
3241 str = "12.345M";
3242 endptr = str;
3243 res = 0xbaadf00d;
3244 err = qemu_strtosz_metric(str, &endptr, &res);
3245 g_assert_cmpint(err, ==, 0);
3246 g_assert_cmpuint(res, ==, 12345000);
3247 g_assert_true(endptr == str + 7);
3248 }
3249
3250 static void test_freq_to_str(void)
3251 {
3252 char *str;
3253
3254 str = freq_to_str(999);
3255 g_assert_cmpstr(str, ==, "999 Hz");
3256 g_free(str);
3257
3258 str = freq_to_str(1000);
3259 g_assert_cmpstr(str, ==, "1 KHz");
3260 g_free(str);
3261
3262 str = freq_to_str(1010);
3263 g_assert_cmpstr(str, ==, "1.01 KHz");
3264 g_free(str);
3265 }
3266
3267 static void test_size_to_str(void)
3268 {
3269 char *str;
3270
3271 str = size_to_str(0);
3272 g_assert_cmpstr(str, ==, "0 B");
3273 g_free(str);
3274
3275 str = size_to_str(1);
3276 g_assert_cmpstr(str, ==, "1 B");
3277 g_free(str);
3278
3279 str = size_to_str(1016);
3280 g_assert_cmpstr(str, ==, "0.992 KiB");
3281 g_free(str);
3282
3283 str = size_to_str(1024);
3284 g_assert_cmpstr(str, ==, "1 KiB");
3285 g_free(str);
3286
3287 str = size_to_str(512ull << 20);
3288 g_assert_cmpstr(str, ==, "512 MiB");
3289 g_free(str);
3290 }
3291
3292 static void test_iec_binary_prefix(void)
3293 {
3294 g_assert_cmpstr(iec_binary_prefix(0), ==, "");
3295 g_assert_cmpstr(iec_binary_prefix(10), ==, "Ki");
3296 g_assert_cmpstr(iec_binary_prefix(20), ==, "Mi");
3297 g_assert_cmpstr(iec_binary_prefix(30), ==, "Gi");
3298 g_assert_cmpstr(iec_binary_prefix(40), ==, "Ti");
3299 g_assert_cmpstr(iec_binary_prefix(50), ==, "Pi");
3300 g_assert_cmpstr(iec_binary_prefix(60), ==, "Ei");
3301 }
3302
3303 static void test_si_prefix(void)
3304 {
3305 g_assert_cmpstr(si_prefix(-18), ==, "a");
3306 g_assert_cmpstr(si_prefix(-15), ==, "f");
3307 g_assert_cmpstr(si_prefix(-12), ==, "p");
3308 g_assert_cmpstr(si_prefix(-9), ==, "n");
3309 g_assert_cmpstr(si_prefix(-6), ==, "u");
3310 g_assert_cmpstr(si_prefix(-3), ==, "m");
3311 g_assert_cmpstr(si_prefix(0), ==, "");
3312 g_assert_cmpstr(si_prefix(3), ==, "K");
3313 g_assert_cmpstr(si_prefix(6), ==, "M");
3314 g_assert_cmpstr(si_prefix(9), ==, "G");
3315 g_assert_cmpstr(si_prefix(12), ==, "T");
3316 g_assert_cmpstr(si_prefix(15), ==, "P");
3317 g_assert_cmpstr(si_prefix(18), ==, "E");
3318 }
3319
3320 int main(int argc, char **argv)
3321 {
3322 g_test_init(&argc, &argv, NULL);
3323
3324 g_test_add_func("/cutils/parse_uint/null", test_parse_uint_null);
3325 g_test_add_func("/cutils/parse_uint/empty", test_parse_uint_empty);
3326 g_test_add_func("/cutils/parse_uint/whitespace",
3327 test_parse_uint_whitespace);
3328 g_test_add_func("/cutils/parse_uint/invalid", test_parse_uint_invalid);
3329 g_test_add_func("/cutils/parse_uint/trailing", test_parse_uint_trailing);
3330 g_test_add_func("/cutils/parse_uint/correct", test_parse_uint_correct);
3331 g_test_add_func("/cutils/parse_uint/octal", test_parse_uint_octal);
3332 g_test_add_func("/cutils/parse_uint/decimal", test_parse_uint_decimal);
3333 g_test_add_func("/cutils/parse_uint/llong_max", test_parse_uint_llong_max);
3334 g_test_add_func("/cutils/parse_uint/max", test_parse_uint_max);
3335 g_test_add_func("/cutils/parse_uint/overflow", test_parse_uint_overflow);
3336 g_test_add_func("/cutils/parse_uint/negative", test_parse_uint_negative);
3337 g_test_add_func("/cutils/parse_uint/negzero", test_parse_uint_negzero);
3338 g_test_add_func("/cutils/parse_uint_full/trailing",
3339 test_parse_uint_full_trailing);
3340 g_test_add_func("/cutils/parse_uint_full/correct",
3341 test_parse_uint_full_correct);
3342 g_test_add_func("/cutils/parse_uint_full/erange_junk",
3343 test_parse_uint_full_erange_junk);
3344
3345 /* qemu_strtoi() tests */
3346 g_test_add_func("/cutils/qemu_strtoi/correct",
3347 test_qemu_strtoi_correct);
3348 g_test_add_func("/cutils/qemu_strtoi/null",
3349 test_qemu_strtoi_null);
3350 g_test_add_func("/cutils/qemu_strtoi/empty",
3351 test_qemu_strtoi_empty);
3352 g_test_add_func("/cutils/qemu_strtoi/whitespace",
3353 test_qemu_strtoi_whitespace);
3354 g_test_add_func("/cutils/qemu_strtoi/invalid",
3355 test_qemu_strtoi_invalid);
3356 g_test_add_func("/cutils/qemu_strtoi/trailing",
3357 test_qemu_strtoi_trailing);
3358 g_test_add_func("/cutils/qemu_strtoi/octal",
3359 test_qemu_strtoi_octal);
3360 g_test_add_func("/cutils/qemu_strtoi/decimal",
3361 test_qemu_strtoi_decimal);
3362 g_test_add_func("/cutils/qemu_strtoi/hex",
3363 test_qemu_strtoi_hex);
3364 g_test_add_func("/cutils/qemu_strtoi/max",
3365 test_qemu_strtoi_max);
3366 g_test_add_func("/cutils/qemu_strtoi/overflow",
3367 test_qemu_strtoi_overflow);
3368 g_test_add_func("/cutils/qemu_strtoi/min",
3369 test_qemu_strtoi_min);
3370 g_test_add_func("/cutils/qemu_strtoi/underflow",
3371 test_qemu_strtoi_underflow);
3372 g_test_add_func("/cutils/qemu_strtoi/negative",
3373 test_qemu_strtoi_negative);
3374 g_test_add_func("/cutils/qemu_strtoi/negzero",
3375 test_qemu_strtoi_negzero);
3376 g_test_add_func("/cutils/qemu_strtoi_full/correct",
3377 test_qemu_strtoi_full_correct);
3378 g_test_add_func("/cutils/qemu_strtoi_full/null",
3379 test_qemu_strtoi_full_null);
3380 g_test_add_func("/cutils/qemu_strtoi_full/empty",
3381 test_qemu_strtoi_full_empty);
3382 g_test_add_func("/cutils/qemu_strtoi_full/negative",
3383 test_qemu_strtoi_full_negative);
3384 g_test_add_func("/cutils/qemu_strtoi_full/negzero",
3385 test_qemu_strtoi_full_negzero);
3386 g_test_add_func("/cutils/qemu_strtoi_full/trailing",
3387 test_qemu_strtoi_full_trailing);
3388 g_test_add_func("/cutils/qemu_strtoi_full/max",
3389 test_qemu_strtoi_full_max);
3390 g_test_add_func("/cutils/qemu_strtoi_full/erange_junk",
3391 test_qemu_strtoi_full_erange_junk);
3392
3393 /* qemu_strtoui() tests */
3394 g_test_add_func("/cutils/qemu_strtoui/correct",
3395 test_qemu_strtoui_correct);
3396 g_test_add_func("/cutils/qemu_strtoui/null",
3397 test_qemu_strtoui_null);
3398 g_test_add_func("/cutils/qemu_strtoui/empty",
3399 test_qemu_strtoui_empty);
3400 g_test_add_func("/cutils/qemu_strtoui/whitespace",
3401 test_qemu_strtoui_whitespace);
3402 g_test_add_func("/cutils/qemu_strtoui/invalid",
3403 test_qemu_strtoui_invalid);
3404 g_test_add_func("/cutils/qemu_strtoui/trailing",
3405 test_qemu_strtoui_trailing);
3406 g_test_add_func("/cutils/qemu_strtoui/octal",
3407 test_qemu_strtoui_octal);
3408 g_test_add_func("/cutils/qemu_strtoui/decimal",
3409 test_qemu_strtoui_decimal);
3410 g_test_add_func("/cutils/qemu_strtoui/hex",
3411 test_qemu_strtoui_hex);
3412 g_test_add_func("/cutils/qemu_strtoui/wrap",
3413 test_qemu_strtoui_wrap);
3414 g_test_add_func("/cutils/qemu_strtoui/max",
3415 test_qemu_strtoui_max);
3416 g_test_add_func("/cutils/qemu_strtoui/overflow",
3417 test_qemu_strtoui_overflow);
3418 g_test_add_func("/cutils/qemu_strtoui/underflow",
3419 test_qemu_strtoui_underflow);
3420 g_test_add_func("/cutils/qemu_strtoui/negative",
3421 test_qemu_strtoui_negative);
3422 g_test_add_func("/cutils/qemu_strtoui/negzero",
3423 test_qemu_strtoui_negzero);
3424 g_test_add_func("/cutils/qemu_strtoui_full/correct",
3425 test_qemu_strtoui_full_correct);
3426 g_test_add_func("/cutils/qemu_strtoui_full/null",
3427 test_qemu_strtoui_full_null);
3428 g_test_add_func("/cutils/qemu_strtoui_full/empty",
3429 test_qemu_strtoui_full_empty);
3430 g_test_add_func("/cutils/qemu_strtoui_full/negative",
3431 test_qemu_strtoui_full_negative);
3432 g_test_add_func("/cutils/qemu_strtoui_full/negzero",
3433 test_qemu_strtoui_full_negzero);
3434 g_test_add_func("/cutils/qemu_strtoui_full/trailing",
3435 test_qemu_strtoui_full_trailing);
3436 g_test_add_func("/cutils/qemu_strtoui_full/max",
3437 test_qemu_strtoui_full_max);
3438 g_test_add_func("/cutils/qemu_strtoui_full/erange_junk",
3439 test_qemu_strtoui_full_erange_junk);
3440
3441 /* qemu_strtol() tests */
3442 g_test_add_func("/cutils/qemu_strtol/correct",
3443 test_qemu_strtol_correct);
3444 g_test_add_func("/cutils/qemu_strtol/null",
3445 test_qemu_strtol_null);
3446 g_test_add_func("/cutils/qemu_strtol/empty",
3447 test_qemu_strtol_empty);
3448 g_test_add_func("/cutils/qemu_strtol/whitespace",
3449 test_qemu_strtol_whitespace);
3450 g_test_add_func("/cutils/qemu_strtol/invalid",
3451 test_qemu_strtol_invalid);
3452 g_test_add_func("/cutils/qemu_strtol/trailing",
3453 test_qemu_strtol_trailing);
3454 g_test_add_func("/cutils/qemu_strtol/octal",
3455 test_qemu_strtol_octal);
3456 g_test_add_func("/cutils/qemu_strtol/decimal",
3457 test_qemu_strtol_decimal);
3458 g_test_add_func("/cutils/qemu_strtol/hex",
3459 test_qemu_strtol_hex);
3460 g_test_add_func("/cutils/qemu_strtol/max",
3461 test_qemu_strtol_max);
3462 g_test_add_func("/cutils/qemu_strtol/overflow",
3463 test_qemu_strtol_overflow);
3464 g_test_add_func("/cutils/qemu_strtol/min",
3465 test_qemu_strtol_min);
3466 g_test_add_func("/cutils/qemu_strtol/underflow",
3467 test_qemu_strtol_underflow);
3468 g_test_add_func("/cutils/qemu_strtol/negative",
3469 test_qemu_strtol_negative);
3470 g_test_add_func("/cutils/qemu_strtol/negzero",
3471 test_qemu_strtol_negzero);
3472 g_test_add_func("/cutils/qemu_strtol_full/correct",
3473 test_qemu_strtol_full_correct);
3474 g_test_add_func("/cutils/qemu_strtol_full/null",
3475 test_qemu_strtol_full_null);
3476 g_test_add_func("/cutils/qemu_strtol_full/empty",
3477 test_qemu_strtol_full_empty);
3478 g_test_add_func("/cutils/qemu_strtol_full/negative",
3479 test_qemu_strtol_full_negative);
3480 g_test_add_func("/cutils/qemu_strtol_full/negzero",
3481 test_qemu_strtol_full_negzero);
3482 g_test_add_func("/cutils/qemu_strtol_full/trailing",
3483 test_qemu_strtol_full_trailing);
3484 g_test_add_func("/cutils/qemu_strtol_full/max",
3485 test_qemu_strtol_full_max);
3486 g_test_add_func("/cutils/qemu_strtol_full/erange_junk",
3487 test_qemu_strtol_full_erange_junk);
3488
3489 /* qemu_strtoul() tests */
3490 g_test_add_func("/cutils/qemu_strtoul/correct",
3491 test_qemu_strtoul_correct);
3492 g_test_add_func("/cutils/qemu_strtoul/null",
3493 test_qemu_strtoul_null);
3494 g_test_add_func("/cutils/qemu_strtoul/empty",
3495 test_qemu_strtoul_empty);
3496 g_test_add_func("/cutils/qemu_strtoul/whitespace",
3497 test_qemu_strtoul_whitespace);
3498 g_test_add_func("/cutils/qemu_strtoul/invalid",
3499 test_qemu_strtoul_invalid);
3500 g_test_add_func("/cutils/qemu_strtoul/trailing",
3501 test_qemu_strtoul_trailing);
3502 g_test_add_func("/cutils/qemu_strtoul/octal",
3503 test_qemu_strtoul_octal);
3504 g_test_add_func("/cutils/qemu_strtoul/decimal",
3505 test_qemu_strtoul_decimal);
3506 g_test_add_func("/cutils/qemu_strtoul/hex",
3507 test_qemu_strtoul_hex);
3508 g_test_add_func("/cutils/qemu_strtoul/wrap",
3509 test_qemu_strtoul_wrap);
3510 g_test_add_func("/cutils/qemu_strtoul/max",
3511 test_qemu_strtoul_max);
3512 g_test_add_func("/cutils/qemu_strtoul/overflow",
3513 test_qemu_strtoul_overflow);
3514 g_test_add_func("/cutils/qemu_strtoul/underflow",
3515 test_qemu_strtoul_underflow);
3516 g_test_add_func("/cutils/qemu_strtoul/negative",
3517 test_qemu_strtoul_negative);
3518 g_test_add_func("/cutils/qemu_strtoul/negzero",
3519 test_qemu_strtoul_negzero);
3520 g_test_add_func("/cutils/qemu_strtoul_full/correct",
3521 test_qemu_strtoul_full_correct);
3522 g_test_add_func("/cutils/qemu_strtoul_full/null",
3523 test_qemu_strtoul_full_null);
3524 g_test_add_func("/cutils/qemu_strtoul_full/empty",
3525 test_qemu_strtoul_full_empty);
3526 g_test_add_func("/cutils/qemu_strtoul_full/negative",
3527 test_qemu_strtoul_full_negative);
3528 g_test_add_func("/cutils/qemu_strtoul_full/negzero",
3529 test_qemu_strtoul_full_negzero);
3530 g_test_add_func("/cutils/qemu_strtoul_full/trailing",
3531 test_qemu_strtoul_full_trailing);
3532 g_test_add_func("/cutils/qemu_strtoul_full/max",
3533 test_qemu_strtoul_full_max);
3534 g_test_add_func("/cutils/qemu_strtoul_full/erange_junk",
3535 test_qemu_strtoul_full_erange_junk);
3536
3537 /* qemu_strtoi64() tests */
3538 g_test_add_func("/cutils/qemu_strtoi64/correct",
3539 test_qemu_strtoi64_correct);
3540 g_test_add_func("/cutils/qemu_strtoi64/null",
3541 test_qemu_strtoi64_null);
3542 g_test_add_func("/cutils/qemu_strtoi64/empty",
3543 test_qemu_strtoi64_empty);
3544 g_test_add_func("/cutils/qemu_strtoi64/whitespace",
3545 test_qemu_strtoi64_whitespace);
3546 g_test_add_func("/cutils/qemu_strtoi64/invalid",
3547 test_qemu_strtoi64_invalid);
3548 g_test_add_func("/cutils/qemu_strtoi64/trailing",
3549 test_qemu_strtoi64_trailing);
3550 g_test_add_func("/cutils/qemu_strtoi64/octal",
3551 test_qemu_strtoi64_octal);
3552 g_test_add_func("/cutils/qemu_strtoi64/decimal",
3553 test_qemu_strtoi64_decimal);
3554 g_test_add_func("/cutils/qemu_strtoi64/hex",
3555 test_qemu_strtoi64_hex);
3556 g_test_add_func("/cutils/qemu_strtoi64/max",
3557 test_qemu_strtoi64_max);
3558 g_test_add_func("/cutils/qemu_strtoi64/overflow",
3559 test_qemu_strtoi64_overflow);
3560 g_test_add_func("/cutils/qemu_strtoi64/min",
3561 test_qemu_strtoi64_min);
3562 g_test_add_func("/cutils/qemu_strtoi64/underflow",
3563 test_qemu_strtoi64_underflow);
3564 g_test_add_func("/cutils/qemu_strtoi64/negative",
3565 test_qemu_strtoi64_negative);
3566 g_test_add_func("/cutils/qemu_strtoi64/negzero",
3567 test_qemu_strtoi64_negzero);
3568 g_test_add_func("/cutils/qemu_strtoi64_full/correct",
3569 test_qemu_strtoi64_full_correct);
3570 g_test_add_func("/cutils/qemu_strtoi64_full/null",
3571 test_qemu_strtoi64_full_null);
3572 g_test_add_func("/cutils/qemu_strtoi64_full/empty",
3573 test_qemu_strtoi64_full_empty);
3574 g_test_add_func("/cutils/qemu_strtoi64_full/negative",
3575 test_qemu_strtoi64_full_negative);
3576 g_test_add_func("/cutils/qemu_strtoi64_full/negzero",
3577 test_qemu_strtoi64_full_negzero);
3578 g_test_add_func("/cutils/qemu_strtoi64_full/trailing",
3579 test_qemu_strtoi64_full_trailing);
3580 g_test_add_func("/cutils/qemu_strtoi64_full/max",
3581 test_qemu_strtoi64_full_max);
3582 g_test_add_func("/cutils/qemu_strtoi64_full/erange_junk",
3583 test_qemu_strtoi64_full_erange_junk);
3584
3585 /* qemu_strtou64() tests */
3586 g_test_add_func("/cutils/qemu_strtou64/correct",
3587 test_qemu_strtou64_correct);
3588 g_test_add_func("/cutils/qemu_strtou64/null",
3589 test_qemu_strtou64_null);
3590 g_test_add_func("/cutils/qemu_strtou64/empty",
3591 test_qemu_strtou64_empty);
3592 g_test_add_func("/cutils/qemu_strtou64/whitespace",
3593 test_qemu_strtou64_whitespace);
3594 g_test_add_func("/cutils/qemu_strtou64/invalid",
3595 test_qemu_strtou64_invalid);
3596 g_test_add_func("/cutils/qemu_strtou64/trailing",
3597 test_qemu_strtou64_trailing);
3598 g_test_add_func("/cutils/qemu_strtou64/octal",
3599 test_qemu_strtou64_octal);
3600 g_test_add_func("/cutils/qemu_strtou64/decimal",
3601 test_qemu_strtou64_decimal);
3602 g_test_add_func("/cutils/qemu_strtou64/hex",
3603 test_qemu_strtou64_hex);
3604 g_test_add_func("/cutils/qemu_strtou64/wrap",
3605 test_qemu_strtou64_wrap);
3606 g_test_add_func("/cutils/qemu_strtou64/max",
3607 test_qemu_strtou64_max);
3608 g_test_add_func("/cutils/qemu_strtou64/overflow",
3609 test_qemu_strtou64_overflow);
3610 g_test_add_func("/cutils/qemu_strtou64/underflow",
3611 test_qemu_strtou64_underflow);
3612 g_test_add_func("/cutils/qemu_strtou64/negative",
3613 test_qemu_strtou64_negative);
3614 g_test_add_func("/cutils/qemu_strtou64/negzero",
3615 test_qemu_strtou64_negzero);
3616 g_test_add_func("/cutils/qemu_strtou64_full/correct",
3617 test_qemu_strtou64_full_correct);
3618 g_test_add_func("/cutils/qemu_strtou64_full/null",
3619 test_qemu_strtou64_full_null);
3620 g_test_add_func("/cutils/qemu_strtou64_full/empty",
3621 test_qemu_strtou64_full_empty);
3622 g_test_add_func("/cutils/qemu_strtou64_full/negative",
3623 test_qemu_strtou64_full_negative);
3624 g_test_add_func("/cutils/qemu_strtou64_full/negzero",
3625 test_qemu_strtou64_full_negzero);
3626 g_test_add_func("/cutils/qemu_strtou64_full/trailing",
3627 test_qemu_strtou64_full_trailing);
3628 g_test_add_func("/cutils/qemu_strtou64_full/max",
3629 test_qemu_strtou64_full_max);
3630 g_test_add_func("/cutils/qemu_strtou64_full/erange_junk",
3631 test_qemu_strtou64_full_erange_junk);
3632
3633 g_test_add_func("/cutils/strtosz/simple",
3634 test_qemu_strtosz_simple);
3635 g_test_add_func("/cutils/strtosz/hex",
3636 test_qemu_strtosz_hex);
3637 g_test_add_func("/cutils/strtosz/units",
3638 test_qemu_strtosz_units);
3639 g_test_add_func("/cutils/strtosz/float",
3640 test_qemu_strtosz_float);
3641 g_test_add_func("/cutils/strtosz/invalid",
3642 test_qemu_strtosz_invalid);
3643 g_test_add_func("/cutils/strtosz/trailing",
3644 test_qemu_strtosz_trailing);
3645 g_test_add_func("/cutils/strtosz/erange",
3646 test_qemu_strtosz_erange);
3647 g_test_add_func("/cutils/strtosz/metric",
3648 test_qemu_strtosz_metric);
3649
3650 g_test_add_func("/cutils/size_to_str",
3651 test_size_to_str);
3652 g_test_add_func("/cutils/freq_to_str",
3653 test_freq_to_str);
3654 g_test_add_func("/cutils/iec_binary_prefix",
3655 test_iec_binary_prefix);
3656 g_test_add_func("/cutils/si_prefix",
3657 test_si_prefix);
3658 return g_test_run();
3659 }