Lines Matching full:test
3 * Base unit test (KUnit) API.
10 #include <kunit/test.h>
11 #include <kunit/test-bug.h>
31 * Hook to fail the current test and print an error message to the log.
81 "Print test stats: never (0), only for multiple subtests (1), or always (2)");
101 static void kunit_print_test_stats(struct kunit *test, in kunit_print_test_stats() argument
107 kunit_log(KERN_INFO, test, in kunit_print_test_stats()
110 test->name, in kunit_print_test_stats()
143 /* Currently supported test levels */
153 * We do not log the test suite header as doing so would in kunit_print_suite_start()
154 * mean debugfs display would consist of the test suite in kunit_print_suite_start()
155 * header prior to individual test results. in kunit_print_suite_start()
168 static void kunit_print_ok_not_ok(struct kunit *test, in kunit_print_ok_not_ok() argument
179 * When test is NULL assume that results are from the suite in kunit_print_ok_not_ok()
182 WARN(!test && test_level, "suite test level can't be %u!\n", test_level); in kunit_print_ok_not_ok()
185 * We do not log the test suite results as doing so would in kunit_print_ok_not_ok()
186 * mean debugfs display would consist of an incorrect test in kunit_print_ok_not_ok()
191 if (!test) in kunit_print_ok_not_ok()
197 kunit_log(KERN_INFO, test, in kunit_print_ok_not_ok()
251 static void kunit_print_string_stream(struct kunit *test, in kunit_print_string_stream() argument
262 kunit_err(test, in kunit_print_string_stream()
265 kunit_err(test, "%s", fragment->fragment); in kunit_print_string_stream()
267 kunit_err(test, "\n"); in kunit_print_string_stream()
269 kunit_err(test, "%s", buf); in kunit_print_string_stream()
274 static void kunit_fail(struct kunit *test, const struct kunit_loc *loc, in kunit_fail() argument
280 kunit_set_failure(test); in kunit_fail()
282 stream = kunit_alloc_string_stream(test, GFP_KERNEL); in kunit_fail()
294 kunit_print_string_stream(test, stream); in kunit_fail()
296 kunit_free_string_stream(test, stream); in kunit_fail()
299 void __noreturn __kunit_abort(struct kunit *test) in __kunit_abort() argument
301 kunit_try_catch_throw(&test->try_catch); /* Does not return. */ in __kunit_abort()
304 * Throw could not abort from test. in __kunit_abort()
309 WARN_ONCE(true, "Throw could not abort from test!\n"); in __kunit_abort()
313 void __kunit_do_failed_assertion(struct kunit *test, in __kunit_do_failed_assertion() argument
327 kunit_fail(test, loc, type, assert, assert_format, &message); in __kunit_do_failed_assertion()
333 void kunit_init_test(struct kunit *test, const char *name, struct string_stream *log) in kunit_init_test() argument
335 spin_lock_init(&test->lock); in kunit_init_test()
336 INIT_LIST_HEAD(&test->resources); in kunit_init_test()
337 test->name = name; in kunit_init_test()
338 test->log = log; in kunit_init_test()
339 if (test->log) in kunit_init_test()
341 test->status = KUNIT_SUCCESS; in kunit_init_test()
342 test->status_comment[0] = '\0'; in kunit_init_test()
346 /* Only warn when a test takes more than twice the threshold */
357 static void kunit_run_case_check_speed(struct kunit *test, in kunit_run_case_check_speed() argument
371 kunit_warn(test, in kunit_run_case_check_speed()
372 "Test should be marked slow (runtime: %lld.%09lds)", in kunit_run_case_check_speed()
377 * Initializes and runs test case. Does not clean up or do post validations.
379 static void kunit_run_case_internal(struct kunit *test, in kunit_run_case_internal() argument
388 ret = suite->init(test); in kunit_run_case_internal()
390 kunit_err(test, "failed to initialize: %d\n", ret); in kunit_run_case_internal()
391 kunit_set_failure(test); in kunit_run_case_internal()
398 test_case->run_case(test); in kunit_run_case_internal()
402 kunit_run_case_check_speed(test, test_case, timespec64_sub(end, start)); in kunit_run_case_internal()
405 static void kunit_case_internal_cleanup(struct kunit *test) in kunit_case_internal_cleanup() argument
407 kunit_cleanup(test); in kunit_case_internal_cleanup()
411 * Performs post validations and cleanup after a test case was run.
414 static void kunit_run_case_cleanup(struct kunit *test, in kunit_run_case_cleanup() argument
418 suite->exit(test); in kunit_run_case_cleanup()
420 kunit_case_internal_cleanup(test); in kunit_run_case_cleanup()
424 struct kunit *test; member
432 struct kunit *test = ctx->test; in kunit_try_run_case() local
436 current->kunit_test = test; in kunit_try_run_case()
443 kunit_run_case_internal(test, suite, test_case); in kunit_try_run_case()
449 struct kunit *test = ctx->test; in kunit_try_run_case_cleanup() local
452 current->kunit_test = test; in kunit_try_run_case_cleanup()
454 kunit_run_case_cleanup(test, suite); in kunit_try_run_case_cleanup()
460 struct kunit *test = ctx->test; in kunit_catch_run_case_cleanup() local
461 int try_exit_code = kunit_try_catch_get_result(&test->try_catch); in kunit_catch_run_case_cleanup()
464 kunit_set_failure(test); in kunit_catch_run_case_cleanup()
468 * Test case could not finish, we have no idea what state it is in kunit_catch_run_case_cleanup()
472 kunit_err(test, "test case cleanup timed out\n"); in kunit_catch_run_case_cleanup()
474 * Unknown internal error occurred preventing test case from in kunit_catch_run_case_cleanup()
478 kunit_err(test, "internal error occurred during test case cleanup: %d\n", in kunit_catch_run_case_cleanup()
484 kunit_err(test, "test aborted during cleanup. continuing without cleaning up\n"); in kunit_catch_run_case_cleanup()
491 struct kunit *test = ctx->test; in kunit_catch_run_case() local
492 int try_exit_code = kunit_try_catch_get_result(&test->try_catch); in kunit_catch_run_case()
495 kunit_set_failure(test); in kunit_catch_run_case()
497 * Test case could not finish, we have no idea what state it is in kunit_catch_run_case()
501 kunit_err(test, "test case timed out\n"); in kunit_catch_run_case()
503 * Unknown internal error occurred preventing test case from in kunit_catch_run_case()
507 kunit_err(test, "internal error occurred preventing test case from running: %d\n", in kunit_catch_run_case()
515 * Performs all logic to run a test case. It also catches most errors that
516 * occur in a test case and reports them as failures.
520 struct kunit *test) in kunit_run_case_catch_errors() argument
525 try_catch = &test->try_catch; in kunit_run_case_catch_errors()
528 test, in kunit_run_case_catch_errors()
531 context.test = test; in kunit_run_case_catch_errors()
538 test, in kunit_run_case_catch_errors()
543 /* Propagate the parameter result to the test case. */ in kunit_run_case_catch_errors()
544 if (test->status == KUNIT_FAILURE) in kunit_run_case_catch_errors()
546 else if (test_case->status != KUNIT_FAILURE && test->status == KUNIT_SUCCESS) in kunit_run_case_catch_errors()
623 struct kunit test = { .param_value = NULL, .param_index = 0 }; in kunit_run_tests() local
626 kunit_init_test(&test, test_case->name, test_case->log); in kunit_run_tests()
628 /* Test marked as skip */ in kunit_run_tests()
629 test.status = KUNIT_SKIPPED; in kunit_run_tests()
630 kunit_update_stats(¶m_stats, test.status); in kunit_run_tests()
632 /* Non-parameterised test. */ in kunit_run_tests()
634 kunit_run_case_catch_errors(suite, test_case, &test); in kunit_run_tests()
635 kunit_update_stats(¶m_stats, test.status); in kunit_run_tests()
639 test.param_value = test_case->generate_params(NULL, param_desc); in kunit_run_tests()
641 kunit_log(KERN_INFO, &test, KUNIT_SUBTEST_INDENT KUNIT_SUBTEST_INDENT in kunit_run_tests()
643 kunit_log(KERN_INFO, &test, KUNIT_SUBTEST_INDENT KUNIT_SUBTEST_INDENT in kunit_run_tests()
646 while (test.param_value) { in kunit_run_tests()
647 kunit_run_case_catch_errors(suite, test_case, &test); in kunit_run_tests()
651 "param-%d", test.param_index); in kunit_run_tests()
654 kunit_print_ok_not_ok(&test, KUNIT_LEVEL_CASE_PARAM, in kunit_run_tests()
655 test.status, in kunit_run_tests()
656 test.param_index + 1, in kunit_run_tests()
658 test.status_comment); in kunit_run_tests()
660 kunit_update_stats(¶m_stats, test.status); in kunit_run_tests()
664 test.param_value = test_case->generate_params(test.param_value, param_desc); in kunit_run_tests()
665 test.param_index++; in kunit_run_tests()
666 test.status = KUNIT_SUCCESS; in kunit_run_tests()
667 test.status_comment[0] = '\0'; in kunit_run_tests()
668 test.priv = NULL; in kunit_run_tests()
674 kunit_print_test_stats(&test, param_stats); in kunit_run_tests()
676 kunit_print_ok_not_ok(&test, KUNIT_LEVEL_CASE, test_case->status, in kunit_run_tests()
679 test.status_comment); in kunit_run_tests()
724 pr_err("kunit: test interrupted\n"); in __kunit_test_suites_init()
849 void *kunit_kmalloc_array(struct kunit *test, size_t n, size_t size, gfp_t gfp) in KUNIT_DEFINE_ACTION_WRAPPER()
858 if (kunit_add_action_or_reset(test, kfree_action_wrapper, data) != 0) in KUNIT_DEFINE_ACTION_WRAPPER()
865 void kunit_kfree(struct kunit *test, const void *ptr) in kunit_kfree() argument
870 kunit_release_action(test, kfree_action_wrapper, (void *)ptr); in kunit_kfree()
874 void kunit_cleanup(struct kunit *test) in kunit_cleanup() argument
880 * test->resources is a stack - each allocation must be freed in the in kunit_cleanup()
889 spin_lock_irqsave(&test->lock, flags); in kunit_cleanup()
890 if (list_empty(&test->resources)) { in kunit_cleanup()
891 spin_unlock_irqrestore(&test->lock, flags); in kunit_cleanup()
894 res = list_last_entry(&test->resources, in kunit_cleanup()
899 * resource, and this can't happen if the test->lock in kunit_cleanup()
902 spin_unlock_irqrestore(&test->lock, flags); in kunit_cleanup()
903 kunit_remove_resource(test, res); in kunit_cleanup()