diff --git a/include/criterion/stats.h b/include/criterion/stats.h index 03600db..2225896 100644 --- a/include/criterion/stats.h +++ b/include/criterion/stats.h @@ -46,6 +46,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 19ca42d..d77709a 100644 --- a/src/event.c +++ b/src/event.c @@ -40,15 +40,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/runner.c b/src/runner.c index 2fd63f8..2f51512 100644 --- a/src/runner.c +++ b/src/runner.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "criterion/options.h" #include "stats.h" @@ -87,8 +88,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(); + + double elapsed_time = (double) (after - before) / CLOCKS_PER_SEC; + send_event(POST_TEST, &elapsed_time, sizeof (double)); (test->data->fini ?: nothing)(); send_event(POST_FINI, NULL, 0); } @@ -124,7 +130,8 @@ 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 }; + double elapsed_time = 0; + struct event ev = { .kind = POST_TEST, .data = &elapsed_time }; stat_push_event(stats, test_stats, &ev); report(POST_TEST, test_stats); diff --git a/src/stats.c b/src/stats.c index e12db58..ba5a2ed 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;