1#define	ASSERT_BUFSIZE	256
2
3#define	assert_cmp(t, a, b, cmp, neg_cmp, pri, ...) do {		\
4	t a_ = (a);							\
5	t b_ = (b);							\
6	if (!(a_ cmp b_)) {						\
7		char prefix[ASSERT_BUFSIZE];				\
8		char message[ASSERT_BUFSIZE];				\
9		malloc_snprintf(prefix, sizeof(prefix),			\
10		    "%s:%s:%d: Failed assertion: "			\
11		    "(%s) "#cmp" (%s) --> "				\
12		    "%"pri" "#neg_cmp" %"pri": ",			\
13		    __func__, __FILE__, __LINE__,			\
14		    #a, #b, a_, b_);					\
15		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
16		p_test_fail(prefix, message);				\
17	}								\
18} while (0)
19
20#define	assert_ptr_eq(a, b, ...)	assert_cmp(void *, a, b, ==,	\
21    !=, "p", __VA_ARGS__)
22#define	assert_ptr_ne(a, b, ...)	assert_cmp(void *, a, b, !=,	\
23    ==, "p", __VA_ARGS__)
24#define	assert_ptr_null(a, ...)		assert_cmp(void *, a, NULL, ==,	\
25    !=, "p", __VA_ARGS__)
26#define	assert_ptr_not_null(a, ...)	assert_cmp(void *, a, NULL, !=,	\
27    ==, "p", __VA_ARGS__)
28
29#define	assert_c_eq(a, b, ...)	assert_cmp(char, a, b, ==, !=, "c", __VA_ARGS__)
30#define	assert_c_ne(a, b, ...)	assert_cmp(char, a, b, !=, ==, "c", __VA_ARGS__)
31#define	assert_c_lt(a, b, ...)	assert_cmp(char, a, b, <, >=, "c", __VA_ARGS__)
32#define	assert_c_le(a, b, ...)	assert_cmp(char, a, b, <=, >, "c", __VA_ARGS__)
33#define	assert_c_ge(a, b, ...)	assert_cmp(char, a, b, >=, <, "c", __VA_ARGS__)
34#define	assert_c_gt(a, b, ...)	assert_cmp(char, a, b, >, <=, "c", __VA_ARGS__)
35
36#define	assert_x_eq(a, b, ...)	assert_cmp(int, a, b, ==, !=, "#x", __VA_ARGS__)
37#define	assert_x_ne(a, b, ...)	assert_cmp(int, a, b, !=, ==, "#x", __VA_ARGS__)
38#define	assert_x_lt(a, b, ...)	assert_cmp(int, a, b, <, >=, "#x", __VA_ARGS__)
39#define	assert_x_le(a, b, ...)	assert_cmp(int, a, b, <=, >, "#x", __VA_ARGS__)
40#define	assert_x_ge(a, b, ...)	assert_cmp(int, a, b, >=, <, "#x", __VA_ARGS__)
41#define	assert_x_gt(a, b, ...)	assert_cmp(int, a, b, >, <=, "#x", __VA_ARGS__)
42
43#define	assert_d_eq(a, b, ...)	assert_cmp(int, a, b, ==, !=, "d", __VA_ARGS__)
44#define	assert_d_ne(a, b, ...)	assert_cmp(int, a, b, !=, ==, "d", __VA_ARGS__)
45#define	assert_d_lt(a, b, ...)	assert_cmp(int, a, b, <, >=, "d", __VA_ARGS__)
46#define	assert_d_le(a, b, ...)	assert_cmp(int, a, b, <=, >, "d", __VA_ARGS__)
47#define	assert_d_ge(a, b, ...)	assert_cmp(int, a, b, >=, <, "d", __VA_ARGS__)
48#define	assert_d_gt(a, b, ...)	assert_cmp(int, a, b, >, <=, "d", __VA_ARGS__)
49
50#define	assert_u_eq(a, b, ...)	assert_cmp(int, a, b, ==, !=, "u", __VA_ARGS__)
51#define	assert_u_ne(a, b, ...)	assert_cmp(int, a, b, !=, ==, "u", __VA_ARGS__)
52#define	assert_u_lt(a, b, ...)	assert_cmp(int, a, b, <, >=, "u", __VA_ARGS__)
53#define	assert_u_le(a, b, ...)	assert_cmp(int, a, b, <=, >, "u", __VA_ARGS__)
54#define	assert_u_ge(a, b, ...)	assert_cmp(int, a, b, >=, <, "u", __VA_ARGS__)
55#define	assert_u_gt(a, b, ...)	assert_cmp(int, a, b, >, <=, "u", __VA_ARGS__)
56
57#define	assert_ld_eq(a, b, ...)	assert_cmp(long, a, b, ==,	\
58    !=, "ld", __VA_ARGS__)
59#define	assert_ld_ne(a, b, ...)	assert_cmp(long, a, b, !=,	\
60    ==, "ld", __VA_ARGS__)
61#define	assert_ld_lt(a, b, ...)	assert_cmp(long, a, b, <,	\
62    >=, "ld", __VA_ARGS__)
63#define	assert_ld_le(a, b, ...)	assert_cmp(long, a, b, <=,	\
64    >, "ld", __VA_ARGS__)
65#define	assert_ld_ge(a, b, ...)	assert_cmp(long, a, b, >=,	\
66    <, "ld", __VA_ARGS__)
67#define	assert_ld_gt(a, b, ...)	assert_cmp(long, a, b, >,	\
68    <=, "ld", __VA_ARGS__)
69
70#define	assert_lu_eq(a, b, ...)	assert_cmp(unsigned long,	\
71    a, b, ==, !=, "lu", __VA_ARGS__)
72#define	assert_lu_ne(a, b, ...)	assert_cmp(unsigned long,	\
73    a, b, !=, ==, "lu", __VA_ARGS__)
74#define	assert_lu_lt(a, b, ...)	assert_cmp(unsigned long,	\
75    a, b, <, >=, "lu", __VA_ARGS__)
76#define	assert_lu_le(a, b, ...)	assert_cmp(unsigned long,	\
77    a, b, <=, >, "lu", __VA_ARGS__)
78#define	assert_lu_ge(a, b, ...)	assert_cmp(unsigned long,	\
79    a, b, >=, <, "lu", __VA_ARGS__)
80#define	assert_lu_gt(a, b, ...)	assert_cmp(unsigned long,	\
81    a, b, >, <=, "lu", __VA_ARGS__)
82
83#define	assert_qd_eq(a, b, ...)	assert_cmp(long long, a, b, ==,	\
84    !=, "qd", __VA_ARGS__)
85#define	assert_qd_ne(a, b, ...)	assert_cmp(long long, a, b, !=,	\
86    ==, "qd", __VA_ARGS__)
87#define	assert_qd_lt(a, b, ...)	assert_cmp(long long, a, b, <,	\
88    >=, "qd", __VA_ARGS__)
89#define	assert_qd_le(a, b, ...)	assert_cmp(long long, a, b, <=,	\
90    >, "qd", __VA_ARGS__)
91#define	assert_qd_ge(a, b, ...)	assert_cmp(long long, a, b, >=,	\
92    <, "qd", __VA_ARGS__)
93#define	assert_qd_gt(a, b, ...)	assert_cmp(long long, a, b, >,	\
94    <=, "qd", __VA_ARGS__)
95
96#define	assert_qu_eq(a, b, ...)	assert_cmp(unsigned long long,	\
97    a, b, ==, !=, "qu", __VA_ARGS__)
98#define	assert_qu_ne(a, b, ...)	assert_cmp(unsigned long long,	\
99    a, b, !=, ==, "qu", __VA_ARGS__)
100#define	assert_qu_lt(a, b, ...)	assert_cmp(unsigned long long,	\
101    a, b, <, >=, "qu", __VA_ARGS__)
102#define	assert_qu_le(a, b, ...)	assert_cmp(unsigned long long,	\
103    a, b, <=, >, "qu", __VA_ARGS__)
104#define	assert_qu_ge(a, b, ...)	assert_cmp(unsigned long long,	\
105    a, b, >=, <, "qu", __VA_ARGS__)
106#define	assert_qu_gt(a, b, ...)	assert_cmp(unsigned long long,	\
107    a, b, >, <=, "qu", __VA_ARGS__)
108
109#define	assert_jd_eq(a, b, ...)	assert_cmp(intmax_t, a, b, ==,	\
110    !=, "jd", __VA_ARGS__)
111#define	assert_jd_ne(a, b, ...)	assert_cmp(intmax_t, a, b, !=,	\
112    ==, "jd", __VA_ARGS__)
113#define	assert_jd_lt(a, b, ...)	assert_cmp(intmax_t, a, b, <,	\
114    >=, "jd", __VA_ARGS__)
115#define	assert_jd_le(a, b, ...)	assert_cmp(intmax_t, a, b, <=,	\
116    >, "jd", __VA_ARGS__)
117#define	assert_jd_ge(a, b, ...)	assert_cmp(intmax_t, a, b, >=,	\
118    <, "jd", __VA_ARGS__)
119#define	assert_jd_gt(a, b, ...)	assert_cmp(intmax_t, a, b, >,	\
120    <=, "jd", __VA_ARGS__)
121
122#define	assert_ju_eq(a, b, ...)	assert_cmp(uintmax_t, a, b, ==,	\
123    !=, "ju", __VA_ARGS__)
124#define	assert_ju_ne(a, b, ...)	assert_cmp(uintmax_t, a, b, !=,	\
125    ==, "ju", __VA_ARGS__)
126#define	assert_ju_lt(a, b, ...)	assert_cmp(uintmax_t, a, b, <,	\
127    >=, "ju", __VA_ARGS__)
128#define	assert_ju_le(a, b, ...)	assert_cmp(uintmax_t, a, b, <=,	\
129    >, "ju", __VA_ARGS__)
130#define	assert_ju_ge(a, b, ...)	assert_cmp(uintmax_t, a, b, >=,	\
131    <, "ju", __VA_ARGS__)
132#define	assert_ju_gt(a, b, ...)	assert_cmp(uintmax_t, a, b, >,	\
133    <=, "ju", __VA_ARGS__)
134
135#define	assert_zd_eq(a, b, ...)	assert_cmp(ssize_t, a, b, ==,	\
136    !=, "zd", __VA_ARGS__)
137#define	assert_zd_ne(a, b, ...)	assert_cmp(ssize_t, a, b, !=,	\
138    ==, "zd", __VA_ARGS__)
139#define	assert_zd_lt(a, b, ...)	assert_cmp(ssize_t, a, b, <,	\
140    >=, "zd", __VA_ARGS__)
141#define	assert_zd_le(a, b, ...)	assert_cmp(ssize_t, a, b, <=,	\
142    >, "zd", __VA_ARGS__)
143#define	assert_zd_ge(a, b, ...)	assert_cmp(ssize_t, a, b, >=,	\
144    <, "zd", __VA_ARGS__)
145#define	assert_zd_gt(a, b, ...)	assert_cmp(ssize_t, a, b, >,	\
146    <=, "zd", __VA_ARGS__)
147
148#define	assert_zu_eq(a, b, ...)	assert_cmp(size_t, a, b, ==,	\
149    !=, "zu", __VA_ARGS__)
150#define	assert_zu_ne(a, b, ...)	assert_cmp(size_t, a, b, !=,	\
151    ==, "zu", __VA_ARGS__)
152#define	assert_zu_lt(a, b, ...)	assert_cmp(size_t, a, b, <,	\
153    >=, "zu", __VA_ARGS__)
154#define	assert_zu_le(a, b, ...)	assert_cmp(size_t, a, b, <=,	\
155    >, "zu", __VA_ARGS__)
156#define	assert_zu_ge(a, b, ...)	assert_cmp(size_t, a, b, >=,	\
157    <, "zu", __VA_ARGS__)
158#define	assert_zu_gt(a, b, ...)	assert_cmp(size_t, a, b, >,	\
159    <=, "zu", __VA_ARGS__)
160
161#define	assert_d32_eq(a, b, ...)	assert_cmp(int32_t, a, b, ==,	\
162    !=, PRId32, __VA_ARGS__)
163#define	assert_d32_ne(a, b, ...)	assert_cmp(int32_t, a, b, !=,	\
164    ==, PRId32, __VA_ARGS__)
165#define	assert_d32_lt(a, b, ...)	assert_cmp(int32_t, a, b, <,	\
166    >=, PRId32, __VA_ARGS__)
167#define	assert_d32_le(a, b, ...)	assert_cmp(int32_t, a, b, <=,	\
168    >, PRId32, __VA_ARGS__)
169#define	assert_d32_ge(a, b, ...)	assert_cmp(int32_t, a, b, >=,	\
170    <, PRId32, __VA_ARGS__)
171#define	assert_d32_gt(a, b, ...)	assert_cmp(int32_t, a, b, >,	\
172    <=, PRId32, __VA_ARGS__)
173
174#define	assert_u32_eq(a, b, ...)	assert_cmp(uint32_t, a, b, ==,	\
175    !=, PRIu32, __VA_ARGS__)
176#define	assert_u32_ne(a, b, ...)	assert_cmp(uint32_t, a, b, !=,	\
177    ==, PRIu32, __VA_ARGS__)
178#define	assert_u32_lt(a, b, ...)	assert_cmp(uint32_t, a, b, <,	\
179    >=, PRIu32, __VA_ARGS__)
180#define	assert_u32_le(a, b, ...)	assert_cmp(uint32_t, a, b, <=,	\
181    >, PRIu32, __VA_ARGS__)
182#define	assert_u32_ge(a, b, ...)	assert_cmp(uint32_t, a, b, >=,	\
183    <, PRIu32, __VA_ARGS__)
184#define	assert_u32_gt(a, b, ...)	assert_cmp(uint32_t, a, b, >,	\
185    <=, PRIu32, __VA_ARGS__)
186
187#define	assert_d64_eq(a, b, ...)	assert_cmp(int64_t, a, b, ==,	\
188    !=, PRId64, __VA_ARGS__)
189#define	assert_d64_ne(a, b, ...)	assert_cmp(int64_t, a, b, !=,	\
190    ==, PRId64, __VA_ARGS__)
191#define	assert_d64_lt(a, b, ...)	assert_cmp(int64_t, a, b, <,	\
192    >=, PRId64, __VA_ARGS__)
193#define	assert_d64_le(a, b, ...)	assert_cmp(int64_t, a, b, <=,	\
194    >, PRId64, __VA_ARGS__)
195#define	assert_d64_ge(a, b, ...)	assert_cmp(int64_t, a, b, >=,	\
196    <, PRId64, __VA_ARGS__)
197#define	assert_d64_gt(a, b, ...)	assert_cmp(int64_t, a, b, >,	\
198    <=, PRId64, __VA_ARGS__)
199
200#define	assert_u64_eq(a, b, ...)	assert_cmp(uint64_t, a, b, ==,	\
201    !=, PRIu64, __VA_ARGS__)
202#define	assert_u64_ne(a, b, ...)	assert_cmp(uint64_t, a, b, !=,	\
203    ==, PRIu64, __VA_ARGS__)
204#define	assert_u64_lt(a, b, ...)	assert_cmp(uint64_t, a, b, <,	\
205    >=, PRIu64, __VA_ARGS__)
206#define	assert_u64_le(a, b, ...)	assert_cmp(uint64_t, a, b, <=,	\
207    >, PRIu64, __VA_ARGS__)
208#define	assert_u64_ge(a, b, ...)	assert_cmp(uint64_t, a, b, >=,	\
209    <, PRIu64, __VA_ARGS__)
210#define	assert_u64_gt(a, b, ...)	assert_cmp(uint64_t, a, b, >,	\
211    <=, PRIu64, __VA_ARGS__)
212
213#define	assert_b_eq(a, b, ...) do {					\
214	bool a_ = (a);							\
215	bool b_ = (b);							\
216	if (!(a_ == b_)) {						\
217		char prefix[ASSERT_BUFSIZE];				\
218		char message[ASSERT_BUFSIZE];				\
219		malloc_snprintf(prefix, sizeof(prefix),			\
220		    "%s:%s:%d: Failed assertion: "			\
221		    "(%s) == (%s) --> %s != %s: ",			\
222		    __func__, __FILE__, __LINE__,			\
223		    #a, #b, a_ ? "true" : "false",			\
224		    b_ ? "true" : "false");				\
225		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
226		p_test_fail(prefix, message);				\
227	}								\
228} while (0)
229#define	assert_b_ne(a, b, ...) do {					\
230	bool a_ = (a);							\
231	bool b_ = (b);							\
232	if (!(a_ != b_)) {						\
233		char prefix[ASSERT_BUFSIZE];				\
234		char message[ASSERT_BUFSIZE];				\
235		malloc_snprintf(prefix, sizeof(prefix),			\
236		    "%s:%s:%d: Failed assertion: "			\
237		    "(%s) != (%s) --> %s == %s: ",			\
238		    __func__, __FILE__, __LINE__,			\
239		    #a, #b, a_ ? "true" : "false",			\
240		    b_ ? "true" : "false");				\
241		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
242		p_test_fail(prefix, message);				\
243	}								\
244} while (0)
245#define	assert_true(a, ...)	assert_b_eq(a, true, __VA_ARGS__)
246#define	assert_false(a, ...)	assert_b_eq(a, false, __VA_ARGS__)
247
248#define	assert_str_eq(a, b, ...) do {				\
249	if (strcmp((a), (b))) {						\
250		char prefix[ASSERT_BUFSIZE];				\
251		char message[ASSERT_BUFSIZE];				\
252		malloc_snprintf(prefix, sizeof(prefix),			\
253		    "%s:%s:%d: Failed assertion: "			\
254		    "(%s) same as (%s) --> "				\
255		    "\"%s\" differs from \"%s\": ",			\
256		    __func__, __FILE__, __LINE__, #a, #b, a, b);	\
257		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
258		p_test_fail(prefix, message);				\
259	}								\
260} while (0)
261#define	assert_str_ne(a, b, ...) do {				\
262	if (!strcmp((a), (b))) {					\
263		char prefix[ASSERT_BUFSIZE];				\
264		char message[ASSERT_BUFSIZE];				\
265		malloc_snprintf(prefix, sizeof(prefix),			\
266		    "%s:%s:%d: Failed assertion: "			\
267		    "(%s) differs from (%s) --> "			\
268		    "\"%s\" same as \"%s\": ",				\
269		    __func__, __FILE__, __LINE__, #a, #b, a, b);	\
270		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
271		p_test_fail(prefix, message);				\
272	}								\
273} while (0)
274
275#define	assert_not_reached(...) do {					\
276	char prefix[ASSERT_BUFSIZE];					\
277	char message[ASSERT_BUFSIZE];					\
278	malloc_snprintf(prefix, sizeof(prefix),				\
279	    "%s:%s:%d: Unreachable code reached: ",			\
280	    __func__, __FILE__, __LINE__);				\
281	malloc_snprintf(message, sizeof(message), __VA_ARGS__);		\
282	p_test_fail(prefix, message);					\
283} while (0)
284
285/*
286 * If this enum changes, corresponding changes in test/test.sh.in are also
287 * necessary.
288 */
289typedef enum {
290	test_status_pass = 0,
291	test_status_skip = 1,
292	test_status_fail = 2,
293
294	test_status_count = 3
295} test_status_t;
296
297typedef void (test_t)(void);
298
299#define	TEST_BEGIN(f)							\
300static void								\
301f(void)									\
302{									\
303	p_test_init(#f);
304
305#define	TEST_END							\
306	goto label_test_end;						\
307label_test_end:								\
308	p_test_fini();							\
309}
310
311#define	test(...)							\
312	p_test(__VA_ARGS__, NULL)
313
314#define	test_skip_if(e) do {						\
315	if (e) {							\
316		test_skip("%s:%s:%d: Test skipped: (%s)",		\
317		    __func__, __FILE__, __LINE__, #e);			\
318		goto label_test_end;					\
319	}								\
320} while (0)
321
322void	test_skip(const char *format, ...) JEMALLOC_ATTR(format(printf, 1, 2));
323void	test_fail(const char *format, ...) JEMALLOC_ATTR(format(printf, 1, 2));
324
325/* For private use by macros. */
326test_status_t	p_test(test_t *t, ...);
327void	p_test_init(const char *name);
328void	p_test_fini(void);
329void	p_test_fail(const char *prefix, const char *message);
330