static void run_every_test(TestSuite *suite, TestReporter *reporter) { int i; uint32_t test_duration; run_specified_test_if_child(suite, reporter); uint32_t test_starting_milliseconds = cgreen_time_get_current_milliseconds(); (*reporter->start_suite)(reporter, suite->name, count_tests(suite)); for (i = 0; i < suite->size; i++) { if (suite->tests[i].type == test_function) { if (getenv("CGREEN_NO_FORK") == NULL) run_test_in_its_own_process(suite, suite->tests[i].Runnable.test, reporter); else run_test_in_the_current_process(suite, suite->tests[i].Runnable.test, reporter); } else { (*suite->setup)(); run_every_test(suite->tests[i].Runnable.suite, reporter); (*suite->teardown)(); } } test_duration = cgreen_time_duration_in_milliseconds(test_starting_milliseconds, cgreen_time_get_current_milliseconds()); send_reporter_completion_notification(reporter); (*reporter->finish_suite)(reporter, suite->filename, suite->line, test_duration); }
static void run_test_in_its_own_process(TestSuite *suite, UnitTest *test, TestReporter *reporter) { #ifdef WIN32 HANDLE pHandle = NULL; CgTestParams* pThreadParams = malloc(sizeof(CgTestParams)); if(!pThreadParams) return; pThreadParams->reporter = reporter; pThreadParams->suite = suite; pThreadParams->test = test; #endif (*reporter->start)(reporter, test->name); #ifdef WIN32 pHandle = (VOID *)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &run_test_thread, (LPVOID) pThreadParams, 0, NULL); WaitForSingleObject(pHandle, INFINITE); (*reporter->finish)(reporter, test->name); #else if (in_child_process()) { run_the_test_code(suite, test, reporter); send_reporter_completion_notification(reporter); stop(); } else { wait_for_child_process(); (*reporter->finish)(reporter, test->name); } #endif }
void run_test_in_its_own_process(TestSuite *suite, CgreenTest *test, TestReporter *reporter) { uint32_t test_starting_milliseconds = cgreen_time_get_current_milliseconds(); (*reporter->start_test)(reporter, test->name); if (test->skip) { send_reporter_skipped_notification(reporter); (*reporter->finish_test)(reporter, test->filename, test->line, NULL, 0); } else if (in_child_process()) { run_the_test_code(suite, test, reporter); send_reporter_completion_notification(reporter); stop(); } else { uint32_t test_duration = cgreen_time_duration_in_milliseconds(test_starting_milliseconds, cgreen_time_get_current_milliseconds()); const int status = wait_for_child_process(); if (WIFSIGNALED(status)) { /* a C++ exception generates SIGABRT. Only print our special message for different signals. */ const int sig = WTERMSIG(status); if (sig != SIGABRT) { char buf[128]; snprintf(buf, sizeof(buf), "Test terminated with signal: %s", (const char *)strsignal(sig)); (*reporter->finish_test)(reporter, test->filename, test->line, buf, test_duration); return; } } (*reporter->finish_test)(reporter, test->filename, test->line, NULL, test_duration); } }
static void run_test_in_the_current_process(TestSuite *suite, CgreenTest *test, TestReporter *reporter) { uint32_t test_duration = 0; uint32_t test_starting_milliseconds = cgreen_time_get_current_milliseconds(); (*reporter->start_test)(reporter, test->name); if (test->skip) { send_reporter_skipped_notification(reporter); } else { run_the_test_code(suite, test, reporter); test_duration = cgreen_time_duration_in_milliseconds(test_starting_milliseconds, cgreen_time_get_current_milliseconds()); send_reporter_completion_notification(reporter); } (*reporter->finish_test)(reporter, test->filename, test->line, NULL, test_duration); }
static void run_every_test(TestSuite *suite, TestReporter *reporter) { int i = 0; (*reporter->start)(reporter, suite->name); for (i = 0; i < suite->size; i++) { if (suite->tests[i].type == test_function) { run_test_in_its_own_process(suite, &(suite->tests[i]), reporter); } else { (*suite->setup)(); run_every_test(suite->tests[i].suite, reporter); (*suite->teardown)(); } } send_reporter_completion_notification(reporter); (*reporter->finish)(reporter, suite->name); }
static void run_named_test(TestSuite *suite, const char *name, TestReporter *reporter) { int i; (*reporter->start_suite)(reporter, suite->name, count_tests(suite)); for (i = 0; i < suite->size; i++) { if (suite->tests[i].type == test_function) { if (strcmp(suite->tests[i].name, name) == 0) { run_test_in_the_current_process(suite, suite->tests[i].Runnable.test, reporter); } } else if (has_test(suite->tests[i].Runnable.suite, name)) { (*suite->setup)(); run_named_test(suite->tests[i].Runnable.suite, name, reporter); (*suite->teardown)(); } } send_reporter_completion_notification(reporter); (*reporter->finish_suite)(reporter, suite->filename, suite->line); }
unsigned int run_test_thread(void* pVoid) { CgTestParams* pTestParams = (CgTestParams*)pVoid; if(!pTestParams) return (unsigned int)-1; __try { run_the_test_code(pTestParams->suite, pTestParams->test, pTestParams->reporter); } __finally { send_reporter_completion_notification(pTestParams->reporter); } free(pTestParams); return 0; }
static void run_every_test(TestSuite *suite, TestReporter *reporter) { int i; run_specified_test_if_child(suite, reporter); (*reporter->start_suite)(reporter, suite->name, count_tests(suite)); for (i = 0; i < suite->size; i++) { if (suite->tests[i].type == test_function) { run_test_in_its_own_process(suite, suite->tests[i].Runnable.test, reporter); } else { (*suite->setup)(); run_every_test(suite->tests[i].Runnable.suite, reporter); (*suite->teardown)(); } } send_reporter_completion_notification(reporter); (*reporter->finish_suite)(reporter, suite->filename, suite->line); }
static void run_named_test_child(TestSuite *suite, const char *name, TestReporter *reporter) { int i; //(*reporter->start_suite)(reporter, suite->name, count_tests(suite)); for (i = 0; i < suite->size; i++) { if (suite->tests[i].type == test_function) { if (strcmp(suite->tests[i].name, name) == 0) { run_test_in_the_current_process_child(suite, suite->tests[i].Runnable.test, reporter); } } else if (has_test(suite->tests[i].Runnable.suite, name)) { TestSuite* newSuite=suite->tests[i].Runnable.suite; (*suite->setup)(); //moved recursive calls to start_suite and finish_suite to the caller, so I //can control the printf that occurs in the first one. //This may have undesireable side effects. Not sure of the best solution (*reporter->start_suite)(reporter, newSuite->name, count_tests(newSuite)); run_named_test_child(newSuite, name, reporter); (*reporter->finish_suite)(reporter, newSuite->filename, newSuite->line); (*suite->teardown)(); } } send_reporter_completion_notification(reporter); }
static void run_named_test(TestSuite *suite, const char *name, TestReporter *reporter) { int i; uint32_t test_duration; uint32_t test_starting_milliseconds = cgreen_time_get_current_milliseconds(); (*reporter->start_suite)(reporter, suite->name, count_tests(suite)); for (i = 0; i < suite->size; i++) { if (suite->tests[i].type == test_function) { if (strcmp(suite->tests[i].name, name) == 0) { run_test_in_the_current_process(suite, suite->tests[i].Runnable.test, reporter); } } else if (has_test(suite->tests[i].Runnable.suite, name)) { (*suite->setup)(); run_named_test(suite->tests[i].Runnable.suite, name, reporter); (*suite->teardown)(); } } test_duration = cgreen_time_duration_in_milliseconds(test_starting_milliseconds, cgreen_time_get_current_milliseconds()); send_reporter_completion_notification(reporter); (*reporter->finish_suite)(reporter, suite->filename, suite->line, test_duration); }
static void run_test_in_the_current_process_child(TestSuite *suite, CgreenTest *test, TestReporter *reporter) { (*reporter->start_test)(reporter, test->name); run_the_test_code(suite, test, reporter); send_reporter_completion_notification(reporter); stop(0, 0, 0, 0, 0); }
static void run_test_in_the_current_process(TestSuite *suite, UnitTest *test, TestReporter *reporter) { (*reporter->start)(reporter, test->name); run_the_test_code(suite, test, reporter); send_reporter_completion_notification(reporter); (*reporter->finish)(reporter, test->name); }
static void run_test_in_the_current_process(TestSuite *suite, CgreenTest *test, TestReporter *reporter) { (*reporter->start_test)(reporter, test->name); run_the_test_code(suite, test, reporter); send_reporter_completion_notification(reporter); (*reporter->finish_test)(reporter, test->filename, test->line, NULL); }