1e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans#define	ASSERT_BUFSIZE	256
2e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans
3b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_cmp(t, a, b, cmp, neg_cmp, pri, ...) do {		\
42a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	t a_ = (a);							\
52a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	t b_ = (b);							\
62a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	if (!(a_ cmp b_)) {						\
7e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char prefix[ASSERT_BUFSIZE];				\
8e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char message[ASSERT_BUFSIZE];				\
9e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		malloc_snprintf(prefix, sizeof(prefix),			\
102a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "%s:%s:%d: Failed assertion: "			\
112a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "(%s) "#cmp" (%s) --> "				\
122a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "%"pri" "#neg_cmp" %"pri": ",			\
132a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    __func__, __FILE__, __LINE__,			\
14e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		    #a, #b, a_, b_);					\
15b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
16e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		p_test_fail(prefix, message);				\
172a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	}								\
182a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans} while (0)
192a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
20b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ptr_eq(a, b, ...)	assert_cmp(void *, a, b, ==,	\
21b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, "p", __VA_ARGS__)
22b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ptr_ne(a, b, ...)	assert_cmp(void *, a, b, !=,	\
23b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, "p", __VA_ARGS__)
24b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ptr_null(a, ...)		assert_cmp(void *, a, NULL, ==,	\
25b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, "p", __VA_ARGS__)
26b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ptr_not_null(a, ...)	assert_cmp(void *, a, NULL, !=,	\
27b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, "p", __VA_ARGS__)
282a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
29b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_c_eq(a, b, ...)	assert_cmp(char, a, b, ==, !=, "c", __VA_ARGS__)
30b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_c_ne(a, b, ...)	assert_cmp(char, a, b, !=, ==, "c", __VA_ARGS__)
31b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_c_lt(a, b, ...)	assert_cmp(char, a, b, <, >=, "c", __VA_ARGS__)
32b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_c_le(a, b, ...)	assert_cmp(char, a, b, <=, >, "c", __VA_ARGS__)
33b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_c_ge(a, b, ...)	assert_cmp(char, a, b, >=, <, "c", __VA_ARGS__)
34b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_c_gt(a, b, ...)	assert_cmp(char, a, b, >, <=, "c", __VA_ARGS__)
352a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
36b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_x_eq(a, b, ...)	assert_cmp(int, a, b, ==, !=, "#x", __VA_ARGS__)
37b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_x_ne(a, b, ...)	assert_cmp(int, a, b, !=, ==, "#x", __VA_ARGS__)
38b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_x_lt(a, b, ...)	assert_cmp(int, a, b, <, >=, "#x", __VA_ARGS__)
39b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_x_le(a, b, ...)	assert_cmp(int, a, b, <=, >, "#x", __VA_ARGS__)
40b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_x_ge(a, b, ...)	assert_cmp(int, a, b, >=, <, "#x", __VA_ARGS__)
41b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_x_gt(a, b, ...)	assert_cmp(int, a, b, >, <=, "#x", __VA_ARGS__)
422a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
43b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d_eq(a, b, ...)	assert_cmp(int, a, b, ==, !=, "d", __VA_ARGS__)
44b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d_ne(a, b, ...)	assert_cmp(int, a, b, !=, ==, "d", __VA_ARGS__)
45b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d_lt(a, b, ...)	assert_cmp(int, a, b, <, >=, "d", __VA_ARGS__)
46b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d_le(a, b, ...)	assert_cmp(int, a, b, <=, >, "d", __VA_ARGS__)
47b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d_ge(a, b, ...)	assert_cmp(int, a, b, >=, <, "d", __VA_ARGS__)
48b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d_gt(a, b, ...)	assert_cmp(int, a, b, >, <=, "d", __VA_ARGS__)
492a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
50b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u_eq(a, b, ...)	assert_cmp(int, a, b, ==, !=, "u", __VA_ARGS__)
51b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u_ne(a, b, ...)	assert_cmp(int, a, b, !=, ==, "u", __VA_ARGS__)
52b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u_lt(a, b, ...)	assert_cmp(int, a, b, <, >=, "u", __VA_ARGS__)
53b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u_le(a, b, ...)	assert_cmp(int, a, b, <=, >, "u", __VA_ARGS__)
54b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u_ge(a, b, ...)	assert_cmp(int, a, b, >=, <, "u", __VA_ARGS__)
55b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u_gt(a, b, ...)	assert_cmp(int, a, b, >, <=, "u", __VA_ARGS__)
562a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
57b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ld_eq(a, b, ...)	assert_cmp(long, a, b, ==,	\
58b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, "ld", __VA_ARGS__)
59b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ld_ne(a, b, ...)	assert_cmp(long, a, b, !=,	\
60b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, "ld", __VA_ARGS__)
61b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ld_lt(a, b, ...)	assert_cmp(long, a, b, <,	\
62b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, "ld", __VA_ARGS__)
63b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ld_le(a, b, ...)	assert_cmp(long, a, b, <=,	\
64b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, "ld", __VA_ARGS__)
65b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ld_ge(a, b, ...)	assert_cmp(long, a, b, >=,	\
66b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, "ld", __VA_ARGS__)
67b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ld_gt(a, b, ...)	assert_cmp(long, a, b, >,	\
68b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, "ld", __VA_ARGS__)
69e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evans
70b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_lu_eq(a, b, ...)	assert_cmp(unsigned long,	\
71b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, ==, !=, "lu", __VA_ARGS__)
72b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_lu_ne(a, b, ...)	assert_cmp(unsigned long,	\
73b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, !=, ==, "lu", __VA_ARGS__)
74b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_lu_lt(a, b, ...)	assert_cmp(unsigned long,	\
75b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, <, >=, "lu", __VA_ARGS__)
76b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_lu_le(a, b, ...)	assert_cmp(unsigned long,	\
77b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, <=, >, "lu", __VA_ARGS__)
78b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_lu_ge(a, b, ...)	assert_cmp(unsigned long,	\
79b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, >=, <, "lu", __VA_ARGS__)
80b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_lu_gt(a, b, ...)	assert_cmp(unsigned long,	\
81b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, >, <=, "lu", __VA_ARGS__)
82e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evans
83b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qd_eq(a, b, ...)	assert_cmp(long long, a, b, ==,	\
84b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, "qd", __VA_ARGS__)
85b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qd_ne(a, b, ...)	assert_cmp(long long, a, b, !=,	\
86b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, "qd", __VA_ARGS__)
87b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qd_lt(a, b, ...)	assert_cmp(long long, a, b, <,	\
88b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, "qd", __VA_ARGS__)
89b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qd_le(a, b, ...)	assert_cmp(long long, a, b, <=,	\
90b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, "qd", __VA_ARGS__)
91b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qd_ge(a, b, ...)	assert_cmp(long long, a, b, >=,	\
92b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, "qd", __VA_ARGS__)
93b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qd_gt(a, b, ...)	assert_cmp(long long, a, b, >,	\
94b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, "qd", __VA_ARGS__)
95e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evans
96b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qu_eq(a, b, ...)	assert_cmp(unsigned long long,	\
97b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, ==, !=, "qu", __VA_ARGS__)
98b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qu_ne(a, b, ...)	assert_cmp(unsigned long long,	\
99b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, !=, ==, "qu", __VA_ARGS__)
100b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qu_lt(a, b, ...)	assert_cmp(unsigned long long,	\
101b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, <, >=, "qu", __VA_ARGS__)
102b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qu_le(a, b, ...)	assert_cmp(unsigned long long,	\
103b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, <=, >, "qu", __VA_ARGS__)
104b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qu_ge(a, b, ...)	assert_cmp(unsigned long long,	\
105b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, >=, <, "qu", __VA_ARGS__)
106b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_qu_gt(a, b, ...)	assert_cmp(unsigned long long,	\
107b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    a, b, >, <=, "qu", __VA_ARGS__)
108e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evans
109b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_jd_eq(a, b, ...)	assert_cmp(intmax_t, a, b, ==,	\
110b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, "jd", __VA_ARGS__)
111b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_jd_ne(a, b, ...)	assert_cmp(intmax_t, a, b, !=,	\
112b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, "jd", __VA_ARGS__)
113b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_jd_lt(a, b, ...)	assert_cmp(intmax_t, a, b, <,	\
114b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, "jd", __VA_ARGS__)
115b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_jd_le(a, b, ...)	assert_cmp(intmax_t, a, b, <=,	\
116b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, "jd", __VA_ARGS__)
117b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_jd_ge(a, b, ...)	assert_cmp(intmax_t, a, b, >=,	\
118b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, "jd", __VA_ARGS__)
119b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_jd_gt(a, b, ...)	assert_cmp(intmax_t, a, b, >,	\
120b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, "jd", __VA_ARGS__)
121e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evans
122b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ju_eq(a, b, ...)	assert_cmp(uintmax_t, a, b, ==,	\
123b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, "ju", __VA_ARGS__)
124b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ju_ne(a, b, ...)	assert_cmp(uintmax_t, a, b, !=,	\
125b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, "ju", __VA_ARGS__)
126b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ju_lt(a, b, ...)	assert_cmp(uintmax_t, a, b, <,	\
127b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, "ju", __VA_ARGS__)
128b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ju_le(a, b, ...)	assert_cmp(uintmax_t, a, b, <=,	\
129b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, "ju", __VA_ARGS__)
130b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ju_ge(a, b, ...)	assert_cmp(uintmax_t, a, b, >=,	\
131b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, "ju", __VA_ARGS__)
132b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_ju_gt(a, b, ...)	assert_cmp(uintmax_t, a, b, >,	\
133b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, "ju", __VA_ARGS__)
134e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evans
135b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zd_eq(a, b, ...)	assert_cmp(ssize_t, a, b, ==,	\
136b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, "zd", __VA_ARGS__)
137b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zd_ne(a, b, ...)	assert_cmp(ssize_t, a, b, !=,	\
138b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, "zd", __VA_ARGS__)
139b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zd_lt(a, b, ...)	assert_cmp(ssize_t, a, b, <,	\
140b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, "zd", __VA_ARGS__)
141b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zd_le(a, b, ...)	assert_cmp(ssize_t, a, b, <=,	\
142b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, "zd", __VA_ARGS__)
143b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zd_ge(a, b, ...)	assert_cmp(ssize_t, a, b, >=,	\
144b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, "zd", __VA_ARGS__)
145b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zd_gt(a, b, ...)	assert_cmp(ssize_t, a, b, >,	\
146b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, "zd", __VA_ARGS__)
1472a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
148b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zu_eq(a, b, ...)	assert_cmp(size_t, a, b, ==,	\
149b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, "zu", __VA_ARGS__)
150b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zu_ne(a, b, ...)	assert_cmp(size_t, a, b, !=,	\
151b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, "zu", __VA_ARGS__)
152b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zu_lt(a, b, ...)	assert_cmp(size_t, a, b, <,	\
153b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, "zu", __VA_ARGS__)
154b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zu_le(a, b, ...)	assert_cmp(size_t, a, b, <=,	\
155b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, "zu", __VA_ARGS__)
156b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zu_ge(a, b, ...)	assert_cmp(size_t, a, b, >=,	\
157b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, "zu", __VA_ARGS__)
158b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_zu_gt(a, b, ...)	assert_cmp(size_t, a, b, >,	\
159b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, "zu", __VA_ARGS__)
1602a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
161b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d32_eq(a, b, ...)	assert_cmp(int32_t, a, b, ==,	\
162b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, PRId32, __VA_ARGS__)
163b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d32_ne(a, b, ...)	assert_cmp(int32_t, a, b, !=,	\
164b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, PRId32, __VA_ARGS__)
165b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d32_lt(a, b, ...)	assert_cmp(int32_t, a, b, <,	\
166b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, PRId32, __VA_ARGS__)
167b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d32_le(a, b, ...)	assert_cmp(int32_t, a, b, <=,	\
168b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, PRId32, __VA_ARGS__)
169b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d32_ge(a, b, ...)	assert_cmp(int32_t, a, b, >=,	\
170b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, PRId32, __VA_ARGS__)
171b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d32_gt(a, b, ...)	assert_cmp(int32_t, a, b, >,	\
172b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, PRId32, __VA_ARGS__)
17380061b6df0a8bef0cedbd947d74932ff1c2511e8Jason Evans
174b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u32_eq(a, b, ...)	assert_cmp(uint32_t, a, b, ==,	\
175b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, PRIu32, __VA_ARGS__)
176b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u32_ne(a, b, ...)	assert_cmp(uint32_t, a, b, !=,	\
177b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, PRIu32, __VA_ARGS__)
178b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u32_lt(a, b, ...)	assert_cmp(uint32_t, a, b, <,	\
179b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, PRIu32, __VA_ARGS__)
180b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u32_le(a, b, ...)	assert_cmp(uint32_t, a, b, <=,	\
181b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, PRIu32, __VA_ARGS__)
182b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u32_ge(a, b, ...)	assert_cmp(uint32_t, a, b, >=,	\
183b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, PRIu32, __VA_ARGS__)
184b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u32_gt(a, b, ...)	assert_cmp(uint32_t, a, b, >,	\
185b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, PRIu32, __VA_ARGS__)
18680061b6df0a8bef0cedbd947d74932ff1c2511e8Jason Evans
187b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d64_eq(a, b, ...)	assert_cmp(int64_t, a, b, ==,	\
188b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, PRId64, __VA_ARGS__)
189b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d64_ne(a, b, ...)	assert_cmp(int64_t, a, b, !=,	\
190b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, PRId64, __VA_ARGS__)
191b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d64_lt(a, b, ...)	assert_cmp(int64_t, a, b, <,	\
192b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, PRId64, __VA_ARGS__)
193b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d64_le(a, b, ...)	assert_cmp(int64_t, a, b, <=,	\
194b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, PRId64, __VA_ARGS__)
195b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d64_ge(a, b, ...)	assert_cmp(int64_t, a, b, >=,	\
196b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, PRId64, __VA_ARGS__)
197b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_d64_gt(a, b, ...)	assert_cmp(int64_t, a, b, >,	\
198b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, PRId64, __VA_ARGS__)
1992a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
200b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u64_eq(a, b, ...)	assert_cmp(uint64_t, a, b, ==,	\
201b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    !=, PRIu64, __VA_ARGS__)
202b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u64_ne(a, b, ...)	assert_cmp(uint64_t, a, b, !=,	\
203b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    ==, PRIu64, __VA_ARGS__)
204b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u64_lt(a, b, ...)	assert_cmp(uint64_t, a, b, <,	\
205b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >=, PRIu64, __VA_ARGS__)
206b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u64_le(a, b, ...)	assert_cmp(uint64_t, a, b, <=,	\
207b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    >, PRIu64, __VA_ARGS__)
208b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u64_ge(a, b, ...)	assert_cmp(uint64_t, a, b, >=,	\
209b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <, PRIu64, __VA_ARGS__)
210b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_u64_gt(a, b, ...)	assert_cmp(uint64_t, a, b, >,	\
211b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey    <=, PRIu64, __VA_ARGS__)
2122a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
213b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_b_eq(a, b, ...) do {					\
2142a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	bool a_ = (a);							\
215de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	bool b_ = (b);							\
216de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	if (!(a_ == b_)) {						\
217e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char prefix[ASSERT_BUFSIZE];				\
218e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char message[ASSERT_BUFSIZE];				\
219e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		malloc_snprintf(prefix, sizeof(prefix),			\
2202a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "%s:%s:%d: Failed assertion: "			\
221de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		    "(%s) == (%s) --> %s != %s: ",			\
2222a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    __func__, __FILE__, __LINE__,			\
223de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		    #a, #b, a_ ? "true" : "false",			\
224e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		    b_ ? "true" : "false");				\
225b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
226e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		p_test_fail(prefix, message);				\
2272a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	}								\
2282a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans} while (0)
229b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_b_ne(a, b, ...) do {					\
2302a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	bool a_ = (a);							\
231de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	bool b_ = (b);							\
232de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	if (!(a_ != b_)) {						\
233e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char prefix[ASSERT_BUFSIZE];				\
234e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char message[ASSERT_BUFSIZE];				\
235e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		malloc_snprintf(prefix, sizeof(prefix),			\
2362a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "%s:%s:%d: Failed assertion: "			\
237de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		    "(%s) != (%s) --> %s == %s: ",			\
2382a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    __func__, __FILE__, __LINE__,			\
239de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		    #a, #b, a_ ? "true" : "false",			\
240e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		    b_ ? "true" : "false");				\
241b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
242e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		p_test_fail(prefix, message);				\
2432a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	}								\
2442a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans} while (0)
245b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_true(a, ...)	assert_b_eq(a, true, __VA_ARGS__)
246b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_false(a, ...)	assert_b_eq(a, false, __VA_ARGS__)
2472a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
248b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_str_eq(a, b, ...) do {				\
2492a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	if (strcmp((a), (b))) {						\
250e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char prefix[ASSERT_BUFSIZE];				\
251e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char message[ASSERT_BUFSIZE];				\
252e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		malloc_snprintf(prefix, sizeof(prefix),			\
2532a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "%s:%s:%d: Failed assertion: "			\
2542a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "(%s) same as (%s) --> "				\
255b1941c615023cab9baf0a78a28df1e3b4972434fJason Evans		    "\"%s\" differs from \"%s\": ",			\
256e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		    __func__, __FILE__, __LINE__, #a, #b, a, b);	\
257b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
258e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		p_test_fail(prefix, message);				\
2592a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	}								\
2602a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans} while (0)
261b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_str_ne(a, b, ...) do {				\
2622a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	if (!strcmp((a), (b))) {					\
263e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char prefix[ASSERT_BUFSIZE];				\
264e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		char message[ASSERT_BUFSIZE];				\
265e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		malloc_snprintf(prefix, sizeof(prefix),			\
2662a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "%s:%s:%d: Failed assertion: "			\
2672a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "(%s) differs from (%s) --> "			\
268b1941c615023cab9baf0a78a28df1e3b4972434fJason Evans		    "\"%s\" same as \"%s\": ",				\
269e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		    __func__, __FILE__, __LINE__, #a, #b, a, b);	\
270b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey		malloc_snprintf(message, sizeof(message), __VA_ARGS__);	\
271e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans		p_test_fail(prefix, message);				\
2722a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	}								\
2732a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans} while (0)
2742a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
275b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	assert_not_reached(...) do {					\
276e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans	char prefix[ASSERT_BUFSIZE];					\
277e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans	char message[ASSERT_BUFSIZE];					\
278e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans	malloc_snprintf(prefix, sizeof(prefix),				\
279e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans	    "%s:%s:%d: Unreachable code reached: ",			\
280e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans	    __func__, __FILE__, __LINE__);				\
281b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey	malloc_snprintf(message, sizeof(message), __VA_ARGS__);		\
282e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evans	p_test_fail(prefix, message);					\
283e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evans} while (0)
284e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evans
2852a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans/*
2862a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans * If this enum changes, corresponding changes in test/test.sh.in are also
2872a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans * necessary.
2882a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans */
2892a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evanstypedef enum {
2902a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	test_status_pass = 0,
2912a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	test_status_skip = 1,
2922a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	test_status_fail = 2,
2932a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
2942a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	test_status_count = 3
2952a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans} test_status_t;
2962a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
2972a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evanstypedef void (test_t)(void);
2982a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
2992a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans#define	TEST_BEGIN(f)							\
3002a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansstatic void								\
3012a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansf(void)									\
3022a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans{									\
3032a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	p_test_init(#f);
3042a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
3052a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans#define	TEST_END							\
3060d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evans	goto label_test_end;						\
3070d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evanslabel_test_end:								\
3082a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	p_test_fini();							\
3092a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans}
3102a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
311b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey#define	test(...)							\
312b105e65e3ceb60def3908aa2945f94011d61e3fdMike Hommey	p_test(__VA_ARGS__, NULL)
3132a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
3140d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evans#define	test_skip_if(e) do {						\
3150d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evans	if (e) {							\
3160d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evans		test_skip("%s:%s:%d: Test skipped: (%s)",		\
3170d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evans		    __func__, __FILE__, __LINE__, #e);			\
3180d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evans		goto label_test_end;					\
3190d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evans	}								\
3200d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evans} while (0)
3210d6c5d8bd0d866a0ce4ce321259cec65d6459821Jason Evans
32286abd0dcd8e478759fe409d338d11558c4cec427Jason Evansvoid	test_skip(const char *format, ...) JEMALLOC_ATTR(format(printf, 1, 2));
3232a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansvoid	test_fail(const char *format, ...) JEMALLOC_ATTR(format(printf, 1, 2));
3242a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
3252a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans/* For private use by macros. */
3268888fdb946de0fff946f6a27ded0f54b06bdc51fJason Evanstest_status_t	p_test(test_t *t, ...);
3272a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansvoid	p_test_init(const char *name);
3282a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansvoid	p_test_fini(void);
329e3f27cfced57ac9c3b5306947d37411479a68c2eJason Evansvoid	p_test_fail(const char *prefix, const char *message);
330