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