xref: /openbmc/linux/tools/testing/selftests/nolibc/nolibc-test.c (revision 362aecb2d8cfad0268d6c0ae5f448e9b6eee7ffb)
1*362aecb2SWilly Tarreau // SPDX-License-Identifier: GPL-2.0
2*362aecb2SWilly Tarreau 
3*362aecb2SWilly Tarreau /* platform-specific include files coming from the compiler */
4*362aecb2SWilly Tarreau #include <limits.h>
5*362aecb2SWilly Tarreau 
6*362aecb2SWilly Tarreau /* libc-specific include files
7*362aecb2SWilly Tarreau  * The program may be built in 2 ways:
8*362aecb2SWilly Tarreau  *   $(CC) -nostdlib -include /path/to/nolibc.h => NOLIBC already defined
9*362aecb2SWilly Tarreau  *   $(CC) -nostdlib -I/path/to/nolibc/sysroot
10*362aecb2SWilly Tarreau  */
11*362aecb2SWilly Tarreau #ifndef NOLIBC
12*362aecb2SWilly Tarreau #include <stdio.h>
13*362aecb2SWilly Tarreau #include <stdlib.h>
14*362aecb2SWilly Tarreau #include <string.h>
15*362aecb2SWilly Tarreau #endif
16*362aecb2SWilly Tarreau 
17*362aecb2SWilly Tarreau /* will be used by nolibc by getenv() */
18*362aecb2SWilly Tarreau char **environ;
19*362aecb2SWilly Tarreau 
20*362aecb2SWilly Tarreau #define CASE_ERR(err) \
21*362aecb2SWilly Tarreau 	case err: return #err
22*362aecb2SWilly Tarreau 
23*362aecb2SWilly Tarreau /* returns the error name (e.g. "ENOENT") for common errors, "SUCCESS" for 0,
24*362aecb2SWilly Tarreau  * or the decimal value for less common ones.
25*362aecb2SWilly Tarreau  */
26*362aecb2SWilly Tarreau const char *errorname(int err)
27*362aecb2SWilly Tarreau {
28*362aecb2SWilly Tarreau 	switch (err) {
29*362aecb2SWilly Tarreau 	case 0: return "SUCCESS";
30*362aecb2SWilly Tarreau 	CASE_ERR(EPERM);
31*362aecb2SWilly Tarreau 	CASE_ERR(ENOENT);
32*362aecb2SWilly Tarreau 	CASE_ERR(ESRCH);
33*362aecb2SWilly Tarreau 	CASE_ERR(EINTR);
34*362aecb2SWilly Tarreau 	CASE_ERR(EIO);
35*362aecb2SWilly Tarreau 	CASE_ERR(ENXIO);
36*362aecb2SWilly Tarreau 	CASE_ERR(E2BIG);
37*362aecb2SWilly Tarreau 	CASE_ERR(ENOEXEC);
38*362aecb2SWilly Tarreau 	CASE_ERR(EBADF);
39*362aecb2SWilly Tarreau 	CASE_ERR(ECHILD);
40*362aecb2SWilly Tarreau 	CASE_ERR(EAGAIN);
41*362aecb2SWilly Tarreau 	CASE_ERR(ENOMEM);
42*362aecb2SWilly Tarreau 	CASE_ERR(EACCES);
43*362aecb2SWilly Tarreau 	CASE_ERR(EFAULT);
44*362aecb2SWilly Tarreau 	CASE_ERR(ENOTBLK);
45*362aecb2SWilly Tarreau 	CASE_ERR(EBUSY);
46*362aecb2SWilly Tarreau 	CASE_ERR(EEXIST);
47*362aecb2SWilly Tarreau 	CASE_ERR(EXDEV);
48*362aecb2SWilly Tarreau 	CASE_ERR(ENODEV);
49*362aecb2SWilly Tarreau 	CASE_ERR(ENOTDIR);
50*362aecb2SWilly Tarreau 	CASE_ERR(EISDIR);
51*362aecb2SWilly Tarreau 	CASE_ERR(EINVAL);
52*362aecb2SWilly Tarreau 	CASE_ERR(ENFILE);
53*362aecb2SWilly Tarreau 	CASE_ERR(EMFILE);
54*362aecb2SWilly Tarreau 	CASE_ERR(ENOTTY);
55*362aecb2SWilly Tarreau 	CASE_ERR(ETXTBSY);
56*362aecb2SWilly Tarreau 	CASE_ERR(EFBIG);
57*362aecb2SWilly Tarreau 	CASE_ERR(ENOSPC);
58*362aecb2SWilly Tarreau 	CASE_ERR(ESPIPE);
59*362aecb2SWilly Tarreau 	CASE_ERR(EROFS);
60*362aecb2SWilly Tarreau 	CASE_ERR(EMLINK);
61*362aecb2SWilly Tarreau 	CASE_ERR(EPIPE);
62*362aecb2SWilly Tarreau 	CASE_ERR(EDOM);
63*362aecb2SWilly Tarreau 	CASE_ERR(ERANGE);
64*362aecb2SWilly Tarreau 	CASE_ERR(ENOSYS);
65*362aecb2SWilly Tarreau 	default:
66*362aecb2SWilly Tarreau 		return itoa(err);
67*362aecb2SWilly Tarreau 	}
68*362aecb2SWilly Tarreau }
69*362aecb2SWilly Tarreau 
70*362aecb2SWilly Tarreau static int pad_spc(int llen, int cnt, const char *fmt, ...)
71*362aecb2SWilly Tarreau {
72*362aecb2SWilly Tarreau 	va_list args;
73*362aecb2SWilly Tarreau 	int len;
74*362aecb2SWilly Tarreau 	int ret;
75*362aecb2SWilly Tarreau 
76*362aecb2SWilly Tarreau 	for (len = 0; len < cnt - llen; len++)
77*362aecb2SWilly Tarreau 		putchar(' ');
78*362aecb2SWilly Tarreau 
79*362aecb2SWilly Tarreau 	va_start(args, fmt);
80*362aecb2SWilly Tarreau 	ret = vfprintf(stdout, fmt, args);
81*362aecb2SWilly Tarreau 	va_end(args);
82*362aecb2SWilly Tarreau 	return ret < 0 ? ret : ret + len;
83*362aecb2SWilly Tarreau }
84*362aecb2SWilly Tarreau 
85*362aecb2SWilly Tarreau /* The tests below are intended to be used by the macroes, which evaluate
86*362aecb2SWilly Tarreau  * expression <expr>, print the status to stdout, and update the "ret"
87*362aecb2SWilly Tarreau  * variable to count failures. The functions themselves return the number
88*362aecb2SWilly Tarreau  * of failures, thus either 0 or 1.
89*362aecb2SWilly Tarreau  */
90*362aecb2SWilly Tarreau 
91*362aecb2SWilly Tarreau #define EXPECT_ZR(cond, expr)				\
92*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_zr(expr, llen); } while (0)
93*362aecb2SWilly Tarreau 
94*362aecb2SWilly Tarreau static int expect_zr(int expr, int llen)
95*362aecb2SWilly Tarreau {
96*362aecb2SWilly Tarreau 	int ret = !(expr == 0);
97*362aecb2SWilly Tarreau 
98*362aecb2SWilly Tarreau 	llen += printf(" = %d ", expr);
99*362aecb2SWilly Tarreau 	pad_spc(llen, 40, ret ? "[FAIL]\n" : " [OK]\n");
100*362aecb2SWilly Tarreau 	return ret;
101*362aecb2SWilly Tarreau }
102*362aecb2SWilly Tarreau 
103*362aecb2SWilly Tarreau 
104*362aecb2SWilly Tarreau #define EXPECT_NZ(cond, expr, val)			\
105*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_nz(expr, llen; } while (0)
106*362aecb2SWilly Tarreau 
107*362aecb2SWilly Tarreau static int expect_nz(int expr, int llen)
108*362aecb2SWilly Tarreau {
109*362aecb2SWilly Tarreau 	int ret = !(expr != 0);
110*362aecb2SWilly Tarreau 
111*362aecb2SWilly Tarreau 	llen += printf(" = %d ", expr);
112*362aecb2SWilly Tarreau 	pad_spc(llen, 40, ret ? "[FAIL]\n" : " [OK]\n");
113*362aecb2SWilly Tarreau 	return ret;
114*362aecb2SWilly Tarreau }
115*362aecb2SWilly Tarreau 
116*362aecb2SWilly Tarreau 
117*362aecb2SWilly Tarreau #define EXPECT_EQ(cond, expr, val)				\
118*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_eq(expr, llen, val); } while (0)
119*362aecb2SWilly Tarreau 
120*362aecb2SWilly Tarreau static int expect_eq(int expr, int llen, int val)
121*362aecb2SWilly Tarreau {
122*362aecb2SWilly Tarreau 	int ret = !(expr == val);
123*362aecb2SWilly Tarreau 
124*362aecb2SWilly Tarreau 	llen += printf(" = %d ", expr);
125*362aecb2SWilly Tarreau 	pad_spc(llen, 40, ret ? "[FAIL]\n" : " [OK]\n");
126*362aecb2SWilly Tarreau 	return ret;
127*362aecb2SWilly Tarreau }
128*362aecb2SWilly Tarreau 
129*362aecb2SWilly Tarreau 
130*362aecb2SWilly Tarreau #define EXPECT_NE(cond, expr, val)				\
131*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_ne(expr, llen, val); } while (0)
132*362aecb2SWilly Tarreau 
133*362aecb2SWilly Tarreau static int expect_ne(int expr, int llen, int val)
134*362aecb2SWilly Tarreau {
135*362aecb2SWilly Tarreau 	int ret = !(expr != val);
136*362aecb2SWilly Tarreau 
137*362aecb2SWilly Tarreau 	llen += printf(" = %d ", expr);
138*362aecb2SWilly Tarreau 	pad_spc(llen, 40, ret ? "[FAIL]\n" : " [OK]\n");
139*362aecb2SWilly Tarreau 	return ret;
140*362aecb2SWilly Tarreau }
141*362aecb2SWilly Tarreau 
142*362aecb2SWilly Tarreau 
143*362aecb2SWilly Tarreau #define EXPECT_GE(cond, expr, val)				\
144*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_ge(expr, llen, val); } while (0)
145*362aecb2SWilly Tarreau 
146*362aecb2SWilly Tarreau static int expect_ge(int expr, int llen, int val)
147*362aecb2SWilly Tarreau {
148*362aecb2SWilly Tarreau 	int ret = !(expr >= val);
149*362aecb2SWilly Tarreau 
150*362aecb2SWilly Tarreau 	llen += printf(" = %d ", expr);
151*362aecb2SWilly Tarreau 	pad_spc(llen, 40, ret ? "[FAIL]\n" : " [OK]\n");
152*362aecb2SWilly Tarreau 	return ret;
153*362aecb2SWilly Tarreau }
154*362aecb2SWilly Tarreau 
155*362aecb2SWilly Tarreau 
156*362aecb2SWilly Tarreau #define EXPECT_GT(cond, expr, val)				\
157*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_gt(expr, llen, val); } while (0)
158*362aecb2SWilly Tarreau 
159*362aecb2SWilly Tarreau static int expect_gt(int expr, int llen, int val)
160*362aecb2SWilly Tarreau {
161*362aecb2SWilly Tarreau 	int ret = !(expr > val);
162*362aecb2SWilly Tarreau 
163*362aecb2SWilly Tarreau 	llen += printf(" = %d ", expr);
164*362aecb2SWilly Tarreau 	pad_spc(llen, 40, ret ? "[FAIL]\n" : " [OK]\n");
165*362aecb2SWilly Tarreau 	return ret;
166*362aecb2SWilly Tarreau }
167*362aecb2SWilly Tarreau 
168*362aecb2SWilly Tarreau 
169*362aecb2SWilly Tarreau #define EXPECT_LE(cond, expr, val)				\
170*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_le(expr, llen, val); } while (0)
171*362aecb2SWilly Tarreau 
172*362aecb2SWilly Tarreau static int expect_le(int expr, int llen, int val)
173*362aecb2SWilly Tarreau {
174*362aecb2SWilly Tarreau 	int ret = !(expr <= val);
175*362aecb2SWilly Tarreau 
176*362aecb2SWilly Tarreau 	llen += printf(" = %d ", expr);
177*362aecb2SWilly Tarreau 	pad_spc(llen, 40, ret ? "[FAIL]\n" : " [OK]\n");
178*362aecb2SWilly Tarreau 	return ret;
179*362aecb2SWilly Tarreau }
180*362aecb2SWilly Tarreau 
181*362aecb2SWilly Tarreau 
182*362aecb2SWilly Tarreau #define EXPECT_LT(cond, expr, val)				\
183*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_lt(expr, llen, val); } while (0)
184*362aecb2SWilly Tarreau 
185*362aecb2SWilly Tarreau static int expect_lt(int expr, int llen, int val)
186*362aecb2SWilly Tarreau {
187*362aecb2SWilly Tarreau 	int ret = !(expr < val);
188*362aecb2SWilly Tarreau 
189*362aecb2SWilly Tarreau 	llen += printf(" = %d ", expr);
190*362aecb2SWilly Tarreau 	pad_spc(llen, 40, ret ? "[FAIL]\n" : " [OK]\n");
191*362aecb2SWilly Tarreau 	return ret;
192*362aecb2SWilly Tarreau }
193*362aecb2SWilly Tarreau 
194*362aecb2SWilly Tarreau 
195*362aecb2SWilly Tarreau #define EXPECT_SYSZR(cond, expr)				\
196*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_syszr(expr, llen); } while (0)
197*362aecb2SWilly Tarreau 
198*362aecb2SWilly Tarreau static int expect_syszr(int expr, int llen)
199*362aecb2SWilly Tarreau {
200*362aecb2SWilly Tarreau 	int ret = 0;
201*362aecb2SWilly Tarreau 
202*362aecb2SWilly Tarreau 	if (expr) {
203*362aecb2SWilly Tarreau 		ret = 1;
204*362aecb2SWilly Tarreau 		llen += printf(" = %d %s ", expr, errorname(errno));
205*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
206*362aecb2SWilly Tarreau 	} else {
207*362aecb2SWilly Tarreau 		llen += printf(" = %d ", expr);
208*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
209*362aecb2SWilly Tarreau 	}
210*362aecb2SWilly Tarreau 	return ret;
211*362aecb2SWilly Tarreau }
212*362aecb2SWilly Tarreau 
213*362aecb2SWilly Tarreau 
214*362aecb2SWilly Tarreau #define EXPECT_SYSEQ(cond, expr, val)				\
215*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_syseq(expr, llen, val); } while (0)
216*362aecb2SWilly Tarreau 
217*362aecb2SWilly Tarreau static int expect_syseq(int expr, int llen, int val)
218*362aecb2SWilly Tarreau {
219*362aecb2SWilly Tarreau 	int ret = 0;
220*362aecb2SWilly Tarreau 
221*362aecb2SWilly Tarreau 	if (expr != val) {
222*362aecb2SWilly Tarreau 		ret = 1;
223*362aecb2SWilly Tarreau 		llen += printf(" = %d %s ", expr, errorname(errno));
224*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
225*362aecb2SWilly Tarreau 	} else {
226*362aecb2SWilly Tarreau 		llen += printf(" = %d ", expr);
227*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
228*362aecb2SWilly Tarreau 	}
229*362aecb2SWilly Tarreau 	return ret;
230*362aecb2SWilly Tarreau }
231*362aecb2SWilly Tarreau 
232*362aecb2SWilly Tarreau 
233*362aecb2SWilly Tarreau #define EXPECT_SYSNE(cond, expr, val)				\
234*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_sysne(expr, llen, val); } while (0)
235*362aecb2SWilly Tarreau 
236*362aecb2SWilly Tarreau static int expect_sysne(int expr, int llen, int val)
237*362aecb2SWilly Tarreau {
238*362aecb2SWilly Tarreau 	int ret = 0;
239*362aecb2SWilly Tarreau 
240*362aecb2SWilly Tarreau 	if (expr == val) {
241*362aecb2SWilly Tarreau 		ret = 1;
242*362aecb2SWilly Tarreau 		llen += printf(" = %d %s ", expr, errorname(errno));
243*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
244*362aecb2SWilly Tarreau 	} else {
245*362aecb2SWilly Tarreau 		llen += printf(" = %d ", expr);
246*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
247*362aecb2SWilly Tarreau 	}
248*362aecb2SWilly Tarreau 	return ret;
249*362aecb2SWilly Tarreau }
250*362aecb2SWilly Tarreau 
251*362aecb2SWilly Tarreau 
252*362aecb2SWilly Tarreau #define EXPECT_SYSER(cond, expr, expret, experr)			\
253*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_syserr(expr, expret, experr, llen); } while (0)
254*362aecb2SWilly Tarreau 
255*362aecb2SWilly Tarreau static int expect_syserr(int expr, int expret, int experr, int llen)
256*362aecb2SWilly Tarreau {
257*362aecb2SWilly Tarreau 	int ret = 0;
258*362aecb2SWilly Tarreau 	int _errno = errno;
259*362aecb2SWilly Tarreau 
260*362aecb2SWilly Tarreau 	llen += printf(" = %d %s ", expr, errorname(_errno));
261*362aecb2SWilly Tarreau 	if (expr != expret || _errno != experr) {
262*362aecb2SWilly Tarreau 		ret = 1;
263*362aecb2SWilly Tarreau 		llen += printf(" != (%d %s) ", expret, errorname(experr));
264*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
265*362aecb2SWilly Tarreau 	} else {
266*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
267*362aecb2SWilly Tarreau 	}
268*362aecb2SWilly Tarreau 	return ret;
269*362aecb2SWilly Tarreau }
270*362aecb2SWilly Tarreau 
271*362aecb2SWilly Tarreau 
272*362aecb2SWilly Tarreau #define EXPECT_PTRZR(cond, expr)				\
273*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_ptrzr(expr, llen); } while (0)
274*362aecb2SWilly Tarreau 
275*362aecb2SWilly Tarreau static int expect_ptrzr(const void *expr, int llen)
276*362aecb2SWilly Tarreau {
277*362aecb2SWilly Tarreau 	int ret = 0;
278*362aecb2SWilly Tarreau 
279*362aecb2SWilly Tarreau 	llen += printf(" = <%p> ", expr);
280*362aecb2SWilly Tarreau 	if (expr) {
281*362aecb2SWilly Tarreau 		ret = 1;
282*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
283*362aecb2SWilly Tarreau 	} else {
284*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
285*362aecb2SWilly Tarreau 	}
286*362aecb2SWilly Tarreau 	return ret;
287*362aecb2SWilly Tarreau }
288*362aecb2SWilly Tarreau 
289*362aecb2SWilly Tarreau 
290*362aecb2SWilly Tarreau #define EXPECT_PTRNZ(cond, expr)				\
291*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_ptrnz(expr, llen); } while (0)
292*362aecb2SWilly Tarreau 
293*362aecb2SWilly Tarreau static int expect_ptrnz(const void *expr, int llen)
294*362aecb2SWilly Tarreau {
295*362aecb2SWilly Tarreau 	int ret = 0;
296*362aecb2SWilly Tarreau 
297*362aecb2SWilly Tarreau 	llen += printf(" = <%p> ", expr);
298*362aecb2SWilly Tarreau 	if (!expr) {
299*362aecb2SWilly Tarreau 		ret = 1;
300*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
301*362aecb2SWilly Tarreau 	} else {
302*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
303*362aecb2SWilly Tarreau 	}
304*362aecb2SWilly Tarreau 	return ret;
305*362aecb2SWilly Tarreau }
306*362aecb2SWilly Tarreau 
307*362aecb2SWilly Tarreau 
308*362aecb2SWilly Tarreau #define EXPECT_STRZR(cond, expr)				\
309*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_strzr(expr, llen); } while (0)
310*362aecb2SWilly Tarreau 
311*362aecb2SWilly Tarreau static int expect_strzr(const char *expr, int llen)
312*362aecb2SWilly Tarreau {
313*362aecb2SWilly Tarreau 	int ret = 0;
314*362aecb2SWilly Tarreau 
315*362aecb2SWilly Tarreau 	llen += printf(" = <%s> ", expr);
316*362aecb2SWilly Tarreau 	if (expr) {
317*362aecb2SWilly Tarreau 		ret = 1;
318*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
319*362aecb2SWilly Tarreau 	} else {
320*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
321*362aecb2SWilly Tarreau 	}
322*362aecb2SWilly Tarreau 	return ret;
323*362aecb2SWilly Tarreau }
324*362aecb2SWilly Tarreau 
325*362aecb2SWilly Tarreau 
326*362aecb2SWilly Tarreau #define EXPECT_STRNZ(cond, expr)				\
327*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_strnz(expr, llen); } while (0)
328*362aecb2SWilly Tarreau 
329*362aecb2SWilly Tarreau static int expect_strnz(const char *expr, int llen)
330*362aecb2SWilly Tarreau {
331*362aecb2SWilly Tarreau 	int ret = 0;
332*362aecb2SWilly Tarreau 
333*362aecb2SWilly Tarreau 	llen += printf(" = <%s> ", expr);
334*362aecb2SWilly Tarreau 	if (!expr) {
335*362aecb2SWilly Tarreau 		ret = 1;
336*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
337*362aecb2SWilly Tarreau 	} else {
338*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
339*362aecb2SWilly Tarreau 	}
340*362aecb2SWilly Tarreau 	return ret;
341*362aecb2SWilly Tarreau }
342*362aecb2SWilly Tarreau 
343*362aecb2SWilly Tarreau 
344*362aecb2SWilly Tarreau #define EXPECT_STREQ(cond, expr, cmp)				\
345*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_streq(expr, llen, cmp); } while (0)
346*362aecb2SWilly Tarreau 
347*362aecb2SWilly Tarreau static int expect_streq(const char *expr, int llen, const char *cmp)
348*362aecb2SWilly Tarreau {
349*362aecb2SWilly Tarreau 	int ret = 0;
350*362aecb2SWilly Tarreau 
351*362aecb2SWilly Tarreau 	llen += printf(" = <%s> ", expr);
352*362aecb2SWilly Tarreau 	if (strcmp(expr, cmp) != 0) {
353*362aecb2SWilly Tarreau 		ret = 1;
354*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
355*362aecb2SWilly Tarreau 	} else {
356*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
357*362aecb2SWilly Tarreau 	}
358*362aecb2SWilly Tarreau 	return ret;
359*362aecb2SWilly Tarreau }
360*362aecb2SWilly Tarreau 
361*362aecb2SWilly Tarreau 
362*362aecb2SWilly Tarreau #define EXPECT_STRNE(cond, expr, cmp)				\
363*362aecb2SWilly Tarreau 	do { if (!cond) pad_spc(llen, 40, "[SKIPPED]\n"); else ret += expect_strne(expr, llen, cmp); } while (0)
364*362aecb2SWilly Tarreau 
365*362aecb2SWilly Tarreau static int expect_strne(const char *expr, int llen, const char *cmp)
366*362aecb2SWilly Tarreau {
367*362aecb2SWilly Tarreau 	int ret = 0;
368*362aecb2SWilly Tarreau 
369*362aecb2SWilly Tarreau 	llen += printf(" = <%s> ", expr);
370*362aecb2SWilly Tarreau 	if (strcmp(expr, cmp) == 0) {
371*362aecb2SWilly Tarreau 		ret = 1;
372*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, "[FAIL]\n");
373*362aecb2SWilly Tarreau 	} else {
374*362aecb2SWilly Tarreau 		llen += pad_spc(llen, 40, " [OK]\n");
375*362aecb2SWilly Tarreau 	}
376*362aecb2SWilly Tarreau 	return ret;
377*362aecb2SWilly Tarreau }
378*362aecb2SWilly Tarreau 
379*362aecb2SWilly Tarreau /* declare tests based on line numbers. There must be exactly one test per line. */
380*362aecb2SWilly Tarreau #define CASE_TEST(name) \
381*362aecb2SWilly Tarreau 	case __LINE__: llen += printf("%d %s", test, #name);
382*362aecb2SWilly Tarreau 
383*362aecb2SWilly Tarreau 
384*362aecb2SWilly Tarreau int main(int argc, char **argv, char **envp)
385*362aecb2SWilly Tarreau {
386*362aecb2SWilly Tarreau 	int min = 0;
387*362aecb2SWilly Tarreau 	int max = __INT_MAX__;
388*362aecb2SWilly Tarreau 	int ret = 0;
389*362aecb2SWilly Tarreau 
390*362aecb2SWilly Tarreau 	environ = envp;
391*362aecb2SWilly Tarreau 
392*362aecb2SWilly Tarreau 	printf("Total number of errors: %d\n", ret);
393*362aecb2SWilly Tarreau 	printf("Exiting with status %d\n", !!ret);
394*362aecb2SWilly Tarreau 	return !!ret;
395*362aecb2SWilly Tarreau }
396