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