1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 4 * 5 * kselftest_harness.h: simple C unit test helper. 6 * 7 * See documentation in Documentation/dev-tools/kselftest.rst 8 * 9 * API inspired by code.google.com/p/googletest 10 */ 11 12 /** 13 * DOC: example 14 * 15 * .. code-block:: c 16 * 17 * #include "kselftest_harness.h" 18 * 19 * TEST(standalone_test) { 20 * do_some_stuff; 21 * EXPECT_GT(10, stuff) { 22 * stuff_state_t state; 23 * enumerate_stuff_state(&state); 24 * TH_LOG("expectation failed with state: %s", state.msg); 25 * } 26 * more_stuff; 27 * ASSERT_NE(some_stuff, NULL) TH_LOG("how did it happen?!"); 28 * last_stuff; 29 * EXPECT_EQ(0, last_stuff); 30 * } 31 * 32 * FIXTURE(my_fixture) { 33 * mytype_t *data; 34 * int awesomeness_level; 35 * }; 36 * FIXTURE_SETUP(my_fixture) { 37 * self->data = mytype_new(); 38 * ASSERT_NE(NULL, self->data); 39 * } 40 * FIXTURE_TEARDOWN(my_fixture) { 41 * mytype_free(self->data); 42 * } 43 * TEST_F(my_fixture, data_is_good) { 44 * EXPECT_EQ(1, is_my_data_good(self->data)); 45 * } 46 * 47 * TEST_HARNESS_MAIN 48 */ 49 50 #ifndef __KSELFTEST_HARNESS_H 51 #define __KSELFTEST_HARNESS_H 52 53 #ifndef _GNU_SOURCE 54 #define _GNU_SOURCE 55 #endif 56 #include <asm/types.h> 57 #include <ctype.h> 58 #include <errno.h> 59 #include <linux/unistd.h> 60 #include <poll.h> 61 #include <stdbool.h> 62 #include <stdint.h> 63 #include <stdio.h> 64 #include <stdlib.h> 65 #include <string.h> 66 #include <sys/mman.h> 67 #include <sys/types.h> 68 #include <sys/wait.h> 69 #include <unistd.h> 70 71 #include "kselftest.h" 72 73 static inline void __kselftest_memset_safe(void *s, int c, size_t n) 74 { 75 if (n > 0) 76 memset(s, c, n); 77 } 78 79 #define TEST_TIMEOUT_DEFAULT 30 80 81 /* Utilities exposed to the test definitions */ 82 #ifndef TH_LOG_STREAM 83 # define TH_LOG_STREAM stderr 84 #endif 85 86 #ifndef TH_LOG_ENABLED 87 # define TH_LOG_ENABLED 1 88 #endif 89 90 /** 91 * TH_LOG() 92 * 93 * @fmt: format string 94 * @...: optional arguments 95 * 96 * .. code-block:: c 97 * 98 * TH_LOG(format, ...) 99 * 100 * Optional debug logging function available for use in tests. 101 * Logging may be enabled or disabled by defining TH_LOG_ENABLED. 102 * E.g., #define TH_LOG_ENABLED 1 103 * 104 * If no definition is provided, logging is enabled by default. 105 */ 106 #define TH_LOG(fmt, ...) do { \ 107 if (TH_LOG_ENABLED) \ 108 __TH_LOG(fmt, ##__VA_ARGS__); \ 109 } while (0) 110 111 /* Unconditional logger for internal use. */ 112 #define __TH_LOG(fmt, ...) \ 113 fprintf(TH_LOG_STREAM, "# %s:%d:%s:" fmt "\n", \ 114 __FILE__, __LINE__, _metadata->name, ##__VA_ARGS__) 115 116 /** 117 * SKIP() 118 * 119 * @statement: statement to run after reporting SKIP 120 * @fmt: format string 121 * @...: optional arguments 122 * 123 * .. code-block:: c 124 * 125 * SKIP(statement, fmt, ...); 126 * 127 * This forces a "pass" after reporting why something is being skipped 128 * and runs "statement", which is usually "return" or "goto skip". 129 */ 130 #define SKIP(statement, fmt, ...) do { \ 131 snprintf(_metadata->results->reason, \ 132 sizeof(_metadata->results->reason), fmt, ##__VA_ARGS__); \ 133 if (TH_LOG_ENABLED) { \ 134 fprintf(TH_LOG_STREAM, "# SKIP %s\n", \ 135 _metadata->results->reason); \ 136 } \ 137 _metadata->exit_code = KSFT_SKIP; \ 138 _metadata->trigger = 0; \ 139 statement; \ 140 } while (0) 141 142 /** 143 * TEST() - Defines the test function and creates the registration 144 * stub 145 * 146 * @test_name: test name 147 * 148 * .. code-block:: c 149 * 150 * TEST(name) { implementation } 151 * 152 * Defines a test by name. 153 * Names must be unique and tests must not be run in parallel. The 154 * implementation containing block is a function and scoping should be treated 155 * as such. Returning early may be performed with a bare "return;" statement. 156 * 157 * EXPECT_* and ASSERT_* are valid in a TEST() { } context. 158 */ 159 #define TEST(test_name) __TEST_IMPL(test_name, -1) 160 161 /** 162 * TEST_SIGNAL() 163 * 164 * @test_name: test name 165 * @signal: signal number 166 * 167 * .. code-block:: c 168 * 169 * TEST_SIGNAL(name, signal) { implementation } 170 * 171 * Defines a test by name and the expected term signal. 172 * Names must be unique and tests must not be run in parallel. The 173 * implementation containing block is a function and scoping should be treated 174 * as such. Returning early may be performed with a bare "return;" statement. 175 * 176 * EXPECT_* and ASSERT_* are valid in a TEST() { } context. 177 */ 178 #define TEST_SIGNAL(test_name, signal) __TEST_IMPL(test_name, signal) 179 180 #define __TEST_IMPL(test_name, _signal) \ 181 static void test_name(struct __test_metadata *_metadata); \ 182 static void wrapper_##test_name( \ 183 struct __test_metadata *_metadata, \ 184 struct __fixture_variant_metadata __attribute__((unused)) *variant) \ 185 { \ 186 test_name(_metadata); \ 187 } \ 188 static struct __test_metadata _##test_name##_object = \ 189 { .name = #test_name, \ 190 .fn = &wrapper_##test_name, \ 191 .fixture = &_fixture_global, \ 192 .termsig = _signal, \ 193 .timeout = TEST_TIMEOUT_DEFAULT, }; \ 194 static void __attribute__((constructor)) _register_##test_name(void) \ 195 { \ 196 __register_test(&_##test_name##_object); \ 197 } \ 198 static void test_name( \ 199 struct __test_metadata __attribute__((unused)) *_metadata) 200 201 /** 202 * FIXTURE_DATA() - Wraps the struct name so we have one less 203 * argument to pass around 204 * 205 * @datatype_name: datatype name 206 * 207 * .. code-block:: c 208 * 209 * FIXTURE_DATA(datatype_name) 210 * 211 * Almost always, you want just FIXTURE() instead (see below). 212 * This call may be used when the type of the fixture data 213 * is needed. In general, this should not be needed unless 214 * the *self* is being passed to a helper directly. 215 */ 216 #define FIXTURE_DATA(datatype_name) struct _test_data_##datatype_name 217 218 /** 219 * FIXTURE() - Called once per fixture to setup the data and 220 * register 221 * 222 * @fixture_name: fixture name 223 * 224 * .. code-block:: c 225 * 226 * FIXTURE(fixture_name) { 227 * type property1; 228 * ... 229 * }; 230 * 231 * Defines the data provided to TEST_F()-defined tests as *self*. It should be 232 * populated and cleaned up using FIXTURE_SETUP() and FIXTURE_TEARDOWN(). 233 */ 234 #define FIXTURE(fixture_name) \ 235 FIXTURE_VARIANT(fixture_name); \ 236 static struct __fixture_metadata _##fixture_name##_fixture_object = \ 237 { .name = #fixture_name, }; \ 238 static void __attribute__((constructor)) \ 239 _register_##fixture_name##_data(void) \ 240 { \ 241 __register_fixture(&_##fixture_name##_fixture_object); \ 242 } \ 243 FIXTURE_DATA(fixture_name) 244 245 /** 246 * FIXTURE_SETUP() - Prepares the setup function for the fixture. 247 * *_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly. 248 * 249 * @fixture_name: fixture name 250 * 251 * .. code-block:: c 252 * 253 * FIXTURE_SETUP(fixture_name) { implementation } 254 * 255 * Populates the required "setup" function for a fixture. An instance of the 256 * datatype defined with FIXTURE_DATA() will be exposed as *self* for the 257 * implementation. 258 * 259 * ASSERT_* are valid for use in this context and will prempt the execution 260 * of any dependent fixture tests. 261 * 262 * A bare "return;" statement may be used to return early. 263 */ 264 #define FIXTURE_SETUP(fixture_name) \ 265 static void fixture_name##_setup( \ 266 struct __test_metadata __attribute__((unused)) *_metadata, \ 267 FIXTURE_DATA(fixture_name) __attribute__((unused)) *self, \ 268 const FIXTURE_VARIANT(fixture_name) \ 269 __attribute__((unused)) *variant) 270 271 /** 272 * FIXTURE_TEARDOWN() 273 * *_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly. 274 * 275 * @fixture_name: fixture name 276 * 277 * .. code-block:: c 278 * 279 * FIXTURE_TEARDOWN(fixture_name) { implementation } 280 * 281 * Populates the required "teardown" function for a fixture. An instance of the 282 * datatype defined with FIXTURE_DATA() will be exposed as *self* for the 283 * implementation to clean up. 284 * 285 * A bare "return;" statement may be used to return early. 286 */ 287 #define FIXTURE_TEARDOWN(fixture_name) \ 288 static const bool fixture_name##_teardown_parent; \ 289 __FIXTURE_TEARDOWN(fixture_name) 290 291 /** 292 * FIXTURE_TEARDOWN_PARENT() 293 * *_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly. 294 * 295 * @fixture_name: fixture name 296 * 297 * .. code-block:: c 298 * 299 * FIXTURE_TEARDOWN_PARENT(fixture_name) { implementation } 300 * 301 * Same as FIXTURE_TEARDOWN() but run this code in a parent process. This 302 * enables the test process to drop its privileges without impacting the 303 * related FIXTURE_TEARDOWN_PARENT() (e.g. to remove files from a directory 304 * where write access was dropped). 305 * 306 * To make it possible for the parent process to use *self*, share (MAP_SHARED) 307 * the fixture data between all forked processes. 308 */ 309 #define FIXTURE_TEARDOWN_PARENT(fixture_name) \ 310 static const bool fixture_name##_teardown_parent = true; \ 311 __FIXTURE_TEARDOWN(fixture_name) 312 313 #define __FIXTURE_TEARDOWN(fixture_name) \ 314 static void fixture_name##_teardown( \ 315 struct __test_metadata __attribute__((unused)) *_metadata, \ 316 FIXTURE_DATA(fixture_name) __attribute__((unused)) *self, \ 317 const FIXTURE_VARIANT(fixture_name) \ 318 __attribute__((unused)) *variant) 319 320 /** 321 * FIXTURE_VARIANT() - Optionally called once per fixture 322 * to declare fixture variant 323 * 324 * @fixture_name: fixture name 325 * 326 * .. code-block:: c 327 * 328 * FIXTURE_VARIANT(fixture_name) { 329 * type property1; 330 * ... 331 * }; 332 * 333 * Defines type of constant parameters provided to FIXTURE_SETUP(), TEST_F() and 334 * FIXTURE_TEARDOWN as *variant*. Variants allow the same tests to be run with 335 * different arguments. 336 */ 337 #define FIXTURE_VARIANT(fixture_name) struct _fixture_variant_##fixture_name 338 339 /** 340 * FIXTURE_VARIANT_ADD() - Called once per fixture 341 * variant to setup and register the data 342 * 343 * @fixture_name: fixture name 344 * @variant_name: name of the parameter set 345 * 346 * .. code-block:: c 347 * 348 * FIXTURE_VARIANT_ADD(fixture_name, variant_name) { 349 * .property1 = val1, 350 * ... 351 * }; 352 * 353 * Defines a variant of the test fixture, provided to FIXTURE_SETUP() and 354 * TEST_F() as *variant*. Tests of each fixture will be run once for each 355 * variant. 356 */ 357 #define FIXTURE_VARIANT_ADD(fixture_name, variant_name) \ 358 extern const FIXTURE_VARIANT(fixture_name) \ 359 _##fixture_name##_##variant_name##_variant; \ 360 static struct __fixture_variant_metadata \ 361 _##fixture_name##_##variant_name##_object = \ 362 { .name = #variant_name, \ 363 .data = &_##fixture_name##_##variant_name##_variant}; \ 364 static void __attribute__((constructor)) \ 365 _register_##fixture_name##_##variant_name(void) \ 366 { \ 367 __register_fixture_variant(&_##fixture_name##_fixture_object, \ 368 &_##fixture_name##_##variant_name##_object); \ 369 } \ 370 const FIXTURE_VARIANT(fixture_name) \ 371 _##fixture_name##_##variant_name##_variant = 372 373 /** 374 * TEST_F() - Emits test registration and helpers for 375 * fixture-based test cases 376 * 377 * @fixture_name: fixture name 378 * @test_name: test name 379 * 380 * .. code-block:: c 381 * 382 * TEST_F(fixture, name) { implementation } 383 * 384 * Defines a test that depends on a fixture (e.g., is part of a test case). 385 * Very similar to TEST() except that *self* is the setup instance of fixture's 386 * datatype exposed for use by the implementation. 387 * 388 * The _metadata object is shared (MAP_SHARED) with all the potential forked 389 * processes, which enables them to use EXCEPT_*() and ASSERT_*(). 390 * 391 * The *self* object is only shared with the potential forked processes if 392 * FIXTURE_TEARDOWN_PARENT() is used instead of FIXTURE_TEARDOWN(). 393 */ 394 #define TEST_F(fixture_name, test_name) \ 395 __TEST_F_IMPL(fixture_name, test_name, -1, TEST_TIMEOUT_DEFAULT) 396 397 #define TEST_F_SIGNAL(fixture_name, test_name, signal) \ 398 __TEST_F_IMPL(fixture_name, test_name, signal, TEST_TIMEOUT_DEFAULT) 399 400 #define TEST_F_TIMEOUT(fixture_name, test_name, timeout) \ 401 __TEST_F_IMPL(fixture_name, test_name, -1, timeout) 402 403 #define __TEST_F_IMPL(fixture_name, test_name, signal, tmout) \ 404 static void fixture_name##_##test_name( \ 405 struct __test_metadata *_metadata, \ 406 FIXTURE_DATA(fixture_name) *self, \ 407 const FIXTURE_VARIANT(fixture_name) *variant); \ 408 static void wrapper_##fixture_name##_##test_name( \ 409 struct __test_metadata *_metadata, \ 410 struct __fixture_variant_metadata *variant) \ 411 { \ 412 /* fixture data is alloced, setup, and torn down per call. */ \ 413 FIXTURE_DATA(fixture_name) self_private, *self = NULL; \ 414 pid_t child = 1; \ 415 int status = 0; \ 416 /* Makes sure there is only one teardown, even when child forks again. */ \ 417 _metadata->no_teardown = mmap(NULL, sizeof(*_metadata->no_teardown), \ 418 PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); \ 419 *_metadata->no_teardown = true; \ 420 if (sizeof(*self) > 0) { \ 421 if (fixture_name##_teardown_parent) { \ 422 self = mmap(NULL, sizeof(*self), PROT_READ | PROT_WRITE, \ 423 MAP_SHARED | MAP_ANONYMOUS, -1, 0); \ 424 } else { \ 425 __kselftest_memset_safe(&self_private, 0, sizeof(self_private)); \ 426 self = &self_private; \ 427 } \ 428 } \ 429 _metadata->variant = variant->data; \ 430 _metadata->self = self; \ 431 /* _metadata and potentially self are shared with all forks. */ \ 432 child = fork(); \ 433 if (child == 0) { \ 434 fixture_name##_setup(_metadata, self, variant->data); \ 435 /* Let setup failure terminate early. */ \ 436 if (_metadata->exit_code) \ 437 _exit(0); \ 438 *_metadata->no_teardown = false; \ 439 fixture_name##_##test_name(_metadata, self, variant->data); \ 440 _metadata->teardown_fn(false, _metadata, self, variant->data); \ 441 _exit(0); \ 442 } else if (child < 0 || child != waitpid(child, &status, 0)) { \ 443 ksft_print_msg("ERROR SPAWNING TEST GRANDCHILD\n"); \ 444 _metadata->exit_code = KSFT_FAIL; \ 445 } \ 446 _metadata->teardown_fn(true, _metadata, self, variant->data); \ 447 munmap(_metadata->no_teardown, sizeof(*_metadata->no_teardown)); \ 448 _metadata->no_teardown = NULL; \ 449 if (self && fixture_name##_teardown_parent) \ 450 munmap(self, sizeof(*self)); \ 451 if (WIFEXITED(status)) { \ 452 if (WEXITSTATUS(status)) \ 453 _metadata->exit_code = WEXITSTATUS(status); \ 454 } else if (WIFSIGNALED(status)) { \ 455 /* Forward signal to __wait_for_test(). */ \ 456 kill(getpid(), WTERMSIG(status)); \ 457 } \ 458 } \ 459 static void wrapper_##fixture_name##_##test_name##_teardown( \ 460 bool in_parent, struct __test_metadata *_metadata, \ 461 void *self, const void *variant) \ 462 { \ 463 if (fixture_name##_teardown_parent == in_parent && \ 464 !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ 465 fixture_name##_teardown(_metadata, self, variant); \ 466 } \ 467 static struct __test_metadata *_##fixture_name##_##test_name##_object; \ 468 static void __attribute__((constructor)) \ 469 _register_##fixture_name##_##test_name(void) \ 470 { \ 471 struct __test_metadata *object = mmap(NULL, sizeof(*object), \ 472 PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); \ 473 object->name = #test_name; \ 474 object->fn = &wrapper_##fixture_name##_##test_name; \ 475 object->fixture = &_##fixture_name##_fixture_object; \ 476 object->teardown_fn = &wrapper_##fixture_name##_##test_name##_teardown; \ 477 object->termsig = signal; \ 478 object->timeout = tmout; \ 479 _##fixture_name##_##test_name##_object = object; \ 480 __register_test(object); \ 481 } \ 482 static void fixture_name##_##test_name( \ 483 struct __test_metadata __attribute__((unused)) *_metadata, \ 484 FIXTURE_DATA(fixture_name) __attribute__((unused)) *self, \ 485 const FIXTURE_VARIANT(fixture_name) \ 486 __attribute__((unused)) *variant) 487 488 /** 489 * TEST_HARNESS_MAIN - Simple wrapper to run the test harness 490 * 491 * .. code-block:: c 492 * 493 * TEST_HARNESS_MAIN 494 * 495 * Use once to append a main() to the test file. 496 */ 497 #define TEST_HARNESS_MAIN \ 498 int main(int argc, char **argv) { \ 499 return test_harness_run(argc, argv); \ 500 } 501 502 /** 503 * DOC: operators 504 * 505 * Operators for use in TEST() and TEST_F(). 506 * ASSERT_* calls will stop test execution immediately. 507 * EXPECT_* calls will emit a failure warning, note it, and continue. 508 */ 509 510 /** 511 * ASSERT_EQ() 512 * 513 * @expected: expected value 514 * @seen: measured value 515 * 516 * ASSERT_EQ(expected, measured): expected == measured 517 */ 518 #define ASSERT_EQ(expected, seen) \ 519 __EXPECT(expected, #expected, seen, #seen, ==, 1) 520 521 /** 522 * ASSERT_NE() 523 * 524 * @expected: expected value 525 * @seen: measured value 526 * 527 * ASSERT_NE(expected, measured): expected != measured 528 */ 529 #define ASSERT_NE(expected, seen) \ 530 __EXPECT(expected, #expected, seen, #seen, !=, 1) 531 532 /** 533 * ASSERT_LT() 534 * 535 * @expected: expected value 536 * @seen: measured value 537 * 538 * ASSERT_LT(expected, measured): expected < measured 539 */ 540 #define ASSERT_LT(expected, seen) \ 541 __EXPECT(expected, #expected, seen, #seen, <, 1) 542 543 /** 544 * ASSERT_LE() 545 * 546 * @expected: expected value 547 * @seen: measured value 548 * 549 * ASSERT_LE(expected, measured): expected <= measured 550 */ 551 #define ASSERT_LE(expected, seen) \ 552 __EXPECT(expected, #expected, seen, #seen, <=, 1) 553 554 /** 555 * ASSERT_GT() 556 * 557 * @expected: expected value 558 * @seen: measured value 559 * 560 * ASSERT_GT(expected, measured): expected > measured 561 */ 562 #define ASSERT_GT(expected, seen) \ 563 __EXPECT(expected, #expected, seen, #seen, >, 1) 564 565 /** 566 * ASSERT_GE() 567 * 568 * @expected: expected value 569 * @seen: measured value 570 * 571 * ASSERT_GE(expected, measured): expected >= measured 572 */ 573 #define ASSERT_GE(expected, seen) \ 574 __EXPECT(expected, #expected, seen, #seen, >=, 1) 575 576 /** 577 * ASSERT_NULL() 578 * 579 * @seen: measured value 580 * 581 * ASSERT_NULL(measured): NULL == measured 582 */ 583 #define ASSERT_NULL(seen) \ 584 __EXPECT(NULL, "NULL", seen, #seen, ==, 1) 585 586 /** 587 * ASSERT_TRUE() 588 * 589 * @seen: measured value 590 * 591 * ASSERT_TRUE(measured): measured != 0 592 */ 593 #define ASSERT_TRUE(seen) \ 594 __EXPECT(0, "0", seen, #seen, !=, 1) 595 596 /** 597 * ASSERT_FALSE() 598 * 599 * @seen: measured value 600 * 601 * ASSERT_FALSE(measured): measured == 0 602 */ 603 #define ASSERT_FALSE(seen) \ 604 __EXPECT(0, "0", seen, #seen, ==, 1) 605 606 /** 607 * ASSERT_STREQ() 608 * 609 * @expected: expected value 610 * @seen: measured value 611 * 612 * ASSERT_STREQ(expected, measured): !strcmp(expected, measured) 613 */ 614 #define ASSERT_STREQ(expected, seen) \ 615 __EXPECT_STR(expected, seen, ==, 1) 616 617 /** 618 * ASSERT_STRNE() 619 * 620 * @expected: expected value 621 * @seen: measured value 622 * 623 * ASSERT_STRNE(expected, measured): strcmp(expected, measured) 624 */ 625 #define ASSERT_STRNE(expected, seen) \ 626 __EXPECT_STR(expected, seen, !=, 1) 627 628 /** 629 * EXPECT_EQ() 630 * 631 * @expected: expected value 632 * @seen: measured value 633 * 634 * EXPECT_EQ(expected, measured): expected == measured 635 */ 636 #define EXPECT_EQ(expected, seen) \ 637 __EXPECT(expected, #expected, seen, #seen, ==, 0) 638 639 /** 640 * EXPECT_NE() 641 * 642 * @expected: expected value 643 * @seen: measured value 644 * 645 * EXPECT_NE(expected, measured): expected != measured 646 */ 647 #define EXPECT_NE(expected, seen) \ 648 __EXPECT(expected, #expected, seen, #seen, !=, 0) 649 650 /** 651 * EXPECT_LT() 652 * 653 * @expected: expected value 654 * @seen: measured value 655 * 656 * EXPECT_LT(expected, measured): expected < measured 657 */ 658 #define EXPECT_LT(expected, seen) \ 659 __EXPECT(expected, #expected, seen, #seen, <, 0) 660 661 /** 662 * EXPECT_LE() 663 * 664 * @expected: expected value 665 * @seen: measured value 666 * 667 * EXPECT_LE(expected, measured): expected <= measured 668 */ 669 #define EXPECT_LE(expected, seen) \ 670 __EXPECT(expected, #expected, seen, #seen, <=, 0) 671 672 /** 673 * EXPECT_GT() 674 * 675 * @expected: expected value 676 * @seen: measured value 677 * 678 * EXPECT_GT(expected, measured): expected > measured 679 */ 680 #define EXPECT_GT(expected, seen) \ 681 __EXPECT(expected, #expected, seen, #seen, >, 0) 682 683 /** 684 * EXPECT_GE() 685 * 686 * @expected: expected value 687 * @seen: measured value 688 * 689 * EXPECT_GE(expected, measured): expected >= measured 690 */ 691 #define EXPECT_GE(expected, seen) \ 692 __EXPECT(expected, #expected, seen, #seen, >=, 0) 693 694 /** 695 * EXPECT_NULL() 696 * 697 * @seen: measured value 698 * 699 * EXPECT_NULL(measured): NULL == measured 700 */ 701 #define EXPECT_NULL(seen) \ 702 __EXPECT(NULL, "NULL", seen, #seen, ==, 0) 703 704 /** 705 * EXPECT_TRUE() 706 * 707 * @seen: measured value 708 * 709 * EXPECT_TRUE(measured): 0 != measured 710 */ 711 #define EXPECT_TRUE(seen) \ 712 __EXPECT(0, "0", seen, #seen, !=, 0) 713 714 /** 715 * EXPECT_FALSE() 716 * 717 * @seen: measured value 718 * 719 * EXPECT_FALSE(measured): 0 == measured 720 */ 721 #define EXPECT_FALSE(seen) \ 722 __EXPECT(0, "0", seen, #seen, ==, 0) 723 724 /** 725 * EXPECT_STREQ() 726 * 727 * @expected: expected value 728 * @seen: measured value 729 * 730 * EXPECT_STREQ(expected, measured): !strcmp(expected, measured) 731 */ 732 #define EXPECT_STREQ(expected, seen) \ 733 __EXPECT_STR(expected, seen, ==, 0) 734 735 /** 736 * EXPECT_STRNE() 737 * 738 * @expected: expected value 739 * @seen: measured value 740 * 741 * EXPECT_STRNE(expected, measured): strcmp(expected, measured) 742 */ 743 #define EXPECT_STRNE(expected, seen) \ 744 __EXPECT_STR(expected, seen, !=, 0) 745 746 #ifndef ARRAY_SIZE 747 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 748 #endif 749 750 /* Support an optional handler after and ASSERT_* or EXPECT_*. The approach is 751 * not thread-safe, but it should be fine in most sane test scenarios. 752 * 753 * Using __bail(), which optionally abort()s, is the easiest way to early 754 * return while still providing an optional block to the API consumer. 755 */ 756 #define OPTIONAL_HANDLER(_assert) \ 757 for (; _metadata->trigger; _metadata->trigger = \ 758 __bail(_assert, _metadata)) 759 760 #define is_signed_var(var) (!!(((__typeof__(var))(-1)) < (__typeof__(var))1)) 761 762 #define __EXPECT(_expected, _expected_str, _seen, _seen_str, _t, _assert) do { \ 763 /* Avoid multiple evaluation of the cases */ \ 764 __typeof__(_expected) __exp = (_expected); \ 765 __typeof__(_seen) __seen = (_seen); \ 766 if (!(__exp _t __seen)) { \ 767 /* Report with actual signedness to avoid weird output. */ \ 768 switch (is_signed_var(__exp) * 2 + is_signed_var(__seen)) { \ 769 case 0: { \ 770 uintmax_t __exp_print = (uintmax_t)__exp; \ 771 uintmax_t __seen_print = (uintmax_t)__seen; \ 772 __TH_LOG("Expected %s (%ju) %s %s (%ju)", \ 773 _expected_str, __exp_print, #_t, \ 774 _seen_str, __seen_print); \ 775 break; \ 776 } \ 777 case 1: { \ 778 uintmax_t __exp_print = (uintmax_t)__exp; \ 779 intmax_t __seen_print = (intmax_t)__seen; \ 780 __TH_LOG("Expected %s (%ju) %s %s (%jd)", \ 781 _expected_str, __exp_print, #_t, \ 782 _seen_str, __seen_print); \ 783 break; \ 784 } \ 785 case 2: { \ 786 intmax_t __exp_print = (intmax_t)__exp; \ 787 uintmax_t __seen_print = (uintmax_t)__seen; \ 788 __TH_LOG("Expected %s (%jd) %s %s (%ju)", \ 789 _expected_str, __exp_print, #_t, \ 790 _seen_str, __seen_print); \ 791 break; \ 792 } \ 793 case 3: { \ 794 intmax_t __exp_print = (intmax_t)__exp; \ 795 intmax_t __seen_print = (intmax_t)__seen; \ 796 __TH_LOG("Expected %s (%jd) %s %s (%jd)", \ 797 _expected_str, __exp_print, #_t, \ 798 _seen_str, __seen_print); \ 799 break; \ 800 } \ 801 } \ 802 _metadata->exit_code = KSFT_FAIL; \ 803 /* Ensure the optional handler is triggered */ \ 804 _metadata->trigger = 1; \ 805 } \ 806 } while (0); OPTIONAL_HANDLER(_assert) 807 808 #define __EXPECT_STR(_expected, _seen, _t, _assert) do { \ 809 const char *__exp = (_expected); \ 810 const char *__seen = (_seen); \ 811 if (!(strcmp(__exp, __seen) _t 0)) { \ 812 __TH_LOG("Expected '%s' %s '%s'.", __exp, #_t, __seen); \ 813 _metadata->exit_code = KSFT_FAIL; \ 814 _metadata->trigger = 1; \ 815 } \ 816 } while (0); OPTIONAL_HANDLER(_assert) 817 818 /* List helpers */ 819 #define __LIST_APPEND(head, item) \ 820 { \ 821 /* Circular linked list where only prev is circular. */ \ 822 if (head == NULL) { \ 823 head = item; \ 824 item->next = NULL; \ 825 item->prev = item; \ 826 return; \ 827 } \ 828 if (__constructor_order_forward) { \ 829 item->next = NULL; \ 830 item->prev = head->prev; \ 831 item->prev->next = item; \ 832 head->prev = item; \ 833 } else { \ 834 item->next = head; \ 835 item->next->prev = item; \ 836 item->prev = item; \ 837 head = item; \ 838 } \ 839 } 840 841 struct __test_results { 842 char reason[1024]; /* Reason for test result */ 843 }; 844 845 struct __test_metadata; 846 struct __fixture_variant_metadata; 847 848 /* Contains all the information about a fixture. */ 849 struct __fixture_metadata { 850 const char *name; 851 struct __test_metadata *tests; 852 struct __fixture_variant_metadata *variant; 853 struct __fixture_metadata *prev, *next; 854 } _fixture_global __attribute__((unused)) = { 855 .name = "global", 856 .prev = &_fixture_global, 857 }; 858 859 struct __test_xfail { 860 struct __fixture_metadata *fixture; 861 struct __fixture_variant_metadata *variant; 862 struct __test_metadata *test; 863 struct __test_xfail *prev, *next; 864 }; 865 866 /** 867 * XFAIL_ADD() - mark variant + test case combination as expected to fail 868 * @fixture_name: name of the fixture 869 * @variant_name: name of the variant 870 * @test_name: name of the test case 871 * 872 * Mark a combination of variant + test case for a given fixture as expected 873 * to fail. Tests marked this way will report XPASS / XFAIL return codes, 874 * instead of PASS / FAIL,and use respective counters. 875 */ 876 #define XFAIL_ADD(fixture_name, variant_name, test_name) \ 877 static struct __test_xfail \ 878 _##fixture_name##_##variant_name##_##test_name##_xfail = \ 879 { \ 880 .fixture = &_##fixture_name##_fixture_object, \ 881 .variant = &_##fixture_name##_##variant_name##_object, \ 882 }; \ 883 static void __attribute__((constructor)) \ 884 _register_##fixture_name##_##variant_name##_##test_name##_xfail(void) \ 885 { \ 886 _##fixture_name##_##variant_name##_##test_name##_xfail.test = \ 887 _##fixture_name##_##test_name##_object; \ 888 __register_xfail(&_##fixture_name##_##variant_name##_##test_name##_xfail); \ 889 } 890 891 static struct __fixture_metadata *__fixture_list = &_fixture_global; 892 static bool __constructor_order_forward; 893 894 static inline void __register_fixture(struct __fixture_metadata *f) 895 { 896 __LIST_APPEND(__fixture_list, f); 897 } 898 899 struct __fixture_variant_metadata { 900 const char *name; 901 const void *data; 902 struct __test_xfail *xfails; 903 struct __fixture_variant_metadata *prev, *next; 904 }; 905 906 static inline void 907 __register_fixture_variant(struct __fixture_metadata *f, 908 struct __fixture_variant_metadata *variant) 909 { 910 __LIST_APPEND(f->variant, variant); 911 } 912 913 /* Contains all the information for test execution and status checking. */ 914 struct __test_metadata { 915 const char *name; 916 void (*fn)(struct __test_metadata *, 917 struct __fixture_variant_metadata *); 918 pid_t pid; /* pid of test when being run */ 919 struct __fixture_metadata *fixture; 920 void (*teardown_fn)(bool in_parent, struct __test_metadata *_metadata, 921 void *self, const void *variant); 922 int termsig; 923 int exit_code; 924 int trigger; /* extra handler after the evaluation */ 925 int timeout; /* seconds to wait for test timeout */ 926 bool aborted; /* stopped test due to failed ASSERT */ 927 bool *no_teardown; /* fixture needs teardown */ 928 void *self; 929 const void *variant; 930 struct __test_results *results; 931 struct __test_metadata *prev, *next; 932 }; 933 934 static inline bool __test_passed(struct __test_metadata *metadata) 935 { 936 return metadata->exit_code != KSFT_FAIL && 937 metadata->exit_code <= KSFT_SKIP; 938 } 939 940 /* 941 * Since constructors are called in reverse order, reverse the test 942 * list so tests are run in source declaration order. 943 * https://gcc.gnu.org/onlinedocs/gccint/Initialization.html 944 * However, it seems not all toolchains do this correctly, so use 945 * __constructor_order_foward to detect which direction is called first 946 * and adjust list building logic to get things running in the right 947 * direction. 948 */ 949 static inline void __register_test(struct __test_metadata *t) 950 { 951 __LIST_APPEND(t->fixture->tests, t); 952 } 953 954 static inline void __register_xfail(struct __test_xfail *xf) 955 { 956 __LIST_APPEND(xf->variant->xfails, xf); 957 } 958 959 static inline int __bail(int for_realz, struct __test_metadata *t) 960 { 961 /* if this is ASSERT, return immediately. */ 962 if (for_realz) { 963 if (t->teardown_fn) 964 t->teardown_fn(false, t, t->self, t->variant); 965 abort(); 966 } 967 /* otherwise, end the for loop and continue. */ 968 return 0; 969 } 970 971 static void __wait_for_test(struct __test_metadata *t) 972 { 973 /* 974 * Sets status so that WIFEXITED(status) returns true and 975 * WEXITSTATUS(status) returns KSFT_FAIL. This safe default value 976 * should never be evaluated because of the waitpid(2) check and 977 * timeout handling. 978 */ 979 int status = KSFT_FAIL << 8; 980 struct pollfd poll_child; 981 int ret, child, childfd; 982 bool timed_out = false; 983 984 childfd = syscall(__NR_pidfd_open, t->pid, 0); 985 if (childfd == -1) { 986 t->exit_code = KSFT_FAIL; 987 fprintf(TH_LOG_STREAM, 988 "# %s: unable to open pidfd\n", 989 t->name); 990 return; 991 } 992 993 poll_child.fd = childfd; 994 poll_child.events = POLLIN; 995 ret = poll(&poll_child, 1, t->timeout * 1000); 996 if (ret == -1) { 997 t->exit_code = KSFT_FAIL; 998 fprintf(TH_LOG_STREAM, 999 "# %s: unable to wait on child pidfd\n", 1000 t->name); 1001 return; 1002 } else if (ret == 0) { 1003 timed_out = true; 1004 /* signal process group */ 1005 kill(-(t->pid), SIGKILL); 1006 } 1007 child = waitpid(t->pid, &status, WNOHANG); 1008 if (child == -1 && errno != EINTR) { 1009 t->exit_code = KSFT_FAIL; 1010 fprintf(TH_LOG_STREAM, 1011 "# %s: Failed to wait for PID %d (errno: %d)\n", 1012 t->name, t->pid, errno); 1013 return; 1014 } 1015 1016 if (timed_out) { 1017 t->exit_code = KSFT_FAIL; 1018 fprintf(TH_LOG_STREAM, 1019 "# %s: Test terminated by timeout\n", t->name); 1020 } else if (WIFEXITED(status)) { 1021 if (WEXITSTATUS(status) == KSFT_SKIP || 1022 WEXITSTATUS(status) == KSFT_XPASS || 1023 WEXITSTATUS(status) == KSFT_XFAIL) { 1024 t->exit_code = WEXITSTATUS(status); 1025 } else if (t->termsig != -1) { 1026 t->exit_code = KSFT_FAIL; 1027 fprintf(TH_LOG_STREAM, 1028 "# %s: Test exited normally instead of by signal (code: %d)\n", 1029 t->name, 1030 WEXITSTATUS(status)); 1031 } else { 1032 switch (WEXITSTATUS(status)) { 1033 /* Success */ 1034 case KSFT_PASS: 1035 t->exit_code = KSFT_PASS; 1036 break; 1037 /* Failure */ 1038 default: 1039 t->exit_code = KSFT_FAIL; 1040 fprintf(TH_LOG_STREAM, 1041 "# %s: Test failed\n", 1042 t->name); 1043 } 1044 } 1045 } else if (WIFSIGNALED(status)) { 1046 t->exit_code = KSFT_FAIL; 1047 if (WTERMSIG(status) == SIGABRT) { 1048 fprintf(TH_LOG_STREAM, 1049 "# %s: Test terminated by assertion\n", 1050 t->name); 1051 } else if (WTERMSIG(status) == t->termsig) { 1052 t->exit_code = KSFT_PASS; 1053 } else { 1054 fprintf(TH_LOG_STREAM, 1055 "# %s: Test terminated unexpectedly by signal %d\n", 1056 t->name, 1057 WTERMSIG(status)); 1058 } 1059 } else { 1060 t->exit_code = KSFT_FAIL; 1061 fprintf(TH_LOG_STREAM, 1062 "# %s: Test ended in some other way [%u]\n", 1063 t->name, 1064 status); 1065 } 1066 } 1067 1068 static void test_harness_list_tests(void) 1069 { 1070 struct __fixture_variant_metadata *v; 1071 struct __fixture_metadata *f; 1072 struct __test_metadata *t; 1073 1074 for (f = __fixture_list; f; f = f->next) { 1075 v = f->variant; 1076 t = f->tests; 1077 1078 if (f == __fixture_list) 1079 fprintf(stderr, "%-20s %-25s %s\n", 1080 "# FIXTURE", "VARIANT", "TEST"); 1081 else 1082 fprintf(stderr, "--------------------------------------------------------------------------------\n"); 1083 1084 do { 1085 fprintf(stderr, "%-20s %-25s %s\n", 1086 t == f->tests ? f->name : "", 1087 v ? v->name : "", 1088 t ? t->name : ""); 1089 1090 v = v ? v->next : NULL; 1091 t = t ? t->next : NULL; 1092 } while (v || t); 1093 } 1094 } 1095 1096 static int test_harness_argv_check(int argc, char **argv) 1097 { 1098 int opt; 1099 1100 while ((opt = getopt(argc, argv, "dhlF:f:V:v:t:T:r:")) != -1) { 1101 switch (opt) { 1102 case 'f': 1103 case 'F': 1104 case 'v': 1105 case 'V': 1106 case 't': 1107 case 'T': 1108 case 'r': 1109 break; 1110 case 'l': 1111 test_harness_list_tests(); 1112 return KSFT_SKIP; 1113 case 'd': 1114 ksft_debug_enabled = true; 1115 break; 1116 case 'h': 1117 default: 1118 fprintf(stderr, 1119 "Usage: %s [-h|-l|-d] [-t|-T|-v|-V|-f|-F|-r name]\n" 1120 "\t-h print help\n" 1121 "\t-l list all tests\n" 1122 "\t-d enable debug prints\n" 1123 "\n" 1124 "\t-t name include test\n" 1125 "\t-T name exclude test\n" 1126 "\t-v name include variant\n" 1127 "\t-V name exclude variant\n" 1128 "\t-f name include fixture\n" 1129 "\t-F name exclude fixture\n" 1130 "\t-r name run specified test\n" 1131 "\n" 1132 "Test filter options can be specified " 1133 "multiple times. The filtering stops\n" 1134 "at the first match. For example to " 1135 "include all tests from variant 'bla'\n" 1136 "but not test 'foo' specify '-T foo -v bla'.\n" 1137 "", argv[0]); 1138 return opt == 'h' ? KSFT_SKIP : KSFT_FAIL; 1139 } 1140 } 1141 1142 return KSFT_PASS; 1143 } 1144 1145 static bool test_enabled(int argc, char **argv, 1146 struct __fixture_metadata *f, 1147 struct __fixture_variant_metadata *v, 1148 struct __test_metadata *t) 1149 { 1150 unsigned int flen = 0, vlen = 0, tlen = 0; 1151 bool has_positive = false; 1152 int opt; 1153 1154 optind = 1; 1155 while ((opt = getopt(argc, argv, "dF:f:V:v:t:T:r:")) != -1) { 1156 if (opt != 'd') 1157 has_positive |= islower(opt); 1158 1159 switch (tolower(opt)) { 1160 case 't': 1161 if (!strcmp(t->name, optarg)) 1162 return islower(opt); 1163 break; 1164 case 'f': 1165 if (!strcmp(f->name, optarg)) 1166 return islower(opt); 1167 break; 1168 case 'v': 1169 if (!strcmp(v->name, optarg)) 1170 return islower(opt); 1171 break; 1172 case 'r': 1173 if (!tlen) { 1174 flen = strlen(f->name); 1175 vlen = strlen(v->name); 1176 tlen = strlen(t->name); 1177 } 1178 if (strlen(optarg) == flen + 1 + vlen + !!vlen + tlen && 1179 !strncmp(f->name, &optarg[0], flen) && 1180 !strncmp(v->name, &optarg[flen + 1], vlen) && 1181 !strncmp(t->name, &optarg[flen + 1 + vlen + !!vlen], tlen)) 1182 return true; 1183 break; 1184 } 1185 } 1186 1187 /* 1188 * If there are no positive tests then we assume user just wants 1189 * exclusions and everything else is a pass. 1190 */ 1191 return !has_positive; 1192 } 1193 1194 static void __run_test(struct __fixture_metadata *f, 1195 struct __fixture_variant_metadata *variant, 1196 struct __test_metadata *t) 1197 { 1198 struct __test_xfail *xfail; 1199 char test_name[1024]; 1200 const char *diagnostic; 1201 int child; 1202 1203 /* reset test struct */ 1204 t->exit_code = KSFT_PASS; 1205 t->trigger = 0; 1206 t->aborted = false; 1207 t->no_teardown = NULL; 1208 memset(t->results->reason, 0, sizeof(t->results->reason)); 1209 1210 snprintf(test_name, sizeof(test_name), "%s%s%s.%s", 1211 f->name, variant->name[0] ? "." : "", variant->name, t->name); 1212 1213 ksft_print_msg(" RUN %s ...\n", test_name); 1214 1215 /* Make sure output buffers are flushed before fork */ 1216 fflush(stdout); 1217 fflush(stderr); 1218 1219 child = fork(); 1220 if (child < 0) { 1221 ksft_print_msg("ERROR SPAWNING TEST CHILD\n"); 1222 t->exit_code = KSFT_FAIL; 1223 } else if (child == 0) { 1224 setpgrp(); 1225 t->fn(t, variant); 1226 _exit(t->exit_code); 1227 } else { 1228 t->pid = child; 1229 __wait_for_test(t); 1230 } 1231 ksft_print_msg(" %4s %s\n", 1232 __test_passed(t) ? "OK" : "FAIL", test_name); 1233 1234 /* Check if we're expecting this test to fail */ 1235 for (xfail = variant->xfails; xfail; xfail = xfail->next) 1236 if (xfail->test == t) 1237 break; 1238 if (xfail) 1239 t->exit_code = __test_passed(t) ? KSFT_XPASS : KSFT_XFAIL; 1240 1241 if (t->results->reason[0]) 1242 diagnostic = t->results->reason; 1243 else if (t->exit_code == KSFT_PASS || t->exit_code == KSFT_FAIL) 1244 diagnostic = NULL; 1245 else 1246 diagnostic = "unknown"; 1247 1248 ksft_test_result_code(t->exit_code, test_name, 1249 diagnostic ? "%s" : NULL, diagnostic); 1250 } 1251 1252 static int test_harness_run(int argc, char **argv) 1253 { 1254 struct __fixture_variant_metadata no_variant = { .name = "", }; 1255 struct __fixture_variant_metadata *v; 1256 struct __fixture_metadata *f; 1257 struct __test_results *results; 1258 struct __test_metadata *t; 1259 int ret; 1260 unsigned int case_count = 0, test_count = 0; 1261 unsigned int count = 0; 1262 unsigned int pass_count = 0; 1263 1264 ret = test_harness_argv_check(argc, argv); 1265 if (ret != KSFT_PASS) 1266 return ret; 1267 1268 for (f = __fixture_list; f; f = f->next) { 1269 for (v = f->variant ?: &no_variant; v; v = v->next) { 1270 unsigned int old_tests = test_count; 1271 1272 for (t = f->tests; t; t = t->next) 1273 if (test_enabled(argc, argv, f, v, t)) 1274 test_count++; 1275 1276 if (old_tests != test_count) 1277 case_count++; 1278 } 1279 } 1280 1281 results = mmap(NULL, sizeof(*results), PROT_READ | PROT_WRITE, 1282 MAP_SHARED | MAP_ANONYMOUS, -1, 0); 1283 1284 ksft_print_header(); 1285 ksft_set_plan(test_count); 1286 ksft_print_msg("Starting %u tests from %u test cases.\n", 1287 test_count, case_count); 1288 for (f = __fixture_list; f; f = f->next) { 1289 for (v = f->variant ?: &no_variant; v; v = v->next) { 1290 for (t = f->tests; t; t = t->next) { 1291 if (!test_enabled(argc, argv, f, v, t)) 1292 continue; 1293 count++; 1294 t->results = results; 1295 __run_test(f, v, t); 1296 t->results = NULL; 1297 if (__test_passed(t)) 1298 pass_count++; 1299 else 1300 ret = 1; 1301 } 1302 } 1303 } 1304 munmap(results, sizeof(*results)); 1305 1306 ksft_print_msg("%s: %u / %u tests passed.\n", ret ? "FAILED" : "PASSED", 1307 pass_count, count); 1308 ksft_exit(ret == 0); 1309 1310 /* unreachable */ 1311 return KSFT_FAIL; 1312 } 1313 1314 static void __attribute__((constructor)) __constructor_order_first(void) 1315 { 1316 __constructor_order_forward = true; 1317 } 1318 1319 #endif /* __KSELFTEST_HARNESS_H */ 1320