xref: /xnu-10002.81.5/osfmk/tests/ktest.h (revision 5e3eaea39dcf651e66cb99ba7d70e32cc4a99587)
1 /*
2  * Copyright (c) 2015 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef _TESTS_KTEST_H
30 #define _TESTS_KTEST_H
31 
32 /* Symbol name prefix */
33 #define T_SYM(sym) ktest_ ## sym
34 
35 #include <stdarg.h>
36 
37 extern unsigned int T_SYM(current_line);
38 extern const char * T_SYM(current_file);
39 extern const char * T_SYM(current_func);
40 extern int T_SYM(testcase_mode);
41 extern int T_SYM(testcase_result);
42 extern int T_SYM(test_result);
43 extern int T_SYM(quiet);
44 
45 void T_SYM(start)(void);
46 void T_SYM(finish)(void);
47 void T_SYM(testbegin)(const char * test_name);
48 void T_SYM(testend)(void);
49 void T_SYM(testskip)(const char * msg, ...);
50 void T_SYM(testcase)(int expr);
51 void T_SYM(log)(const char * msg, ...);
52 void T_SYM(perf)(const char * metric, const char * unit, double value, const char * desc);
53 void T_SYM(update_test_result_state)(void);
54 void T_SYM(assertion_check)(void);
55 
56 void T_SYM(set_current_msg)(const char * msg, ...);
57 void T_SYM(set_current_expr)(const char * expr_fmt, ...);
58 void T_SYM(set_current_var)(const char * name, const char * value_fmt, ...);
59 
60 typedef union {
61 	char _char;
62 	unsigned char _uchar;
63 
64 	short _short;
65 	unsigned short _ushort;
66 
67 	int _int;
68 	unsigned int _uint;
69 
70 	long _long;
71 	unsigned long _ulong;
72 
73 	long long _llong;
74 	unsigned long long _ullong;
75 
76 	float _float;
77 
78 	double _double;
79 
80 	long double _ldouble;
81 
82 	void* _ptr;
83 } T_SYM(temp);
84 
85 extern T_SYM(temp) T_SYM(temp1), T_SYM(temp2), T_SYM(temp3);
86 
87 #define T_SUCCESS 1
88 #define T_FAILURE 0
89 
90 /* Testcase modes */
91 #define T_MAIN 0
92 #define T_SETUP 1
93 
94 /* Testcase result states */
95 #define T_RESULT_PASS 0
96 #define T_RESULT_FAIL 1
97 #define T_RESULT_UXPASS 2
98 #define T_RESULT_XFAIL 3
99 
100 /* Test result states */
101 #define T_STATE_UNRESOLVED 0
102 #define T_STATE_PASS 1
103 #define T_STATE_FAIL 2
104 #define T_STATE_SETUPFAIL 3
105 
106 /*
107  * Helpers
108  */
109 
110 #define T_TOSTRING_HELPER(x) #x
111 #define T_TOSTRING(x) T_TOSTRING_HELPER(x)
112 
113 #define T_SAVEINFO do {\
114 	T_SYM(current_line) = __LINE__;\
115 	T_SYM(current_func) = (const char *)__func__;\
116 	T_SYM(current_file) = (const char *)__FILE__;\
117 } while(0)
118 
119 #define T_SET_AUX_VARS do {\
120 	/* Only used in userspace lib for now */ \
121 } while(0)
122 
123 #define T_ASSERTION_CHECK do {\
124 	T_SYM(assertion_check)();\
125 } while(0)
126 
127 #define T_EXPECT_BLOCK2(type, fmt, cmp, lhs, rhs, msg, ...) do {\
128 	T_SAVEINFO;\
129 	T_SYM(temp1).type = (lhs);\
130 	T_SYM(temp2).type = (rhs);\
131 	T_SYM(set_current_expr)(T_TOSTRING(lhs) " "\
132 	                        T_TOSTRING(cmp) " "\
133 	                        T_TOSTRING(rhs));\
134 	T_SYM(set_current_var)(T_TOSTRING(lhs), fmt, T_SYM(temp1).type);\
135 	T_SYM(set_current_var)(T_TOSTRING(rhs), fmt, T_SYM(temp2).type);\
136 	T_SET_AUX_VARS;\
137 	T_SYM(set_current_msg)(msg, ## __VA_ARGS__);\
138 	T_SYM(testcase)(T_SYM(temp1).type cmp T_SYM(temp2).type);\
139 } while(0)
140 
141 #define T_ASSERT_BLOCK2(type, fmt, cmp, lhs, rhs, msg, ...) do {\
142 	T_EXPECT_BLOCK2(type, fmt, cmp, lhs, rhs, msg, ## __VA_ARGS__);\
143 	T_ASSERTION_CHECK;\
144 } while(0)
145 
146 /*
147  * Core functions
148  */
149 
150 /* Denotes start of testing. All prior output is ignored. */
151 #define T_START do {\
152 	T_SAVEINFO;\
153 	T_SYM(start)();\
154 } while(0)
155 
156 /* Denotes end of testing. All subsequent output is ignored. */
157 #define T_FINISH do {\
158 	T_SAVEINFO;\
159 	T_SYM(finish)();\
160 } while(0)
161 
162 /* Denotes beginning of a test. */
163 #define T_BEGIN(name) do {\
164 	T_SAVEINFO;\
165 	T_SYM(testbegin)(name);\
166 } while(0)
167 
168 /* Denotes end of current test. */
169 #define T_END do {\
170 	T_SAVEINFO;\
171 	T_SYM(testend)();\
172 } while(0)
173 
174 /* Denotes beginning of a setup section of the current test. */
175 #define T_SETUPBEGIN do {\
176 	T_SYM(testcase_mode) = T_SETUP;\
177 } while(0)
178 
179 /* Denotes end of the current setup section of the current test. */
180 #define T_SETUPEND do {\
181 	T_SYM(testcase_mode) = T_MAIN;\
182 } while(0)
183 
184 /* Denotes end of current test because test was skipped. */
185 #define T_SKIP(msg, ...) do {\
186 	T_SAVEINFO;\
187 	T_SYM(testskip)(msg, ## __VA_ARGS__);\
188 } while(0)
189 
190 /* Returns result of latest testrun. */
191 #define T_TESTRESULT (T_SYM(test_result))
192 
193 /* Return result of latest testcase. */
194 #define T_TESTCASERESULT (T_SYM(testcase_result))
195 
196 /* Flags the next testcase as expected failure. */
197 #define T_EXPECTFAIL do {\
198 	T_SYM(expectfail) = 1;\
199 } while(0)
200 
201 /* Only emit output for next testcase if it is a FAIL or UXPASS. */
202 #define T_QUIET do {\
203 	T_SYM(quiet) = 1;\
204 } while(0)
205 
206 /* Logs a message. */
207 #define T_LOG(msg, ...) do {\
208 	T_SAVEINFO;\
209 	T_SYM(log)(msg, ## __VA_ARGS__);\
210 } while(0)
211 
212 /* Explicit pass. */
213 #define T_PASS(msg, ...) do {\
214 	T_SAVEINFO;\
215 	T_SYM(set_current_msg)(msg, ## __VA_ARGS__);\
216 	T_SYM(testcase)(T_SUCCESS);\
217 } while(0)
218 
219 /* Explicit fail. */
220 #define T_FAIL(msg, ...) do {\
221 	T_SAVEINFO;\
222 	T_SYM(set_current_msg)(msg, ## __VA_ARGS__);\
223 	T_SYM(testcase)(T_FAILURE);\
224 } while(0)
225 
226 /* Explicit assert fail. */
227 #define T_ASSERT_FAIL(msg, ...) do {\
228 	T_SAVEINFO;\
229 	T_SET_AUX_VARS;\
230 	T_SYM(set_current_msg)(msg, ## __VA_ARGS__);\
231 	T_SYM(testcase)(T_FAILURE);\
232 	T_SYM(assertion_fail)();\
233 } while(0)
234 
235 /* Generic expect. */
236 #define T_EXPECT(expr, msg, ...) do {\
237 	T_SAVEINFO;\
238 	T_SYM(temp1)._int = (int)(!!(expr));\
239 	T_SYM(set_current_expr)(T_TOSTRING(expr));\
240 	T_SET_AUX_VARS;\
241 	T_SYM(set_current_msg)(msg, ## __VA_ARGS__);\
242 	T_SYM(testcase)(T_SYM(temp1)._int);\
243 } while(0)
244 
245 /* Generic assert. */
246 #define T_ASSERT(expr, msg, ...) do {\
247 	T_EXPECT(expr, msg, ## __VA_ARGS__);\
248 	T_ASSERTION_CHECK;\
249 } while(0)
250 
251 /*
252  * Convenience functions
253  */
254 
255 /* null */
256 
257 #define T_EXPECT_NOTNULL(expr, msg, ...) do {\
258 	T_SAVEINFO;\
259 	T_SYM(temp1)._int = (int)(!!(expr));\
260 	T_SYM(set_current_expr)(T_TOSTRING(expr) " != NULL");\
261 	T_SYM(set_current_var)(T_TOSTRING(expr),\
262 	                       "%s",\
263 	                       T_SYM(temp1)._int ? "<NOTNULL>" : "NULL");\
264 	T_SET_AUX_VARS;\
265 	T_SYM(set_current_msg)(msg, ## __VA_ARGS__);\
266 	T_SYM(testcase)(T_SYM(temp1)._int);\
267 } while(0)
268 
269 #define T_EXPECT_NULL(expr, msg, ...) do {\
270 	T_SAVEINFO;\
271 	T_SYM(temp1)._int = (int)(!(expr));\
272 	T_SYM(set_current_expr)(T_TOSTRING(expr) " == NULL");\
273 	T_SYM(set_current_var)(T_TOSTRING(expr),\
274 	                       "%s",\
275 	                       T_SYM(temp1)._int ? "NULL" : "<NOTNULL>");\
276 	T_SET_AUX_VARS;\
277 	T_SYM(set_current_msg)(msg, ## __VA_ARGS__);\
278 	T_SYM(testcase)(T_SYM(temp1)._int);\
279 } while(0)
280 
281 #define T_ASSERT_NOTNULL(expr, msg, ...) do {\
282 	T_EXPECT_NOTNULL(expr, msg, ## __VA_ARGS__);\
283 	T_ASSERTION_CHECK;\
284 } while(0)
285 
286 #define T_ASSERT_NULL(expr, msg, ...) do {\
287 	T_EXPECT_NULL(expr, msg, ## __VA_ARGS__);\
288 	T_ASSERTION_CHECK;\
289 } while(0)
290 
291 /* string */
292 
293 // TODO: check/truncate inputs
294 #define T_EXPECT_EQ_STR(lhs, rhs, msg, ...) do {\
295 	T_SAVEINFO;\
296 	T_SYM(temp1)._ptr = (lhs);\
297 	T_SYM(temp2)._ptr = (rhs);\
298 	T_SYM(set_current_expr)(T_TOSTRING(lhs) " == " T_TOSTRING(rhs));\
299 	T_SYM(set_current_var)(T_TOSTRING(lhs), "%s", T_SYM(temp1)._ptr);\
300 	T_SYM(set_current_var)(T_TOSTRING(rhs), "%s", T_SYM(temp2)._ptr);\
301 	T_SET_AUX_VARS;\
302 	T_SYM(set_current_msg)(msg, ## __VA_ARGS__);\
303 	T_SYM(testcase)(strcmp(T_SYM(temp1)._ptr, T_SYM(temp2)._ptr) == 0);\
304 } while(0)
305 
306 #define T_EXPECT_NE_STR(lhs, rhs, msg, ...) do {\
307 	T_SAVEINFO;\
308 	T_SYM(temp1)._ptr = (lhs);\
309 	T_SYM(temp2)._ptr = (rhs);\
310 	T_SYM(set_current_expr)(T_TOSTRING(lhs) " == " T_TOSTRING(rhs));\
311 	T_SYM(set_current_var)(T_TOSTRING(lhs), "%s", T_SYM(temp1)._ptr);\
312 	T_SYM(set_current_var)(T_TOSTRING(rhs), "%s", T_SYM(temp2)._ptr);\
313 	T_SET_AUX_VARS;\
314 	T_SYM(set_current_msg)(msg, ## __VA_ARGS__);\
315 	T_SYM(testcase)(strcmp(T_SYM(temp1)._ptr, T_SYM(temp2)._ptr) != 0);\
316 } while(0)
317 
318 #define T_ASSERT_EQ_STR(lhs, rhs, msg, ...) do {\
319 	T_EXPECT_EQ_STR(lhs, rhs, msg, # __VA_ARGS__);\
320 	T_ASSERTION_CHECK;\
321 } while(0)
322 
323 #define T_ASSERT_NE_STR(lhs, rhs, msg, ...) do {\
324 	T_EXPECT_NE_STR(lhs, rhs, msg, # __VA_ARGS__);\
325 	T_ASSERTION_CHECK;\
326 } while(0)
327 
328 /* char */
329 
330 #define T_EXPECT_EQ_CHAR(lhs, rhs, msg, ...) \
331 	T_EXPECT_BLOCK2(_char, "%c", ==, lhs, rhs, msg, ## __VA_ARGS__)
332 #define T_EXPECT_NE_CHAR(lhs, rhs, msg, ...) \
333 	T_EXPECT_BLOCK2(_char, "%c", !=, lhs, rhs, msg, ## __VA_ARGS__)
334 #define T_EXPECT_LT_CHAR(lhs, rhs, msg, ...) \
335 	T_EXPECT_BLOCK2(_char, "%c", <, lhs, rhs, msg, ## __VA_ARGS__)
336 #define T_EXPECT_GT_CHAR(lhs, rhs, msg, ...) \
337 	T_EXPECT_BLOCK2(_char, "%c", >, lhs, rhs, msg, ## __VA_ARGS__)
338 #define T_EXPECT_LE_CHAR(lhs, rhs, msg, ...) \
339 	T_EXPECT_BLOCK2(_char, "%c", <=, lhs, rhs, msg, ## __VA_ARGS__)
340 #define T_EXPECT_GE_CHAR(lhs, rhs, msg, ...) \
341 	T_EXPECT_BLOCK2(_char, "%c", >=, lhs, rhs, msg, ## __VA_ARGS__)
342 
343 #define T_ASSERT_EQ_CHAR(lhs, rhs, msg, ...) \
344 	T_ASSERT_BLOCK2(_char, "%c", ==, lhs, rhs, msg, ## __VA_ARGS__)
345 #define T_ASSERT_NE_CHAR(lhs, rhs, msg, ...) \
346 	T_ASSERT_BLOCK2(_char, "%c", !=, lhs, rhs, msg, ## __VA_ARGS__)
347 #define T_ASSERT_LT_CHAR(lhs, rhs, msg, ...) \
348 	T_ASSERT_BLOCK2(_char, "%c", <, lhs, rhs, msg, ## __VA_ARGS__)
349 #define T_ASSERT_GT_CHAR(lhs, rhs, msg, ...) \
350 	T_ASSERT_BLOCK2(_char, "%c", >, lhs, rhs, msg, ## __VA_ARGS__)
351 #define T_ASSERT_LE_CHAR(lhs, rhs, msg, ...) \
352 	T_ASSERT_BLOCK2(_char, "%c", <=, lhs, rhs, msg, ## __VA_ARGS__)
353 #define T_ASSERT_GE_CHAR(lhs, rhs, msg, ...) \
354 	T_ASSERT_BLOCK2(_char, "%c", >=, lhs, rhs, msg, ## __VA_ARGS__)
355 
356 /* unsigned char */
357 
358 #define T_EXPECT_EQ_UCHAR(lhs, rhs, msg, ...) \
359 	T_EXPECT_BLOCK2(_uchar, "%c", ==, lhs, rhs, msg, ## __VA_ARGS__)
360 #define T_EXPECT_NE_UCHAR(lhs, rhs, msg, ...) \
361 	T_EXPECT_BLOCK2(_uchar, "%c", !=, lhs, rhs, msg, ## __VA_ARGS__)
362 #define T_EXPECT_LT_UCHAR(lhs, rhs, msg, ...) \
363 	T_EXPECT_BLOCK2(_uchar, "%c", <, lhs, rhs, msg, ## __VA_ARGS__)
364 #define T_EXPECT_GT_UCHAR(lhs, rhs, msg, ...) \
365 	T_EXPECT_BLOCK2(_uchar, "%c", >, lhs, rhs, msg, ## __VA_ARGS__)
366 #define T_EXPECT_LE_UCHAR(lhs, rhs, msg, ...) \
367 	T_EXPECT_BLOCK2(_uchar, "%c", <=, lhs, rhs, msg, ## __VA_ARGS__)
368 #define T_EXPECT_GE_UCHAR(lhs, rhs, msg, ...) \
369 	T_EXPECT_BLOCK2(_uchar, "%c", >=, lhs, rhs, msg, ## __VA_ARGS__)
370 
371 #define T_ASSERT_EQ_UCHAR(lhs, rhs, msg, ...) \
372 	T_ASSERT_BLOCK2(_uchar, "%c", ==, lhs, rhs, msg, ## __VA_ARGS__)
373 #define T_ASSERT_NE_UCHAR(lhs, rhs, msg, ...) \
374 	T_ASSERT_BLOCK2(_uchar, "%c", !=, lhs, rhs, msg, ## __VA_ARGS__)
375 #define T_ASSERT_LT_UCHAR(lhs, rhs, msg, ...) \
376 	T_ASSERT_BLOCK2(_uchar, "%c", <, lhs, rhs, msg, ## __VA_ARGS__)
377 #define T_ASSERT_GT_UCHAR(lhs, rhs, msg, ...) \
378 	T_ASSERT_BLOCK2(_uchar, "%c", >, lhs, rhs, msg, ## __VA_ARGS__)
379 #define T_ASSERT_LE_UCHAR(lhs, rhs, msg, ...) \
380 	T_ASSERT_BLOCK2(_uchar, "%c", <=, lhs, rhs, msg, ## __VA_ARGS__)
381 #define T_ASSERT_GE_UCHAR(lhs, rhs, msg, ...) \
382 	T_ASSERT_BLOCK2(_uchar, "%c", >=, lhs, rhs, msg, ## __VA_ARGS__)
383 
384 /* short */
385 
386 #define T_EXPECT_EQ_SHORT(lhs, rhs, msg, ...) \
387 	T_EXPECT_BLOCK2(_short, "%hi", ==, lhs, rhs, msg, ## __VA_ARGS__)
388 #define T_EXPECT_NE_SHORT(lhs, rhs, msg, ...) \
389 	T_EXPECT_BLOCK2(_short, "%hi", !=, lhs, rhs, msg, ## __VA_ARGS__)
390 #define T_EXPECT_LT_SHORT(lhs, rhs, msg, ...) \
391 	T_EXPECT_BLOCK2(_short, "%hi", <, lhs, rhs, msg, ## __VA_ARGS__)
392 #define T_EXPECT_GT_SHORT(lhs, rhs, msg, ...) \
393 	T_EXPECT_BLOCK2(_short, "%hi", >, lhs, rhs, msg, ## __VA_ARGS__)
394 #define T_EXPECT_LE_SHORT(lhs, rhs, msg, ...) \
395 	T_EXPECT_BLOCK2(_short, "%hi", <=, lhs, rhs, msg, ## __VA_ARGS__)
396 #define T_EXPECT_GE_SHORT(lhs, rhs, msg, ...) \
397 	T_EXPECT_BLOCK2(_short, "%hi", >=, lhs, rhs, msg, ## __VA_ARGS__)
398 
399 #define T_ASSERT_EQ_SHORT(lhs, rhs, msg, ...) \
400 	T_ASSERT_BLOCK2(_short, "%hi", ==, lhs, rhs, msg, ## __VA_ARGS__)
401 #define T_ASSERT_NE_SHORT(lhs, rhs, msg, ...) \
402 	T_ASSERT_BLOCK2(_short, "%hi", !=, lhs, rhs, msg, ## __VA_ARGS__)
403 #define T_ASSERT_LT_SHORT(lhs, rhs, msg, ...) \
404 	T_ASSERT_BLOCK2(_short, "%hi", <, lhs, rhs, msg, ## __VA_ARGS__)
405 #define T_ASSERT_GT_SHORT(lhs, rhs, msg, ...) \
406 	T_ASSERT_BLOCK2(_short, "%hi", >, lhs, rhs, msg, ## __VA_ARGS__)
407 #define T_ASSERT_LE_SHORT(lhs, rhs, msg, ...) \
408 	T_ASSERT_BLOCK2(_short, "%hi", <=, lhs, rhs, msg, ## __VA_ARGS__)
409 #define T_ASSERT_GE_SHORT(lhs, rhs, msg, ...) \
410 	T_ASSERT_BLOCK2(_short, "%hi", >=, lhs, rhs, msg, ## __VA_ARGS__)
411 
412 /* unsigned short */
413 
414 #define T_EXPECT_EQ_USHORT(lhs, rhs, msg, ...) \
415 	T_EXPECT_BLOCK2(_ushort, "%hu", ==, lhs, rhs, msg, ## __VA_ARGS__)
416 #define T_EXPECT_NE_USHORT(lhs, rhs, msg, ...) \
417 	T_EXPECT_BLOCK2(_ushort, "%hu", !=, lhs, rhs, msg, ## __VA_ARGS__)
418 #define T_EXPECT_LT_USHORT(lhs, rhs, msg, ...) \
419 	T_EXPECT_BLOCK2(_ushort, "%hu", <, lhs, rhs, msg, ## __VA_ARGS__)
420 #define T_EXPECT_GT_USHORT(lhs, rhs, msg, ...) \
421 	T_EXPECT_BLOCK2(_ushort, "%hu", >, lhs, rhs, msg, ## __VA_ARGS__)
422 #define T_EXPECT_LE_USHORT(lhs, rhs, msg, ...) \
423 	T_EXPECT_BLOCK2(_ushort, "%hu", <=, lhs, rhs, msg, ## __VA_ARGS__)
424 #define T_EXPECT_GE_USHORT(lhs, rhs, msg, ...) \
425 	T_EXPECT_BLOCK2(_ushort, "%hu", >=, lhs, rhs, msg, ## __VA_ARGS__)
426 
427 #define T_ASSERT_EQ_USHORT(lhs, rhs, msg, ...) \
428 	T_ASSERT_BLOCK2(_ushort, "%hu", ==, lhs, rhs, msg, ## __VA_ARGS__)
429 #define T_ASSERT_NE_USHORT(lhs, rhs, msg, ...) \
430 	T_ASSERT_BLOCK2(_ushort, "%hu", !=, lhs, rhs, msg, ## __VA_ARGS__)
431 #define T_ASSERT_LT_USHORT(lhs, rhs, msg, ...) \
432 	T_ASSERT_BLOCK2(_ushort, "%hu", <, lhs, rhs, msg, ## __VA_ARGS__)
433 #define T_ASSERT_GT_USHORT(lhs, rhs, msg, ...) \
434 	T_ASSERT_BLOCK2(_ushort, "%hu", >, lhs, rhs, msg, ## __VA_ARGS__)
435 #define T_ASSERT_LE_USHORT(lhs, rhs, msg, ...) \
436 	T_ASSERT_BLOCK2(_ushort, "%hu", <=, lhs, rhs, msg, ## __VA_ARGS__)
437 #define T_ASSERT_GE_USHORT(lhs, rhs, msg, ...) \
438 	T_ASSERT_BLOCK2(_ushort, "%hu", >=, lhs, rhs, msg, ## __VA_ARGS__)
439 
440 /* int */
441 
442 #define T_EXPECT_EQ_INT(lhs, rhs, msg, ...) \
443 	T_EXPECT_BLOCK2(_int, "%d", ==, lhs, rhs, msg, ## __VA_ARGS__)
444 #define T_EXPECT_NE_INT(lhs, rhs, msg, ...) \
445 	T_EXPECT_BLOCK2(_int, "%d", !=, lhs, rhs, msg, ## __VA_ARGS__)
446 #define T_EXPECT_LT_INT(lhs, rhs, msg, ...) \
447 	T_EXPECT_BLOCK2(_int, "%d", <, lhs, rhs, msg, ## __VA_ARGS__)
448 #define T_EXPECT_GT_INT(lhs, rhs, msg, ...) \
449 	T_EXPECT_BLOCK2(_int, "%d", >, lhs, rhs, msg, ## __VA_ARGS__)
450 #define T_EXPECT_LE_INT(lhs, rhs, msg, ...) \
451 	T_EXPECT_BLOCK2(_int, "%d", <=, lhs, rhs, msg, ## __VA_ARGS__)
452 #define T_EXPECT_GE_INT(lhs, rhs, msg, ...) \
453 	T_EXPECT_BLOCK2(_int, "%d", >=, lhs, rhs, msg, ## __VA_ARGS__)
454 
455 #define T_ASSERT_EQ_INT(lhs, rhs, msg, ...) \
456 	T_ASSERT_BLOCK2(_int, "%d", ==, lhs, rhs, msg, ## __VA_ARGS__)
457 #define T_ASSERT_NE_INT(lhs, rhs, msg, ...) \
458 	T_ASSERT_BLOCK2(_int, "%d", !=, lhs, rhs, msg, ## __VA_ARGS__)
459 #define T_ASSERT_LT_INT(lhs, rhs, msg, ...) \
460 	T_ASSERT_BLOCK2(_int, "%d", <, lhs, rhs, msg, ## __VA_ARGS__)
461 #define T_ASSERT_GT_INT(lhs, rhs, msg, ...) \
462 	T_ASSERT_BLOCK2(_int, "%d", >, lhs, rhs, msg, ## __VA_ARGS__)
463 #define T_ASSERT_LE_INT(lhs, rhs, msg, ...) \
464 	T_ASSERT_BLOCK2(_int, "%d", <=, lhs, rhs, msg, ## __VA_ARGS__)
465 #define T_ASSERT_GE_INT(lhs, rhs, msg, ...) \
466 	T_ASSERT_BLOCK2(_int, "%d", >=, lhs, rhs, msg, ## __VA_ARGS__)
467 
468 /* unsigned int */
469 
470 #define T_EXPECT_EQ_UINT(lhs, rhs, msg, ...) \
471 	T_EXPECT_BLOCK2(_uint, "%u", ==, lhs, rhs, msg, ## __VA_ARGS__)
472 #define T_EXPECT_NE_UINT(lhs, rhs, msg, ...) \
473 	T_EXPECT_BLOCK2(_uint, "%u", !=, lhs, rhs, msg, ## __VA_ARGS__)
474 #define T_EXPECT_LT_UINT(lhs, rhs, msg, ...) \
475 	T_EXPECT_BLOCK2(_uint, "%u", <, lhs, rhs, msg, ## __VA_ARGS__)
476 #define T_EXPECT_GT_UINT(lhs, rhs, msg, ...) \
477 	T_EXPECT_BLOCK2(_uint, "%u", >, lhs, rhs, msg, ## __VA_ARGS__)
478 #define T_EXPECT_LE_UINT(lhs, rhs, msg, ...) \
479 	T_EXPECT_BLOCK2(_uint, "%u", <=, lhs, rhs, msg, ## __VA_ARGS__)
480 #define T_EXPECT_GE_UINT(lhs, rhs, msg, ...) \
481 	T_EXPECT_BLOCK2(_uint, "%u", >=, lhs, rhs, msg, ## __VA_ARGS__)
482 
483 #define T_ASSERT_EQ_UINT(lhs, rhs, msg, ...) \
484 	T_ASSERT_BLOCK2(_uint, "%u", ==, lhs, rhs, msg, ## __VA_ARGS__)
485 #define T_ASSERT_NE_UINT(lhs, rhs, msg, ...) \
486 	T_ASSERT_BLOCK2(_uint, "%u", !=, lhs, rhs, msg, ## __VA_ARGS__)
487 #define T_ASSERT_LT_UINT(lhs, rhs, msg, ...) \
488 	T_ASSERT_BLOCK2(_uint, "%u", <, lhs, rhs, msg, ## __VA_ARGS__)
489 #define T_ASSERT_GT_UINT(lhs, rhs, msg, ...) \
490 	T_ASSERT_BLOCK2(_uint, "%u", >, lhs, rhs, msg, ## __VA_ARGS__)
491 #define T_ASSERT_LE_UINT(lhs, rhs, msg, ...) \
492 	T_ASSERT_BLOCK2(_uint, "%u", <=, lhs, rhs, msg, ## __VA_ARGS__)
493 #define T_ASSERT_GE_UINT(lhs, rhs, msg, ...) \
494 	T_ASSERT_BLOCK2(_uint, "%u", >=, lhs, rhs, msg, ## __VA_ARGS__)
495 
496 /* long */
497 
498 #define T_EXPECT_EQ_LONG(lhs, rhs, msg, ...) \
499 	T_EXPECT_BLOCK2(_long, "%li", ==, lhs, rhs, msg, ## __VA_ARGS__)
500 #define T_EXPECT_NE_LONG(lhs, rhs, msg, ...) \
501 	T_EXPECT_BLOCK2(_long, "%li", !=, lhs, rhs, msg, ## __VA_ARGS__)
502 #define T_EXPECT_LT_LONG(lhs, rhs, msg, ...) \
503 	T_EXPECT_BLOCK2(_long, "%li", <, lhs, rhs, msg, ## __VA_ARGS__)
504 #define T_EXPECT_GT_LONG(lhs, rhs, msg, ...) \
505 	T_EXPECT_BLOCK2(_long, "%li", >, lhs, rhs, msg, ## __VA_ARGS__)
506 #define T_EXPECT_LE_LONG(lhs, rhs, msg, ...) \
507 	T_EXPECT_BLOCK2(_long, "%li", <=, lhs, rhs, msg, ## __VA_ARGS__)
508 #define T_EXPECT_GE_LONG(lhs, rhs, msg, ...) \
509 	T_EXPECT_BLOCK2(_long, "%li", >=, lhs, rhs, msg, ## __VA_ARGS__)
510 
511 #define T_ASSERT_EQ_LONG(lhs, rhs, msg, ...) \
512 	T_ASSERT_BLOCK2(_long, "%li", ==, lhs, rhs, msg, ## __VA_ARGS__)
513 #define T_ASSERT_NE_LONG(lhs, rhs, msg, ...) \
514 	T_ASSERT_BLOCK2(_long, "%li", !=, lhs, rhs, msg, ## __VA_ARGS__)
515 #define T_ASSERT_LT_LONG(lhs, rhs, msg, ...) \
516 	T_ASSERT_BLOCK2(_long, "%li", <, lhs, rhs, msg, ## __VA_ARGS__)
517 #define T_ASSERT_GT_LONG(lhs, rhs, msg, ...) \
518 	T_ASSERT_BLOCK2(_long, "%li", >, lhs, rhs, msg, ## __VA_ARGS__)
519 #define T_ASSERT_LE_LONG(lhs, rhs, msg, ...) \
520 	T_ASSERT_BLOCK2(_long, "%li", <=, lhs, rhs, msg, ## __VA_ARGS__)
521 #define T_ASSERT_GE_LONG(lhs, rhs, msg, ...) \
522 	T_ASSERT_BLOCK2(_long, "%li", >=, lhs, rhs, msg, ## __VA_ARGS__)
523 
524 /* unsigned long */
525 
526 #define T_EXPECT_EQ_ULONG(lhs, rhs, msg, ...) \
527 	T_EXPECT_BLOCK2(_ulong, "%lu", ==, lhs, rhs, msg, ## __VA_ARGS__)
528 #define T_EXPECT_NE_ULONG(lhs, rhs, msg, ...) \
529 	T_EXPECT_BLOCK2(_ulong, "%lu", !=, lhs, rhs, msg, ## __VA_ARGS__)
530 #define T_EXPECT_LT_ULONG(lhs, rhs, msg, ...) \
531 	T_EXPECT_BLOCK2(_ulong, "%lu", <, lhs, rhs, msg, ## __VA_ARGS__)
532 #define T_EXPECT_GT_ULONG(lhs, rhs, msg, ...) \
533 	T_EXPECT_BLOCK2(_ulong, "%lu", >, lhs, rhs, msg, ## __VA_ARGS__)
534 #define T_EXPECT_LE_ULONG(lhs, rhs, msg, ...) \
535 	T_EXPECT_BLOCK2(_ulong, "%lu", <=, lhs, rhs, msg, ## __VA_ARGS__)
536 #define T_EXPECT_GE_ULONG(lhs, rhs, msg, ...) \
537 	T_EXPECT_BLOCK2(_ulong, "%lu", >=, lhs, rhs, msg, ## __VA_ARGS__)
538 
539 #define T_ASSERT_EQ_ULONG(lhs, rhs, msg, ...) \
540 	T_ASSERT_BLOCK2(_ulong, "%lu", ==, lhs, rhs, msg, ## __VA_ARGS__)
541 #define T_ASSERT_NE_ULONG(lhs, rhs, msg, ...) \
542 	T_ASSERT_BLOCK2(_ulong, "%lu", !=, lhs, rhs, msg, ## __VA_ARGS__)
543 #define T_ASSERT_LT_ULONG(lhs, rhs, msg, ...) \
544 	T_ASSERT_BLOCK2(_ulong, "%lu", <, lhs, rhs, msg, ## __VA_ARGS__)
545 #define T_ASSERT_GT_ULONG(lhs, rhs, msg, ...) \
546 	T_ASSERT_BLOCK2(_ulong, "%lu", >, lhs, rhs, msg, ## __VA_ARGS__)
547 #define T_ASSERT_LE_ULONG(lhs, rhs, msg, ...) \
548 	T_ASSERT_BLOCK2(_ulong, "%lu", <=, lhs, rhs, msg, ## __VA_ARGS__)
549 #define T_ASSERT_GE_ULONG(lhs, rhs, msg, ...) \
550 	T_ASSERT_BLOCK2(_ulong, "%lu", >=, lhs, rhs, msg, ## __VA_ARGS__)
551 
552 /* long long */
553 
554 #define T_EXPECT_EQ_LLONG(lhs, rhs, msg, ...) \
555 	T_EXPECT_BLOCK2(_llong, "%lli", ==, lhs, rhs, msg, ## __VA_ARGS__)
556 #define T_EXPECT_NE_LLONG(lhs, rhs, msg, ...) \
557 	T_EXPECT_BLOCK2(_llong, "%lli", !=, lhs, rhs, msg, ## __VA_ARGS__)
558 #define T_EXPECT_LT_LLONG(lhs, rhs, msg, ...) \
559 	T_EXPECT_BLOCK2(_llong, "%lli", <, lhs, rhs, msg, ## __VA_ARGS__)
560 #define T_EXPECT_GT_LLONG(lhs, rhs, msg, ...) \
561 	T_EXPECT_BLOCK2(_llong, "%lli", >, lhs, rhs, msg, ## __VA_ARGS__)
562 #define T_EXPECT_LE_LLONG(lhs, rhs, msg, ...) \
563 	T_EXPECT_BLOCK2(_llong, "%lli", <=, lhs, rhs, msg, ## __VA_ARGS__)
564 #define T_EXPECT_GE_LLONG(lhs, rhs, msg, ...) \
565 	T_EXPECT_BLOCK2(_llong, "%lli", >=, lhs, rhs, msg, ## __VA_ARGS__)
566 
567 #define T_ASSERT_EQ_LLONG(lhs, rhs, msg, ...) \
568 	T_ASSERT_BLOCK2(_llong, "%lli", ==, lhs, rhs, msg, ## __VA_ARGS__)
569 #define T_ASSERT_NE_LLONG(lhs, rhs, msg, ...) \
570 	T_ASSERT_BLOCK2(_llong, "%lli", !=, lhs, rhs, msg, ## __VA_ARGS__)
571 #define T_ASSERT_LT_LLONG(lhs, rhs, msg, ...) \
572 	T_ASSERT_BLOCK2(_llong, "%lli", <, lhs, rhs, msg, ## __VA_ARGS__)
573 #define T_ASSERT_GT_LLONG(lhs, rhs, msg, ...) \
574 	T_ASSERT_BLOCK2(_llong, "%lli", >, lhs, rhs, msg, ## __VA_ARGS__)
575 #define T_ASSERT_LE_LLONG(lhs, rhs, msg, ...) \
576 	T_ASSERT_BLOCK2(_llong, "%lli", <=, lhs, rhs, msg, ## __VA_ARGS__)
577 #define T_ASSERT_GE_LLONG(lhs, rhs, msg, ...) \
578 	T_ASSERT_BLOCK2(_llong, "%lli", >=, lhs, rhs, msg, ## __VA_ARGS__)
579 
580 /* unsigned long long */
581 
582 #define T_EXPECT_EQ_ULLONG(lhs, rhs, msg, ...) \
583 	T_EXPECT_BLOCK2(_ullong, "%llu", ==, lhs, rhs, msg, ## __VA_ARGS__)
584 #define T_EXPECT_NE_ULLONG(lhs, rhs, msg, ...) \
585 	T_EXPECT_BLOCK2(_ullong, "%llu", !=, lhs, rhs, msg, ## __VA_ARGS__)
586 #define T_EXPECT_LT_ULLONG(lhs, rhs, msg, ...) \
587 	T_EXPECT_BLOCK2(_ullong, "%llu", <, lhs, rhs, msg, ## __VA_ARGS__)
588 #define T_EXPECT_GT_ULLONG(lhs, rhs, msg, ...) \
589 	T_EXPECT_BLOCK2(_ullong, "%llu", >, lhs, rhs, msg, ## __VA_ARGS__)
590 #define T_EXPECT_LE_ULLONG(lhs, rhs, msg, ...) \
591 	T_EXPECT_BLOCK2(_ullong, "%llu", <=, lhs, rhs, msg, ## __VA_ARGS__)
592 #define T_EXPECT_GE_ULLONG(lhs, rhs, msg, ...) \
593 	T_EXPECT_BLOCK2(_ullong, "%llu", >=, lhs, rhs, msg, ## __VA_ARGS__)
594 
595 #define T_ASSERT_EQ_ULLONG(lhs, rhs, msg, ...) \
596 	T_ASSERT_BLOCK2(_ullong, "%llu", ==, lhs, rhs, msg, ## __VA_ARGS__)
597 #define T_ASSERT_NE_ULLONG(lhs, rhs, msg, ...) \
598 	T_ASSERT_BLOCK2(_ullong, "%llu", !=, lhs, rhs, msg, ## __VA_ARGS__)
599 #define T_ASSERT_LT_ULLONG(lhs, rhs, msg, ...) \
600 	T_ASSERT_BLOCK2(_ullong, "%llu", <, lhs, rhs, msg, ## __VA_ARGS__)
601 #define T_ASSERT_GT_ULLONG(lhs, rhs, msg, ...) \
602 	T_ASSERT_BLOCK2(_ullong, "%llu", >, lhs, rhs, msg, ## __VA_ARGS__)
603 #define T_ASSERT_LE_ULLONG(lhs, rhs, msg, ...) \
604 	T_ASSERT_BLOCK2(_ullong, "%llu", <=, lhs, rhs, msg, ## __VA_ARGS__)
605 #define T_ASSERT_GE_ULLONG(lhs, rhs, msg, ...) \
606 	T_ASSERT_BLOCK2(_ullong, "%llu", >=, lhs, rhs, msg, ## __VA_ARGS__)
607 
608 /* pointer */
609 
610 #define T_EXPECT_EQ_PTR(lhs, rhs, msg, ...) \
611 	T_EXPECT_BLOCK2(_ptr, "%p", ==, lhs, rhs, msg, ## __VA_ARGS__)
612 #define T_EXPECT_NE_PTR(lhs, rhs, msg, ...) \
613 	T_EXPECT_BLOCK2(_ptr, "%p", !=, lhs, rhs, msg, ## __VA_ARGS__)
614 #define T_EXPECT_LT_PTR(lhs, rhs, msg, ...) \
615 	T_EXPECT_BLOCK2(_ptr, "%p", <, lhs, rhs, msg, ## __VA_ARGS__)
616 #define T_EXPECT_GT_PTR(lhs, rhs, msg, ...) \
617 	T_EXPECT_BLOCK2(_ptr, "%p", >, lhs, rhs, msg, ## __VA_ARGS__)
618 #define T_EXPECT_LE_PTR(lhs, rhs, msg, ...) \
619 	T_EXPECT_BLOCK2(_ptr, "%p", <=, lhs, rhs, msg, ## __VA_ARGS__)
620 #define T_EXPECT_GE_PTR(lhs, rhs, msg, ...) \
621 	T_EXPECT_BLOCK2(_ptr, "%p", >=, lhs, rhs, msg, ## __VA_ARGS__)
622 
623 #define T_ASSERT_EQ_PTR(lhs, rhs, msg, ...) \
624 	T_ASSERT_BLOCK2(_ptr, "%p", ==, lhs, rhs, msg, ## __VA_ARGS__)
625 #define T_ASSERT_NE_PTR(lhs, rhs, msg, ...) \
626 	T_ASSERT_BLOCK2(_ptr, "%p", !=, lhs, rhs, msg, ## __VA_ARGS__)
627 #define T_ASSERT_LT_PTR(lhs, rhs, msg, ...) \
628 	T_ASSERT_BLOCK2(_ptr, "%p", <, lhs, rhs, msg, ## __VA_ARGS__)
629 #define T_ASSERT_GT_PTR(lhs, rhs, msg, ...) \
630 	T_ASSERT_BLOCK2(_ptr, "%p", >, lhs, rhs, msg, ## __VA_ARGS__)
631 #define T_ASSERT_LE_PTR(lhs, rhs, msg, ...) \
632 	T_ASSERT_BLOCK2(_ptr, "%p", <=, lhs, rhs, msg, ## __VA_ARGS__)
633 #define T_ASSERT_GE_PTR(lhs, rhs, msg, ...) \
634 	T_ASSERT_BLOCK2(_ptr, "%p", >=, lhs, rhs, msg, ## __VA_ARGS__)
635 
636 /*
637  * Log a perfdata measurement. For example:
638  * T_PERF("name_of_metric", 3234, "nsec", "time since first test run")
639  */
640 #define T_PERF(metric, value, unit, desc) \
641 	do {                                              \
642 	        T_SAVEINFO;                               \
643 	        T_SYM(perf)(metric, unit, value, desc);   \
644 	} while (0)
645 
646 #endif /* _TESTS_KTEST_H */
647