]> git.proxmox.com Git - mirror_qemu.git/blob - tests/unit/test-cutils.c
0202ac0d5b3ece083c6854562782c0e22ffb609f
[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_cmpint(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_cmpint(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_cmpint(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_cmpint(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_cmpint(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_cmpint(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_cmpint(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_cmpint(i, ==, 123);
150 g_assert_true(endptr == str + strlen(str));
151 }
152
153
154 static void test_parse_uint_llong_max(void)
155 {
156 unsigned long long i = 999;
157 char f = 'X';
158 char *endptr = &f;
159 char *str = g_strdup_printf("%llu", (unsigned long long)LLONG_MAX + 1);
160 int r;
161
162 r = parse_uint(str, &i, &endptr, 0);
163
164 g_assert_cmpint(r, ==, 0);
165 g_assert_cmpint(i, ==, (unsigned long long)LLONG_MAX + 1);
166 g_assert_true(endptr == str + strlen(str));
167
168 g_free(str);
169 }
170
171 static void test_parse_uint_overflow(void)
172 {
173 unsigned long long i = 999;
174 char f = 'X';
175 char *endptr = &f;
176 const char *str = "99999999999999999999999999999999999999";
177 int r;
178
179 r = parse_uint(str, &i, &endptr, 0);
180
181 g_assert_cmpint(r, ==, -ERANGE);
182 g_assert_cmpint(i, ==, ULLONG_MAX);
183 g_assert_true(endptr == str + strlen(str));
184 }
185
186 static void test_parse_uint_negative(void)
187 {
188 unsigned long long i = 999;
189 char f = 'X';
190 char *endptr = &f;
191 const char *str = " \t -321";
192 int r;
193
194 r = parse_uint(str, &i, &endptr, 0);
195
196 g_assert_cmpint(r, ==, -ERANGE);
197 g_assert_cmpint(i, ==, 0);
198 g_assert_true(endptr == str + strlen(str));
199 }
200
201
202 static void test_parse_uint_full_trailing(void)
203 {
204 unsigned long long i = 999;
205 const char *str = "123xxx";
206 int r;
207
208 r = parse_uint_full(str, &i, 0);
209
210 g_assert_cmpint(r, ==, -EINVAL);
211 g_assert_cmpint(i, ==, 0);
212 }
213
214 static void test_parse_uint_full_correct(void)
215 {
216 unsigned long long i = 999;
217 const char *str = "123";
218 int r;
219
220 r = parse_uint_full(str, &i, 0);
221
222 g_assert_cmpint(r, ==, 0);
223 g_assert_cmpint(i, ==, 123);
224 }
225
226 static void test_qemu_strtoi_correct(void)
227 {
228 const char *str = "12345 foo";
229 char f = 'X';
230 const char *endptr = &f;
231 int res = 999;
232 int err;
233
234 err = qemu_strtoi(str, &endptr, 0, &res);
235
236 g_assert_cmpint(err, ==, 0);
237 g_assert_cmpint(res, ==, 12345);
238 g_assert_true(endptr == str + 5);
239 }
240
241 static void test_qemu_strtoi_null(void)
242 {
243 char f = 'X';
244 const char *endptr = &f;
245 int res = 999;
246 int err;
247
248 err = qemu_strtoi(NULL, &endptr, 0, &res);
249
250 g_assert_cmpint(err, ==, -EINVAL);
251 g_assert_null(endptr);
252 }
253
254 static void test_qemu_strtoi_empty(void)
255 {
256 const char *str = "";
257 char f = 'X';
258 const char *endptr = &f;
259 int res = 999;
260 int err;
261
262 err = qemu_strtoi(str, &endptr, 0, &res);
263
264 g_assert_cmpint(err, ==, -EINVAL);
265 g_assert_true(endptr == str);
266 }
267
268 static void test_qemu_strtoi_whitespace(void)
269 {
270 const char *str = " \t ";
271 char f = 'X';
272 const char *endptr = &f;
273 int res = 999;
274 int err;
275
276 err = qemu_strtoi(str, &endptr, 0, &res);
277
278 g_assert_cmpint(err, ==, -EINVAL);
279 g_assert_true(endptr == str);
280 }
281
282 static void test_qemu_strtoi_invalid(void)
283 {
284 const char *str = " xxxx \t abc";
285 char f = 'X';
286 const char *endptr = &f;
287 int res = 999;
288 int err;
289
290 err = qemu_strtoi(str, &endptr, 0, &res);
291
292 g_assert_cmpint(err, ==, -EINVAL);
293 g_assert_true(endptr == str);
294 }
295
296 static void test_qemu_strtoi_trailing(void)
297 {
298 const char *str = "123xxx";
299 char f = 'X';
300 const char *endptr = &f;
301 int res = 999;
302 int err;
303
304 err = qemu_strtoi(str, &endptr, 0, &res);
305
306 g_assert_cmpint(err, ==, 0);
307 g_assert_cmpint(res, ==, 123);
308 g_assert_true(endptr == str + 3);
309 }
310
311 static void test_qemu_strtoi_octal(void)
312 {
313 const char *str = "0123";
314 char f = 'X';
315 const char *endptr = &f;
316 int res = 999;
317 int err;
318
319 err = qemu_strtoi(str, &endptr, 8, &res);
320
321 g_assert_cmpint(err, ==, 0);
322 g_assert_cmpint(res, ==, 0123);
323 g_assert_true(endptr == str + strlen(str));
324
325 res = 999;
326 endptr = &f;
327 err = qemu_strtoi(str, &endptr, 0, &res);
328
329 g_assert_cmpint(err, ==, 0);
330 g_assert_cmpint(res, ==, 0123);
331 g_assert_true(endptr == str + strlen(str));
332 }
333
334 static void test_qemu_strtoi_decimal(void)
335 {
336 const char *str = "0123";
337 char f = 'X';
338 const char *endptr = &f;
339 int res = 999;
340 int err;
341
342 err = qemu_strtoi(str, &endptr, 10, &res);
343
344 g_assert_cmpint(err, ==, 0);
345 g_assert_cmpint(res, ==, 123);
346 g_assert_true(endptr == str + strlen(str));
347
348 str = "123";
349 res = 999;
350 endptr = &f;
351 err = qemu_strtoi(str, &endptr, 0, &res);
352
353 g_assert_cmpint(err, ==, 0);
354 g_assert_cmpint(res, ==, 123);
355 g_assert_true(endptr == str + strlen(str));
356 }
357
358 static void test_qemu_strtoi_hex(void)
359 {
360 const char *str = "0123";
361 char f = 'X';
362 const char *endptr = &f;
363 int res = 999;
364 int err;
365
366 err = qemu_strtoi(str, &endptr, 16, &res);
367
368 g_assert_cmpint(err, ==, 0);
369 g_assert_cmpint(res, ==, 0x123);
370 g_assert_true(endptr == str + strlen(str));
371
372 str = "0x123";
373 res = 999;
374 endptr = &f;
375 err = qemu_strtoi(str, &endptr, 0, &res);
376
377 g_assert_cmpint(err, ==, 0);
378 g_assert_cmpint(res, ==, 0x123);
379 g_assert_true(endptr == str + strlen(str));
380
381 str = "0x";
382 res = 999;
383 endptr = &f;
384 err = qemu_strtoi(str, &endptr, 16, &res);
385
386 g_assert_cmpint(err, ==, 0);
387 g_assert_cmpint(res, ==, 0);
388 g_assert_true(endptr == str + 1);
389 }
390
391 static void test_qemu_strtoi_max(void)
392 {
393 char *str = g_strdup_printf("%d", INT_MAX);
394 char f = 'X';
395 const char *endptr = &f;
396 int res = 999;
397 int err;
398
399 err = qemu_strtoi(str, &endptr, 0, &res);
400
401 g_assert_cmpint(err, ==, 0);
402 g_assert_cmpint(res, ==, INT_MAX);
403 g_assert_true(endptr == str + strlen(str));
404 g_free(str);
405 }
406
407 static void test_qemu_strtoi_overflow(void)
408 {
409 char *str = g_strdup_printf("%lld", (long long)INT_MAX + 1ll);
410 char f = 'X';
411 const char *endptr = &f;
412 int res = 999;
413 int err;
414
415 err = qemu_strtoi(str, &endptr, 0, &res);
416
417 g_assert_cmpint(err, ==, -ERANGE);
418 g_assert_cmpint(res, ==, INT_MAX);
419 g_assert_true(endptr == str + strlen(str));
420 g_free(str);
421 }
422
423 static void test_qemu_strtoi_underflow(void)
424 {
425 char *str = g_strdup_printf("%lld", (long long)INT_MIN - 1ll);
426 char f = 'X';
427 const char *endptr = &f;
428 int res = 999;
429 int err;
430
431 err = qemu_strtoi(str, &endptr, 0, &res);
432
433 g_assert_cmpint(err, ==, -ERANGE);
434 g_assert_cmpint(res, ==, INT_MIN);
435 g_assert_true(endptr == str + strlen(str));
436 g_free(str);
437 }
438
439 static void test_qemu_strtoi_negative(void)
440 {
441 const char *str = " \t -321";
442 char f = 'X';
443 const char *endptr = &f;
444 int res = 999;
445 int err;
446
447 err = qemu_strtoi(str, &endptr, 0, &res);
448
449 g_assert_cmpint(err, ==, 0);
450 g_assert_cmpint(res, ==, -321);
451 g_assert_true(endptr == str + strlen(str));
452 }
453
454 static void test_qemu_strtoi_full_correct(void)
455 {
456 const char *str = "123";
457 int res = 999;
458 int err;
459
460 err = qemu_strtoi(str, NULL, 0, &res);
461
462 g_assert_cmpint(err, ==, 0);
463 g_assert_cmpint(res, ==, 123);
464 }
465
466 static void test_qemu_strtoi_full_null(void)
467 {
468 char f = 'X';
469 const char *endptr = &f;
470 int res = 999;
471 int err;
472
473 err = qemu_strtoi(NULL, &endptr, 0, &res);
474
475 g_assert_cmpint(err, ==, -EINVAL);
476 g_assert_null(endptr);
477 }
478
479 static void test_qemu_strtoi_full_empty(void)
480 {
481 const char *str = "";
482 int res = 999L;
483 int err;
484
485 err = qemu_strtoi(str, NULL, 0, &res);
486
487 g_assert_cmpint(err, ==, -EINVAL);
488 }
489
490 static void test_qemu_strtoi_full_negative(void)
491 {
492 const char *str = " \t -321";
493 int res = 999;
494 int err;
495
496 err = qemu_strtoi(str, NULL, 0, &res);
497
498 g_assert_cmpint(err, ==, 0);
499 g_assert_cmpint(res, ==, -321);
500 }
501
502 static void test_qemu_strtoi_full_trailing(void)
503 {
504 const char *str = "123xxx";
505 int res;
506 int err;
507
508 err = qemu_strtoi(str, NULL, 0, &res);
509
510 g_assert_cmpint(err, ==, -EINVAL);
511 }
512
513 static void test_qemu_strtoi_full_max(void)
514 {
515 char *str = g_strdup_printf("%d", INT_MAX);
516 int res;
517 int err;
518
519 err = qemu_strtoi(str, NULL, 0, &res);
520
521 g_assert_cmpint(err, ==, 0);
522 g_assert_cmpint(res, ==, INT_MAX);
523 g_free(str);
524 }
525
526 static void test_qemu_strtoui_correct(void)
527 {
528 const char *str = "12345 foo";
529 char f = 'X';
530 const char *endptr = &f;
531 unsigned int res = 999;
532 int err;
533
534 err = qemu_strtoui(str, &endptr, 0, &res);
535
536 g_assert_cmpint(err, ==, 0);
537 g_assert_cmpuint(res, ==, 12345);
538 g_assert_true(endptr == str + 5);
539 }
540
541 static void test_qemu_strtoui_null(void)
542 {
543 char f = 'X';
544 const char *endptr = &f;
545 unsigned int res = 999;
546 int err;
547
548 err = qemu_strtoui(NULL, &endptr, 0, &res);
549
550 g_assert_cmpint(err, ==, -EINVAL);
551 g_assert_null(endptr);
552 }
553
554 static void test_qemu_strtoui_empty(void)
555 {
556 const char *str = "";
557 char f = 'X';
558 const char *endptr = &f;
559 unsigned int res = 999;
560 int err;
561
562 err = qemu_strtoui(str, &endptr, 0, &res);
563
564 g_assert_cmpint(err, ==, -EINVAL);
565 g_assert_true(endptr == str);
566 }
567
568 static void test_qemu_strtoui_whitespace(void)
569 {
570 const char *str = " \t ";
571 char f = 'X';
572 const char *endptr = &f;
573 unsigned int res = 999;
574 int err;
575
576 err = qemu_strtoui(str, &endptr, 0, &res);
577
578 g_assert_cmpint(err, ==, -EINVAL);
579 g_assert_true(endptr == str);
580 }
581
582 static void test_qemu_strtoui_invalid(void)
583 {
584 const char *str = " xxxx \t abc";
585 char f = 'X';
586 const char *endptr = &f;
587 unsigned int res = 999;
588 int err;
589
590 err = qemu_strtoui(str, &endptr, 0, &res);
591
592 g_assert_cmpint(err, ==, -EINVAL);
593 g_assert_true(endptr == str);
594 }
595
596 static void test_qemu_strtoui_trailing(void)
597 {
598 const char *str = "123xxx";
599 char f = 'X';
600 const char *endptr = &f;
601 unsigned int res = 999;
602 int err;
603
604 err = qemu_strtoui(str, &endptr, 0, &res);
605
606 g_assert_cmpint(err, ==, 0);
607 g_assert_cmpuint(res, ==, 123);
608 g_assert_true(endptr == str + 3);
609 }
610
611 static void test_qemu_strtoui_octal(void)
612 {
613 const char *str = "0123";
614 char f = 'X';
615 const char *endptr = &f;
616 unsigned int res = 999;
617 int err;
618
619 err = qemu_strtoui(str, &endptr, 8, &res);
620
621 g_assert_cmpint(err, ==, 0);
622 g_assert_cmpuint(res, ==, 0123);
623 g_assert_true(endptr == str + strlen(str));
624
625 res = 999;
626 endptr = &f;
627 err = qemu_strtoui(str, &endptr, 0, &res);
628
629 g_assert_cmpint(err, ==, 0);
630 g_assert_cmpuint(res, ==, 0123);
631 g_assert_true(endptr == str + strlen(str));
632 }
633
634 static void test_qemu_strtoui_decimal(void)
635 {
636 const char *str = "0123";
637 char f = 'X';
638 const char *endptr = &f;
639 unsigned int res = 999;
640 int err;
641
642 err = qemu_strtoui(str, &endptr, 10, &res);
643
644 g_assert_cmpint(err, ==, 0);
645 g_assert_cmpuint(res, ==, 123);
646 g_assert_true(endptr == str + strlen(str));
647
648 str = "123";
649 res = 999;
650 endptr = &f;
651 err = qemu_strtoui(str, &endptr, 0, &res);
652
653 g_assert_cmpint(err, ==, 0);
654 g_assert_cmpuint(res, ==, 123);
655 g_assert_true(endptr == str + strlen(str));
656 }
657
658 static void test_qemu_strtoui_hex(void)
659 {
660 const char *str = "0123";
661 char f = 'X';
662 const char *endptr = &f;
663 unsigned int res = 999;
664 int err;
665
666 err = qemu_strtoui(str, &endptr, 16, &res);
667
668 g_assert_cmpint(err, ==, 0);
669 g_assert_cmphex(res, ==, 0x123);
670 g_assert_true(endptr == str + strlen(str));
671
672 str = "0x123";
673 res = 999;
674 endptr = &f;
675 err = qemu_strtoui(str, &endptr, 0, &res);
676
677 g_assert_cmpint(err, ==, 0);
678 g_assert_cmphex(res, ==, 0x123);
679 g_assert_true(endptr == str + strlen(str));
680
681 str = "0x";
682 res = 999;
683 endptr = &f;
684 err = qemu_strtoui(str, &endptr, 16, &res);
685
686 g_assert_cmpint(err, ==, 0);
687 g_assert_cmphex(res, ==, 0);
688 g_assert_true(endptr == str + 1);
689 }
690
691 static void test_qemu_strtoui_max(void)
692 {
693 char *str = g_strdup_printf("%u", UINT_MAX);
694 char f = 'X';
695 const char *endptr = &f;
696 unsigned int res = 999;
697 int err;
698
699 err = qemu_strtoui(str, &endptr, 0, &res);
700
701 g_assert_cmpint(err, ==, 0);
702 g_assert_cmphex(res, ==, UINT_MAX);
703 g_assert_true(endptr == str + strlen(str));
704 g_free(str);
705 }
706
707 static void test_qemu_strtoui_overflow(void)
708 {
709 char *str = g_strdup_printf("%lld", (long long)UINT_MAX + 1ll);
710 char f = 'X';
711 const char *endptr = &f;
712 unsigned int res = 999;
713 int err;
714
715 err = qemu_strtoui(str, &endptr, 0, &res);
716
717 g_assert_cmpint(err, ==, -ERANGE);
718 g_assert_cmphex(res, ==, UINT_MAX);
719 g_assert_true(endptr == str + strlen(str));
720 g_free(str);
721 }
722
723 static void test_qemu_strtoui_underflow(void)
724 {
725 char *str = g_strdup_printf("%lld", (long long)INT_MIN - 1ll);
726 char f = 'X';
727 const char *endptr = &f;
728 unsigned int res = 999;
729 int err;
730
731 err = qemu_strtoui(str, &endptr, 0, &res);
732
733 g_assert_cmpint(err, ==, -ERANGE);
734 g_assert_cmpuint(res, ==, (unsigned int)-1);
735 g_assert_true(endptr == str + strlen(str));
736 g_free(str);
737 }
738
739 static void test_qemu_strtoui_negative(void)
740 {
741 const char *str = " \t -321";
742 char f = 'X';
743 const char *endptr = &f;
744 unsigned int res = 999;
745 int err;
746
747 err = qemu_strtoui(str, &endptr, 0, &res);
748
749 g_assert_cmpint(err, ==, 0);
750 g_assert_cmpuint(res, ==, (unsigned int)-321);
751 g_assert_true(endptr == str + strlen(str));
752 }
753
754 static void test_qemu_strtoui_full_correct(void)
755 {
756 const char *str = "123";
757 unsigned int res = 999;
758 int err;
759
760 err = qemu_strtoui(str, NULL, 0, &res);
761
762 g_assert_cmpint(err, ==, 0);
763 g_assert_cmpuint(res, ==, 123);
764 }
765
766 static void test_qemu_strtoui_full_null(void)
767 {
768 unsigned int res = 999;
769 int err;
770
771 err = qemu_strtoui(NULL, NULL, 0, &res);
772
773 g_assert_cmpint(err, ==, -EINVAL);
774 }
775
776 static void test_qemu_strtoui_full_empty(void)
777 {
778 const char *str = "";
779 unsigned int res = 999;
780 int err;
781
782 err = qemu_strtoui(str, NULL, 0, &res);
783
784 g_assert_cmpint(err, ==, -EINVAL);
785 }
786 static void test_qemu_strtoui_full_negative(void)
787 {
788 const char *str = " \t -321";
789 unsigned int res = 999;
790 int err;
791
792 err = qemu_strtoui(str, NULL, 0, &res);
793 g_assert_cmpint(err, ==, 0);
794 g_assert_cmpuint(res, ==, (unsigned int)-321);
795 }
796
797 static void test_qemu_strtoui_full_trailing(void)
798 {
799 const char *str = "123xxx";
800 unsigned int res;
801 int err;
802
803 err = qemu_strtoui(str, NULL, 0, &res);
804
805 g_assert_cmpint(err, ==, -EINVAL);
806 }
807
808 static void test_qemu_strtoui_full_max(void)
809 {
810 char *str = g_strdup_printf("%u", UINT_MAX);
811 unsigned int res = 999;
812 int err;
813
814 err = qemu_strtoui(str, NULL, 0, &res);
815
816 g_assert_cmpint(err, ==, 0);
817 g_assert_cmphex(res, ==, UINT_MAX);
818 g_free(str);
819 }
820
821 static void test_qemu_strtol_correct(void)
822 {
823 const char *str = "12345 foo";
824 char f = 'X';
825 const char *endptr = &f;
826 long res = 999;
827 int err;
828
829 err = qemu_strtol(str, &endptr, 0, &res);
830
831 g_assert_cmpint(err, ==, 0);
832 g_assert_cmpint(res, ==, 12345);
833 g_assert_true(endptr == str + 5);
834 }
835
836 static void test_qemu_strtol_null(void)
837 {
838 char f = 'X';
839 const char *endptr = &f;
840 long res = 999;
841 int err;
842
843 err = qemu_strtol(NULL, &endptr, 0, &res);
844
845 g_assert_cmpint(err, ==, -EINVAL);
846 g_assert_null(endptr);
847 }
848
849 static void test_qemu_strtol_empty(void)
850 {
851 const char *str = "";
852 char f = 'X';
853 const char *endptr = &f;
854 long res = 999;
855 int err;
856
857 err = qemu_strtol(str, &endptr, 0, &res);
858
859 g_assert_cmpint(err, ==, -EINVAL);
860 g_assert_true(endptr == str);
861 }
862
863 static void test_qemu_strtol_whitespace(void)
864 {
865 const char *str = " \t ";
866 char f = 'X';
867 const char *endptr = &f;
868 long res = 999;
869 int err;
870
871 err = qemu_strtol(str, &endptr, 0, &res);
872
873 g_assert_cmpint(err, ==, -EINVAL);
874 g_assert_true(endptr == str);
875 }
876
877 static void test_qemu_strtol_invalid(void)
878 {
879 const char *str = " xxxx \t abc";
880 char f = 'X';
881 const char *endptr = &f;
882 long res = 999;
883 int err;
884
885 err = qemu_strtol(str, &endptr, 0, &res);
886
887 g_assert_cmpint(err, ==, -EINVAL);
888 g_assert_true(endptr == str);
889 }
890
891 static void test_qemu_strtol_trailing(void)
892 {
893 const char *str = "123xxx";
894 char f = 'X';
895 const char *endptr = &f;
896 long res = 999;
897 int err;
898
899 err = qemu_strtol(str, &endptr, 0, &res);
900
901 g_assert_cmpint(err, ==, 0);
902 g_assert_cmpint(res, ==, 123);
903 g_assert_true(endptr == str + 3);
904 }
905
906 static void test_qemu_strtol_octal(void)
907 {
908 const char *str = "0123";
909 char f = 'X';
910 const char *endptr = &f;
911 long res = 999;
912 int err;
913
914 err = qemu_strtol(str, &endptr, 8, &res);
915
916 g_assert_cmpint(err, ==, 0);
917 g_assert_cmpint(res, ==, 0123);
918 g_assert_true(endptr == str + strlen(str));
919
920 res = 999;
921 endptr = &f;
922 err = qemu_strtol(str, &endptr, 0, &res);
923
924 g_assert_cmpint(err, ==, 0);
925 g_assert_cmpint(res, ==, 0123);
926 g_assert_true(endptr == str + strlen(str));
927 }
928
929 static void test_qemu_strtol_decimal(void)
930 {
931 const char *str = "0123";
932 char f = 'X';
933 const char *endptr = &f;
934 long res = 999;
935 int err;
936
937 err = qemu_strtol(str, &endptr, 10, &res);
938
939 g_assert_cmpint(err, ==, 0);
940 g_assert_cmpint(res, ==, 123);
941 g_assert_true(endptr == str + strlen(str));
942
943 str = "123";
944 res = 999;
945 endptr = &f;
946 err = qemu_strtol(str, &endptr, 0, &res);
947
948 g_assert_cmpint(err, ==, 0);
949 g_assert_cmpint(res, ==, 123);
950 g_assert_true(endptr == str + strlen(str));
951 }
952
953 static void test_qemu_strtol_hex(void)
954 {
955 const char *str = "0123";
956 char f = 'X';
957 const char *endptr = &f;
958 long res = 999;
959 int err;
960
961 err = qemu_strtol(str, &endptr, 16, &res);
962
963 g_assert_cmpint(err, ==, 0);
964 g_assert_cmpint(res, ==, 0x123);
965 g_assert_true(endptr == str + strlen(str));
966
967 str = "0x123";
968 res = 999;
969 endptr = &f;
970 err = qemu_strtol(str, &endptr, 0, &res);
971
972 g_assert_cmpint(err, ==, 0);
973 g_assert_cmpint(res, ==, 0x123);
974 g_assert_true(endptr == str + strlen(str));
975
976 str = "0x";
977 res = 999;
978 endptr = &f;
979 err = qemu_strtol(str, &endptr, 16, &res);
980
981 g_assert_cmpint(err, ==, 0);
982 g_assert_cmpint(res, ==, 0);
983 g_assert_true(endptr == str + 1);
984 }
985
986 static void test_qemu_strtol_max(void)
987 {
988 char *str = g_strdup_printf("%ld", LONG_MAX);
989 char f = 'X';
990 const char *endptr = &f;
991 long res = 999;
992 int err;
993
994 err = qemu_strtol(str, &endptr, 0, &res);
995
996 g_assert_cmpint(err, ==, 0);
997 g_assert_cmpint(res, ==, LONG_MAX);
998 g_assert_true(endptr == str + strlen(str));
999 g_free(str);
1000 }
1001
1002 static void test_qemu_strtol_overflow(void)
1003 {
1004 const char *str = "99999999999999999999999999999999999999999999";
1005 char f = 'X';
1006 const char *endptr = &f;
1007 long res = 999;
1008 int err;
1009
1010 err = qemu_strtol(str, &endptr, 0, &res);
1011
1012 g_assert_cmpint(err, ==, -ERANGE);
1013 g_assert_cmpint(res, ==, LONG_MAX);
1014 g_assert_true(endptr == str + strlen(str));
1015 }
1016
1017 static void test_qemu_strtol_underflow(void)
1018 {
1019 const char *str = "-99999999999999999999999999999999999999999999";
1020 char f = 'X';
1021 const char *endptr = &f;
1022 long res = 999;
1023 int err;
1024
1025 err = qemu_strtol(str, &endptr, 0, &res);
1026
1027 g_assert_cmpint(err, ==, -ERANGE);
1028 g_assert_cmpint(res, ==, LONG_MIN);
1029 g_assert_true(endptr == str + strlen(str));
1030 }
1031
1032 static void test_qemu_strtol_negative(void)
1033 {
1034 const char *str = " \t -321";
1035 char f = 'X';
1036 const char *endptr = &f;
1037 long res = 999;
1038 int err;
1039
1040 err = qemu_strtol(str, &endptr, 0, &res);
1041
1042 g_assert_cmpint(err, ==, 0);
1043 g_assert_cmpint(res, ==, -321);
1044 g_assert_true(endptr == str + strlen(str));
1045 }
1046
1047 static void test_qemu_strtol_full_correct(void)
1048 {
1049 const char *str = "123";
1050 long res = 999;
1051 int err;
1052
1053 err = qemu_strtol(str, NULL, 0, &res);
1054
1055 g_assert_cmpint(err, ==, 0);
1056 g_assert_cmpint(res, ==, 123);
1057 }
1058
1059 static void test_qemu_strtol_full_null(void)
1060 {
1061 char f = 'X';
1062 const char *endptr = &f;
1063 long res = 999;
1064 int err;
1065
1066 err = qemu_strtol(NULL, &endptr, 0, &res);
1067
1068 g_assert_cmpint(err, ==, -EINVAL);
1069 g_assert_null(endptr);
1070 }
1071
1072 static void test_qemu_strtol_full_empty(void)
1073 {
1074 const char *str = "";
1075 long res = 999L;
1076 int err;
1077
1078 err = qemu_strtol(str, NULL, 0, &res);
1079
1080 g_assert_cmpint(err, ==, -EINVAL);
1081 }
1082
1083 static void test_qemu_strtol_full_negative(void)
1084 {
1085 const char *str = " \t -321";
1086 long res = 999;
1087 int err;
1088
1089 err = qemu_strtol(str, NULL, 0, &res);
1090
1091 g_assert_cmpint(err, ==, 0);
1092 g_assert_cmpint(res, ==, -321);
1093 }
1094
1095 static void test_qemu_strtol_full_trailing(void)
1096 {
1097 const char *str = "123xxx";
1098 long res;
1099 int err;
1100
1101 err = qemu_strtol(str, NULL, 0, &res);
1102
1103 g_assert_cmpint(err, ==, -EINVAL);
1104 }
1105
1106 static void test_qemu_strtol_full_max(void)
1107 {
1108 char *str = g_strdup_printf("%ld", LONG_MAX);
1109 long res;
1110 int err;
1111
1112 err = qemu_strtol(str, NULL, 0, &res);
1113
1114 g_assert_cmpint(err, ==, 0);
1115 g_assert_cmpint(res, ==, LONG_MAX);
1116 g_free(str);
1117 }
1118
1119 static void test_qemu_strtoul_correct(void)
1120 {
1121 const char *str = "12345 foo";
1122 char f = 'X';
1123 const char *endptr = &f;
1124 unsigned long res = 999;
1125 int err;
1126
1127 err = qemu_strtoul(str, &endptr, 0, &res);
1128
1129 g_assert_cmpint(err, ==, 0);
1130 g_assert_cmpuint(res, ==, 12345);
1131 g_assert_true(endptr == str + 5);
1132 }
1133
1134 static void test_qemu_strtoul_null(void)
1135 {
1136 char f = 'X';
1137 const char *endptr = &f;
1138 unsigned long res = 999;
1139 int err;
1140
1141 err = qemu_strtoul(NULL, &endptr, 0, &res);
1142
1143 g_assert_cmpint(err, ==, -EINVAL);
1144 g_assert_null(endptr);
1145 }
1146
1147 static void test_qemu_strtoul_empty(void)
1148 {
1149 const char *str = "";
1150 char f = 'X';
1151 const char *endptr = &f;
1152 unsigned long res = 999;
1153 int err;
1154
1155 err = qemu_strtoul(str, &endptr, 0, &res);
1156
1157 g_assert_cmpint(err, ==, -EINVAL);
1158 g_assert_true(endptr == str);
1159 }
1160
1161 static void test_qemu_strtoul_whitespace(void)
1162 {
1163 const char *str = " \t ";
1164 char f = 'X';
1165 const char *endptr = &f;
1166 unsigned long res = 999;
1167 int err;
1168
1169 err = qemu_strtoul(str, &endptr, 0, &res);
1170
1171 g_assert_cmpint(err, ==, -EINVAL);
1172 g_assert_true(endptr == str);
1173 }
1174
1175 static void test_qemu_strtoul_invalid(void)
1176 {
1177 const char *str = " xxxx \t abc";
1178 char f = 'X';
1179 const char *endptr = &f;
1180 unsigned long res = 999;
1181 int err;
1182
1183 err = qemu_strtoul(str, &endptr, 0, &res);
1184
1185 g_assert_cmpint(err, ==, -EINVAL);
1186 g_assert_true(endptr == str);
1187 }
1188
1189 static void test_qemu_strtoul_trailing(void)
1190 {
1191 const char *str = "123xxx";
1192 char f = 'X';
1193 const char *endptr = &f;
1194 unsigned long res = 999;
1195 int err;
1196
1197 err = qemu_strtoul(str, &endptr, 0, &res);
1198
1199 g_assert_cmpint(err, ==, 0);
1200 g_assert_cmpuint(res, ==, 123);
1201 g_assert_true(endptr == str + 3);
1202 }
1203
1204 static void test_qemu_strtoul_octal(void)
1205 {
1206 const char *str = "0123";
1207 char f = 'X';
1208 const char *endptr = &f;
1209 unsigned long res = 999;
1210 int err;
1211
1212 err = qemu_strtoul(str, &endptr, 8, &res);
1213
1214 g_assert_cmpint(err, ==, 0);
1215 g_assert_cmpuint(res, ==, 0123);
1216 g_assert_true(endptr == str + strlen(str));
1217
1218 res = 999;
1219 endptr = &f;
1220 err = qemu_strtoul(str, &endptr, 0, &res);
1221
1222 g_assert_cmpint(err, ==, 0);
1223 g_assert_cmpuint(res, ==, 0123);
1224 g_assert_true(endptr == str + strlen(str));
1225 }
1226
1227 static void test_qemu_strtoul_decimal(void)
1228 {
1229 const char *str = "0123";
1230 char f = 'X';
1231 const char *endptr = &f;
1232 unsigned long res = 999;
1233 int err;
1234
1235 err = qemu_strtoul(str, &endptr, 10, &res);
1236
1237 g_assert_cmpint(err, ==, 0);
1238 g_assert_cmpuint(res, ==, 123);
1239 g_assert_true(endptr == str + strlen(str));
1240
1241 str = "123";
1242 res = 999;
1243 endptr = &f;
1244 err = qemu_strtoul(str, &endptr, 0, &res);
1245
1246 g_assert_cmpint(err, ==, 0);
1247 g_assert_cmpuint(res, ==, 123);
1248 g_assert_true(endptr == str + strlen(str));
1249 }
1250
1251 static void test_qemu_strtoul_hex(void)
1252 {
1253 const char *str = "0123";
1254 char f = 'X';
1255 const char *endptr = &f;
1256 unsigned long res = 999;
1257 int err;
1258
1259 err = qemu_strtoul(str, &endptr, 16, &res);
1260
1261 g_assert_cmpint(err, ==, 0);
1262 g_assert_cmphex(res, ==, 0x123);
1263 g_assert_true(endptr == str + strlen(str));
1264
1265 str = "0x123";
1266 res = 999;
1267 endptr = &f;
1268 err = qemu_strtoul(str, &endptr, 0, &res);
1269
1270 g_assert_cmpint(err, ==, 0);
1271 g_assert_cmphex(res, ==, 0x123);
1272 g_assert_true(endptr == str + strlen(str));
1273
1274 str = "0x";
1275 res = 999;
1276 endptr = &f;
1277 err = qemu_strtoul(str, &endptr, 16, &res);
1278
1279 g_assert_cmpint(err, ==, 0);
1280 g_assert_cmphex(res, ==, 0);
1281 g_assert_true(endptr == str + 1);
1282 }
1283
1284 static void test_qemu_strtoul_max(void)
1285 {
1286 char *str = g_strdup_printf("%lu", ULONG_MAX);
1287 char f = 'X';
1288 const char *endptr = &f;
1289 unsigned long res = 999;
1290 int err;
1291
1292 err = qemu_strtoul(str, &endptr, 0, &res);
1293
1294 g_assert_cmpint(err, ==, 0);
1295 g_assert_cmphex(res, ==, ULONG_MAX);
1296 g_assert_true(endptr == str + strlen(str));
1297 g_free(str);
1298 }
1299
1300 static void test_qemu_strtoul_overflow(void)
1301 {
1302 const char *str = "99999999999999999999999999999999999999999999";
1303 char f = 'X';
1304 const char *endptr = &f;
1305 unsigned long res = 999;
1306 int err;
1307
1308 err = qemu_strtoul(str, &endptr, 0, &res);
1309
1310 g_assert_cmpint(err, ==, -ERANGE);
1311 g_assert_cmphex(res, ==, ULONG_MAX);
1312 g_assert_true(endptr == str + strlen(str));
1313 }
1314
1315 static void test_qemu_strtoul_underflow(void)
1316 {
1317 const char *str = "-99999999999999999999999999999999999999999999";
1318 char f = 'X';
1319 const char *endptr = &f;
1320 unsigned long res = 999;
1321 int err;
1322
1323 err = qemu_strtoul(str, &endptr, 0, &res);
1324
1325 g_assert_cmpint(err, ==, -ERANGE);
1326 g_assert_cmpuint(res, ==, -1ul);
1327 g_assert_true(endptr == str + strlen(str));
1328 }
1329
1330 static void test_qemu_strtoul_negative(void)
1331 {
1332 const char *str = " \t -321";
1333 char f = 'X';
1334 const char *endptr = &f;
1335 unsigned long res = 999;
1336 int err;
1337
1338 err = qemu_strtoul(str, &endptr, 0, &res);
1339
1340 g_assert_cmpint(err, ==, 0);
1341 g_assert_cmpuint(res, ==, -321ul);
1342 g_assert_true(endptr == str + strlen(str));
1343 }
1344
1345 static void test_qemu_strtoul_full_correct(void)
1346 {
1347 const char *str = "123";
1348 unsigned long res = 999;
1349 int err;
1350
1351 err = qemu_strtoul(str, NULL, 0, &res);
1352
1353 g_assert_cmpint(err, ==, 0);
1354 g_assert_cmpuint(res, ==, 123);
1355 }
1356
1357 static void test_qemu_strtoul_full_null(void)
1358 {
1359 unsigned long res = 999;
1360 int err;
1361
1362 err = qemu_strtoul(NULL, NULL, 0, &res);
1363
1364 g_assert_cmpint(err, ==, -EINVAL);
1365 }
1366
1367 static void test_qemu_strtoul_full_empty(void)
1368 {
1369 const char *str = "";
1370 unsigned long res = 999;
1371 int err;
1372
1373 err = qemu_strtoul(str, NULL, 0, &res);
1374
1375 g_assert_cmpint(err, ==, -EINVAL);
1376 }
1377 static void test_qemu_strtoul_full_negative(void)
1378 {
1379 const char *str = " \t -321";
1380 unsigned long res = 999;
1381 int err;
1382
1383 err = qemu_strtoul(str, NULL, 0, &res);
1384 g_assert_cmpint(err, ==, 0);
1385 g_assert_cmpuint(res, ==, -321ul);
1386 }
1387
1388 static void test_qemu_strtoul_full_trailing(void)
1389 {
1390 const char *str = "123xxx";
1391 unsigned long res;
1392 int err;
1393
1394 err = qemu_strtoul(str, NULL, 0, &res);
1395
1396 g_assert_cmpint(err, ==, -EINVAL);
1397 }
1398
1399 static void test_qemu_strtoul_full_max(void)
1400 {
1401 char *str = g_strdup_printf("%lu", ULONG_MAX);
1402 unsigned long res = 999;
1403 int err;
1404
1405 err = qemu_strtoul(str, NULL, 0, &res);
1406
1407 g_assert_cmpint(err, ==, 0);
1408 g_assert_cmphex(res, ==, ULONG_MAX);
1409 g_free(str);
1410 }
1411
1412 static void test_qemu_strtoi64_correct(void)
1413 {
1414 const char *str = "12345 foo";
1415 char f = 'X';
1416 const char *endptr = &f;
1417 int64_t res = 999;
1418 int err;
1419
1420 err = qemu_strtoi64(str, &endptr, 0, &res);
1421
1422 g_assert_cmpint(err, ==, 0);
1423 g_assert_cmpint(res, ==, 12345);
1424 g_assert_true(endptr == str + 5);
1425 }
1426
1427 static void test_qemu_strtoi64_null(void)
1428 {
1429 char f = 'X';
1430 const char *endptr = &f;
1431 int64_t res = 999;
1432 int err;
1433
1434 err = qemu_strtoi64(NULL, &endptr, 0, &res);
1435
1436 g_assert_cmpint(err, ==, -EINVAL);
1437 g_assert_null(endptr);
1438 }
1439
1440 static void test_qemu_strtoi64_empty(void)
1441 {
1442 const char *str = "";
1443 char f = 'X';
1444 const char *endptr = &f;
1445 int64_t res = 999;
1446 int err;
1447
1448 err = qemu_strtoi64(str, &endptr, 0, &res);
1449
1450 g_assert_cmpint(err, ==, -EINVAL);
1451 g_assert_true(endptr == str);
1452 }
1453
1454 static void test_qemu_strtoi64_whitespace(void)
1455 {
1456 const char *str = " \t ";
1457 char f = 'X';
1458 const char *endptr = &f;
1459 int64_t res = 999;
1460 int err;
1461
1462 err = qemu_strtoi64(str, &endptr, 0, &res);
1463
1464 g_assert_cmpint(err, ==, -EINVAL);
1465 g_assert_true(endptr == str);
1466 }
1467
1468 static void test_qemu_strtoi64_invalid(void)
1469 {
1470 const char *str = " xxxx \t abc";
1471 char f = 'X';
1472 const char *endptr = &f;
1473 int64_t res = 999;
1474 int err;
1475
1476 err = qemu_strtoi64(str, &endptr, 0, &res);
1477
1478 g_assert_cmpint(err, ==, -EINVAL);
1479 g_assert_true(endptr == str);
1480 }
1481
1482 static void test_qemu_strtoi64_trailing(void)
1483 {
1484 const char *str = "123xxx";
1485 char f = 'X';
1486 const char *endptr = &f;
1487 int64_t res = 999;
1488 int err;
1489
1490 err = qemu_strtoi64(str, &endptr, 0, &res);
1491
1492 g_assert_cmpint(err, ==, 0);
1493 g_assert_cmpint(res, ==, 123);
1494 g_assert_true(endptr == str + 3);
1495 }
1496
1497 static void test_qemu_strtoi64_octal(void)
1498 {
1499 const char *str = "0123";
1500 char f = 'X';
1501 const char *endptr = &f;
1502 int64_t res = 999;
1503 int err;
1504
1505 err = qemu_strtoi64(str, &endptr, 8, &res);
1506
1507 g_assert_cmpint(err, ==, 0);
1508 g_assert_cmpint(res, ==, 0123);
1509 g_assert_true(endptr == str + strlen(str));
1510
1511 endptr = &f;
1512 res = 999;
1513 err = qemu_strtoi64(str, &endptr, 0, &res);
1514
1515 g_assert_cmpint(err, ==, 0);
1516 g_assert_cmpint(res, ==, 0123);
1517 g_assert_true(endptr == str + strlen(str));
1518 }
1519
1520 static void test_qemu_strtoi64_decimal(void)
1521 {
1522 const char *str = "0123";
1523 char f = 'X';
1524 const char *endptr = &f;
1525 int64_t res = 999;
1526 int err;
1527
1528 err = qemu_strtoi64(str, &endptr, 10, &res);
1529
1530 g_assert_cmpint(err, ==, 0);
1531 g_assert_cmpint(res, ==, 123);
1532 g_assert_true(endptr == str + strlen(str));
1533
1534 str = "123";
1535 endptr = &f;
1536 res = 999;
1537 err = qemu_strtoi64(str, &endptr, 0, &res);
1538
1539 g_assert_cmpint(err, ==, 0);
1540 g_assert_cmpint(res, ==, 123);
1541 g_assert_true(endptr == str + strlen(str));
1542 }
1543
1544 static void test_qemu_strtoi64_hex(void)
1545 {
1546 const char *str = "0123";
1547 char f = 'X';
1548 const char *endptr = &f;
1549 int64_t res = 999;
1550 int err;
1551
1552 err = qemu_strtoi64(str, &endptr, 16, &res);
1553
1554 g_assert_cmpint(err, ==, 0);
1555 g_assert_cmpint(res, ==, 0x123);
1556 g_assert_true(endptr == str + strlen(str));
1557
1558 str = "0x123";
1559 endptr = &f;
1560 res = 999;
1561 err = qemu_strtoi64(str, &endptr, 0, &res);
1562
1563 g_assert_cmpint(err, ==, 0);
1564 g_assert_cmpint(res, ==, 0x123);
1565 g_assert_true(endptr == str + strlen(str));
1566
1567 str = "0x";
1568 endptr = &f;
1569 res = 999;
1570 err = qemu_strtoi64(str, &endptr, 16, &res);
1571
1572 g_assert_cmpint(err, ==, 0);
1573 g_assert_cmpint(res, ==, 0);
1574 g_assert_true(endptr == str + 1);
1575 }
1576
1577 static void test_qemu_strtoi64_max(void)
1578 {
1579 char *str = g_strdup_printf("%lld", LLONG_MAX);
1580 char f = 'X';
1581 const char *endptr = &f;
1582 int64_t res = 999;
1583 int err;
1584
1585 err = qemu_strtoi64(str, &endptr, 0, &res);
1586
1587 g_assert_cmpint(err, ==, 0);
1588 g_assert_cmpint(res, ==, LLONG_MAX);
1589 g_assert_true(endptr == str + strlen(str));
1590 g_free(str);
1591 }
1592
1593 static void test_qemu_strtoi64_overflow(void)
1594 {
1595 const char *str = "99999999999999999999999999999999999999999999";
1596 char f = 'X';
1597 const char *endptr = &f;
1598 int64_t res = 999;
1599 int err;
1600
1601 err = qemu_strtoi64(str, &endptr, 0, &res);
1602
1603 g_assert_cmpint(err, ==, -ERANGE);
1604 g_assert_cmpint(res, ==, LLONG_MAX);
1605 g_assert_true(endptr == str + strlen(str));
1606 }
1607
1608 static void test_qemu_strtoi64_underflow(void)
1609 {
1610 const char *str = "-99999999999999999999999999999999999999999999";
1611 char f = 'X';
1612 const char *endptr = &f;
1613 int64_t res = 999;
1614 int err;
1615
1616 err = qemu_strtoi64(str, &endptr, 0, &res);
1617
1618 g_assert_cmpint(err, ==, -ERANGE);
1619 g_assert_cmpint(res, ==, LLONG_MIN);
1620 g_assert_true(endptr == str + strlen(str));
1621 }
1622
1623 static void test_qemu_strtoi64_negative(void)
1624 {
1625 const char *str = " \t -321";
1626 char f = 'X';
1627 const char *endptr = &f;
1628 int64_t res = 999;
1629 int err;
1630
1631 err = qemu_strtoi64(str, &endptr, 0, &res);
1632
1633 g_assert_cmpint(err, ==, 0);
1634 g_assert_cmpint(res, ==, -321);
1635 g_assert_true(endptr == str + strlen(str));
1636 }
1637
1638 static void test_qemu_strtoi64_full_correct(void)
1639 {
1640 const char *str = "123";
1641 int64_t res = 999;
1642 int err;
1643
1644 err = qemu_strtoi64(str, NULL, 0, &res);
1645
1646 g_assert_cmpint(err, ==, 0);
1647 g_assert_cmpint(res, ==, 123);
1648 }
1649
1650 static void test_qemu_strtoi64_full_null(void)
1651 {
1652 int64_t res = 999;
1653 int err;
1654
1655 err = qemu_strtoi64(NULL, NULL, 0, &res);
1656
1657 g_assert_cmpint(err, ==, -EINVAL);
1658 }
1659
1660 static void test_qemu_strtoi64_full_empty(void)
1661 {
1662 const char *str = "";
1663 int64_t res = 999;
1664 int err;
1665
1666 err = qemu_strtoi64(str, NULL, 0, &res);
1667
1668 g_assert_cmpint(err, ==, -EINVAL);
1669 }
1670
1671 static void test_qemu_strtoi64_full_negative(void)
1672 {
1673 const char *str = " \t -321";
1674 int64_t res = 999;
1675 int err;
1676
1677 err = qemu_strtoi64(str, NULL, 0, &res);
1678
1679 g_assert_cmpint(err, ==, 0);
1680 g_assert_cmpint(res, ==, -321);
1681 }
1682
1683 static void test_qemu_strtoi64_full_trailing(void)
1684 {
1685 const char *str = "123xxx";
1686 int64_t res = 999;
1687 int err;
1688
1689 err = qemu_strtoi64(str, NULL, 0, &res);
1690
1691 g_assert_cmpint(err, ==, -EINVAL);
1692 }
1693
1694 static void test_qemu_strtoi64_full_max(void)
1695 {
1696
1697 char *str = g_strdup_printf("%lld", LLONG_MAX);
1698 int64_t res;
1699 int err;
1700
1701 err = qemu_strtoi64(str, NULL, 0, &res);
1702
1703 g_assert_cmpint(err, ==, 0);
1704 g_assert_cmpint(res, ==, LLONG_MAX);
1705 g_free(str);
1706 }
1707
1708 static void test_qemu_strtou64_correct(void)
1709 {
1710 const char *str = "12345 foo";
1711 char f = 'X';
1712 const char *endptr = &f;
1713 uint64_t res = 999;
1714 int err;
1715
1716 err = qemu_strtou64(str, &endptr, 0, &res);
1717
1718 g_assert_cmpint(err, ==, 0);
1719 g_assert_cmpuint(res, ==, 12345);
1720 g_assert_true(endptr == str + 5);
1721 }
1722
1723 static void test_qemu_strtou64_null(void)
1724 {
1725 char f = 'X';
1726 const char *endptr = &f;
1727 uint64_t res = 999;
1728 int err;
1729
1730 err = qemu_strtou64(NULL, &endptr, 0, &res);
1731
1732 g_assert_cmpint(err, ==, -EINVAL);
1733 g_assert_null(endptr);
1734 }
1735
1736 static void test_qemu_strtou64_empty(void)
1737 {
1738 const char *str = "";
1739 char f = 'X';
1740 const char *endptr = &f;
1741 uint64_t res = 999;
1742 int err;
1743
1744 err = qemu_strtou64(str, &endptr, 0, &res);
1745
1746 g_assert_cmpint(err, ==, -EINVAL);
1747 g_assert_true(endptr == str);
1748 }
1749
1750 static void test_qemu_strtou64_whitespace(void)
1751 {
1752 const char *str = " \t ";
1753 char f = 'X';
1754 const char *endptr = &f;
1755 uint64_t res = 999;
1756 int err;
1757
1758 err = qemu_strtou64(str, &endptr, 0, &res);
1759
1760 g_assert_cmpint(err, ==, -EINVAL);
1761 g_assert_true(endptr == str);
1762 }
1763
1764 static void test_qemu_strtou64_invalid(void)
1765 {
1766 const char *str = " xxxx \t abc";
1767 char f = 'X';
1768 const char *endptr = &f;
1769 uint64_t res = 999;
1770 int err;
1771
1772 err = qemu_strtou64(str, &endptr, 0, &res);
1773
1774 g_assert_cmpint(err, ==, -EINVAL);
1775 g_assert_true(endptr == str);
1776 }
1777
1778 static void test_qemu_strtou64_trailing(void)
1779 {
1780 const char *str = "123xxx";
1781 char f = 'X';
1782 const char *endptr = &f;
1783 uint64_t res = 999;
1784 int err;
1785
1786 err = qemu_strtou64(str, &endptr, 0, &res);
1787
1788 g_assert_cmpint(err, ==, 0);
1789 g_assert_cmpuint(res, ==, 123);
1790 g_assert_true(endptr == str + 3);
1791 }
1792
1793 static void test_qemu_strtou64_octal(void)
1794 {
1795 const char *str = "0123";
1796 char f = 'X';
1797 const char *endptr = &f;
1798 uint64_t res = 999;
1799 int err;
1800
1801 err = qemu_strtou64(str, &endptr, 8, &res);
1802
1803 g_assert_cmpint(err, ==, 0);
1804 g_assert_cmpuint(res, ==, 0123);
1805 g_assert_true(endptr == str + strlen(str));
1806
1807 endptr = &f;
1808 res = 999;
1809 err = qemu_strtou64(str, &endptr, 0, &res);
1810
1811 g_assert_cmpint(err, ==, 0);
1812 g_assert_cmpuint(res, ==, 0123);
1813 g_assert_true(endptr == str + strlen(str));
1814 }
1815
1816 static void test_qemu_strtou64_decimal(void)
1817 {
1818 const char *str = "0123";
1819 char f = 'X';
1820 const char *endptr = &f;
1821 uint64_t res = 999;
1822 int err;
1823
1824 err = qemu_strtou64(str, &endptr, 10, &res);
1825
1826 g_assert_cmpint(err, ==, 0);
1827 g_assert_cmpuint(res, ==, 123);
1828 g_assert_true(endptr == str + strlen(str));
1829
1830 str = "123";
1831 endptr = &f;
1832 res = 999;
1833 err = qemu_strtou64(str, &endptr, 0, &res);
1834
1835 g_assert_cmpint(err, ==, 0);
1836 g_assert_cmpuint(res, ==, 123);
1837 g_assert_true(endptr == str + strlen(str));
1838 }
1839
1840 static void test_qemu_strtou64_hex(void)
1841 {
1842 const char *str = "0123";
1843 char f = 'X';
1844 const char *endptr = &f;
1845 uint64_t res = 999;
1846 int err;
1847
1848 err = qemu_strtou64(str, &endptr, 16, &res);
1849
1850 g_assert_cmpint(err, ==, 0);
1851 g_assert_cmphex(res, ==, 0x123);
1852 g_assert_true(endptr == str + strlen(str));
1853
1854 str = "0x123";
1855 endptr = &f;
1856 res = 999;
1857 err = qemu_strtou64(str, &endptr, 0, &res);
1858
1859 g_assert_cmpint(err, ==, 0);
1860 g_assert_cmphex(res, ==, 0x123);
1861 g_assert_true(endptr == str + strlen(str));
1862
1863 str = "0x";
1864 endptr = &f;
1865 res = 999;
1866 err = qemu_strtou64(str, &endptr, 16, &res);
1867
1868 g_assert_cmpint(err, ==, 0);
1869 g_assert_cmphex(res, ==, 0);
1870 g_assert_true(endptr == str + 1);
1871 }
1872
1873 static void test_qemu_strtou64_max(void)
1874 {
1875 char *str = g_strdup_printf("%llu", ULLONG_MAX);
1876 char f = 'X';
1877 const char *endptr = &f;
1878 uint64_t res = 999;
1879 int err;
1880
1881 err = qemu_strtou64(str, &endptr, 0, &res);
1882
1883 g_assert_cmpint(err, ==, 0);
1884 g_assert_cmphex(res, ==, ULLONG_MAX);
1885 g_assert_true(endptr == str + strlen(str));
1886 g_free(str);
1887 }
1888
1889 static void test_qemu_strtou64_overflow(void)
1890 {
1891 const char *str = "99999999999999999999999999999999999999999999";
1892 char f = 'X';
1893 const char *endptr = &f;
1894 uint64_t res = 999;
1895 int err;
1896
1897 err = qemu_strtou64(str, &endptr, 0, &res);
1898
1899 g_assert_cmpint(err, ==, -ERANGE);
1900 g_assert_cmphex(res, ==, ULLONG_MAX);
1901 g_assert_true(endptr == str + strlen(str));
1902 }
1903
1904 static void test_qemu_strtou64_underflow(void)
1905 {
1906 const char *str = "-99999999999999999999999999999999999999999999";
1907 char f = 'X';
1908 const char *endptr = &f;
1909 uint64_t res = 999;
1910 int err;
1911
1912 err = qemu_strtou64(str, &endptr, 0, &res);
1913
1914 g_assert_cmpint(err, ==, -ERANGE);
1915 g_assert_cmphex(res, ==, -1ull);
1916 g_assert_true(endptr == str + strlen(str));
1917 }
1918
1919 static void test_qemu_strtou64_negative(void)
1920 {
1921 const char *str = " \t -321";
1922 char f = 'X';
1923 const char *endptr = &f;
1924 uint64_t res = 999;
1925 int err;
1926
1927 err = qemu_strtou64(str, &endptr, 0, &res);
1928
1929 g_assert_cmpint(err, ==, 0);
1930 g_assert_cmpuint(res, ==, -321ull);
1931 g_assert_true(endptr == str + strlen(str));
1932 }
1933
1934 static void test_qemu_strtou64_full_correct(void)
1935 {
1936 const char *str = "18446744073709551614";
1937 uint64_t res = 999;
1938 int err;
1939
1940 err = qemu_strtou64(str, NULL, 0, &res);
1941
1942 g_assert_cmpint(err, ==, 0);
1943 g_assert_cmpuint(res, ==, 18446744073709551614ull);
1944 }
1945
1946 static void test_qemu_strtou64_full_null(void)
1947 {
1948 uint64_t res = 999;
1949 int err;
1950
1951 err = qemu_strtou64(NULL, NULL, 0, &res);
1952
1953 g_assert_cmpint(err, ==, -EINVAL);
1954 }
1955
1956 static void test_qemu_strtou64_full_empty(void)
1957 {
1958 const char *str = "";
1959 uint64_t res = 999;
1960 int err;
1961
1962 err = qemu_strtou64(str, NULL, 0, &res);
1963
1964 g_assert_cmpint(err, ==, -EINVAL);
1965 }
1966
1967 static void test_qemu_strtou64_full_negative(void)
1968 {
1969 const char *str = " \t -321";
1970 uint64_t res = 999;
1971 int err;
1972
1973 err = qemu_strtou64(str, NULL, 0, &res);
1974
1975 g_assert_cmpint(err, ==, 0);
1976 g_assert_cmpuint(res, ==, -321ull);
1977 }
1978
1979 static void test_qemu_strtou64_full_trailing(void)
1980 {
1981 const char *str = "18446744073709551614xxxxxx";
1982 uint64_t res = 999;
1983 int err;
1984
1985 err = qemu_strtou64(str, NULL, 0, &res);
1986
1987 g_assert_cmpint(err, ==, -EINVAL);
1988 }
1989
1990 static void test_qemu_strtou64_full_max(void)
1991 {
1992 char *str = g_strdup_printf("%lld", ULLONG_MAX);
1993 uint64_t res = 999;
1994 int err;
1995
1996 err = qemu_strtou64(str, NULL, 0, &res);
1997
1998 g_assert_cmpint(err, ==, 0);
1999 g_assert_cmphex(res, ==, ULLONG_MAX);
2000 g_free(str);
2001 }
2002
2003 static void test_qemu_strtosz_simple(void)
2004 {
2005 const char *str;
2006 const char *endptr;
2007 int err;
2008 uint64_t res;
2009
2010 str = "0";
2011 endptr = str;
2012 res = 0xbaadf00d;
2013 err = qemu_strtosz(str, &endptr, &res);
2014 g_assert_cmpint(err, ==, 0);
2015 g_assert_cmpint(res, ==, 0);
2016 g_assert_true(endptr == str + 1);
2017
2018 /* Leading 0 gives decimal results, not octal */
2019 str = "08";
2020 endptr = str;
2021 res = 0xbaadf00d;
2022 err = qemu_strtosz(str, &endptr, &res);
2023 g_assert_cmpint(err, ==, 0);
2024 g_assert_cmpint(res, ==, 8);
2025 g_assert_true(endptr == str + 2);
2026
2027 /* Leading space is ignored */
2028 str = " 12345";
2029 endptr = str;
2030 res = 0xbaadf00d;
2031 err = qemu_strtosz(str, &endptr, &res);
2032 g_assert_cmpint(err, ==, 0);
2033 g_assert_cmpint(res, ==, 12345);
2034 g_assert_true(endptr == str + 6);
2035
2036 res = 0xbaadf00d;
2037 err = qemu_strtosz(str, NULL, &res);
2038 g_assert_cmpint(err, ==, 0);
2039 g_assert_cmpint(res, ==, 12345);
2040
2041 str = "9007199254740991"; /* 2^53-1 */
2042 endptr = str;
2043 res = 0xbaadf00d;
2044 err = qemu_strtosz(str, &endptr, &res);
2045 g_assert_cmpint(err, ==, 0);
2046 g_assert_cmpint(res, ==, 0x1fffffffffffff);
2047 g_assert_true(endptr == str + 16);
2048
2049 str = "9007199254740992"; /* 2^53 */
2050 endptr = str;
2051 res = 0xbaadf00d;
2052 err = qemu_strtosz(str, &endptr, &res);
2053 g_assert_cmpint(err, ==, 0);
2054 g_assert_cmpint(res, ==, 0x20000000000000);
2055 g_assert_true(endptr == str + 16);
2056
2057 str = "9007199254740993"; /* 2^53+1 */
2058 endptr = str;
2059 res = 0xbaadf00d;
2060 err = qemu_strtosz(str, &endptr, &res);
2061 g_assert_cmpint(err, ==, 0);
2062 g_assert_cmpint(res, ==, 0x20000000000001);
2063 g_assert_true(endptr == str + 16);
2064
2065 str = "18446744073709549568"; /* 0xfffffffffffff800 (53 msbs set) */
2066 endptr = str;
2067 res = 0xbaadf00d;
2068 err = qemu_strtosz(str, &endptr, &res);
2069 g_assert_cmpint(err, ==, 0);
2070 g_assert_cmpint(res, ==, 0xfffffffffffff800);
2071 g_assert_true(endptr == str + 20);
2072
2073 str = "18446744073709550591"; /* 0xfffffffffffffbff */
2074 endptr = str;
2075 res = 0xbaadf00d;
2076 err = qemu_strtosz(str, &endptr, &res);
2077 g_assert_cmpint(err, ==, 0);
2078 g_assert_cmpint(res, ==, 0xfffffffffffffbff);
2079 g_assert_true(endptr == str + 20);
2080
2081 str = "18446744073709551615"; /* 0xffffffffffffffff */
2082 endptr = str;
2083 res = 0xbaadf00d;
2084 err = qemu_strtosz(str, &endptr, &res);
2085 g_assert_cmpint(err, ==, 0);
2086 g_assert_cmpint(res, ==, 0xffffffffffffffff);
2087 g_assert_true(endptr == str + 20);
2088 }
2089
2090 static void test_qemu_strtosz_hex(void)
2091 {
2092 const char *str;
2093 const char *endptr;
2094 int err;
2095 uint64_t res;
2096
2097 str = "0x0";
2098 endptr = str;
2099 res = 0xbaadf00d;
2100 err = qemu_strtosz(str, &endptr, &res);
2101 g_assert_cmpint(err, ==, 0);
2102 g_assert_cmpint(res, ==, 0);
2103 g_assert_true(endptr == str + 3);
2104
2105 str = "0xab";
2106 endptr = str;
2107 res = 0xbaadf00d;
2108 err = qemu_strtosz(str, &endptr, &res);
2109 g_assert_cmpint(err, ==, 0);
2110 g_assert_cmpint(res, ==, 171);
2111 g_assert_true(endptr == str + 4);
2112
2113 str = "0xae";
2114 endptr = str;
2115 res = 0xbaadf00d;
2116 err = qemu_strtosz(str, &endptr, &res);
2117 g_assert_cmpint(err, ==, 0);
2118 g_assert_cmpint(res, ==, 174);
2119 g_assert_true(endptr == str + 4);
2120 }
2121
2122 static void test_qemu_strtosz_units(void)
2123 {
2124 const char *none = "1";
2125 const char *b = "1B";
2126 const char *k = "1K";
2127 const char *m = "1M";
2128 const char *g = "1G";
2129 const char *t = "1T";
2130 const char *p = "1P";
2131 const char *e = "1E";
2132 int err;
2133 const char *endptr;
2134 uint64_t res;
2135
2136 /* default is M */
2137 endptr = NULL;
2138 res = 0xbaadf00d;
2139 err = qemu_strtosz_MiB(none, &endptr, &res);
2140 g_assert_cmpint(err, ==, 0);
2141 g_assert_cmpint(res, ==, MiB);
2142 g_assert_true(endptr == none + 1);
2143
2144 endptr = NULL;
2145 res = 0xbaadf00d;
2146 err = qemu_strtosz(b, &endptr, &res);
2147 g_assert_cmpint(err, ==, 0);
2148 g_assert_cmpint(res, ==, 1);
2149 g_assert_true(endptr == b + 2);
2150
2151 endptr = NULL;
2152 res = 0xbaadf00d;
2153 err = qemu_strtosz(k, &endptr, &res);
2154 g_assert_cmpint(err, ==, 0);
2155 g_assert_cmpint(res, ==, KiB);
2156 g_assert_true(endptr == k + 2);
2157
2158 endptr = NULL;
2159 res = 0xbaadf00d;
2160 err = qemu_strtosz(m, &endptr, &res);
2161 g_assert_cmpint(err, ==, 0);
2162 g_assert_cmpint(res, ==, MiB);
2163 g_assert_true(endptr == m + 2);
2164
2165 endptr = NULL;
2166 res = 0xbaadf00d;
2167 err = qemu_strtosz(g, &endptr, &res);
2168 g_assert_cmpint(err, ==, 0);
2169 g_assert_cmpint(res, ==, GiB);
2170 g_assert_true(endptr == g + 2);
2171
2172 endptr = NULL;
2173 res = 0xbaadf00d;
2174 err = qemu_strtosz(t, &endptr, &res);
2175 g_assert_cmpint(err, ==, 0);
2176 g_assert_cmpint(res, ==, TiB);
2177 g_assert_true(endptr == t + 2);
2178
2179 endptr = NULL;
2180 res = 0xbaadf00d;
2181 err = qemu_strtosz(p, &endptr, &res);
2182 g_assert_cmpint(err, ==, 0);
2183 g_assert_cmpint(res, ==, PiB);
2184 g_assert_true(endptr == p + 2);
2185
2186 endptr = NULL;
2187 res = 0xbaadf00d;
2188 err = qemu_strtosz(e, &endptr, &res);
2189 g_assert_cmpint(err, ==, 0);
2190 g_assert_cmpint(res, ==, EiB);
2191 g_assert_true(endptr == e + 2);
2192 }
2193
2194 static void test_qemu_strtosz_float(void)
2195 {
2196 const char *str;
2197 int err;
2198 const char *endptr;
2199 uint64_t res;
2200
2201 str = "0.5E";
2202 endptr = str;
2203 res = 0xbaadf00d;
2204 err = qemu_strtosz(str, &endptr, &res);
2205 g_assert_cmpint(err, ==, 0);
2206 g_assert_cmpint(res, ==, EiB / 2);
2207 g_assert_true(endptr == str + 4);
2208
2209 /* For convenience, a fraction of 0 is tolerated even on bytes */
2210 str = "1.0B";
2211 endptr = str;
2212 res = 0xbaadf00d;
2213 err = qemu_strtosz(str, &endptr, &res);
2214 g_assert_cmpint(err, ==, 0);
2215 g_assert_cmpint(res, ==, 1);
2216 g_assert_true(endptr == str + 4);
2217
2218 /* An empty fraction is tolerated */
2219 str = "1.k";
2220 endptr = str;
2221 res = 0xbaadf00d;
2222 err = qemu_strtosz(str, &endptr, &res);
2223 g_assert_cmpint(err, ==, 0);
2224 g_assert_cmpint(res, ==, 1024);
2225 g_assert_true(endptr == str + 3);
2226
2227 /* For convenience, we permit values that are not byte-exact */
2228 str = "12.345M";
2229 endptr = str;
2230 res = 0xbaadf00d;
2231 err = qemu_strtosz(str, &endptr, &res);
2232 g_assert_cmpint(err, ==, 0);
2233 g_assert_cmpint(res, ==, (uint64_t) (12.345 * MiB + 0.5));
2234 g_assert_true(endptr == str + 7);
2235 }
2236
2237 static void test_qemu_strtosz_invalid(void)
2238 {
2239 const char *str;
2240 const char *endptr;
2241 int err;
2242 uint64_t res = 0xbaadf00d;
2243
2244 str = "";
2245 endptr = NULL;
2246 err = qemu_strtosz(str, &endptr, &res);
2247 g_assert_cmpint(err, ==, -EINVAL);
2248 g_assert_cmpint(res, ==, 0xbaadf00d);
2249 g_assert_true(endptr == str);
2250
2251 str = " \t ";
2252 endptr = NULL;
2253 err = qemu_strtosz(str, &endptr, &res);
2254 g_assert_cmpint(err, ==, -EINVAL);
2255 g_assert_cmpint(res, ==, 0xbaadf00d);
2256 g_assert_true(endptr == str);
2257
2258 str = "crap";
2259 endptr = NULL;
2260 err = qemu_strtosz(str, &endptr, &res);
2261 g_assert_cmpint(err, ==, -EINVAL);
2262 g_assert_cmpint(res, ==, 0xbaadf00d);
2263 g_assert_true(endptr == str);
2264
2265 str = "inf";
2266 endptr = NULL;
2267 err = qemu_strtosz(str, &endptr, &res);
2268 g_assert_cmpint(err, ==, -EINVAL);
2269 g_assert_cmpint(res, ==, 0xbaadf00d);
2270 g_assert_true(endptr == str);
2271
2272 str = "NaN";
2273 endptr = NULL;
2274 err = qemu_strtosz(str, &endptr, &res);
2275 g_assert_cmpint(err, ==, -EINVAL);
2276 g_assert_cmpint(res, ==, 0xbaadf00d);
2277 g_assert_true(endptr == str);
2278
2279 /* Fractional values require scale larger than bytes */
2280 str = "1.1B";
2281 endptr = NULL;
2282 err = qemu_strtosz(str, &endptr, &res);
2283 g_assert_cmpint(err, ==, -EINVAL);
2284 g_assert_cmpint(res, ==, 0xbaadf00d);
2285 g_assert_true(endptr == str);
2286
2287 str = "1.1";
2288 endptr = NULL;
2289 err = qemu_strtosz(str, &endptr, &res);
2290 g_assert_cmpint(err, ==, -EINVAL);
2291 g_assert_cmpint(res, ==, 0xbaadf00d);
2292 g_assert_true(endptr == str);
2293
2294 /* No floating point exponents */
2295 str = "1.5e1k";
2296 endptr = NULL;
2297 err = qemu_strtosz(str, &endptr, &res);
2298 g_assert_cmpint(err, ==, -EINVAL);
2299 g_assert_cmpint(res, ==, 0xbaadf00d);
2300 g_assert_true(endptr == str);
2301
2302 str = "1.5E+0k";
2303 endptr = NULL;
2304 err = qemu_strtosz(str, &endptr, &res);
2305 g_assert_cmpint(err, ==, -EINVAL);
2306 g_assert_cmpint(res, ==, 0xbaadf00d);
2307 g_assert_true(endptr == str);
2308
2309 /* No hex fractions */
2310 str = "0x1.8k";
2311 endptr = NULL;
2312 err = qemu_strtosz(str, &endptr, &res);
2313 g_assert_cmpint(err, ==, -EINVAL);
2314 g_assert_cmpint(res, ==, 0xbaadf00d);
2315 g_assert_true(endptr == str);
2316
2317 /* No suffixes */
2318 str = "0x18M";
2319 endptr = NULL;
2320 err = qemu_strtosz(str, &endptr, &res);
2321 g_assert_cmpint(err, ==, -EINVAL);
2322 g_assert_cmpint(res, ==, 0xbaadf00d);
2323 g_assert_true(endptr == str);
2324
2325 /* No negative values */
2326 str = "-0";
2327 endptr = NULL;
2328 err = qemu_strtosz(str, &endptr, &res);
2329 g_assert_cmpint(err, ==, -EINVAL);
2330 g_assert_cmpint(res, ==, 0xbaadf00d);
2331 g_assert_true(endptr == str);
2332
2333 str = "-1";
2334 endptr = NULL;
2335 err = qemu_strtosz(str, &endptr, &res);
2336 g_assert_cmpint(err, ==, -EINVAL);
2337 g_assert_cmpint(res, ==, 0xbaadf00d);
2338 g_assert_true(endptr == str);
2339 }
2340
2341 static void test_qemu_strtosz_trailing(void)
2342 {
2343 const char *str;
2344 const char *endptr;
2345 int err;
2346 uint64_t res;
2347
2348 str = "123xxx";
2349 endptr = NULL;
2350 res = 0xbaadf00d;
2351 err = qemu_strtosz_MiB(str, &endptr, &res);
2352 g_assert_cmpint(err, ==, 0);
2353 g_assert_cmpint(res, ==, 123 * MiB);
2354 g_assert_true(endptr == str + 3);
2355
2356 res = 0xbaadf00d;
2357 err = qemu_strtosz(str, NULL, &res);
2358 g_assert_cmpint(err, ==, -EINVAL);
2359 g_assert_cmpint(res, ==, 0xbaadf00d);
2360
2361 str = "1kiB";
2362 endptr = NULL;
2363 res = 0xbaadf00d;
2364 err = qemu_strtosz(str, &endptr, &res);
2365 g_assert_cmpint(err, ==, 0);
2366 g_assert_cmpint(res, ==, 1024);
2367 g_assert_true(endptr == str + 2);
2368
2369 res = 0xbaadf00d;
2370 err = qemu_strtosz(str, NULL, &res);
2371 g_assert_cmpint(err, ==, -EINVAL);
2372 g_assert_cmpint(res, ==, 0xbaadf00d);
2373
2374 str = "0x";
2375 endptr = NULL;
2376 res = 0xbaadf00d;
2377 err = qemu_strtosz(str, &endptr, &res);
2378 g_assert_cmpint(err, ==, 0);
2379 g_assert_cmpint(res, ==, 0);
2380 g_assert_true(endptr == str + 1);
2381
2382 res = 0xbaadf00d;
2383 err = qemu_strtosz(str, NULL, &res);
2384 g_assert_cmpint(err, ==, -EINVAL);
2385 g_assert_cmpint(res, ==, 0xbaadf00d);
2386
2387 str = "0.NaN";
2388 endptr = NULL;
2389 res = 0xbaadf00d;
2390 err = qemu_strtosz(str, &endptr, &res);
2391 g_assert_cmpint(err, ==, 0);
2392 g_assert_cmpint(res, ==, 0);
2393 g_assert_true(endptr == str + 2);
2394
2395 res = 0xbaadf00d;
2396 err = qemu_strtosz(str, NULL, &res);
2397 g_assert_cmpint(err, ==, -EINVAL);
2398 g_assert_cmpint(res, ==, 0xbaadf00d);
2399
2400 str = "123-45";
2401 endptr = NULL;
2402 res = 0xbaadf00d;
2403 err = qemu_strtosz(str, &endptr, &res);
2404 g_assert_cmpint(err, ==, 0);
2405 g_assert_cmpint(res, ==, 123);
2406 g_assert_true(endptr == str + 3);
2407
2408 res = 0xbaadf00d;
2409 err = qemu_strtosz(str, NULL, &res);
2410 g_assert_cmpint(err, ==, -EINVAL);
2411 g_assert_cmpint(res, ==, 0xbaadf00d);
2412 }
2413
2414 static void test_qemu_strtosz_erange(void)
2415 {
2416 const char *str;
2417 const char *endptr;
2418 int err;
2419 uint64_t res = 0xbaadf00d;
2420
2421 str = "18446744073709551616"; /* 2^64; see strtosz_simple for 2^64-1 */
2422 endptr = NULL;
2423 err = qemu_strtosz(str, &endptr, &res);
2424 g_assert_cmpint(err, ==, -ERANGE);
2425 g_assert_cmpint(res, ==, 0xbaadf00d);
2426 g_assert_true(endptr == str + 20);
2427
2428 str = "20E";
2429 endptr = NULL;
2430 err = qemu_strtosz(str, &endptr, &res);
2431 g_assert_cmpint(err, ==, -ERANGE);
2432 g_assert_cmpint(res, ==, 0xbaadf00d);
2433 g_assert_true(endptr == str + 3);
2434 }
2435
2436 static void test_qemu_strtosz_metric(void)
2437 {
2438 const char *str;
2439 int err;
2440 const char *endptr;
2441 uint64_t res;
2442
2443 str = "12345k";
2444 endptr = str;
2445 res = 0xbaadf00d;
2446 err = qemu_strtosz_metric(str, &endptr, &res);
2447 g_assert_cmpint(err, ==, 0);
2448 g_assert_cmpint(res, ==, 12345000);
2449 g_assert_true(endptr == str + 6);
2450
2451 str = "12.345M";
2452 endptr = str;
2453 res = 0xbaadf00d;
2454 err = qemu_strtosz_metric(str, &endptr, &res);
2455 g_assert_cmpint(err, ==, 0);
2456 g_assert_cmpint(res, ==, 12345000);
2457 g_assert_true(endptr == str + 7);
2458 }
2459
2460 static void test_freq_to_str(void)
2461 {
2462 char *str;
2463
2464 str = freq_to_str(999);
2465 g_assert_cmpstr(str, ==, "999 Hz");
2466 g_free(str);
2467
2468 str = freq_to_str(1000);
2469 g_assert_cmpstr(str, ==, "1 KHz");
2470 g_free(str);
2471
2472 str = freq_to_str(1010);
2473 g_assert_cmpstr(str, ==, "1.01 KHz");
2474 g_free(str);
2475 }
2476
2477 static void test_size_to_str(void)
2478 {
2479 char *str;
2480
2481 str = size_to_str(0);
2482 g_assert_cmpstr(str, ==, "0 B");
2483 g_free(str);
2484
2485 str = size_to_str(1);
2486 g_assert_cmpstr(str, ==, "1 B");
2487 g_free(str);
2488
2489 str = size_to_str(1016);
2490 g_assert_cmpstr(str, ==, "0.992 KiB");
2491 g_free(str);
2492
2493 str = size_to_str(1024);
2494 g_assert_cmpstr(str, ==, "1 KiB");
2495 g_free(str);
2496
2497 str = size_to_str(512ull << 20);
2498 g_assert_cmpstr(str, ==, "512 MiB");
2499 g_free(str);
2500 }
2501
2502 static void test_iec_binary_prefix(void)
2503 {
2504 g_assert_cmpstr(iec_binary_prefix(0), ==, "");
2505 g_assert_cmpstr(iec_binary_prefix(10), ==, "Ki");
2506 g_assert_cmpstr(iec_binary_prefix(20), ==, "Mi");
2507 g_assert_cmpstr(iec_binary_prefix(30), ==, "Gi");
2508 g_assert_cmpstr(iec_binary_prefix(40), ==, "Ti");
2509 g_assert_cmpstr(iec_binary_prefix(50), ==, "Pi");
2510 g_assert_cmpstr(iec_binary_prefix(60), ==, "Ei");
2511 }
2512
2513 static void test_si_prefix(void)
2514 {
2515 g_assert_cmpstr(si_prefix(-18), ==, "a");
2516 g_assert_cmpstr(si_prefix(-15), ==, "f");
2517 g_assert_cmpstr(si_prefix(-12), ==, "p");
2518 g_assert_cmpstr(si_prefix(-9), ==, "n");
2519 g_assert_cmpstr(si_prefix(-6), ==, "u");
2520 g_assert_cmpstr(si_prefix(-3), ==, "m");
2521 g_assert_cmpstr(si_prefix(0), ==, "");
2522 g_assert_cmpstr(si_prefix(3), ==, "K");
2523 g_assert_cmpstr(si_prefix(6), ==, "M");
2524 g_assert_cmpstr(si_prefix(9), ==, "G");
2525 g_assert_cmpstr(si_prefix(12), ==, "T");
2526 g_assert_cmpstr(si_prefix(15), ==, "P");
2527 g_assert_cmpstr(si_prefix(18), ==, "E");
2528 }
2529
2530 int main(int argc, char **argv)
2531 {
2532 g_test_init(&argc, &argv, NULL);
2533
2534 g_test_add_func("/cutils/parse_uint/null", test_parse_uint_null);
2535 g_test_add_func("/cutils/parse_uint/empty", test_parse_uint_empty);
2536 g_test_add_func("/cutils/parse_uint/whitespace",
2537 test_parse_uint_whitespace);
2538 g_test_add_func("/cutils/parse_uint/invalid", test_parse_uint_invalid);
2539 g_test_add_func("/cutils/parse_uint/trailing", test_parse_uint_trailing);
2540 g_test_add_func("/cutils/parse_uint/correct", test_parse_uint_correct);
2541 g_test_add_func("/cutils/parse_uint/octal", test_parse_uint_octal);
2542 g_test_add_func("/cutils/parse_uint/decimal", test_parse_uint_decimal);
2543 g_test_add_func("/cutils/parse_uint/llong_max", test_parse_uint_llong_max);
2544 g_test_add_func("/cutils/parse_uint/overflow", test_parse_uint_overflow);
2545 g_test_add_func("/cutils/parse_uint/negative", test_parse_uint_negative);
2546 g_test_add_func("/cutils/parse_uint_full/trailing",
2547 test_parse_uint_full_trailing);
2548 g_test_add_func("/cutils/parse_uint_full/correct",
2549 test_parse_uint_full_correct);
2550
2551 /* qemu_strtoi() tests */
2552 g_test_add_func("/cutils/qemu_strtoi/correct",
2553 test_qemu_strtoi_correct);
2554 g_test_add_func("/cutils/qemu_strtoi/null",
2555 test_qemu_strtoi_null);
2556 g_test_add_func("/cutils/qemu_strtoi/empty",
2557 test_qemu_strtoi_empty);
2558 g_test_add_func("/cutils/qemu_strtoi/whitespace",
2559 test_qemu_strtoi_whitespace);
2560 g_test_add_func("/cutils/qemu_strtoi/invalid",
2561 test_qemu_strtoi_invalid);
2562 g_test_add_func("/cutils/qemu_strtoi/trailing",
2563 test_qemu_strtoi_trailing);
2564 g_test_add_func("/cutils/qemu_strtoi/octal",
2565 test_qemu_strtoi_octal);
2566 g_test_add_func("/cutils/qemu_strtoi/decimal",
2567 test_qemu_strtoi_decimal);
2568 g_test_add_func("/cutils/qemu_strtoi/hex",
2569 test_qemu_strtoi_hex);
2570 g_test_add_func("/cutils/qemu_strtoi/max",
2571 test_qemu_strtoi_max);
2572 g_test_add_func("/cutils/qemu_strtoi/overflow",
2573 test_qemu_strtoi_overflow);
2574 g_test_add_func("/cutils/qemu_strtoi/underflow",
2575 test_qemu_strtoi_underflow);
2576 g_test_add_func("/cutils/qemu_strtoi/negative",
2577 test_qemu_strtoi_negative);
2578 g_test_add_func("/cutils/qemu_strtoi_full/correct",
2579 test_qemu_strtoi_full_correct);
2580 g_test_add_func("/cutils/qemu_strtoi_full/null",
2581 test_qemu_strtoi_full_null);
2582 g_test_add_func("/cutils/qemu_strtoi_full/empty",
2583 test_qemu_strtoi_full_empty);
2584 g_test_add_func("/cutils/qemu_strtoi_full/negative",
2585 test_qemu_strtoi_full_negative);
2586 g_test_add_func("/cutils/qemu_strtoi_full/trailing",
2587 test_qemu_strtoi_full_trailing);
2588 g_test_add_func("/cutils/qemu_strtoi_full/max",
2589 test_qemu_strtoi_full_max);
2590
2591 /* qemu_strtoui() tests */
2592 g_test_add_func("/cutils/qemu_strtoui/correct",
2593 test_qemu_strtoui_correct);
2594 g_test_add_func("/cutils/qemu_strtoui/null",
2595 test_qemu_strtoui_null);
2596 g_test_add_func("/cutils/qemu_strtoui/empty",
2597 test_qemu_strtoui_empty);
2598 g_test_add_func("/cutils/qemu_strtoui/whitespace",
2599 test_qemu_strtoui_whitespace);
2600 g_test_add_func("/cutils/qemu_strtoui/invalid",
2601 test_qemu_strtoui_invalid);
2602 g_test_add_func("/cutils/qemu_strtoui/trailing",
2603 test_qemu_strtoui_trailing);
2604 g_test_add_func("/cutils/qemu_strtoui/octal",
2605 test_qemu_strtoui_octal);
2606 g_test_add_func("/cutils/qemu_strtoui/decimal",
2607 test_qemu_strtoui_decimal);
2608 g_test_add_func("/cutils/qemu_strtoui/hex",
2609 test_qemu_strtoui_hex);
2610 g_test_add_func("/cutils/qemu_strtoui/max",
2611 test_qemu_strtoui_max);
2612 g_test_add_func("/cutils/qemu_strtoui/overflow",
2613 test_qemu_strtoui_overflow);
2614 g_test_add_func("/cutils/qemu_strtoui/underflow",
2615 test_qemu_strtoui_underflow);
2616 g_test_add_func("/cutils/qemu_strtoui/negative",
2617 test_qemu_strtoui_negative);
2618 g_test_add_func("/cutils/qemu_strtoui_full/correct",
2619 test_qemu_strtoui_full_correct);
2620 g_test_add_func("/cutils/qemu_strtoui_full/null",
2621 test_qemu_strtoui_full_null);
2622 g_test_add_func("/cutils/qemu_strtoui_full/empty",
2623 test_qemu_strtoui_full_empty);
2624 g_test_add_func("/cutils/qemu_strtoui_full/negative",
2625 test_qemu_strtoui_full_negative);
2626 g_test_add_func("/cutils/qemu_strtoui_full/trailing",
2627 test_qemu_strtoui_full_trailing);
2628 g_test_add_func("/cutils/qemu_strtoui_full/max",
2629 test_qemu_strtoui_full_max);
2630
2631 /* qemu_strtol() tests */
2632 g_test_add_func("/cutils/qemu_strtol/correct",
2633 test_qemu_strtol_correct);
2634 g_test_add_func("/cutils/qemu_strtol/null",
2635 test_qemu_strtol_null);
2636 g_test_add_func("/cutils/qemu_strtol/empty",
2637 test_qemu_strtol_empty);
2638 g_test_add_func("/cutils/qemu_strtol/whitespace",
2639 test_qemu_strtol_whitespace);
2640 g_test_add_func("/cutils/qemu_strtol/invalid",
2641 test_qemu_strtol_invalid);
2642 g_test_add_func("/cutils/qemu_strtol/trailing",
2643 test_qemu_strtol_trailing);
2644 g_test_add_func("/cutils/qemu_strtol/octal",
2645 test_qemu_strtol_octal);
2646 g_test_add_func("/cutils/qemu_strtol/decimal",
2647 test_qemu_strtol_decimal);
2648 g_test_add_func("/cutils/qemu_strtol/hex",
2649 test_qemu_strtol_hex);
2650 g_test_add_func("/cutils/qemu_strtol/max",
2651 test_qemu_strtol_max);
2652 g_test_add_func("/cutils/qemu_strtol/overflow",
2653 test_qemu_strtol_overflow);
2654 g_test_add_func("/cutils/qemu_strtol/underflow",
2655 test_qemu_strtol_underflow);
2656 g_test_add_func("/cutils/qemu_strtol/negative",
2657 test_qemu_strtol_negative);
2658 g_test_add_func("/cutils/qemu_strtol_full/correct",
2659 test_qemu_strtol_full_correct);
2660 g_test_add_func("/cutils/qemu_strtol_full/null",
2661 test_qemu_strtol_full_null);
2662 g_test_add_func("/cutils/qemu_strtol_full/empty",
2663 test_qemu_strtol_full_empty);
2664 g_test_add_func("/cutils/qemu_strtol_full/negative",
2665 test_qemu_strtol_full_negative);
2666 g_test_add_func("/cutils/qemu_strtol_full/trailing",
2667 test_qemu_strtol_full_trailing);
2668 g_test_add_func("/cutils/qemu_strtol_full/max",
2669 test_qemu_strtol_full_max);
2670
2671 /* qemu_strtoul() tests */
2672 g_test_add_func("/cutils/qemu_strtoul/correct",
2673 test_qemu_strtoul_correct);
2674 g_test_add_func("/cutils/qemu_strtoul/null",
2675 test_qemu_strtoul_null);
2676 g_test_add_func("/cutils/qemu_strtoul/empty",
2677 test_qemu_strtoul_empty);
2678 g_test_add_func("/cutils/qemu_strtoul/whitespace",
2679 test_qemu_strtoul_whitespace);
2680 g_test_add_func("/cutils/qemu_strtoul/invalid",
2681 test_qemu_strtoul_invalid);
2682 g_test_add_func("/cutils/qemu_strtoul/trailing",
2683 test_qemu_strtoul_trailing);
2684 g_test_add_func("/cutils/qemu_strtoul/octal",
2685 test_qemu_strtoul_octal);
2686 g_test_add_func("/cutils/qemu_strtoul/decimal",
2687 test_qemu_strtoul_decimal);
2688 g_test_add_func("/cutils/qemu_strtoul/hex",
2689 test_qemu_strtoul_hex);
2690 g_test_add_func("/cutils/qemu_strtoul/max",
2691 test_qemu_strtoul_max);
2692 g_test_add_func("/cutils/qemu_strtoul/overflow",
2693 test_qemu_strtoul_overflow);
2694 g_test_add_func("/cutils/qemu_strtoul/underflow",
2695 test_qemu_strtoul_underflow);
2696 g_test_add_func("/cutils/qemu_strtoul/negative",
2697 test_qemu_strtoul_negative);
2698 g_test_add_func("/cutils/qemu_strtoul_full/correct",
2699 test_qemu_strtoul_full_correct);
2700 g_test_add_func("/cutils/qemu_strtoul_full/null",
2701 test_qemu_strtoul_full_null);
2702 g_test_add_func("/cutils/qemu_strtoul_full/empty",
2703 test_qemu_strtoul_full_empty);
2704 g_test_add_func("/cutils/qemu_strtoul_full/negative",
2705 test_qemu_strtoul_full_negative);
2706 g_test_add_func("/cutils/qemu_strtoul_full/trailing",
2707 test_qemu_strtoul_full_trailing);
2708 g_test_add_func("/cutils/qemu_strtoul_full/max",
2709 test_qemu_strtoul_full_max);
2710
2711 /* qemu_strtoi64() tests */
2712 g_test_add_func("/cutils/qemu_strtoi64/correct",
2713 test_qemu_strtoi64_correct);
2714 g_test_add_func("/cutils/qemu_strtoi64/null",
2715 test_qemu_strtoi64_null);
2716 g_test_add_func("/cutils/qemu_strtoi64/empty",
2717 test_qemu_strtoi64_empty);
2718 g_test_add_func("/cutils/qemu_strtoi64/whitespace",
2719 test_qemu_strtoi64_whitespace);
2720 g_test_add_func("/cutils/qemu_strtoi64/invalid"
2721 ,
2722 test_qemu_strtoi64_invalid);
2723 g_test_add_func("/cutils/qemu_strtoi64/trailing",
2724 test_qemu_strtoi64_trailing);
2725 g_test_add_func("/cutils/qemu_strtoi64/octal",
2726 test_qemu_strtoi64_octal);
2727 g_test_add_func("/cutils/qemu_strtoi64/decimal",
2728 test_qemu_strtoi64_decimal);
2729 g_test_add_func("/cutils/qemu_strtoi64/hex",
2730 test_qemu_strtoi64_hex);
2731 g_test_add_func("/cutils/qemu_strtoi64/max",
2732 test_qemu_strtoi64_max);
2733 g_test_add_func("/cutils/qemu_strtoi64/overflow",
2734 test_qemu_strtoi64_overflow);
2735 g_test_add_func("/cutils/qemu_strtoi64/underflow",
2736 test_qemu_strtoi64_underflow);
2737 g_test_add_func("/cutils/qemu_strtoi64/negative",
2738 test_qemu_strtoi64_negative);
2739 g_test_add_func("/cutils/qemu_strtoi64_full/correct",
2740 test_qemu_strtoi64_full_correct);
2741 g_test_add_func("/cutils/qemu_strtoi64_full/null",
2742 test_qemu_strtoi64_full_null);
2743 g_test_add_func("/cutils/qemu_strtoi64_full/empty",
2744 test_qemu_strtoi64_full_empty);
2745 g_test_add_func("/cutils/qemu_strtoi64_full/negative",
2746 test_qemu_strtoi64_full_negative);
2747 g_test_add_func("/cutils/qemu_strtoi64_full/trailing",
2748 test_qemu_strtoi64_full_trailing);
2749 g_test_add_func("/cutils/qemu_strtoi64_full/max",
2750 test_qemu_strtoi64_full_max);
2751
2752 /* qemu_strtou64() tests */
2753 g_test_add_func("/cutils/qemu_strtou64/correct",
2754 test_qemu_strtou64_correct);
2755 g_test_add_func("/cutils/qemu_strtou64/null",
2756 test_qemu_strtou64_null);
2757 g_test_add_func("/cutils/qemu_strtou64/empty",
2758 test_qemu_strtou64_empty);
2759 g_test_add_func("/cutils/qemu_strtou64/whitespace",
2760 test_qemu_strtou64_whitespace);
2761 g_test_add_func("/cutils/qemu_strtou64/invalid",
2762 test_qemu_strtou64_invalid);
2763 g_test_add_func("/cutils/qemu_strtou64/trailing",
2764 test_qemu_strtou64_trailing);
2765 g_test_add_func("/cutils/qemu_strtou64/octal",
2766 test_qemu_strtou64_octal);
2767 g_test_add_func("/cutils/qemu_strtou64/decimal",
2768 test_qemu_strtou64_decimal);
2769 g_test_add_func("/cutils/qemu_strtou64/hex",
2770 test_qemu_strtou64_hex);
2771 g_test_add_func("/cutils/qemu_strtou64/max",
2772 test_qemu_strtou64_max);
2773 g_test_add_func("/cutils/qemu_strtou64/overflow",
2774 test_qemu_strtou64_overflow);
2775 g_test_add_func("/cutils/qemu_strtou64/underflow",
2776 test_qemu_strtou64_underflow);
2777 g_test_add_func("/cutils/qemu_strtou64/negative",
2778 test_qemu_strtou64_negative);
2779 g_test_add_func("/cutils/qemu_strtou64_full/correct",
2780 test_qemu_strtou64_full_correct);
2781 g_test_add_func("/cutils/qemu_strtou64_full/null",
2782 test_qemu_strtou64_full_null);
2783 g_test_add_func("/cutils/qemu_strtou64_full/empty",
2784 test_qemu_strtou64_full_empty);
2785 g_test_add_func("/cutils/qemu_strtou64_full/negative",
2786 test_qemu_strtou64_full_negative);
2787 g_test_add_func("/cutils/qemu_strtou64_full/trailing",
2788 test_qemu_strtou64_full_trailing);
2789 g_test_add_func("/cutils/qemu_strtou64_full/max",
2790 test_qemu_strtou64_full_max);
2791
2792 g_test_add_func("/cutils/strtosz/simple",
2793 test_qemu_strtosz_simple);
2794 g_test_add_func("/cutils/strtosz/hex",
2795 test_qemu_strtosz_hex);
2796 g_test_add_func("/cutils/strtosz/units",
2797 test_qemu_strtosz_units);
2798 g_test_add_func("/cutils/strtosz/float",
2799 test_qemu_strtosz_float);
2800 g_test_add_func("/cutils/strtosz/invalid",
2801 test_qemu_strtosz_invalid);
2802 g_test_add_func("/cutils/strtosz/trailing",
2803 test_qemu_strtosz_trailing);
2804 g_test_add_func("/cutils/strtosz/erange",
2805 test_qemu_strtosz_erange);
2806 g_test_add_func("/cutils/strtosz/metric",
2807 test_qemu_strtosz_metric);
2808
2809 g_test_add_func("/cutils/size_to_str",
2810 test_size_to_str);
2811 g_test_add_func("/cutils/freq_to_str",
2812 test_freq_to_str);
2813 g_test_add_func("/cutils/iec_binary_prefix",
2814 test_iec_binary_prefix);
2815 g_test_add_func("/cutils/si_prefix",
2816 test_si_prefix);
2817 return g_test_run();
2818 }