Home | History | Annotate | Line # | Download | only in unit
      1      1.1  christos #include "test/jemalloc_test.h"
      2      1.1  christos 
      3      1.1  christos TEST_BEGIN(test_malloc_strtoumax_no_endptr) {
      4      1.1  christos 	int err;
      5      1.1  christos 
      6      1.1  christos 	set_errno(0);
      7  1.1.1.2  christos 	expect_ju_eq(malloc_strtoumax("0", NULL, 0), 0, "Unexpected result");
      8      1.1  christos 	err = get_errno();
      9  1.1.1.2  christos 	expect_d_eq(err, 0, "Unexpected failure");
     10      1.1  christos }
     11      1.1  christos TEST_END
     12      1.1  christos 
     13      1.1  christos TEST_BEGIN(test_malloc_strtoumax) {
     14      1.1  christos 	struct test_s {
     15      1.1  christos 		const char *input;
     16      1.1  christos 		const char *expected_remainder;
     17      1.1  christos 		int base;
     18      1.1  christos 		int expected_errno;
     19      1.1  christos 		const char *expected_errno_name;
     20      1.1  christos 		uintmax_t expected_x;
     21      1.1  christos 	};
     22      1.1  christos #define ERR(e)		e, #e
     23      1.1  christos #define KUMAX(x)	((uintmax_t)x##ULL)
     24      1.1  christos #define KSMAX(x)	((uintmax_t)(intmax_t)x##LL)
     25      1.1  christos 	struct test_s tests[] = {
     26      1.1  christos 		{"0",		"0",	-1,	ERR(EINVAL),	UINTMAX_MAX},
     27      1.1  christos 		{"0",		"0",	1,	ERR(EINVAL),	UINTMAX_MAX},
     28      1.1  christos 		{"0",		"0",	37,	ERR(EINVAL),	UINTMAX_MAX},
     29      1.1  christos 
     30      1.1  christos 		{"",		"",	0,	ERR(EINVAL),	UINTMAX_MAX},
     31      1.1  christos 		{"+",		"+",	0,	ERR(EINVAL),	UINTMAX_MAX},
     32      1.1  christos 		{"++3",		"++3",	0,	ERR(EINVAL),	UINTMAX_MAX},
     33      1.1  christos 		{"-",		"-",	0,	ERR(EINVAL),	UINTMAX_MAX},
     34      1.1  christos 
     35      1.1  christos 		{"42",		"",	0,	ERR(0),		KUMAX(42)},
     36      1.1  christos 		{"+42",		"",	0,	ERR(0),		KUMAX(42)},
     37      1.1  christos 		{"-42",		"",	0,	ERR(0),		KSMAX(-42)},
     38      1.1  christos 		{"042",		"",	0,	ERR(0),		KUMAX(042)},
     39      1.1  christos 		{"+042",	"",	0,	ERR(0),		KUMAX(042)},
     40      1.1  christos 		{"-042",	"",	0,	ERR(0),		KSMAX(-042)},
     41      1.1  christos 		{"0x42",	"",	0,	ERR(0),		KUMAX(0x42)},
     42      1.1  christos 		{"+0x42",	"",	0,	ERR(0),		KUMAX(0x42)},
     43      1.1  christos 		{"-0x42",	"",	0,	ERR(0),		KSMAX(-0x42)},
     44      1.1  christos 
     45      1.1  christos 		{"0",		"",	0,	ERR(0),		KUMAX(0)},
     46      1.1  christos 		{"1",		"",	0,	ERR(0),		KUMAX(1)},
     47      1.1  christos 
     48      1.1  christos 		{"42",		"",	0,	ERR(0),		KUMAX(42)},
     49      1.1  christos 		{" 42",		"",	0,	ERR(0),		KUMAX(42)},
     50      1.1  christos 		{"42 ",		" ",	0,	ERR(0),		KUMAX(42)},
     51      1.1  christos 		{"0x",		"x",	0,	ERR(0),		KUMAX(0)},
     52      1.1  christos 		{"42x",		"x",	0,	ERR(0),		KUMAX(42)},
     53      1.1  christos 
     54      1.1  christos 		{"07",		"",	0,	ERR(0),		KUMAX(7)},
     55      1.1  christos 		{"010",		"",	0,	ERR(0),		KUMAX(8)},
     56      1.1  christos 		{"08",		"8",	0,	ERR(0),		KUMAX(0)},
     57      1.1  christos 		{"0_",		"_",	0,	ERR(0),		KUMAX(0)},
     58      1.1  christos 
     59      1.1  christos 		{"0x",		"x",	0,	ERR(0),		KUMAX(0)},
     60      1.1  christos 		{"0X",		"X",	0,	ERR(0),		KUMAX(0)},
     61      1.1  christos 		{"0xg",		"xg",	0,	ERR(0),		KUMAX(0)},
     62      1.1  christos 		{"0XA",		"",	0,	ERR(0),		KUMAX(10)},
     63      1.1  christos 
     64      1.1  christos 		{"010",		"",	10,	ERR(0),		KUMAX(10)},
     65      1.1  christos 		{"0x3",		"x3",	10,	ERR(0),		KUMAX(0)},
     66      1.1  christos 
     67      1.1  christos 		{"12",		"2",	2,	ERR(0),		KUMAX(1)},
     68      1.1  christos 		{"78",		"8",	8,	ERR(0),		KUMAX(7)},
     69      1.1  christos 		{"9a",		"a",	10,	ERR(0),		KUMAX(9)},
     70      1.1  christos 		{"9A",		"A",	10,	ERR(0),		KUMAX(9)},
     71      1.1  christos 		{"fg",		"g",	16,	ERR(0),		KUMAX(15)},
     72      1.1  christos 		{"FG",		"G",	16,	ERR(0),		KUMAX(15)},
     73      1.1  christos 		{"0xfg",	"g",	16,	ERR(0),		KUMAX(15)},
     74      1.1  christos 		{"0XFG",	"G",	16,	ERR(0),		KUMAX(15)},
     75      1.1  christos 		{"z_",		"_",	36,	ERR(0),		KUMAX(35)},
     76      1.1  christos 		{"Z_",		"_",	36,	ERR(0),		KUMAX(35)}
     77      1.1  christos 	};
     78      1.1  christos #undef ERR
     79      1.1  christos #undef KUMAX
     80      1.1  christos #undef KSMAX
     81      1.1  christos 	unsigned i;
     82      1.1  christos 
     83      1.1  christos 	for (i = 0; i < sizeof(tests)/sizeof(struct test_s); i++) {
     84      1.1  christos 		struct test_s *test = &tests[i];
     85      1.1  christos 		int err;
     86      1.1  christos 		uintmax_t result;
     87      1.1  christos 		char *remainder;
     88      1.1  christos 
     89      1.1  christos 		set_errno(0);
     90      1.1  christos 		result = malloc_strtoumax(test->input, &remainder, test->base);
     91      1.1  christos 		err = get_errno();
     92  1.1.1.2  christos 		expect_d_eq(err, test->expected_errno,
     93      1.1  christos 		    "Expected errno %s for \"%s\", base %d",
     94      1.1  christos 		    test->expected_errno_name, test->input, test->base);
     95  1.1.1.2  christos 		expect_str_eq(remainder, test->expected_remainder,
     96      1.1  christos 		    "Unexpected remainder for \"%s\", base %d",
     97      1.1  christos 		    test->input, test->base);
     98      1.1  christos 		if (err == 0) {
     99  1.1.1.2  christos 			expect_ju_eq(result, test->expected_x,
    100      1.1  christos 			    "Unexpected result for \"%s\", base %d",
    101      1.1  christos 			    test->input, test->base);
    102      1.1  christos 		}
    103      1.1  christos 	}
    104      1.1  christos }
    105      1.1  christos TEST_END
    106      1.1  christos 
    107      1.1  christos TEST_BEGIN(test_malloc_snprintf_truncated) {
    108      1.1  christos #define BUFLEN	15
    109      1.1  christos 	char buf[BUFLEN];
    110      1.1  christos 	size_t result;
    111      1.1  christos 	size_t len;
    112      1.1  christos #define TEST(expected_str_untruncated, ...) do {			\
    113      1.1  christos 	result = malloc_snprintf(buf, len, __VA_ARGS__);		\
    114  1.1.1.2  christos 	expect_d_eq(strncmp(buf, expected_str_untruncated, len-1), 0,	\
    115      1.1  christos 	    "Unexpected string inequality (\"%s\" vs \"%s\")",		\
    116      1.1  christos 	    buf, expected_str_untruncated);				\
    117  1.1.1.2  christos 	expect_zu_eq(result, strlen(expected_str_untruncated),		\
    118      1.1  christos 	    "Unexpected result");					\
    119      1.1  christos } while (0)
    120      1.1  christos 
    121      1.1  christos 	for (len = 1; len < BUFLEN; len++) {
    122      1.1  christos 		TEST("012346789",	"012346789");
    123      1.1  christos 		TEST("a0123b",		"a%sb", "0123");
    124      1.1  christos 		TEST("a01234567",	"a%s%s", "0123", "4567");
    125      1.1  christos 		TEST("a0123  ",		"a%-6s", "0123");
    126      1.1  christos 		TEST("a  0123",		"a%6s", "0123");
    127      1.1  christos 		TEST("a   012",		"a%6.3s", "0123");
    128      1.1  christos 		TEST("a   012",		"a%*.*s", 6, 3, "0123");
    129      1.1  christos 		TEST("a 123b",		"a% db", 123);
    130      1.1  christos 		TEST("a123b",		"a%-db", 123);
    131      1.1  christos 		TEST("a-123b",		"a%-db", -123);
    132      1.1  christos 		TEST("a+123b",		"a%+db", 123);
    133      1.1  christos 	}
    134      1.1  christos #undef BUFLEN
    135      1.1  christos #undef TEST
    136      1.1  christos }
    137      1.1  christos TEST_END
    138      1.1  christos 
    139      1.1  christos TEST_BEGIN(test_malloc_snprintf) {
    140      1.1  christos #define BUFLEN	128
    141      1.1  christos 	char buf[BUFLEN];
    142      1.1  christos 	size_t result;
    143      1.1  christos #define TEST(expected_str, ...) do {					\
    144      1.1  christos 	result = malloc_snprintf(buf, sizeof(buf), __VA_ARGS__);	\
    145  1.1.1.2  christos 	expect_str_eq(buf, expected_str, "Unexpected output");		\
    146  1.1.1.2  christos 	expect_zu_eq(result, strlen(expected_str), "Unexpected result");\
    147      1.1  christos } while (0)
    148      1.1  christos 
    149      1.1  christos 	TEST("hello", "hello");
    150      1.1  christos 
    151      1.1  christos 	TEST("50%, 100%", "50%%, %d%%", 100);
    152      1.1  christos 
    153      1.1  christos 	TEST("a0123b", "a%sb", "0123");
    154      1.1  christos 
    155      1.1  christos 	TEST("a 0123b", "a%5sb", "0123");
    156      1.1  christos 	TEST("a 0123b", "a%*sb", 5, "0123");
    157      1.1  christos 
    158      1.1  christos 	TEST("a0123 b", "a%-5sb", "0123");
    159      1.1  christos 	TEST("a0123b", "a%*sb", -1, "0123");
    160      1.1  christos 	TEST("a0123 b", "a%*sb", -5, "0123");
    161      1.1  christos 	TEST("a0123 b", "a%-*sb", -5, "0123");
    162      1.1  christos 
    163      1.1  christos 	TEST("a012b", "a%.3sb", "0123");
    164      1.1  christos 	TEST("a012b", "a%.*sb", 3, "0123");
    165      1.1  christos 	TEST("a0123b", "a%.*sb", -3, "0123");
    166      1.1  christos 
    167      1.1  christos 	TEST("a  012b", "a%5.3sb", "0123");
    168      1.1  christos 	TEST("a  012b", "a%5.*sb", 3, "0123");
    169      1.1  christos 	TEST("a  012b", "a%*.3sb", 5, "0123");
    170      1.1  christos 	TEST("a  012b", "a%*.*sb", 5, 3, "0123");
    171      1.1  christos 	TEST("a 0123b", "a%*.*sb", 5, -3, "0123");
    172      1.1  christos 
    173      1.1  christos 	TEST("_abcd_", "_%x_", 0xabcd);
    174      1.1  christos 	TEST("_0xabcd_", "_%#x_", 0xabcd);
    175      1.1  christos 	TEST("_1234_", "_%o_", 01234);
    176      1.1  christos 	TEST("_01234_", "_%#o_", 01234);
    177      1.1  christos 	TEST("_1234_", "_%u_", 1234);
    178  1.1.1.2  christos 	TEST("01234", "%05u", 1234);
    179      1.1  christos 
    180      1.1  christos 	TEST("_1234_", "_%d_", 1234);
    181      1.1  christos 	TEST("_ 1234_", "_% d_", 1234);
    182      1.1  christos 	TEST("_+1234_", "_%+d_", 1234);
    183      1.1  christos 	TEST("_-1234_", "_%d_", -1234);
    184      1.1  christos 	TEST("_-1234_", "_% d_", -1234);
    185      1.1  christos 	TEST("_-1234_", "_%+d_", -1234);
    186      1.1  christos 
    187  1.1.1.2  christos 	/*
    188  1.1.1.2  christos 	 * Morally, we should test these too, but 0-padded signed types are not
    189  1.1.1.2  christos 	 * yet supported.
    190  1.1.1.2  christos 	 *
    191  1.1.1.2  christos 	 * TEST("01234", "%05", 1234);
    192  1.1.1.2  christos 	 * TEST("-1234", "%05d", -1234);
    193  1.1.1.2  christos 	 * TEST("-01234", "%06d", -1234);
    194  1.1.1.2  christos 	*/
    195  1.1.1.2  christos 
    196      1.1  christos 	TEST("_-1234_", "_%d_", -1234);
    197      1.1  christos 	TEST("_1234_", "_%d_", 1234);
    198      1.1  christos 	TEST("_-1234_", "_%i_", -1234);
    199      1.1  christos 	TEST("_1234_", "_%i_", 1234);
    200      1.1  christos 	TEST("_01234_", "_%#o_", 01234);
    201      1.1  christos 	TEST("_1234_", "_%u_", 1234);
    202      1.1  christos 	TEST("_0x1234abc_", "_%#x_", 0x1234abc);
    203      1.1  christos 	TEST("_0X1234ABC_", "_%#X_", 0x1234abc);
    204      1.1  christos 	TEST("_c_", "_%c_", 'c');
    205      1.1  christos 	TEST("_string_", "_%s_", "string");
    206      1.1  christos 	TEST("_0x42_", "_%p_", ((void *)0x42));
    207      1.1  christos 
    208      1.1  christos 	TEST("_-1234_", "_%ld_", ((long)-1234));
    209      1.1  christos 	TEST("_1234_", "_%ld_", ((long)1234));
    210      1.1  christos 	TEST("_-1234_", "_%li_", ((long)-1234));
    211      1.1  christos 	TEST("_1234_", "_%li_", ((long)1234));
    212      1.1  christos 	TEST("_01234_", "_%#lo_", ((long)01234));
    213      1.1  christos 	TEST("_1234_", "_%lu_", ((long)1234));
    214      1.1  christos 	TEST("_0x1234abc_", "_%#lx_", ((long)0x1234abc));
    215      1.1  christos 	TEST("_0X1234ABC_", "_%#lX_", ((long)0x1234ABC));
    216      1.1  christos 
    217      1.1  christos 	TEST("_-1234_", "_%lld_", ((long long)-1234));
    218      1.1  christos 	TEST("_1234_", "_%lld_", ((long long)1234));
    219      1.1  christos 	TEST("_-1234_", "_%lli_", ((long long)-1234));
    220      1.1  christos 	TEST("_1234_", "_%lli_", ((long long)1234));
    221      1.1  christos 	TEST("_01234_", "_%#llo_", ((long long)01234));
    222      1.1  christos 	TEST("_1234_", "_%llu_", ((long long)1234));
    223      1.1  christos 	TEST("_0x1234abc_", "_%#llx_", ((long long)0x1234abc));
    224      1.1  christos 	TEST("_0X1234ABC_", "_%#llX_", ((long long)0x1234ABC));
    225      1.1  christos 
    226      1.1  christos 	TEST("_-1234_", "_%qd_", ((long long)-1234));
    227      1.1  christos 	TEST("_1234_", "_%qd_", ((long long)1234));
    228      1.1  christos 	TEST("_-1234_", "_%qi_", ((long long)-1234));
    229      1.1  christos 	TEST("_1234_", "_%qi_", ((long long)1234));
    230      1.1  christos 	TEST("_01234_", "_%#qo_", ((long long)01234));
    231      1.1  christos 	TEST("_1234_", "_%qu_", ((long long)1234));
    232      1.1  christos 	TEST("_0x1234abc_", "_%#qx_", ((long long)0x1234abc));
    233      1.1  christos 	TEST("_0X1234ABC_", "_%#qX_", ((long long)0x1234ABC));
    234      1.1  christos 
    235      1.1  christos 	TEST("_-1234_", "_%jd_", ((intmax_t)-1234));
    236      1.1  christos 	TEST("_1234_", "_%jd_", ((intmax_t)1234));
    237      1.1  christos 	TEST("_-1234_", "_%ji_", ((intmax_t)-1234));
    238      1.1  christos 	TEST("_1234_", "_%ji_", ((intmax_t)1234));
    239      1.1  christos 	TEST("_01234_", "_%#jo_", ((intmax_t)01234));
    240      1.1  christos 	TEST("_1234_", "_%ju_", ((intmax_t)1234));
    241      1.1  christos 	TEST("_0x1234abc_", "_%#jx_", ((intmax_t)0x1234abc));
    242      1.1  christos 	TEST("_0X1234ABC_", "_%#jX_", ((intmax_t)0x1234ABC));
    243      1.1  christos 
    244      1.1  christos 	TEST("_1234_", "_%td_", ((ptrdiff_t)1234));
    245      1.1  christos 	TEST("_-1234_", "_%td_", ((ptrdiff_t)-1234));
    246      1.1  christos 	TEST("_1234_", "_%ti_", ((ptrdiff_t)1234));
    247      1.1  christos 	TEST("_-1234_", "_%ti_", ((ptrdiff_t)-1234));
    248      1.1  christos 
    249      1.1  christos 	TEST("_-1234_", "_%zd_", ((ssize_t)-1234));
    250      1.1  christos 	TEST("_1234_", "_%zd_", ((ssize_t)1234));
    251      1.1  christos 	TEST("_-1234_", "_%zi_", ((ssize_t)-1234));
    252      1.1  christos 	TEST("_1234_", "_%zi_", ((ssize_t)1234));
    253      1.1  christos 	TEST("_01234_", "_%#zo_", ((ssize_t)01234));
    254      1.1  christos 	TEST("_1234_", "_%zu_", ((ssize_t)1234));
    255      1.1  christos 	TEST("_0x1234abc_", "_%#zx_", ((ssize_t)0x1234abc));
    256      1.1  christos 	TEST("_0X1234ABC_", "_%#zX_", ((ssize_t)0x1234ABC));
    257      1.1  christos #undef BUFLEN
    258      1.1  christos }
    259      1.1  christos TEST_END
    260      1.1  christos 
    261      1.1  christos int
    262      1.1  christos main(void) {
    263      1.1  christos 	return test(
    264      1.1  christos 	    test_malloc_strtoumax_no_endptr,
    265      1.1  christos 	    test_malloc_strtoumax,
    266      1.1  christos 	    test_malloc_snprintf_truncated,
    267      1.1  christos 	    test_malloc_snprintf);
    268      1.1  christos }
    269