From 5b6b304e3c7456f56560a076113e7cb37fd3a357 Mon Sep 17 00:00:00 2001 From: Yuval Peress Date: Tue, 9 Aug 2022 22:11:06 -0600 Subject: [PATCH] ztest: unittest: Fix fail/skip/pass outside of tests When not running in setup, before, or in the test. Calling fail, skip, or pass is invalid and should be considered an error. Properly handle these cases by printing a more detailed error message and bailing the process. Signed-off-by: Yuval Peress --- subsys/testsuite/ztest/src/ztest_new.c | 31 +++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/subsys/testsuite/ztest/src/ztest_new.c b/subsys/testsuite/ztest/src/ztest_new.c index d896899303c..3ca659a9ef8 100644 --- a/subsys/testsuite/ztest/src/ztest_new.c +++ b/subsys/testsuite/ztest/src/ztest_new.c @@ -311,19 +311,39 @@ void ztest_test_fail(void) longjmp(test_suite_fail, 1); case TEST_PHASE_BEFORE: case TEST_PHASE_TEST: - case TEST_PHASE_AFTER: - case TEST_PHASE_TEARDOWN: PRINT(" at %s function\n", get_friendly_phase_name(phase)); longjmp(test_fail, 1); + case TEST_PHASE_AFTER: + case TEST_PHASE_TEARDOWN: case TEST_PHASE_FRAMEWORK: - PRINT("\n"); + PRINT(" ERROR: cannot fail in test '%s()', bailing\n", + get_friendly_phase_name(phase)); longjmp(stack_fail, 1); } } -void ztest_test_pass(void) { longjmp(test_pass, 1); } +void ztest_test_pass(void) +{ + if (phase == TEST_PHASE_TEST) { + longjmp(test_pass, 1); + } + PRINT(" ERROR: cannot pass in test '%s()', bailing\n", get_friendly_phase_name(phase)); + longjmp(stack_fail, 1); +} -void ztest_test_skip(void) { longjmp(test_skip, 1); } +void ztest_test_skip(void) +{ + switch (phase) { + case TEST_PHASE_SETUP: + case TEST_PHASE_BEFORE: + case TEST_PHASE_TEST: + longjmp(test_skip, 1); + default: + PRINT(" ERROR: cannot skip in test '%s()', bailing\n", + get_friendly_phase_name(phase)); + longjmp(stack_fail, 1); + } +} static int run_test(struct ztest_suite_node *suite, struct ztest_unit_test *test, void *data) { @@ -358,6 +378,7 @@ static int run_test(struct ztest_suite_node *suite, struct ztest_unit_test *test } run_test_functions(suite, test, data); out: + phase = TEST_PHASE_FRAMEWORK; ret |= cleanup_test(test); phase = TEST_PHASE_AFTER; if (test_result != ZTEST_RESULT_SUITE_FAIL) {