1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright (c) 2015-2020 Cyril Hrubis <chrubis@suse.cz> 4 */ 5 6 #ifndef TST_TEST_MACROS_H__ 7 #define TST_TEST_MACROS_H__ 8 9 #define TEST(SCALL) \ 10 do { \ 11 errno = 0; \ 12 TST_RET = SCALL; \ 13 TST_ERR = errno; \ 14 } while (0) 15 16 #define TEST_VOID(SCALL) \ 17 do { \ 18 errno = 0; \ 19 SCALL; \ 20 TST_ERR = errno; \ 21 } while (0) 22 23 extern long TST_RET; 24 extern int TST_ERR; 25 extern int TST_PASS; 26 27 extern void *TST_RET_PTR; 28 29 #define TESTPTR(SCALL) \ 30 do { \ 31 errno = 0; \ 32 TST_RET_PTR = (void*)SCALL; \ 33 TST_ERR = errno; \ 34 } while (0) 35 36 37 #define TST_2_(_1, _2, ...) _2 38 39 #define TST_FMT_(FMT, _1, ...) FMT, ##__VA_ARGS__ 40 41 #define TST_MSG_(RES, FMT, SCALL, ...) \ 42 tst_res_(__FILE__, __LINE__, RES, \ 43 TST_FMT_(TST_2_(dummy, ##__VA_ARGS__, SCALL) FMT, __VA_ARGS__)) 44 45 #define TST_MSGP_(RES, FMT, PAR, SCALL, ...) \ 46 tst_res_(__FILE__, __LINE__, RES, \ 47 TST_FMT_(TST_2_(dummy, ##__VA_ARGS__, SCALL) FMT, __VA_ARGS__), PAR) 48 49 #define TST_EXP_POSITIVE(SCALL, ...) \ 50 do { \ 51 TEST(SCALL); \ 52 \ 53 TST_PASS = 0; \ 54 \ 55 if (TST_RET == -1) { \ 56 TST_MSG_(TFAIL | TTERRNO, " failed", \ 57 #SCALL, ##__VA_ARGS__); \ 58 break; \ 59 } \ 60 \ 61 if (TST_RET < 0) { \ 62 TST_MSGP_(TFAIL | TTERRNO, " invalid retval %ld", \ 63 TST_RET, #SCALL, ##__VA_ARGS__); \ 64 break; \ 65 } \ 66 \ 67 TST_PASS = 1; \ 68 \ 69 } while (0) 70 71 #define TST_EXP_FD_SILENT(SCALL, ...) TST_EXP_POSITIVE(SCALL, __VA_ARGS__) 72 73 #define TST_EXP_FD(SCALL, ...) \ 74 do { \ 75 TST_EXP_FD_SILENT(SCALL, __VA_ARGS__); \ 76 \ 77 if (TST_PASS) \ 78 TST_MSGP_(TPASS, " returned fd %ld", TST_RET, \ 79 #SCALL, ##__VA_ARGS__); \ 80 } while (0) 81 82 #define TST_EXP_PID_SILENT(SCALL, ...) TST_EXP_POSITIVE(SCALL, __VA_ARGS__) 83 84 #define TST_EXP_PID(SCALL, ...) \ 85 do { \ 86 TST_EXP_PID_SILENT(SCALL, __VA_ARGS__); \ 87 \ 88 if (TST_PASS) \ 89 TST_MSGP_(TPASS, " returned pid %ld", TST_RET, \ 90 #SCALL, ##__VA_ARGS__); \ 91 } while (0) 92 93 #define TST_EXP_PASS_SILENT(SCALL, ...) \ 94 do { \ 95 TEST(SCALL); \ 96 \ 97 TST_PASS = 0; \ 98 \ 99 if (TST_RET == -1) { \ 100 TST_MSG_(TFAIL | TTERRNO, " failed", \ 101 #SCALL, ##__VA_ARGS__); \ 102 break; \ 103 } \ 104 \ 105 if (TST_RET != 0) { \ 106 TST_MSGP_(TFAIL | TTERRNO, " invalid retval %ld", \ 107 TST_RET, #SCALL, ##__VA_ARGS__); \ 108 break; \ 109 } \ 110 \ 111 TST_PASS = 1; \ 112 \ 113 } while (0) 114 115 #define TST_EXP_PASS(SCALL, ...) \ 116 do { \ 117 TST_EXP_PASS_SILENT(SCALL, __VA_ARGS__); \ 118 \ 119 if (TST_PASS) \ 120 TST_MSG_(TPASS, " passed", #SCALL, ##__VA_ARGS__); \ 121 } while (0) \ 122 123 #define TST_EXP_FAIL(SCALL, ERRNO, ...) \ 124 do { \ 125 TEST(SCALL); \ 126 \ 127 TST_PASS = 0; \ 128 \ 129 if (TST_RET == 0) { \ 130 TST_MSG_(TFAIL, " succeeded", #SCALL, ##__VA_ARGS__); \ 131 break; \ 132 } \ 133 \ 134 if (TST_RET != -1) { \ 135 TST_MSGP_(TFAIL | TTERRNO, " invalid retval %ld", \ 136 TST_RET, #SCALL, ##__VA_ARGS__); \ 137 break; \ 138 } \ 139 \ 140 if (ERRNO) { \ 141 if (TST_ERR == ERRNO) { \ 142 TST_MSG_(TPASS | TTERRNO, "", \ 143 #SCALL, ##__VA_ARGS__); \ 144 TST_PASS = 1; \ 145 } else { \ 146 TST_MSGP_(TFAIL | TTERRNO, " expected %s", \ 147 tst_strerrno(ERRNO), \ 148 #SCALL, ##__VA_ARGS__); \ 149 } \ 150 } \ 151 } while (0) 152 153 #endif /* TST_TEST_MACROS_H__ */ 154