static test_outcome run_test_with_siglongjmp(const test_suite suite, const test* test_case) { int sigsetret; if (0 == test_case->test_case) { fprintf(stderr, "%s is a null test\n", current_test); return INVALID; } sigsetret = sigsetjmp(recovery_buffer, 1); VERBOSE_LOG("Test %s:%s checkpoint status %d\n", sigsetret); switch (sigsetret) { /* clean path */ case 0: current_stage = SETUP; VERBOSE_LOG("Running %s:%s suite setup\n"); suite.setup(); VERBOSE_LOG("Running %s:%s setup\n"); test_case->setup(); current_stage = TEST; VERBOSE_LOG("Running %s:%s\n"); test_case->test_case(); current_stage = TEARDOWN; VERBOSE_LOG("Running %s:%s tear down\n"); test_case->teardown(); VERBOSE_LOG("Running %s:%s tear down\n"); suite.teardown(); return PASS; break; case SETUP: LOG_TEST_ERROR("Error in [%s:%s] during setup\n"); sigsetret = sigsetjmp(recovery_buffer, 1); if (0 == sigsetret) { current_stage = TEARDOWN; VERBOSE_LOG("Running %s:%s setup failure tear down\n"); test_case->teardown(); } break; case TEST: LOG_TEST_ERROR("Test failure in [%s:%s] ***%s\n", TEST_OUTCOMES[FAIL]); sigsetret = sigsetjmp(recovery_buffer, 1); if (0 == sigsetret) { current_stage = TEARDOWN; VERBOSE_LOG("Running %s:%s test failure tear down\n"); test_case->teardown(); } return FAIL; break; case TEARDOWN: LOG_TEST_ERROR("Error in [%s:%s] during teardown\n"); break; default: LOG_TEST_ERROR("Error in [%s:%s] with unknown failure type %u\n", sigsetret); break; } return UNRESOLVED; }
static test_outcome run_test(const test_suite suite, const test* test_case) { VERBOSE_LOG("Test %s:%s running in child process %u\n", getpid()); current_stage = SETUP; VERBOSE_LOG("Setting up suite for test %s:%s\n"); suite.setup(); VERBOSE_LOG("Setting up test %s:%s\n"); test_case->setup(); VERBOSE_LOG("Running %s:%s\n"); current_stage = TEST; test_case->test_case(); current_stage = TEARDOWN; VERBOSE_LOG("Running %s:%s tear down\n"); test_case->teardown(); VERBOSE_LOG("Tearing down suite for %s:%s\n"); return PASS; }