xref: /aosp_15_r20/external/ltp/include/tst_test_macros.h (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) 2015-2024 Cyril Hrubis <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) Linux Test Project, 2021-2022
5*49cdfc7eSAndroid Build Coastguard Worker  */
6*49cdfc7eSAndroid Build Coastguard Worker 
7*49cdfc7eSAndroid Build Coastguard Worker #ifndef TST_TEST_MACROS_H__
8*49cdfc7eSAndroid Build Coastguard Worker #define TST_TEST_MACROS_H__
9*49cdfc7eSAndroid Build Coastguard Worker 
10*49cdfc7eSAndroid Build Coastguard Worker #include <stdbool.h>
11*49cdfc7eSAndroid Build Coastguard Worker 
12*49cdfc7eSAndroid Build Coastguard Worker #define TEST(SCALL) \
13*49cdfc7eSAndroid Build Coastguard Worker 	do { \
14*49cdfc7eSAndroid Build Coastguard Worker 		errno = 0; \
15*49cdfc7eSAndroid Build Coastguard Worker 		TST_RET = SCALL; \
16*49cdfc7eSAndroid Build Coastguard Worker 		TST_ERR = errno; \
17*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
18*49cdfc7eSAndroid Build Coastguard Worker 
19*49cdfc7eSAndroid Build Coastguard Worker #define TEST_VOID(SCALL) \
20*49cdfc7eSAndroid Build Coastguard Worker 	do { \
21*49cdfc7eSAndroid Build Coastguard Worker 		errno = 0; \
22*49cdfc7eSAndroid Build Coastguard Worker 		SCALL; \
23*49cdfc7eSAndroid Build Coastguard Worker 		TST_ERR = errno; \
24*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
25*49cdfc7eSAndroid Build Coastguard Worker 
26*49cdfc7eSAndroid Build Coastguard Worker extern long TST_RET;
27*49cdfc7eSAndroid Build Coastguard Worker extern int TST_ERR;
28*49cdfc7eSAndroid Build Coastguard Worker extern int TST_PASS;
29*49cdfc7eSAndroid Build Coastguard Worker 
30*49cdfc7eSAndroid Build Coastguard Worker extern void *TST_RET_PTR;
31*49cdfc7eSAndroid Build Coastguard Worker 
32*49cdfc7eSAndroid Build Coastguard Worker #define TESTPTR(SCALL) \
33*49cdfc7eSAndroid Build Coastguard Worker 	do { \
34*49cdfc7eSAndroid Build Coastguard Worker 		errno = 0; \
35*49cdfc7eSAndroid Build Coastguard Worker 		TST_RET_PTR = (void*)SCALL; \
36*49cdfc7eSAndroid Build Coastguard Worker 		TST_ERR = errno; \
37*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
38*49cdfc7eSAndroid Build Coastguard Worker 
39*49cdfc7eSAndroid Build Coastguard Worker 
40*49cdfc7eSAndroid Build Coastguard Worker #define TST_2_(_1, _2, ...) _2
41*49cdfc7eSAndroid Build Coastguard Worker 
42*49cdfc7eSAndroid Build Coastguard Worker #define TST_FMT_(FMT, _1, ...) FMT, ##__VA_ARGS__
43*49cdfc7eSAndroid Build Coastguard Worker 
44*49cdfc7eSAndroid Build Coastguard Worker #define TST_MSG_(RES, FMT, SCALL, ...) \
45*49cdfc7eSAndroid Build Coastguard Worker 	tst_res_(__FILE__, __LINE__, RES, \
46*49cdfc7eSAndroid Build Coastguard Worker 		TST_FMT_(TST_2_(dummy, ##__VA_ARGS__, SCALL) FMT, __VA_ARGS__))
47*49cdfc7eSAndroid Build Coastguard Worker 
48*49cdfc7eSAndroid Build Coastguard Worker #define TST_MSGP_(RES, FMT, PAR, SCALL, ...) \
49*49cdfc7eSAndroid Build Coastguard Worker 	tst_res_(__FILE__, __LINE__, RES, \
50*49cdfc7eSAndroid Build Coastguard Worker 		TST_FMT_(TST_2_(dummy, ##__VA_ARGS__, SCALL) FMT, __VA_ARGS__), PAR)
51*49cdfc7eSAndroid Build Coastguard Worker 
52*49cdfc7eSAndroid Build Coastguard Worker #define TST_MSGP2_(RES, FMT, PAR, PAR2, SCALL, ...) \
53*49cdfc7eSAndroid Build Coastguard Worker 	tst_res_(__FILE__, __LINE__, RES, \
54*49cdfc7eSAndroid Build Coastguard Worker 		TST_FMT_(TST_2_(dummy, ##__VA_ARGS__, SCALL) FMT, __VA_ARGS__), PAR, PAR2)
55*49cdfc7eSAndroid Build Coastguard Worker 
56*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_POSITIVE__(SCALL, SSCALL, ...)                                 \
57*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
58*49cdfc7eSAndroid Build Coastguard Worker 		TEST(SCALL);                                                   \
59*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
60*49cdfc7eSAndroid Build Coastguard Worker 		TST_PASS = 0;                                                  \
61*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
62*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_RET == -1) {                                           \
63*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSG_(TFAIL | TTERRNO, " failed",                   \
64*49cdfc7eSAndroid Build Coastguard Worker 			         SSCALL, ##__VA_ARGS__);                       \
65*49cdfc7eSAndroid Build Coastguard Worker 			break;                                                 \
66*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
67*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
68*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_RET < 0) {                                             \
69*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSGP_(TFAIL | TTERRNO, " invalid retval %ld",      \
70*49cdfc7eSAndroid Build Coastguard Worker 			          TST_RET, SSCALL, ##__VA_ARGS__);             \
71*49cdfc7eSAndroid Build Coastguard Worker 			break;                                                 \
72*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
73*49cdfc7eSAndroid Build Coastguard Worker                                                                                \
74*49cdfc7eSAndroid Build Coastguard Worker 		TST_PASS = 1;                                                  \
75*49cdfc7eSAndroid Build Coastguard Worker                                                                                \
76*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
77*49cdfc7eSAndroid Build Coastguard Worker 
78*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_POSITIVE_(SCALL, SSCALL, ...)                                  \
79*49cdfc7eSAndroid Build Coastguard Worker 	({                                                                     \
80*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_POSITIVE__(SCALL, SSCALL, ##__VA_ARGS__);              \
81*49cdfc7eSAndroid Build Coastguard Worker 		TST_RET;                                                       \
82*49cdfc7eSAndroid Build Coastguard Worker 	})
83*49cdfc7eSAndroid Build Coastguard Worker 
84*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_POSITIVE(SCALL, ...)                                           \
85*49cdfc7eSAndroid Build Coastguard Worker 	({                                                                     \
86*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_POSITIVE__(SCALL, #SCALL, ##__VA_ARGS__);              \
87*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
88*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_PASS) {                                                \
89*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSGP_(TPASS, " returned %ld",                      \
90*49cdfc7eSAndroid Build Coastguard Worker 			          TST_RET, #SCALL, ##__VA_ARGS__);             \
91*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
92*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
93*49cdfc7eSAndroid Build Coastguard Worker 		TST_RET;                                                       \
94*49cdfc7eSAndroid Build Coastguard Worker 	})
95*49cdfc7eSAndroid Build Coastguard Worker 
96*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FD_SILENT(SCALL, ...)	TST_EXP_POSITIVE_(SCALL, #SCALL, ##__VA_ARGS__)
97*49cdfc7eSAndroid Build Coastguard Worker 
98*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FD(SCALL, ...)                                                 \
99*49cdfc7eSAndroid Build Coastguard Worker 	({                                                                     \
100*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_POSITIVE__(SCALL, #SCALL, ##__VA_ARGS__);              \
101*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
102*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_PASS)                                                  \
103*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSGP_(TPASS, " returned fd %ld", TST_RET,          \
104*49cdfc7eSAndroid Build Coastguard Worker 				#SCALL, ##__VA_ARGS__);                        \
105*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
106*49cdfc7eSAndroid Build Coastguard Worker 		TST_RET;                                                       \
107*49cdfc7eSAndroid Build Coastguard Worker 	})
108*49cdfc7eSAndroid Build Coastguard Worker 
109*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FD_OR_FAIL(SCALL, ERRNO, ...)                                  \
110*49cdfc7eSAndroid Build Coastguard Worker 	({                                                                     \
111*49cdfc7eSAndroid Build Coastguard Worker 		if (ERRNO)                                                     \
112*49cdfc7eSAndroid Build Coastguard Worker 			TST_EXP_FAIL(SCALL, ERRNO, ##__VA_ARGS__);             \
113*49cdfc7eSAndroid Build Coastguard Worker 		else                                                           \
114*49cdfc7eSAndroid Build Coastguard Worker 			TST_EXP_FD(SCALL, ##__VA_ARGS__);                      \
115*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
116*49cdfc7eSAndroid Build Coastguard Worker 		TST_RET;                                                       \
117*49cdfc7eSAndroid Build Coastguard Worker 	})
118*49cdfc7eSAndroid Build Coastguard Worker 
119*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_PID_SILENT(SCALL, ...)	TST_EXP_POSITIVE_(SCALL, #SCALL, ##__VA_ARGS__)
120*49cdfc7eSAndroid Build Coastguard Worker 
121*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_PID(SCALL, ...)                                                \
122*49cdfc7eSAndroid Build Coastguard Worker 	({                                                                     \
123*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_POSITIVE__(SCALL, #SCALL, ##__VA_ARGS__);              \
124*49cdfc7eSAndroid Build Coastguard Worker 									       \
125*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_PASS)                                                  \
126*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSGP_(TPASS, " returned pid %ld", TST_RET,         \
127*49cdfc7eSAndroid Build Coastguard Worker 				#SCALL, ##__VA_ARGS__);                        \
128*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
129*49cdfc7eSAndroid Build Coastguard Worker 		TST_RET;                                                       \
130*49cdfc7eSAndroid Build Coastguard Worker 	})
131*49cdfc7eSAndroid Build Coastguard Worker 
132*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_VAL_SILENT_(SCALL, VAL, SSCALL, ...)                           \
133*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
134*49cdfc7eSAndroid Build Coastguard Worker 		TEST(SCALL);                                                   \
135*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
136*49cdfc7eSAndroid Build Coastguard Worker 		TST_PASS = 0;                                                  \
137*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
138*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_RET != VAL) {                                          \
139*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSGP2_(TFAIL | TTERRNO, " retval %ld != %ld",      \
140*49cdfc7eSAndroid Build Coastguard Worker 			          TST_RET, (long)VAL, SSCALL, ##__VA_ARGS__);  \
141*49cdfc7eSAndroid Build Coastguard Worker 			break;                                                 \
142*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
143*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
144*49cdfc7eSAndroid Build Coastguard Worker 		TST_PASS = 1;                                                  \
145*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
146*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
147*49cdfc7eSAndroid Build Coastguard Worker 
148*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_VAL_SILENT(SCALL, VAL, ...) TST_EXP_VAL_SILENT_(SCALL, VAL, #SCALL, ##__VA_ARGS__)
149*49cdfc7eSAndroid Build Coastguard Worker 
150*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_VAL(SCALL, VAL, ...)                                           \
151*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
152*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_VAL_SILENT_(SCALL, VAL, #SCALL, ##__VA_ARGS__);        \
153*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
154*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_PASS)                                                  \
155*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSG_(TPASS, " passed", #SCALL, ##__VA_ARGS__);     \
156*49cdfc7eSAndroid Build Coastguard Worker 			                                                       \
157*49cdfc7eSAndroid Build Coastguard Worker 	} while(0)
158*49cdfc7eSAndroid Build Coastguard Worker 
159*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_PASS_SILENT_(SCALL, SSCALL, ...)                               \
160*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
161*49cdfc7eSAndroid Build Coastguard Worker 		TEST(SCALL);                                                   \
162*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
163*49cdfc7eSAndroid Build Coastguard Worker 		TST_PASS = 0;                                                  \
164*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
165*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_RET == -1) {                                           \
166*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSG_(TFAIL | TTERRNO, " failed",                   \
167*49cdfc7eSAndroid Build Coastguard Worker 			         SSCALL, ##__VA_ARGS__);                       \
168*49cdfc7eSAndroid Build Coastguard Worker 		        break;                                                 \
169*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
170*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
171*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_RET != 0) {                                            \
172*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSGP_(TFAIL | TTERRNO, " invalid retval %ld",      \
173*49cdfc7eSAndroid Build Coastguard Worker 			          TST_RET, SSCALL, ##__VA_ARGS__);             \
174*49cdfc7eSAndroid Build Coastguard Worker 			break;                                                 \
175*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
176*49cdfc7eSAndroid Build Coastguard Worker                                                                                \
177*49cdfc7eSAndroid Build Coastguard Worker 		TST_PASS = 1;                                                  \
178*49cdfc7eSAndroid Build Coastguard Worker                                                                                \
179*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
180*49cdfc7eSAndroid Build Coastguard Worker 
181*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_PASS_SILENT(SCALL, ...) TST_EXP_PASS_SILENT_(SCALL, #SCALL, ##__VA_ARGS__)
182*49cdfc7eSAndroid Build Coastguard Worker 
183*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_PASS(SCALL, ...)                                               \
184*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
185*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_PASS_SILENT_(SCALL, #SCALL, ##__VA_ARGS__);            \
186*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
187*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_PASS)                                                  \
188*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSG_(TPASS, " passed", #SCALL, ##__VA_ARGS__);     \
189*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)                                                            \
190*49cdfc7eSAndroid Build Coastguard Worker 
191*49cdfc7eSAndroid Build Coastguard Worker /*
192*49cdfc7eSAndroid Build Coastguard Worker  * Returns true if err is in the exp_err array.
193*49cdfc7eSAndroid Build Coastguard Worker  */
194*49cdfc7eSAndroid Build Coastguard Worker bool tst_errno_in_set(int err, const int *exp_errs, int exp_errs_cnt);
195*49cdfc7eSAndroid Build Coastguard Worker 
196*49cdfc7eSAndroid Build Coastguard Worker /*
197*49cdfc7eSAndroid Build Coastguard Worker  * Fills in the buf with the errno names in the exp_err set. The buf must be at
198*49cdfc7eSAndroid Build Coastguard Worker  * least 20 * exp_errs_cnt bytes long.
199*49cdfc7eSAndroid Build Coastguard Worker  */
200*49cdfc7eSAndroid Build Coastguard Worker const char *tst_errno_names(char *buf, const int *exp_errs, int exp_errs_cnt);
201*49cdfc7eSAndroid Build Coastguard Worker 
202*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_SILENT_(PASS_COND, SCALL, SSCALL, ERRNOS, ERRNOS_CNT, ...)\
203*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
204*49cdfc7eSAndroid Build Coastguard Worker 		TEST(SCALL);                                                   \
205*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
206*49cdfc7eSAndroid Build Coastguard Worker 		TST_PASS = 0;                                                  \
207*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
208*49cdfc7eSAndroid Build Coastguard Worker 		if (PASS_COND) {                                               \
209*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSG_(TFAIL, " succeeded", SSCALL, ##__VA_ARGS__);  \
210*49cdfc7eSAndroid Build Coastguard Worker 		        break;                                                 \
211*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
212*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
213*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_RET != -1) {                                           \
214*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSGP_(TFAIL | TTERRNO, " invalid retval %ld",      \
215*49cdfc7eSAndroid Build Coastguard Worker 			          TST_RET, SSCALL, ##__VA_ARGS__);             \
216*49cdfc7eSAndroid Build Coastguard Worker 			break;                                                 \
217*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
218*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
219*49cdfc7eSAndroid Build Coastguard Worker 		if (tst_errno_in_set(TST_ERR, ERRNOS, ERRNOS_CNT)) {           \
220*49cdfc7eSAndroid Build Coastguard Worker 			TST_PASS = 1;                                          \
221*49cdfc7eSAndroid Build Coastguard Worker 		} else {                                                       \
222*49cdfc7eSAndroid Build Coastguard Worker 			char tst_str_buf__[ERRNOS_CNT * 20];                   \
223*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSGP_(TFAIL | TTERRNO, " expected %s",             \
224*49cdfc7eSAndroid Build Coastguard Worker 				  tst_errno_names(tst_str_buf__,               \
225*49cdfc7eSAndroid Build Coastguard Worker 						  ERRNOS, ERRNOS_CNT),         \
226*49cdfc7eSAndroid Build Coastguard Worker 				  SSCALL, ##__VA_ARGS__);                      \
227*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
228*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
229*49cdfc7eSAndroid Build Coastguard Worker 
230*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_SILENT_PTR_(SCALL, SSCALL, FAIL_PTR_VAL,                  \
231*49cdfc7eSAndroid Build Coastguard Worker 	ERRNOS, ERRNOS_CNT, ...)                                               \
232*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
233*49cdfc7eSAndroid Build Coastguard Worker 		TESTPTR(SCALL);                                                \
234*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
235*49cdfc7eSAndroid Build Coastguard Worker 		TST_PASS = 0;                                                  \
236*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
237*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_RET_PTR != FAIL_PTR_VAL) {                             \
238*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSG_(TFAIL, " succeeded", SSCALL, ##__VA_ARGS__);  \
239*49cdfc7eSAndroid Build Coastguard Worker 		        break;                                                 \
240*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
241*49cdfc7eSAndroid Build Coastguard Worker 		                                                               \
242*49cdfc7eSAndroid Build Coastguard Worker 		if (!tst_errno_in_set(TST_ERR, ERRNOS, ERRNOS_CNT)) {          \
243*49cdfc7eSAndroid Build Coastguard Worker 			char tst_str_buf__[ERRNOS_CNT * 20];                   \
244*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSGP_(TFAIL | TTERRNO, " expected %s",             \
245*49cdfc7eSAndroid Build Coastguard Worker 				  tst_errno_names(tst_str_buf__,               \
246*49cdfc7eSAndroid Build Coastguard Worker 						  ERRNOS, ERRNOS_CNT),         \
247*49cdfc7eSAndroid Build Coastguard Worker 				  SSCALL, ##__VA_ARGS__);                      \
248*49cdfc7eSAndroid Build Coastguard Worker 			break;                                                 \
249*49cdfc7eSAndroid Build Coastguard Worker 		}                                                              \
250*49cdfc7eSAndroid Build Coastguard Worker                                                                                \
251*49cdfc7eSAndroid Build Coastguard Worker 		TST_PASS = 1;                                                  \
252*49cdfc7eSAndroid Build Coastguard Worker                                                                                \
253*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
254*49cdfc7eSAndroid Build Coastguard Worker 
255*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_PTR_(SCALL, SSCALL, FAIL_PTR_VAL,                         \
256*49cdfc7eSAndroid Build Coastguard Worker 	ERRNOS, ERRNOS_CNT, ...)                                               \
257*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
258*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_SILENT_PTR_(SCALL, SSCALL, FAIL_PTR_VAL,          \
259*49cdfc7eSAndroid Build Coastguard Worker 	        ERRNOS, ERRNOS_CNT, ##__VA_ARGS__);                            \
260*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_PASS)                                                  \
261*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSG_(TPASS | TTERRNO, " ", SSCALL, ##__VA_ARGS__); \
262*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
263*49cdfc7eSAndroid Build Coastguard Worker 
264*49cdfc7eSAndroid Build Coastguard Worker 
265*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_ARR_(SCALL, SSCALL, EXP_ERRS, EXP_ERRS_CNT, ...)          \
266*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
267*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_SILENT_(TST_RET == 0, SCALL, SSCALL,              \
268*49cdfc7eSAndroid Build Coastguard Worker 			EXP_ERRS, EXP_ERRS_CNT, ##__VA_ARGS__);                \
269*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_PASS)                                                  \
270*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSG_(TPASS | TTERRNO, " ", SSCALL, ##__VA_ARGS__); \
271*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
272*49cdfc7eSAndroid Build Coastguard Worker 
273*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL(SCALL, EXP_ERR, ...)                                      \
274*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
275*49cdfc7eSAndroid Build Coastguard Worker 		int tst_exp_err__ = EXP_ERR;                                   \
276*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_ARR_(SCALL, #SCALL, &tst_exp_err__, 1,            \
277*49cdfc7eSAndroid Build Coastguard Worker                                   ##__VA_ARGS__);                              \
278*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
279*49cdfc7eSAndroid Build Coastguard Worker 
280*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_ARR(SCALL, EXP_ERRS, EXP_ERRS_CNT, ...)                   \
281*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_ARR_(SCALL, #SCALL, EXP_ERRS,                     \
282*49cdfc7eSAndroid Build Coastguard Worker 				  EXP_ERRS_CNT, ##__VA_ARGS__);
283*49cdfc7eSAndroid Build Coastguard Worker 
284*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL2_ARR_(SCALL, SSCALL, EXP_ERRS, EXP_ERRS_CNT, ...)         \
285*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
286*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_SILENT_(TST_RET >= 0, SCALL, SSCALL,              \
287*49cdfc7eSAndroid Build Coastguard Worker 			EXP_ERRS, EXP_ERRS_CNT, ##__VA_ARGS__);                \
288*49cdfc7eSAndroid Build Coastguard Worker 		if (TST_PASS)                                                  \
289*49cdfc7eSAndroid Build Coastguard Worker 			TST_MSG_(TPASS | TTERRNO, " ", SSCALL, ##__VA_ARGS__); \
290*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
291*49cdfc7eSAndroid Build Coastguard Worker 
292*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL2_ARR(SCALL, EXP_ERRS, EXP_ERRS_CNT, ...)                \
293*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL2_ARR_(SCALL, #SCALL, EXP_ERRS,                    \
294*49cdfc7eSAndroid Build Coastguard Worker 		                  EXP_ERRS_CNT, ##__VA_ARGS__);
295*49cdfc7eSAndroid Build Coastguard Worker 
296*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_PTR_NULL(SCALL, EXP_ERR, ...)                          \
297*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
298*49cdfc7eSAndroid Build Coastguard Worker 		int tst_exp_err__ = EXP_ERR;                                   \
299*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_PTR_(SCALL, #SCALL, NULL,                         \
300*49cdfc7eSAndroid Build Coastguard Worker 			&tst_exp_err__, 1, ##__VA_ARGS__);                     \
301*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
302*49cdfc7eSAndroid Build Coastguard Worker 
303*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_PTR_NULL_ARR(SCALL, EXP_ERRS, EXP_ERRS_CNT, ...)      \
304*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
305*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_PTR_(SCALL, #SCALL, NULL,                         \
306*49cdfc7eSAndroid Build Coastguard Worker 			EXP_ERRS, EXP_ERRS_CNT, ##__VA_ARGS__);        \
307*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
308*49cdfc7eSAndroid Build Coastguard Worker 
309*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_PTR_VOID(SCALL, EXP_ERR, ...)                         \
310*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
311*49cdfc7eSAndroid Build Coastguard Worker 		int tst_exp_err__ = EXP_ERR;                                   \
312*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_PTR_(SCALL, #SCALL, (void *)-1,                   \
313*49cdfc7eSAndroid Build Coastguard Worker 			&tst_exp_err__, 1, ##__VA_ARGS__);                     \
314*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
315*49cdfc7eSAndroid Build Coastguard Worker 
316*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_PTR_VOID_ARR(SCALL, EXP_ERRS, EXP_ERRS_CNT, ...)      \
317*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
318*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_PTR_(SCALL, #SCALL, (void *)-1,                   \
319*49cdfc7eSAndroid Build Coastguard Worker 			EXP_ERRS, EXP_ERRS_CNT, ##__VA_ARGS__);        \
320*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
321*49cdfc7eSAndroid Build Coastguard Worker 
322*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL2(SCALL, EXP_ERR, ...)                                     \
323*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
324*49cdfc7eSAndroid Build Coastguard Worker 		int tst_exp_err__ = EXP_ERR;                                   \
325*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL2_ARR_(SCALL, #SCALL, &tst_exp_err__, 1,           \
326*49cdfc7eSAndroid Build Coastguard Worker                                   ##__VA_ARGS__);                              \
327*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
328*49cdfc7eSAndroid Build Coastguard Worker 
329*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL_SILENT(SCALL, EXP_ERR, ...)                               \
330*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
331*49cdfc7eSAndroid Build Coastguard Worker 		int tst_exp_err__ = EXP_ERR;                                   \
332*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_SILENT_(TST_RET == 0, SCALL, #SCALL,              \
333*49cdfc7eSAndroid Build Coastguard Worker 			&tst_exp_err__, 1, ##__VA_ARGS__);                     \
334*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
335*49cdfc7eSAndroid Build Coastguard Worker 
336*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_FAIL2_SILENT(SCALL, EXP_ERR, ...)                              \
337*49cdfc7eSAndroid Build Coastguard Worker 	do {                                                                   \
338*49cdfc7eSAndroid Build Coastguard Worker 		int tst_exp_err__ = EXP_ERR;                                   \
339*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_FAIL_SILENT_(TST_RET >= 0, SCALL, #SCALL,              \
340*49cdfc7eSAndroid Build Coastguard Worker 			&tst_exp_err__, 1, ##__VA_ARGS__);                     \
341*49cdfc7eSAndroid Build Coastguard Worker 	} while (0)
342*49cdfc7eSAndroid Build Coastguard Worker 
343*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_EXPR(EXPR, FMT, ...)						\
344*49cdfc7eSAndroid Build Coastguard Worker 	tst_res_(__FILE__, __LINE__, (EXPR) ? TPASS : TFAIL, "Expect: " FMT, ##__VA_ARGS__);
345*49cdfc7eSAndroid Build Coastguard Worker 
346*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_EQ_(VAL_A, SVAL_A, VAL_B, SVAL_B, TYPE, PFS) do {\
347*49cdfc7eSAndroid Build Coastguard Worker 	TYPE tst_tmp_a__ = VAL_A; \
348*49cdfc7eSAndroid Build Coastguard Worker 	TYPE tst_tmp_b__ = VAL_B; \
349*49cdfc7eSAndroid Build Coastguard Worker 	if (tst_tmp_a__ == tst_tmp_b__) { \
350*49cdfc7eSAndroid Build Coastguard Worker 		tst_res_(__FILE__, __LINE__, TPASS, \
351*49cdfc7eSAndroid Build Coastguard Worker 			SVAL_A " == " SVAL_B " (" PFS ")", tst_tmp_a__); \
352*49cdfc7eSAndroid Build Coastguard Worker 	} else { \
353*49cdfc7eSAndroid Build Coastguard Worker 		tst_res_(__FILE__, __LINE__, TFAIL, \
354*49cdfc7eSAndroid Build Coastguard Worker 			SVAL_A " (" PFS ") != " SVAL_B " (" PFS ")", \
355*49cdfc7eSAndroid Build Coastguard Worker 			tst_tmp_a__, tst_tmp_b__); \
356*49cdfc7eSAndroid Build Coastguard Worker 	} \
357*49cdfc7eSAndroid Build Coastguard Worker } while (0)
358*49cdfc7eSAndroid Build Coastguard Worker 
359*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_EQ_LI(VAL_A, VAL_B) \
360*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_EQ_(VAL_A, #VAL_A, VAL_B, #VAL_B, long long, "%lli")
361*49cdfc7eSAndroid Build Coastguard Worker 
362*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_EQ_LU(VAL_A, VAL_B) \
363*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_EQ_(VAL_A, #VAL_A, VAL_B, #VAL_B, unsigned long long, "%llu")
364*49cdfc7eSAndroid Build Coastguard Worker 
365*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_EQ_SZ(VAL_A, VAL_B) \
366*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_EQ_(VAL_A, #VAL_A, VAL_B, #VAL_B, size_t, "%zu")
367*49cdfc7eSAndroid Build Coastguard Worker 
368*49cdfc7eSAndroid Build Coastguard Worker #define TST_EXP_EQ_SSZ(VAL_A, VAL_B) \
369*49cdfc7eSAndroid Build Coastguard Worker 		TST_EXP_EQ_(VAL_A, #VAL_A, VAL_B, #VAL_B, ssize_t, "%zi")
370*49cdfc7eSAndroid Build Coastguard Worker 
371*49cdfc7eSAndroid Build Coastguard Worker #endif	/* TST_TEST_MACROS_H__ */
372