1/*-*- mode:C; -*- */ 2/* 3 * Check: a unit test framework for C 4 * Copyright (C) 2001, 2002 Arien Malec 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the 18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 19 * MA 02110-1301, USA. 20 */ 21 22#ifndef CHECK_H 23#define CHECK_H 24 25#include <stddef.h> 26#include <string.h> 27 28/* 29 Macros and functions starting with _ (underscore) are internal and 30 may change without notice. You have been warned!. 31*/ 32 33 34#ifdef __cplusplus 35#define CK_CPPSTART extern "C" { 36#define CK_CPPEND } 37CK_CPPSTART 38#endif 39#if defined(__GNUC__) && defined(__GNUC_MINOR__) 40#define GCC_VERSION_AT_LEAST(major, minor) \ 41((__GNUC__ > (major)) || \ 42 (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) 43#else 44#define GCC_VERSION_AT_LEAST(major, minor) 0 45#endif 46#if GCC_VERSION_AT_LEAST(2,95) 47#define CK_ATTRIBUTE_UNUSED __attribute__ ((unused)) 48#else 49#define CK_ATTRIBUTE_UNUSED 50#endif /* GCC 2.95 */ 51#if GCC_VERSION_AT_LEAST(2,5) 52#define CK_ATTRIBUTE_NORETURN __attribute__ ((noreturn)) 53#else 54#define CK_ATTRIBUTE_NORETURN 55#endif /* GCC 2.5 */ 56#include <sys/types.h> 57 58/* 59 * Used to create the linker script for hiding lib-local symbols. Shall 60 * be put directly in front of the exported symbol. 61 */ 62#define CK_EXPORT 63 64/* 65 * Used for MSVC to create the export attribute 66 * CK_DLL_EXP is defined during the compilation of the library 67 * on the command line. 68 */ 69#ifndef CK_DLL_EXP 70# if defined(_MSC_VER) 71# define CK_DLL_EXP __declspec(dllimport) 72# else 73# define CK_DLL_EXP extern 74# endif 75#endif 76 77/* check version numbers */ 78#define CHECK_MAJOR_VERSION (@CHECK_MAJOR_VERSION@) 79#define CHECK_MINOR_VERSION (@CHECK_MINOR_VERSION@) 80#define CHECK_MICRO_VERSION (@CHECK_MICRO_VERSION@) 81CK_DLL_EXP /*extern*/ int CK_EXPORT check_major_version; 82CK_DLL_EXP /*extern*/ int CK_EXPORT check_minor_version; 83CK_DLL_EXP /*extern*/ int CK_EXPORT check_micro_version; 84 85#ifndef NULL 86#define NULL ((void*)0) 87#endif 88 89#if defined(_MSC_VER) 90#define pid_t int 91#endif 92 93/** 94 * Type for a test case 95 * 96 * A TCase represents a test case. Create with tcase_create, free 97 * with tcase_free. For the moment, test cases can only be run 98 * through a suite 99*/ 100typedef struct TCase TCase; 101 102/** 103 * Type for a test function 104 */ 105typedef void (*TFun) (int); 106 107/** 108 * Type for a setup/teardown function 109 */ 110typedef void (*SFun) (void); 111 112/** 113 * Type for a test suite 114 */ 115typedef struct Suite Suite; 116 117/** 118 * Creates a test suite with the given name. 119 * 120 * Create a suite, which will contain test cases. Once 121 * created, use suite_add_tcase() to add test cases. 122 * When finished, create a suite runner from the 123 * suite using srunner_create() 124 * 125 * @param name name of the suite 126 * 127 * @return suite 128 * 129 * @since 0.6.0 130 */ 131CK_DLL_EXP Suite *CK_EXPORT suite_create (const char *name); 132 133/** 134 * Determines whether a given test suite contains a case named after a 135 * given string. 136 * 137 * @param s suite to check 138 * @param tcname test case to look for 139 * 140 * @return 1 iff the given test case is within the given suite; 141 * 0 otherwise 142 * 143 * @since 0.9.9 144 */ 145CK_DLL_EXP int CK_EXPORT suite_tcase (Suite * s, const char *tcname); 146 147/** 148 * Add a test case to a suite. 149 * 150 * Note that if the TCase has already been added attempting 151 * to add it again will be ignored. 152 * 153 * @param s suite to add test case to 154 * @param tc test case to add to suite 155 * 156 * @since 0.6.0 157 */ 158CK_DLL_EXP void CK_EXPORT suite_add_tcase (Suite * s, TCase * tc); 159 160/** 161 * Create a test case. 162 * 163 * Once created, tests can be added with the tcase_add_test() 164 * function, and the test case assigned to a suite with the 165 * suite_add_tcase() function. 166 * 167 * @param name name of the test case 168 * 169 * @return test case containing no tests 170 * 171 * @since 0.6.0 172 * */ 173CK_DLL_EXP TCase *CK_EXPORT tcase_create (const char *name); 174 175/** 176 * Associate a test case with certain tags. 177 * Replaces any existing tags with the new set. 178 * 179 * @param tc the test case 180 * 181 * @param tags string containing arbitrary tags separated by spaces. 182 * This will be copied. Passing NULL clears all tags. 183 * 184 * @since 0.11.0 185 * */ 186CK_DLL_EXP void CK_EXPORT tcase_set_tags (TCase * tc, const char *tags); 187/** 188 * Add a test function to a test case 189 * 190 * @param tc test case to add test to 191 * @param tf test function to add to test case 192 * 193 * @since 0.6.0 194 * */ 195#define tcase_add_test(tc,tf) tcase_add_test_raise_signal(tc,tf,0) 196 197/** 198 * Add a test function with signal handling to a test case 199 * 200 * The added test is expected to terminate by throwing the given signal 201 * 202 * @param tc test case to add test to 203 * @param tf test function to add to test case 204 * @param signal expected signal for test function to throw in order for 205 * the test to be considered passing 206 * 207 * @since 0.9.2 208 * */ 209#define tcase_add_test_raise_signal(tc,tf,signal) \ 210 _tcase_add_test((tc),(tf),"" # tf "",(signal), 0, 0, 1) 211 212/** 213 * Add a test function with an expected exit value to a test case 214 * 215 * The added test is expected to terminate by exiting with the given value 216 * 217 * @param tc test case to add test to 218 * @param tf test function to add to test case 219 * @param expected_exit_value exit value for test function to return in 220 * order for the test to be considered passing 221 * 222 * @since 0.9.7 223 */ 224#define tcase_add_exit_test(tc, tf, expected_exit_value) \ 225 _tcase_add_test((tc),(tf),"" # tf "",0,(expected_exit_value),0,1) 226 227/** 228 * Add a looping test function to a test case 229 * 230 * The test will be called in a for(i = s; i < e; i++) loop with each 231 * iteration being executed in a new context. The loop variable 'i' is 232 * available in the test. 233 * 234 * @param tc test case to add test to 235 * @param tf function to add to test case 236 * @param s starting index for value "i" in test 237 * @param e ending index for value "i" in test 238 * 239 * @since 0.9.4 240 */ 241#define tcase_add_loop_test(tc,tf,s,e) \ 242 _tcase_add_test((tc),(tf),"" # tf "",0,0,(s),(e)) 243 244/** 245 * Add a looping test function with signal handling to a test case 246 * 247 * The test will be called in a for(i = s; i < e; i++) loop with each 248 * iteration being executed in a new context. The loop variable 'i' is 249 * available in the test. 250 * 251 * The added test is expected to terminate by throwing the given signal 252 * 253 * @param tc test case to add test to 254 * @param tf function to add to test case 255 * @param signal expected signal for test function to throw in order for 256 * the test to be considered passing 257 * @param s starting index for value "i" in test 258 * @param e ending index for value "i" in test 259 * 260 * @since 0.9.5 261 */ 262#define tcase_add_loop_test_raise_signal(tc,tf,signal,s,e) \ 263 _tcase_add_test((tc),(tf),"" # tf "",(signal),0,(s),(e)) 264 265/** 266 * Add a looping test function with an expected exit value to a test case 267 * 268 * The test will be called in a for(i = s; i < e; i++) loop with each 269 * iteration being executed in a new context. The loop variable 'i' is 270 * available in the test. 271 * 272 * The added test is expected to terminate by exiting with the given value 273 * 274 * @param tc test case to add test to 275 * @param tf function to add to test case 276 * @param expected_exit_value exit value for test function to return in 277 * order for the test to be considered passing 278 * @param s starting index for value "i" in test 279 * @param e ending index for value "i" in test 280 * 281 * @since 0.9.7 282 */ 283#define tcase_add_loop_exit_test(tc,tf,expected_exit_value,s,e) \ 284 _tcase_add_test((tc),(tf),"" # tf "",0,(expected_exit_value),(s),(e)) 285 286/* Add a test function to a test case 287 (function version -- use this when the macro won't work 288*/ 289CK_DLL_EXP void CK_EXPORT _tcase_add_test (TCase * tc, TFun tf, 290 const char *fname, int _signal, int allowed_exit_value, int start, int end); 291 292/** 293 * Add unchecked fixture setup/teardown functions to a test case 294 * 295 * Unchecked fixture functions are run at the start and end of the 296 * test case, and not before and after unit tests. Further, 297 * unchecked fixture functions are not run in a separate address space, 298 * like test functions, and so must not exit or signal (e.g., 299 * segfault). 300 * 301 * Also, when run in CK_NOFORK mode, unchecked fixture functions may 302 * lead to different unit test behavior if unit tests change data 303 * setup by the fixture functions. 304 * 305 * Note that if a setup function fails, the remaining setup functions 306 * will be omitted, as will the test case and the teardown functions. 307 * If a teardown function fails the remaining teardown functions will be 308 * omitted. 309 * 310 * @param tc test case to add unchecked fixture setup/teardown to 311 * @param setup function to add to be executed before the test case; 312 * if NULL no setup function is added 313 * @param teardown function to add to be executed after the test case; 314 * if NULL no teardown function is added 315 * @since 0.8.0 316 */ 317CK_DLL_EXP void CK_EXPORT tcase_add_unchecked_fixture (TCase * tc, SFun setup, 318 SFun teardown); 319 320/** 321 * Add checked fixture setup/teardown functions to a test case 322 * 323 * Checked fixture functions are run before and after each unit test inside 324 * of the address space of the test. Thus, if using CK_FORK 325 * mode the separate process running the unit test will survive signals 326 * or unexpected exits in the fixture function. Also, if the setup 327 * function is idempotent, unit test behavior will be the same in 328 * CK_FORK and CK_NOFORK modes. 329 * 330 * However, since fixture functions are run before and after each unit 331 * test, they should not be expensive code. 332 * 333 * Note that if a setup function fails, the remaining setup functions 334 * will be omitted, as will the test and the teardown functions. If a 335 * teardown function fails the remaining teardown functions will be 336 * omitted. 337 * 338 * @param tc test case to add checked fixture setup/teardown to 339 * @param setup function to add to be executed before each unit test in 340 * the test case; if NULL no setup function is added 341 * @param teardown function to add to be executed after each unit test in 342 * the test case; if NULL no teardown function is added 343 * 344 * @since 0.8.0 345*/ 346CK_DLL_EXP void CK_EXPORT tcase_add_checked_fixture (TCase * tc, SFun setup, 347 SFun teardown); 348 349/** 350 * Set the timeout for all tests in a test case. 351 * 352 * A test that lasts longer than the timeout (in seconds) will be killed 353 * and thus fail with an error. 354 * 355 * If not set, the default timeout is one assigned at compile time. If 356 * the environment variable CK_DEFAULT_TIMEOUT is defined and no timeout 357 * is set, the value in the environment variable is used. 358 * 359 * If Check is compile without fork() support this call is ignored, 360 * as timeouts are not possible. 361 * 362 * @param tc test case to assign timeout to 363 * @param timeout to use, in seconds. If the value contains a decimal 364 * portion, but no high resolution timer is available, 365 * the value is rounded up to the nearest second. 366 * 367 * @since 0.9.2 368 */ 369CK_DLL_EXP void CK_EXPORT tcase_set_timeout (TCase * tc, double timeout); 370 371/* Internal function to mark the start of a test function */ 372CK_DLL_EXP void CK_EXPORT tcase_fn_start (const char *fname, const char *file, 373 int line); 374 375/** 376 * Start a unit test with START_TEST(unit_name), end with END_TEST. 377 * 378 * One must use braces within a START_/END_ pair to declare new variables 379 * 380 * @since 0.6.0 381 */ 382#define START_TEST(__testname)\ 383static void __testname (int _i CK_ATTRIBUTE_UNUSED)\ 384{\ 385 tcase_fn_start (""# __testname, __FILE__, __LINE__); 386 387/** 388 * End a unit test 389 * 390 * @since 0.6.0 391 */ 392#define END_TEST } 393 394/* 395 * Fail the test case unless expr is false 396 * 397 * This call is deprecated. 398 */ 399#define fail_unless ck_assert_msg 400 401/* 402 * Fail the test case if expr is false 403 * 404 * This call is deprecated. 405 * 406 * NOTE: The space before the comma sign before ## is essential to be compatible 407 * with gcc 2.95.3 and earlier. 408 * FIXME: these macros may conflict with C89 if expr is 409 * FIXME: strcmp (str1, str2) due to excessive string length. 410 */ 411#define fail_if(expr, ...)\ 412 (expr) ? \ 413 _ck_assert_failed(__FILE__, __LINE__, "Failure '"#expr"' occurred" , ## __VA_ARGS__, NULL) \ 414 : _mark_point(__FILE__, __LINE__) 415 416/* 417 * Fail the test 418 * 419 * This call is deprecated. 420 */ 421#define fail ck_abort_msg 422 423/* 424 * This is called whenever an assertion fails. 425 */ 426CK_DLL_EXP void CK_EXPORT 427_ck_assert_failed (const char *file, int line, const char *expr, ...) 428 CK_ATTRIBUTE_NORETURN; 429 430/** 431 * Fail the test if expression is false 432 * 433 * @param expr expression to evaluate 434 * 435 * @note If the check fails, the remaining of the test is aborted 436 * 437 * @since 0.9.6 438 */ 439#define ck_assert(expr) ck_assert_msg(expr, NULL) 440 441/* The space before the comma sign before ## is essential to be compatible 442 with gcc 2.95.3 and earlier. 443*/ 444/** 445 * Fail the test if the expression is false; print message on failure 446 * 447 * @param expr expression to evaluate 448 * @param ... message to print (in printf format) if expression is false 449 * 450 * @note If the check fails, the remaining of the test is aborted 451 * 452 * @since 0.9.6 453 */ 454#define ck_assert_msg(expr, ...) \ 455 (expr) ? \ 456 _mark_point(__FILE__, __LINE__) : \ 457 _ck_assert_failed(__FILE__, __LINE__, "Assertion '"#expr"' failed" , ## __VA_ARGS__, NULL) 458 459/** 460 * Unconditionally fail the test 461 * 462 * @note Once called, the remaining of the test is aborted 463 * 464 * @since 0.9.6 465 */ 466#define ck_abort() ck_abort_msg(NULL) 467/** 468 * Unconditionally fail the test; print a message 469 * 470 * @param ... message to print (in printf format) 471 * 472 * @note Once called, the remaining of the test is aborted 473 * 474 * @since 0.9.6 475 */ 476#define ck_abort_msg(...) _ck_assert_failed(__FILE__, __LINE__, "Failed" , ## __VA_ARGS__, NULL) 477 478/* Signed and unsigned integer comparison macros with improved output compared to ck_assert(). */ 479/* OP may be any comparison operator. */ 480#define _ck_assert_int(X, OP, Y) do { \ 481 gint64 _ck_x = (X); \ 482 gint64 _ck_y = (Y); \ 483 ck_assert_msg(_ck_x OP _ck_y, "Assertion '%s' failed: " \ 484 "%s==%" G_GINT64_FORMAT ", %s==%" G_GINT64_FORMAT, #X#OP#Y, #X, _ck_x, #Y, _ck_y); \ 485} while (0) 486 487/** 488 * Check two signed integers to determine if X==Y 489 * 490 * If not X==Y, the test fails. 491 * 492 * @param X signed integer 493 * @param Y signed integer to compare against X 494 * 495 * @note If the check fails, the remaining of the test is aborted 496 * 497 * @since 0.9.6 498 */ 499#define ck_assert_int_eq(X, Y) _ck_assert_int(X, ==, Y) 500/** 501 * Check two signed integers to determine if X!=Y 502 * 503 * If not X!=Y, the test fails. 504 * 505 * @param X signed integer 506 * @param Y signed integer to compare against X 507 * 508 * @note If the check fails, the remaining of the test is aborted 509 * 510 * @since 0.9.6 511 */ 512#define ck_assert_int_ne(X, Y) _ck_assert_int(X, !=, Y) 513/** 514 * Check two signed integers to determine if X<Y 515 * 516 * If not X<Y, the test fails. 517 * 518 * @param X signed integer 519 * @param Y signed integer to compare against X 520 * 521 * @note If the check fails, the remaining of the test is aborted 522 * 523 * @since 0.9.10 524 */ 525#define ck_assert_int_lt(X, Y) _ck_assert_int(X, <, Y) 526/** 527 * Check two signed integers to determine if X<=Y 528 * 529 * If not X<=Y, the test fails. 530 * 531 * @param X signed integer 532 * @param Y signed integer to compare against X 533 * 534 * @note If the check fails, the remaining of the test is aborted 535 * 536 * @since 0.9.10 537 */ 538#define ck_assert_int_le(X, Y) _ck_assert_int(X, <=, Y) 539/** 540 * Check two signed integers to determine if X>Y 541 * 542 * If not X>Y, the test fails. 543 * 544 * @param X signed integer 545 * @param Y signed integer to compare against X 546 * 547 * @note If the check fails, the remaining of the test is aborted 548 * 549 * @since 0.9.10 550 */ 551#define ck_assert_int_gt(X, Y) _ck_assert_int(X, >, Y) 552/** 553 * Check two signed integers to determine if X>=Y 554 * 555 * If not X>=Y, the test fails. 556 * 557 * @param X signed integer 558 * @param Y signed integer to compare against X 559 * 560 * @note If the check fails, the remaining of the test is aborted 561 * 562 * @since 0.9.10 563 */ 564#define ck_assert_int_ge(X, Y) _ck_assert_int(X, >=, Y) 565 566#define _ck_assert_uint(X, OP, Y) do { \ 567 guint64 _ck_x = (X); \ 568 guint64 _ck_y = (Y); \ 569 ck_assert_msg(_ck_x OP _ck_y, "Assertion '%s' failed: " \ 570 "%s==%" G_GUINT64_FORMAT ", %s==%" G_GUINT64_FORMAT, #X#OP#Y, #X, _ck_x, #Y, _ck_y); \ 571} while (0) 572/** 573 * Check two unsigned integers to determine if X==Y 574 * 575 * If not X==Y, the test fails. 576 * 577 * @param X signed integer 578 * @param Y signed integer to compare against X 579 * 580 * @note If the check fails, the remaining of the test is aborted 581 * 582 * @since 0.9.10 583 */ 584#define ck_assert_uint_eq(X, Y) _ck_assert_uint(X, ==, Y) 585/** 586 * Check two unsigned integers to determine if X!=Y 587 * 588 * If not X!=Y, the test fails. 589 * 590 * @param X signed integer 591 * @param Y signed integer to compare against X 592 * 593 * @note If the check fails, the remaining of the test is aborted 594 * 595 * @since 0.9.10 596 */ 597#define ck_assert_uint_ne(X, Y) _ck_assert_uint(X, !=, Y) 598/** 599 * Check two unsigned integers to determine if X<Y 600 * 601 * If not X<Y, the test fails. 602 * 603 * @param X signed integer 604 * @param Y signed integer to compare against X 605 * 606 * @note If the check fails, the remaining of the test is aborted 607 * 608 * @since 0.9.10 609 */ 610#define ck_assert_uint_lt(X, Y) _ck_assert_uint(X, <, Y) 611/** 612 * Check two unsigned integers to determine if X<=Y 613 * 614 * If not X<=Y, the test fails. 615 * 616 * @param X signed integer 617 * @param Y signed integer to compare against X 618 * 619 * @note If the check fails, the remaining of the test is aborted 620 * 621 * @since 0.9.10 622 */ 623#define ck_assert_uint_le(X, Y) _ck_assert_uint(X, <=, Y) 624/** 625 * Check two unsigned integers to determine if X>Y 626 * 627 * If not X>Y, the test fails. 628 * 629 * @param X signed integer 630 * @param Y signed integer to compare against X 631 * 632 * @note If the check fails, the remaining of the test is aborted 633 * 634 * @since 0.9.10 635 */ 636#define ck_assert_uint_gt(X, Y) _ck_assert_uint(X, >, Y) 637/** 638 * Check two unsigned integers to determine if X>=Y 639 * 640 * If not X>=Y, the test fails. 641 * 642 * @param X signed integer 643 * @param Y signed integer to compare against X 644 * 645 * @note If the check fails, the remaining of the test is aborted 646 * 647 * @since 0.9.10 648 */ 649#define ck_assert_uint_ge(X, Y) _ck_assert_uint(X, >=, Y) 650 651/* String comparison macros with improved output compared to ck_assert() */ 652/* OP might be any operator that can be used in '0 OP strcmp(X,Y)' comparison */ 653/* The x and y parameter swap in strcmp() is needed to handle >, >=, <, <= operators */ 654#define _ck_assert_str(X, OP, Y) do { \ 655 const char* _ck_x = (X); \ 656 const char* _ck_y = (Y); \ 657 ck_assert_msg(0 OP strcmp(_ck_y, _ck_x), \ 658 "Assertion '%s' failed: %s==\"%s\", %s==\"%s\"", #X#OP#Y, #X, _ck_x, #Y, _ck_y); \ 659} while (0) 660/** 661 * Check two strings to determine if 0==strcmp(X,Y) 662 * 663 * If not 0==strcmp(X,Y), the test fails. 664 * 665 * @param X string 666 * @param Y string to compare against X 667 * 668 * @note If the check fails, the remaining of the test is aborted 669 * 670 * @since 0.9.6 671 */ 672#define ck_assert_str_eq(X, Y) _ck_assert_str(X, ==, Y) 673/** 674 * Check two strings to determine if 0!=strcmp(X,Y) 675 * 676 * If not 0!=strcmp(X,Y), the test fails. 677 * 678 * @param X string 679 * @param Y string to compare against X 680 * 681 * @note If the check fails, the remaining of the test is aborted 682 * 683 * @since 0.9.6 684 */ 685#define ck_assert_str_ne(X, Y) _ck_assert_str(X, !=, Y) 686/** 687 * Check two strings to determine if 0<strcmp(X,Y), (e.g. strcmp(X,Y)>0) 688 * 689 * If not 0<strcmp(X,Y), the test fails. 690 * 691 * @param X string 692 * @param Y string to compare against X 693 * 694 * @note If the check fails, the remaining of the test is aborted 695 * 696 * @since 0.9.10 697 */ 698#define ck_assert_str_lt(X, Y) _ck_assert_str(X, <, Y) 699/** 700 * Check two strings to determine if 0<=strcmp(X,Y) (e.g. strcmp(X,Y)>=0) 701 * 702 * If not 0<=strcmp(X,Y), the test fails. 703 * 704 * @param X string 705 * @param Y string to compare against X 706 * 707 * @note If the check fails, the remaining of the test is aborted 708 * 709 * @since 0.9.10 710 */ 711#define ck_assert_str_le(X, Y) _ck_assert_str(X, <=, Y) 712/** 713 * Check two strings to determine if 0<strcmp(X,Y) (e.g. strcmp(X,Y)>0) 714 * 715 * If not 0<strcmp(X,Y), the test fails. 716 * 717 * @param X string 718 * @param Y string to compare against X 719 * 720 * @note If the check fails, the remaining of the test is aborted 721 * 722 * @since 0.9.10 723 */ 724#define ck_assert_str_gt(X, Y) _ck_assert_str(X, >, Y) 725/** 726 * Check two strings to determine if 0>=strcmp(X,Y) (e.g. strcmp(X,Y)<=0) 727 * 728 * If not 0>=strcmp(X,Y), the test fails. 729 * 730 * @param X string 731 * @param Y string to compare against X 732 * 733 * @note If the check fails, the remaining of the test is aborted 734 * 735 * @since 0.9.10 736 */ 737#define ck_assert_str_ge(X, Y) _ck_assert_str(X, >=, Y) 738 739/* Pointer comparison macros with improved output compared to ck_assert(). */ 740/* OP may only be == or != */ 741#define _ck_assert_ptr(X, OP, Y) do { \ 742 const void* _ck_x = (X); \ 743 const void* _ck_y = (Y); \ 744 ck_assert_msg(_ck_x OP _ck_y, "Assertion '%s' failed: %s==%#x, %s==%#x", #X#OP#Y, #X, _ck_x, #Y, _ck_y); \ 745} while (0) 746 747/** 748 * Check if two pointers are equal. 749 * 750 * If the two passed pointers are not equal, the test 751 * fails. 752 * 753 * @param X pointer 754 * @param Y pointer to compare against X 755 * 756 * @note If the check fails, the remaining of the test is aborted 757 * 758 * @since 0.9.10 759 */ 760#define ck_assert_ptr_eq(X, Y) _ck_assert_ptr(X, ==, Y) 761 762/** 763 * Check if two pointers are not. 764 * 765 * If the two passed pointers are equal, the test fails. 766 * 767 * @param X pointer 768 * @param Y pointer to compare against X 769 * 770 * @since 0.9.10 771 */ 772#define ck_assert_ptr_ne(X, Y) _ck_assert_ptr(X, !=, Y) 773 774/** 775 * Mark the last point reached in a unit test. 776 * 777 * If the test throws a signal or exits, the location noted with the 778 * failure is the last location of a ck_assert*() or ck_abort() call. 779 * Use mark_point() to record intermediate locations (useful for tracking down 780 * crashes or exits). 781 * 782 * @since 0.6.0 783*/ 784#define mark_point() _mark_point(__FILE__,__LINE__) 785 786/* Non macro version of #mark_point */ 787CK_DLL_EXP void CK_EXPORT _mark_point (const char *file, int line); 788 789/** 790 * Enum describing the possible results of a test 791 */ 792enum test_result 793{ 794 CK_TEST_RESULT_INVALID, /**< Default value; should not encounter this */ 795 CK_PASS, /**< Test passed */ 796 CK_FAILURE, /**< Test completed but failed */ 797 CK_ERROR /**< Test failed to complete 798 (unexpected signal or non-zero early exit) */ 799}; 800 801/** 802 * Enum specifying the verbosity of output a SRunner should produce 803 */ 804enum print_output 805{ 806 CK_SILENT, /**< No output */ 807 CK_MINIMAL, /**< Only summary output */ 808 CK_NORMAL, /**< All failed tests */ 809 CK_VERBOSE, /**< All tests */ 810 CK_ENV, /**< Look at environment var CK_VERBOSITY 811 for what verbosity to use, which can be 812 either "silent", "minimal", "normal", 813 or "verbose". If the environment variable 814 is not set, then CK_NORMAL will be used.*/ 815#if @ENABLE_SUBUNIT@ 816 CK_SUBUNIT, /**< Run as a subunit child process */ 817#endif 818 CK_LAST /**< Not a valid option */ 819}; 820 821/** 822 * Holds state for a running of a test suite 823 */ 824typedef struct SRunner SRunner; 825 826/** 827 * Opaque type for a test failure 828 */ 829typedef struct TestResult TestResult; 830 831/** 832 * Enum representing the types of contexts for a test 833 */ 834enum ck_result_ctx 835{ 836 CK_CTX_INVALID, /**< Default value; should not encounter this */ 837 CK_CTX_SETUP, /**< Setup before a test */ 838 CK_CTX_TEST, /**< Body of test itself */ 839 CK_CTX_TEARDOWN /**< Teardown after a test */ 840}; 841 842/** 843 * Retrieve type of result that the given test result represents. 844 * 845 * This is a member of test_result, and can represent a 846 * pass, failure, or error. 847 * 848 * @param tr test result to retrieve result from 849 * 850 * @return result of given test 851 * 852 * @since 0.6.0 853 */ 854CK_DLL_EXP int CK_EXPORT tr_rtype (TestResult * tr); 855 856/** 857 * Retrieve context in which the result occurred for the given test result. 858 * 859 * The types of contents include the test setup, teardown, or the 860 * body of the test itself. 861 * 862 * @param tr test result to retrieve context from 863 * 864 * @return context to which the given test result applies 865 * 866 * @since 0.8.0 867 */ 868CK_DLL_EXP enum ck_result_ctx CK_EXPORT tr_ctx (TestResult * tr); 869 870/** 871 * Retrieve failure message from test result, if applicable. 872 * 873 * @return pointer to a message, if one exists. NULL otherwise. 874 * 875 * @since 0.6.0 876 */ 877CK_DLL_EXP const char *CK_EXPORT tr_msg (TestResult * tr); 878 879/** 880 * Retrieve line number at which a failure occurred, if applicable. 881 * 882 * @return If the test resulted in a failure, returns the line number 883 * that the failure occurred on; otherwise returns -1. 884 * 885 * @since 0.6.0 886 */ 887CK_DLL_EXP int CK_EXPORT tr_lno (TestResult * tr); 888 889/** 890 * Retrieve file name at which a failure occurred, if applicable. 891 * 892 * @return If the test resulted in a failure, returns a string 893 * containing the name of the file where the failure 894 * occurred; otherwise returns NULL. 895 * 896 * @since 0.6.0 897 */ 898CK_DLL_EXP const char *CK_EXPORT tr_lfile (TestResult * tr); 899 900/** 901 * Retrieve test case name in which a failure occurred, if applicable. 902 * 903 * @return If the test resulted in a failure, returns a string 904 * containing the name of the test suite where the failure 905 * occurred; otherwise returns NULL. 906 * 907 * @since 0.6.0 908 */ 909CK_DLL_EXP const char *CK_EXPORT tr_tcname (TestResult * tr); 910 911/** 912 * Creates a suite runner for the given suite. 913 * 914 * Once created, additional suites can be added to the 915 * suite runner using srunner_add_suite(), and the suite runner can be 916 * run with srunner_run_all(). Once finished, the suite runner 917 * must be freed with srunner_free(). 918 * 919 * @param s suite to generate a suite runner for 920 * 921 * @return suite runner for the given suite 922 * 923 * @since 0.6.0 924 */ 925CK_DLL_EXP SRunner *CK_EXPORT srunner_create (Suite * s); 926 927/** 928 * Add an additional suite to a suite runner. 929 * 930 * The first suite in a suite runner is always added in srunner_create(). 931 * This call adds additional suites to a suite runner. 932 * 933 * @param sr suite runner to add the given suite 934 * @param s suite to add to the given suite runner 935 * 936 * @since 0.7.0 937 */ 938CK_DLL_EXP void CK_EXPORT srunner_add_suite (SRunner * sr, Suite * s); 939 940/** 941 * Frees a suite runner, including all contained suite and test cases. 942 * 943 * This call is responsible for freeing all resources related to a 944 * suite runner and all contained suites and test cases. Suite and 945 * test cases need not be freed individually, as this call handles that. 946 * 947 * @param sr suite runner to free 948 * 949 * @since 0.6.0 950 */ 951CK_DLL_EXP void CK_EXPORT srunner_free (SRunner * sr); 952 953/** 954 * Runs a suite runner and all contained suite, printing results to 955 * stdout as specified by the print_mode. 956 * 957 * In addition to running all suites, if the suite runner has been 958 * configured to output to a log, that is also performed. 959 * 960 * Note that if the CK_RUN_CASE, CK_RUN_SUITE, CK_INCLUDE_TAGS and/or 961 * CK_EXCLUDE_TAGS environment variables are defined, then only the 962 * named suites or test cases will run. 963 * 964 * @param sr suite runner to run all suites from 965 * @param print_mode the verbosity in which to report results to stdout 966 * 967 * @since 0.6.0 968 */ 969CK_DLL_EXP void CK_EXPORT srunner_run_all (SRunner * sr, 970 enum print_output print_mode); 971 972/** 973 * Run a specific suite or test case from a suite runner, printing results 974 * to stdout as specified by the print_mode. 975 * 976 * In addition to running any applicable suites or test cases, if the 977 * suite runner has been configured to output to a log, that is also 978 * performed. 979 * 980 * Note that if the sname and tcname parameters are passed as null 981 * then the function will fallback to using the environment variables 982 * CK_RUN_SUITE and CK_RUN_CASE respectively in order to select the 983 * suite/cases. 984 * 985 * Similarly if the CK_INCLUDE_TAGS and/or CK_EXCLUDE_TAGS environment 986 * variables are defined then these will further filter the test cases 987 * (see srunner_run_tagged, below). 988 * 989 * @param sr suite runner where the given suite or test case must be 990 * @param sname suite name to run. A NULL means use the value of the 991 * environment variable CK_RUN_SUITE if set, otherwise run "any/every 992 * suite". 993 * @param tcname test case name to run. A NULL means use the value of 994 * the environment variable CK_RUN_CASE if set, otherwise run 995 * "any/every case". 996 * @param print_mode the verbosity in which to report results to stdout 997 * 998 * @since 0.9.9 999 */ 1000CK_DLL_EXP void CK_EXPORT srunner_run (SRunner * sr, const char *sname, 1001 const char *tcname, enum print_output print_mode); 1002 1003 1004/** 1005 * Run a specific suite or test case or testcases with specific tags 1006 * from a suite runner, printing results to stdout as specified by the 1007 * print_mode. 1008 * 1009 * In addition to running any applicable suites or test cases, if the 1010 * suite runner has been configured to output to a log, that is also 1011 * performed. 1012 * 1013 * Note that if sname, tcname, include_tags, exclude_tags parameters 1014 * are passed as NULL then if the environment variables CK_RUN_SUITE, 1015 * CK_RUN_CASE, CK_INCLUDE_TAGS, CK_EXCLUDE_TAGS are defined then these 1016 * values will be used instead. 1017 * 1018 * @param sr suite runner where the given suite or test case must be 1019 * @param sname suite name to run. A NULL means use the value of the 1020 * environment variable CK_RUN_SUITE if set, otherwise run "any/every 1021 * suite". 1022 * @param tcname test case name to run. A NULL means use the value of 1023 * the environment variable CK_RUN_CASE if set, otherwise run 1024 * "any/every case". 1025 * @param include_tags space separate list of tags. Only run test 1026 * cases that share one of these tags. A NULL means use the value of 1027 * the environment variable CK_INCLUDE_TAGS if set, otherwise run 1028 * "any/every test case". 1029 * @param exclude_tags space separate list of tags. Only run test 1030 * cases that do not share one of these tags even if they are selected 1031 * by an included tag. A NULL means use the value of the environment 1032 * variable CK_EXCLUDE_TAGS if set, otherwise run "any/every test 1033 * case". 1034 * @param print_mode the verbosity in which to report results to stdout 1035 * 1036 * @since 0.11.0 1037 */ 1038CK_DLL_EXP void CK_EXPORT srunner_run_tagged (SRunner * sr, const char *sname, 1039 const char *tcname, 1040 const char *include_tags, 1041 const char *exclude_tags, enum print_output print_mode); 1042 1043/** 1044 * Retrieve the number of failed tests executed by a suite runner. 1045 * 1046 * This value represents both test failures and errors. 1047 * 1048 * @param sr suite runner to query for all failed tests 1049 * 1050 * @return number of test failures and errors found by the suite runner 1051 * 1052 * @since 0.6.1 1053 */ 1054CK_DLL_EXP int CK_EXPORT srunner_ntests_failed (SRunner * sr); 1055 1056/** 1057 * Retrieve the total number of tests run by a suite runner. 1058 * 1059 * @param sr suite runner to query for all tests run 1060 * 1061 * @return number of all tests run by the suite runner 1062 * 1063 * @since 0.6.1 1064 */ 1065CK_DLL_EXP int CK_EXPORT srunner_ntests_run (SRunner * sr); 1066 1067/** 1068 * Return an array of results for all failures found by a suite runner. 1069 * 1070 * Number of results is equal to srunner_nfailed_tests(). 1071 * 1072 * Information about individual results can be queried using: 1073 * tr_rtype(), tr_ctx(), tr_msg(), tr_lno(), tr_lfile(), and tr_tcname(). 1074 * 1075 * Memory is malloc'ed and must be freed; however free the entire structure 1076 * instead of individual test cases. 1077 * 1078 * @param sr suite runner to retrieve results from 1079 * 1080 * @return array of TestResult objects 1081 * 1082 * @since 0.6.0 1083 */ 1084CK_DLL_EXP TestResult **CK_EXPORT srunner_failures (SRunner * sr); 1085 1086/** 1087 * Return an array of results for all tests run by a suite runner. 1088 * 1089 * Number of results is equal to srunner_ntests_run(), and excludes 1090 * failures due to setup function failure. 1091 * 1092 * Information about individual results can be queried using: 1093 * tr_rtype(), tr_ctx(), tr_msg(), tr_lno(), tr_lfile(), and tr_tcname(). 1094 * 1095 * Memory is malloc'ed and must be freed; however free the entire structure 1096 * instead of individual test cases. 1097 * 1098 * @param sr suite runner to retrieve results from 1099 * 1100 * @return array of TestResult objects 1101 * 1102 * @since 0.6.1 1103*/ 1104CK_DLL_EXP TestResult **CK_EXPORT srunner_results (SRunner * sr); 1105 1106/** 1107 * Print the results contained in an SRunner to stdout. 1108 * 1109 * @param sr suite runner to print results for to stdout 1110 * @param print_mode the print_output (verbosity) to use to report 1111 * the result 1112 * 1113 * @since 0.7.0 1114 */ 1115CK_DLL_EXP void CK_EXPORT srunner_print (SRunner * sr, 1116 enum print_output print_mode); 1117 1118/** 1119 * Set the suite runner to output the result in log format to the 1120 * given file. 1121 * 1122 * Note: log file setting is an initialize only operation -- it should 1123 * be done immediately after SRunner creation, and the log file can't be 1124 * changed after being set. 1125 * 1126 * This setting does not conflict with the other log output types; 1127 * all logging types can occur concurrently if configured. 1128 * 1129 * @param sr suite runner to log results of in log format 1130 * @param fname file name to output log results to 1131 * 1132 * @since 0.7.1 1133*/ 1134CK_DLL_EXP void CK_EXPORT srunner_set_log (SRunner * sr, const char *fname); 1135 1136/** 1137 * Checks if the suite runner is assigned a file for log output. 1138 * 1139 * @param sr suite runner to check 1140 * 1141 * @return 1 iff the suite runner currently is configured to output 1142 * in log format; 0 otherwise 1143 * 1144 * @since 0.7.1 1145 */ 1146CK_DLL_EXP int CK_EXPORT srunner_has_log (SRunner * sr); 1147 1148/** 1149 * Retrieves the name of the currently assigned file 1150 * for log output, if any exists. 1151 * 1152 * @return the name of the log file, or NULL if none is configured 1153 * 1154 * @since 0.7.1 1155 */ 1156CK_DLL_EXP const char *CK_EXPORT srunner_log_fname (SRunner * sr); 1157 1158/** 1159 * Set the suite runner to output the result in XML format to the 1160 * given file. 1161 * 1162 * Note: XML file setting is an initialize only operation -- it should 1163 * be done immediately after SRunner creation, and the XML file can't be 1164 * changed after being set. 1165 * 1166 * This setting does not conflict with the other log output types; 1167 * all logging types can occur concurrently if configured. 1168 * 1169 * @param sr suite runner to log results of in XML format 1170 * @param fname file name to output XML results to 1171 * 1172 * @since 0.9.1 1173*/ 1174CK_DLL_EXP void CK_EXPORT srunner_set_xml (SRunner * sr, const char *fname); 1175 1176/** 1177 * Checks if the suite runner is assigned a file for XML output. 1178 * 1179 * @param sr suite runner to check 1180 * 1181 * @return 1 iff the suite runner currently is configured to output 1182 * in XML format; 0 otherwise 1183 * 1184 * @since 0.9.1 1185 */ 1186CK_DLL_EXP int CK_EXPORT srunner_has_xml (SRunner * sr); 1187 1188/** 1189 * Retrieves the name of the currently assigned file 1190 * for XML output, if any exists. 1191 * 1192 * @return the name of the XML file, or NULL if none is configured 1193 * 1194 * @since 0.9.1 1195 */ 1196CK_DLL_EXP const char *CK_EXPORT srunner_xml_fname (SRunner * sr); 1197 1198/** 1199 * Set the suite runner to output the result in TAP format to the 1200 * given file. 1201 * 1202 * Note: TAP file setting is an initialize only operation -- it should 1203 * be done immediately after SRunner creation, and the TAP file can't be 1204 * changed after being set. 1205 * 1206 * This setting does not conflict with the other log output types; 1207 * all logging types can occur concurrently if configured. 1208 * 1209 * @param sr suite runner to log results of in TAP format 1210 * @param fname file name to output TAP results to 1211 * 1212 * @since 0.9.12 1213*/ 1214CK_DLL_EXP void CK_EXPORT srunner_set_tap (SRunner * sr, const char *fname); 1215 1216/** 1217 * Checks if the suite runner is assigned a file for TAP output. 1218 * 1219 * @param sr suite runner to check 1220 * 1221 * @return 1 iff the suite runner currently is configured to output 1222 * in TAP format; 0 otherwise 1223 * 1224 * @since 0.9.12 1225 */ 1226CK_DLL_EXP int CK_EXPORT srunner_has_tap (SRunner * sr); 1227 1228/** 1229 * Retrieves the name of the currently assigned file 1230 * for TAP output, if any exists. 1231 * 1232 * @return the name of the TAP file, or NULL if none is configured 1233 * 1234 * @since 0.9.12 1235 */ 1236CK_DLL_EXP const char *CK_EXPORT srunner_tap_fname (SRunner * sr); 1237 1238/** 1239 * Enum describing the current fork usage. 1240 */ 1241enum fork_status 1242{ 1243 CK_FORK_GETENV, /**< look in the environment for CK_FORK */ 1244 CK_FORK, /**< call fork to run tests */ 1245 CK_NOFORK /**< don't call fork */ 1246}; 1247 1248/** 1249 * Retrieve the current fork status for the given suite runner 1250 * 1251 * @param sr suite runner to check fork status of 1252 * 1253 * @since 0.8.0 1254 */ 1255CK_DLL_EXP enum fork_status CK_EXPORT srunner_fork_status (SRunner * sr); 1256 1257/** 1258 * Set the fork status for a given suite runner. 1259 * 1260 * The default fork status is CK_FORK_GETENV, which will look 1261 * for the CK_FORK environment variable, which can be set to 1262 * "yes" or "no". If the environment variable is not present, 1263 * CK_FORK will be used if fork() is available on the system, 1264 * otherwise CK_NOFORK is used. 1265 * 1266 * If set to CK_FORK or CK_NOFORK, the environment variable 1267 * if defined is ignored. 1268 * 1269 * If Check is compiled without support for fork(), attempting 1270 * to set the status to CK_FORK is ignored. 1271 * 1272 * @param sr suite runner to assign the fork status to 1273 * @param fstat fork status to assign 1274 * 1275 * @since 0.8.0 1276 */ 1277CK_DLL_EXP void CK_EXPORT srunner_set_fork_status (SRunner * sr, 1278 enum fork_status fstat); 1279 1280/** 1281 * Invoke fork() during a test and assign the child to the same 1282 * process group that the rest of the test case uses. 1283 * 1284 * One can invoke fork() directly during a test; however doing so 1285 * may not guarantee that any children processes are destroyed once 1286 * the test finishes. Once a test has completed, all processes in 1287 * the process group will be killed; using this wrapper will prevent 1288 * orphan processes. 1289 * 1290 * If Check is compiled without fork() support this call simply 1291 * return -1 and does nothing. 1292 * 1293 * @return On success, the PID of the child process is returned in 1294 * the parent, and 0 is returned in the child. On failure, 1295 * a value of -1 is returned to the parent process and no 1296 * child process is created. 1297 * 1298 * @since 0.9.3 1299 */ 1300#if !defined(_MSC_VER) 1301CK_DLL_EXP pid_t CK_EXPORT check_fork (void); 1302#endif 1303 1304/** 1305 * Wait for the pid and exit. 1306 * 1307 * This is to be used in conjunction with check_fork(). When called, 1308 * will wait for the given process to terminate. If the process 1309 * exited without error, exit(EXIT_SUCCESS) is invoked; otherwise 1310 * exit(EXIT_FAILURE) is invoked. 1311 * 1312 * If Check is compiled without support for fork(), this invokes 1313 * exit(EXIT_FAILURE). 1314 * 1315 * @param pid process to wait for, created by check_fork() 1316 * 1317 * @since 0.9.3 1318 */ 1319#if !defined(_MSC_VER) 1320CK_DLL_EXP void CK_EXPORT 1321check_waitpid_and_exit (pid_t pid) 1322 CK_ATTRIBUTE_NORETURN; 1323#endif 1324 1325#ifdef __cplusplus 1326CK_CPPEND 1327#endif 1328#endif /* CHECK_H */ 1329