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