• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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