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