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