Пример #1
0
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);
}
Пример #2
0
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);
    }
}
Пример #4
0
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);
}
Пример #5
0
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);
}
Пример #6
0
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);
}
Пример #7
0
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;
}
Пример #8
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);
}
Пример #9
0
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);
}
Пример #10
0
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);
}
Пример #11
0
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);
}
Пример #12
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);
}
Пример #13
0
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);
}