diff --git a/include/criterion/stats.h b/include/criterion/stats.h index c836cbe7..98cfd215 100644 --- a/include/criterion/stats.h +++ b/include/criterion/stats.h @@ -45,6 +45,7 @@ struct criterion_test_stats { int passed_asserts; int failed_asserts; int signal; + float elapsed_time; unsigned progress; const char *file; diff --git a/src/event.c b/src/event.c index 0e569d7d..e00472ef 100644 --- a/src/event.c +++ b/src/event.c @@ -45,15 +45,25 @@ struct event *read_event(int fd) { if (read(fd, &kind, sizeof (unsigned)) < (ssize_t) sizeof (unsigned)) return NULL; - if (kind != ASSERT) - return unique_ptr(struct event, ({ .kind = kind, .data = NULL })); + switch (kind) { + case ASSERT: { + const size_t assert_size = sizeof (struct criterion_assert_stats); + unsigned char *buf = malloc(assert_size); + if (read(fd, buf, assert_size) < (ssize_t) assert_size) + return NULL; - const size_t assert_size = sizeof (struct criterion_assert_stats); - unsigned char *buf = malloc(assert_size); - if (read(fd, buf, assert_size) < (ssize_t) assert_size) - return NULL; + return unique_ptr(struct event, ({ .kind = kind, .data = buf }), destroy_event); + } + case POST_TEST: { + float *elapsed_time = malloc(sizeof (float)); + if (read(fd, elapsed_time, sizeof (float)) < (ssize_t) sizeof (float)) + return NULL; - return unique_ptr(struct event, ({ .kind = kind, .data = buf }), destroy_event); + return unique_ptr(struct event, ({ .kind = kind, .data = elapsed_time }), destroy_event); + } + default: + return unique_ptr(struct event, ({ .kind = kind, .data = NULL })); + } } void send_event(int kind, void *data, size_t size) { diff --git a/src/report.c b/src/report.c index 06e18544..aedc32b8 100644 --- a/src/report.c +++ b/src/report.c @@ -53,7 +53,7 @@ ReportHook(PRE_INIT)(struct criterion_test *test) { } ReportHook(POST_TEST)(struct criterion_test_stats *stats) { - fprintf(stderr, "%s::%s: %s\n", stats->test->category, stats->test->name, stats->failed ? "FAILURE" : "SUCCESS"); + fprintf(stderr, "%s::%s: %s (%3.2fs)\n", stats->test->category, stats->test->name, stats->failed ? "FAILURE" : "SUCCESS", stats->elapsed_time); } ReportHook(PRE_TEST)() {} @@ -61,7 +61,8 @@ ReportHook(POST_FINI)() {} ReportHook(PRE_EVERYTHING)() {} ReportHook(POST_EVERYTHING)(struct criterion_global_stats *stats) { - fprintf(stderr, "Synthesis: %lu tests were run. %lu passed, %lu failed (with %lu crashes)\n", stats->nb_tests, stats->tests_passed, stats->tests_failed, stats->tests_crashed); + fprintf(stderr, "Synthesis: %lu tests were run. %lu passed, %lu failed (with %lu crashes)\n", + stats->nb_tests, stats->tests_passed, stats->tests_failed, stats->tests_crashed); } ReportHook(ASSERT)(struct criterion_assert_stats *stats) { diff --git a/src/runner.c b/src/runner.c index 40b63b93..b237b29d 100644 --- a/src/runner.c +++ b/src/runner.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include "criterion/assert.h" #include "stats.h" @@ -98,8 +99,13 @@ static void run_test_child(struct criterion_test *test) { send_event(PRE_INIT, NULL, 0); (test->data->init ?: nothing)(); send_event(PRE_TEST, NULL, 0); + + clock_t before = clock(); (test->test ?: nothing)(); - send_event(POST_TEST, NULL, 0); + clock_t after = clock(); + + float elapsed_time = (float) (after - before) / CLOCKS_PER_SEC; + send_event(POST_TEST, &elapsed_time, sizeof (float)); (test->data->fini ?: nothing)(); send_event(POST_FINI, NULL, 0); } @@ -150,11 +156,12 @@ static void run_test(struct criterion_global_stats *stats, struct criterion_test stat_push_event(stats, test_stats, &ev); report(TEST_CRASH, test_stats); } else { - struct event ev = { .kind = POST_TEST }; + float elapsed_time = 0; + struct event ev = { .kind = POST_TEST, .data = &elapsed_time }; stat_push_event(stats, test_stats, &ev); report(POST_TEST, test_stats); - ev.kind = POST_FINI; + ev = (struct event) { .kind = POST_FINI }; stat_push_event(stats, test_stats, &ev); report(POST_FINI, test_stats); } diff --git a/src/stats.c b/src/stats.c index 24199ad6..bd6d5d4d 100644 --- a/src/stats.c +++ b/src/stats.c @@ -114,7 +114,8 @@ static void push_assert(s_glob_stats *stats, static void push_post_test(s_glob_stats *stats, s_test_stats *test, - UNUSED void *ptr) { + float *ptr) { + test->elapsed_time = *ptr; if (test->failed_asserts > 0 || test->signal != test->test->data->signal) { test->failed = 1; ++stats->tests_failed;