20
20
#include "includes.h"
21
21
#include "lib/torture/torture.h"
22
#include <subunit/child.h>
23
static void subunit_suite_start(struct torture_context *ctx,
24
static void torture_subunit_suite_start(struct torture_context *ctx,
24
25
struct torture_suite *suite)
28
static void subunit_print_testname(struct torture_context *ctx,
29
static char *torture_subunit_test_name(struct torture_context *ctx,
29
30
struct torture_tcase *tcase,
30
31
struct torture_test *test)
32
33
if (!strcmp(tcase->name, test->name)) {
33
printf("%s", test->name);
34
return talloc_strdup(ctx, test->name);
35
printf("%s.%s", tcase->name, test->name);
39
static void subunit_test_start(struct torture_context *ctx,
36
return talloc_asprintf(ctx, "%s.%s", tcase->name, test->name);
40
static void torture_subunit_report_time(struct torture_context *tctx)
45
if (clock_gettime(CLOCK_REALTIME, &tp) != 0) {
46
perror("clock_gettime");
50
tmp = localtime(&tp.tv_sec);
56
if (strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S", tmp) <= 0) {
61
printf("time: %s.%06ld\n", timestr, tp.tv_nsec / 1000);
64
static void torture_subunit_test_start(struct torture_context *context,
40
65
struct torture_tcase *tcase,
41
66
struct torture_test *test)
44
subunit_print_testname(ctx, tcase, test);
68
char *fullname = torture_subunit_test_name(context, context->active_tcase, context->active_test);
69
subunit_test_start(fullname);
70
torture_subunit_report_time(context);
71
talloc_free(fullname);
48
static void subunit_test_result(struct torture_context *context,
74
static void torture_subunit_test_result(struct torture_context *context,
49
75
enum torture_result res, const char *reason)
77
char *fullname = torture_subunit_test_name(context, context->active_tcase, context->active_test);
78
torture_subunit_report_time(context);
81
subunit_test_pass(fullname);
84
subunit_test_fail(fullname, reason);
58
86
case TORTURE_ERROR:
87
subunit_test_error(fullname, reason);
90
subunit_test_skip(fullname, reason);
65
subunit_print_testname(context, context->active_tcase, context->active_test);
68
printf(" [\n%s\n]", reason);
93
talloc_free(fullname);
72
static void subunit_comment(struct torture_context *test,
96
static void torture_subunit_comment(struct torture_context *test,
73
97
const char *comment)
75
99
fprintf(stderr, "%s", comment);
78
static void subunit_warning(struct torture_context *test,
102
static void torture_subunit_warning(struct torture_context *test,
79
103
const char *comment)
81
105
fprintf(stderr, "WARNING!: %s\n", comment);
108
static void torture_subunit_progress(struct torture_context *tctx, int offset, enum torture_progress_whence whence)
111
case TORTURE_PROGRESS_SET:
112
printf("progress: %d\n", offset);
114
case TORTURE_PROGRESS_CUR:
115
printf("progress: %+-d\n", offset);
117
case TORTURE_PROGRESS_POP:
118
printf("progress: pop\n");
120
case TORTURE_PROGRESS_PUSH:
121
printf("progress: push\n");
124
fprintf(stderr, "Invalid call to progress()\n");
84
129
const struct torture_ui_ops torture_subunit_ui_ops = {
85
.comment = subunit_comment,
86
.warning = subunit_warning,
87
.test_start = subunit_test_start,
88
.test_result = subunit_test_result,
89
.suite_start = subunit_suite_start
130
.comment = torture_subunit_comment,
131
.warning = torture_subunit_warning,
132
.test_start = torture_subunit_test_start,
133
.test_result = torture_subunit_test_result,
134
.suite_start = torture_subunit_suite_start,
135
.progress = torture_subunit_progress,
136
.report_time = torture_subunit_report_time,