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