1 1.1 mrg /* DejaGnu unit testing header. 2 1.1.1.2 mrg Copyright (C) 2000-2022 Free Software Foundation, Inc. 3 1.1 mrg 4 1.1 mrg This file is part of DejaGnu. 5 1.1 mrg 6 1.1 mrg DejaGnu is free software; you can redistribute it and/or modify it 7 1.1 mrg under the terms of the GNU General Public License as published by 8 1.1 mrg the Free Software Foundation; either version 3 of the License, or 9 1.1 mrg (at your option) any later version. 10 1.1 mrg 11 1.1 mrg DejaGnu is distributed in the hope that it will be useful, but 12 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 1.1 mrg General Public License for more details. 15 1.1 mrg 16 1.1 mrg You should have received a copy of the GNU General Public License 17 1.1 mrg along with DejaGnu; if not, write to the Free Software Foundation, 18 1.1 mrg Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 19 1.1 mrg 20 1.1 mrg /* Imported from 1.6.2 with modifications 21 1.1 mrg * to avoid and unused symbol in C compilations 22 1.1 mrg * avoid wait () clashing with system-provided routines 23 1.1 mrg * provide a deterministic last line of output after the totals. */ 24 1.1 mrg 25 1.1 mrg #ifndef __DEJAGNU_H__ 26 1.1 mrg #define __DEJAGNU_H__ 27 1.1 mrg 28 1.1 mrg #include <stdio.h> 29 1.1 mrg #include <stdarg.h> 30 1.1 mrg #include <string.h> 31 1.1 mrg 32 1.1 mrg /* If you have problems with DejaGnu dropping failed, untested, or 33 1.1 mrg * unresolved messages generated by a unit testcase, then: */ 34 1.1 mrg 35 1.1 mrg /* #define _DEJAGNU_WAIT_ */ 36 1.1 mrg 37 1.1 mrg #ifdef _DEJAGNU_WAIT_ 38 1.1 mrg #include <sys/time.h> 39 1.1 mrg #include <sys/types.h> 40 1.1 mrg #include <unistd.h> 41 1.1 mrg #endif 42 1.1 mrg 43 1.1 mrg static int passed; 44 1.1 mrg static int failed; 45 1.1 mrg static int untest; 46 1.1 mrg static int unresolve; 47 1.1 mrg static int xfailed; 48 1.1 mrg #ifdef __cplusplus 49 1.1 mrg static int xpassed; 50 1.1 mrg #endif 51 1.1 mrg 52 1.1 mrg static char buffer[512]; 53 1.1 mrg 54 1.1 mrg #ifdef _DEJAGNU_WAIT_ 55 1.1 mrg void 56 1.1 mrg dg_wait (void) 57 1.1 mrg { 58 1.1 mrg fd_set rfds; 59 1.1 mrg struct timeval tv; 60 1.1 mrg 61 1.1 mrg FD_ZERO (&rfds); 62 1.1 mrg tv.tv_sec = 0; 63 1.1 mrg tv.tv_usec = 1; 64 1.1 mrg 65 1.1 mrg select (0, &rfds, NULL, NULL, &tv); 66 1.1 mrg } 67 1.1 mrg #endif 68 1.1 mrg 69 1.1 mrg static inline void 70 1.1 mrg pass (const char* fmt, ...) 71 1.1 mrg { 72 1.1 mrg va_list ap; 73 1.1 mrg 74 1.1 mrg passed++; 75 1.1 mrg va_start (ap, fmt); 76 1.1 mrg vsnprintf (buffer, sizeof (buffer), fmt, ap); 77 1.1 mrg va_end (ap); 78 1.1 mrg printf ("\tPASSED: %s\n", buffer); 79 1.1 mrg #ifdef _DEJAGNU_WAIT_ 80 1.1 mrg dg_wait (); 81 1.1 mrg #endif 82 1.1 mrg } 83 1.1 mrg 84 1.1 mrg static inline void 85 1.1 mrg xpass (const char* fmt, ...) 86 1.1 mrg { 87 1.1 mrg va_list ap; 88 1.1 mrg 89 1.1 mrg passed++; 90 1.1 mrg va_start (ap, fmt); 91 1.1 mrg vsnprintf (buffer, sizeof (buffer), fmt, ap); 92 1.1 mrg va_end (ap); 93 1.1 mrg printf ("\tXPASSED: %s\n", buffer); 94 1.1 mrg #ifdef _DEJAGNU_WAIT_ 95 1.1 mrg dg_wait (); 96 1.1 mrg #endif 97 1.1 mrg } 98 1.1 mrg 99 1.1 mrg static inline void 100 1.1 mrg fail (const char* fmt, ...) 101 1.1 mrg { 102 1.1 mrg va_list ap; 103 1.1 mrg 104 1.1 mrg failed++; 105 1.1 mrg va_start (ap, fmt); 106 1.1 mrg vsnprintf (buffer, sizeof (buffer), fmt, ap); 107 1.1 mrg va_end (ap); 108 1.1 mrg printf ("\tFAILED: %s\n", buffer); 109 1.1 mrg #ifdef _DEJAGNU_WAIT_ 110 1.1 mrg dg_wait (); 111 1.1 mrg #endif 112 1.1 mrg } 113 1.1 mrg 114 1.1 mrg static inline void 115 1.1 mrg xfail (const char* fmt, ...) 116 1.1 mrg { 117 1.1 mrg va_list ap; 118 1.1 mrg 119 1.1 mrg failed++; 120 1.1 mrg va_start (ap, fmt); 121 1.1 mrg vsnprintf (buffer, sizeof (buffer), fmt, ap); 122 1.1 mrg va_end (ap); 123 1.1 mrg printf ("\tXFAILED: %s\n", buffer); 124 1.1 mrg #ifdef _DEJAGNU_WAIT_ 125 1.1 mrg dg_wait (); 126 1.1 mrg #endif 127 1.1 mrg } 128 1.1 mrg 129 1.1 mrg static inline void 130 1.1 mrg untested (const char* fmt, ...) 131 1.1 mrg { 132 1.1 mrg va_list ap; 133 1.1 mrg 134 1.1 mrg untest++; 135 1.1 mrg va_start (ap, fmt); 136 1.1 mrg vsnprintf (buffer, sizeof (buffer), fmt, ap); 137 1.1 mrg va_end (ap); 138 1.1 mrg printf ("\tUNTESTED: %s\n", buffer); 139 1.1 mrg #ifdef _DEJAGNU_WAIT_ 140 1.1 mrg dg_wait (); 141 1.1 mrg #endif 142 1.1 mrg } 143 1.1 mrg 144 1.1 mrg static inline void 145 1.1 mrg unresolved (const char* fmt, ...) 146 1.1 mrg { 147 1.1 mrg va_list ap; 148 1.1 mrg 149 1.1 mrg unresolve++; 150 1.1 mrg va_start (ap, fmt); 151 1.1 mrg vsnprintf (buffer, sizeof (buffer), fmt, ap); 152 1.1 mrg va_end (ap); 153 1.1 mrg printf ("\tUNRESOLVED: %s\n", buffer); 154 1.1 mrg #ifdef _DEJAGNU_WAIT_ 155 1.1 mrg dg_wait (); 156 1.1 mrg #endif 157 1.1 mrg } 158 1.1 mrg 159 1.1 mrg static inline void 160 1.1 mrg note (const char* fmt, ...) 161 1.1 mrg { 162 1.1 mrg va_list ap; 163 1.1 mrg 164 1.1 mrg va_start (ap, fmt); 165 1.1 mrg vsnprintf (buffer, sizeof (buffer), fmt, ap); 166 1.1 mrg va_end (ap); 167 1.1 mrg printf ("\tNOTE: %s\n", buffer); 168 1.1 mrg #ifdef _DEJAGNU_WAIT_ 169 1.1 mrg dg_wait (); 170 1.1 mrg #endif 171 1.1 mrg } 172 1.1 mrg 173 1.1 mrg static inline void 174 1.1 mrg totals (void) 175 1.1 mrg { 176 1.1 mrg printf ("\nTotals:\n"); 177 1.1 mrg printf ("\t#passed:\t\t%d\n", passed); 178 1.1 mrg printf ("\t#real failed:\t\t%d\n", failed); 179 1.1 mrg if (xfailed) 180 1.1 mrg printf ("\t#expected failures:\t\t%d\n", xfailed); 181 1.1 mrg if (untest) 182 1.1 mrg printf ("\t#untested:\t\t%d\n", untest); 183 1.1 mrg if (unresolve) 184 1.1 mrg printf ("\t#unresolved:\t\t%d\n", unresolve); 185 1.1 mrg printf ("\njit-dg-harness-complete\n"); 186 1.1 mrg } 187 1.1 mrg 188 1.1 mrg #ifdef __cplusplus 189 1.1 mrg 190 1.1 mrg #include <iostream> 191 1.1 mrg #include <iomanip> 192 1.1 mrg #include <fstream> 193 1.1 mrg #include <string> 194 1.1 mrg 195 1.1 mrg const char *outstate_list[] = { 196 1.1 mrg "FAILED: ", "PASSED: ", "UNTESTED: ", "UNRESOLVED: ", "XFAILED: ", "XPASSED: " 197 1.1 mrg }; 198 1.1 mrg 199 1.1 mrg const char ** outstate = outstate_list; 200 1.1 mrg 201 1.1 mrg enum teststate { FAILED, PASSED, UNTESTED, UNRESOLVED, XFAILED, XPASSED} laststate; 202 1.1 mrg 203 1.1 mrg class TestState { 204 1.1 mrg private: 205 1.1 mrg teststate laststate; 206 1.1 mrg std::string lastmsg; 207 1.1 mrg public: 208 1.1 mrg TestState (void) 209 1.1 mrg { 210 1.1 mrg passed = 0; 211 1.1 mrg failed = 0; 212 1.1 mrg untest = 0; 213 1.1 mrg xpassed = 0; 214 1.1 mrg xfailed = 0; 215 1.1 mrg unresolve = 0; 216 1.1 mrg } 217 1.1 mrg 218 1.1 mrg ~TestState (void) { totals(); } 219 1.1 mrg 220 1.1 mrg void testrun (bool b, std::string s) 221 1.1 mrg { 222 1.1 mrg if (b) 223 1.1 mrg pass (s); 224 1.1 mrg else 225 1.1 mrg fail (s); 226 1.1 mrg } 227 1.1 mrg 228 1.1 mrg void pass (std::string s) 229 1.1 mrg { 230 1.1 mrg passed++; 231 1.1 mrg laststate = PASSED; 232 1.1 mrg lastmsg = s; 233 1.1 mrg std::cout << "\t" << outstate[PASSED] << s << std::endl; 234 1.1 mrg } 235 1.1 mrg 236 1.1 mrg void pass (const char *c) 237 1.1 mrg { 238 1.1 mrg std::string s = c; 239 1.1 mrg pass (s); 240 1.1 mrg } 241 1.1 mrg 242 1.1 mrg void xpass (std::string s) 243 1.1 mrg { 244 1.1 mrg xpassed++; 245 1.1 mrg laststate = PASSED; 246 1.1 mrg lastmsg = s; 247 1.1 mrg std::cout << "\t" << outstate[XPASSED] << s << std::endl; 248 1.1 mrg } 249 1.1 mrg 250 1.1 mrg void xpass (const char *c) 251 1.1 mrg { 252 1.1 mrg std::string s = c; 253 1.1 mrg xpass (s); 254 1.1 mrg } 255 1.1 mrg 256 1.1 mrg void fail (std::string s) 257 1.1 mrg { 258 1.1 mrg failed++; 259 1.1 mrg laststate = FAILED; 260 1.1 mrg lastmsg = s; 261 1.1 mrg std::cout << "\t" << outstate[FAILED] << s << std::endl; 262 1.1 mrg } 263 1.1 mrg 264 1.1 mrg void fail (const char *c) 265 1.1 mrg { 266 1.1 mrg std::string s = c; 267 1.1 mrg fail (s); 268 1.1 mrg } 269 1.1 mrg 270 1.1 mrg void xfail (std::string s) 271 1.1 mrg { 272 1.1 mrg xfailed++; 273 1.1 mrg laststate = XFAILED; 274 1.1 mrg lastmsg = s; 275 1.1 mrg std::cout << "\t" << outstate[XFAILED] << s << std::endl; 276 1.1 mrg } 277 1.1 mrg 278 1.1 mrg void xfail (const char *c) 279 1.1 mrg { 280 1.1 mrg std::string s = c; 281 1.1 mrg xfail (s); 282 1.1 mrg } 283 1.1 mrg 284 1.1 mrg void untested (std::string s) 285 1.1 mrg { 286 1.1 mrg untest++; 287 1.1 mrg laststate = UNTESTED; 288 1.1 mrg lastmsg = s; 289 1.1 mrg std::cout << "\t" << outstate[UNTESTED] << s << std::endl; 290 1.1 mrg } 291 1.1 mrg 292 1.1 mrg void untested (const char *c) 293 1.1 mrg { 294 1.1 mrg std::string s = c; 295 1.1 mrg untested (s); 296 1.1 mrg } 297 1.1 mrg 298 1.1 mrg void unresolved (std::string s) 299 1.1 mrg { 300 1.1 mrg unresolve++; 301 1.1 mrg laststate = UNRESOLVED; 302 1.1 mrg lastmsg = s; 303 1.1 mrg std::cout << "\t" << outstate[UNRESOLVED] << s << std::endl; 304 1.1 mrg } 305 1.1 mrg 306 1.1 mrg void unresolved (const char *c) 307 1.1 mrg { 308 1.1 mrg std::string s = c; 309 1.1 mrg unresolved (s); 310 1.1 mrg } 311 1.1 mrg 312 1.1 mrg void totals (void) 313 1.1 mrg { 314 1.1 mrg std::cout << "\t#passed:\t\t" << passed << std::endl; 315 1.1 mrg std::cout << "\t#real failed:\t\t" << failed << std::endl; 316 1.1 mrg if (xfailed) 317 1.1 mrg std::cout << "\t#expected failures:\t\t" << xfailed << std::endl; 318 1.1 mrg if (xpassed) 319 1.1 mrg std::cout << "\t#unexpected passes:\t\t" << xpassed << std::endl; 320 1.1 mrg if (untest) 321 1.1 mrg std::cout << "\t#untested:\t\t" << untest << std::endl; 322 1.1 mrg if (unresolve) 323 1.1 mrg std::cout << "\t#unresolved:\t\t" << unresolve << std::endl; 324 1.1 mrg std::cout << "\njit-dg-harness-complete" << std::endl; 325 1.1 mrg } 326 1.1 mrg 327 1.1 mrg // This is so this class can be printed in an ostream. 328 1.1 mrg friend std::ostream & operator << (std::ostream &os, TestState& t) 329 1.1 mrg { 330 1.1 mrg return os << "\t" << outstate[t.laststate] << t.lastmsg ; 331 1.1 mrg } 332 1.1 mrg 333 1.1 mrg int GetState (void) { return laststate; } 334 1.1 mrg std::string GetMsg (void) { return lastmsg; } 335 1.1 mrg }; 336 1.1 mrg 337 1.1 mrg #endif /* __cplusplus */ 338 1.1 mrg #endif /* _DEJAGNU_H_ */ 339