]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | #include "test/jemalloc_test.h" |
2 | ||
3 | static unsigned test_count = 0; | |
4 | static test_status_t test_counts[test_status_count] = {0, 0, 0}; | |
5 | static test_status_t test_status = test_status_pass; | |
6 | static const char * test_name = ""; | |
7 | ||
54a0048b | 8 | JEMALLOC_FORMAT_PRINTF(1, 2) |
1a4d82fc JJ |
9 | void |
10 | test_skip(const char *format, ...) | |
11 | { | |
12 | va_list ap; | |
13 | ||
14 | va_start(ap, format); | |
15 | malloc_vcprintf(NULL, NULL, format, ap); | |
16 | va_end(ap); | |
17 | malloc_printf("\n"); | |
18 | test_status = test_status_skip; | |
19 | } | |
20 | ||
54a0048b | 21 | JEMALLOC_FORMAT_PRINTF(1, 2) |
1a4d82fc JJ |
22 | void |
23 | test_fail(const char *format, ...) | |
24 | { | |
25 | va_list ap; | |
26 | ||
27 | va_start(ap, format); | |
28 | malloc_vcprintf(NULL, NULL, format, ap); | |
29 | va_end(ap); | |
30 | malloc_printf("\n"); | |
31 | test_status = test_status_fail; | |
32 | } | |
33 | ||
34 | static const char * | |
35 | test_status_string(test_status_t test_status) | |
36 | { | |
37 | ||
38 | switch (test_status) { | |
39 | case test_status_pass: return "pass"; | |
40 | case test_status_skip: return "skip"; | |
41 | case test_status_fail: return "fail"; | |
42 | default: not_reached(); | |
43 | } | |
44 | } | |
45 | ||
46 | void | |
47 | p_test_init(const char *name) | |
48 | { | |
49 | ||
50 | test_count++; | |
51 | test_status = test_status_pass; | |
52 | test_name = name; | |
53 | } | |
54 | ||
55 | void | |
56 | p_test_fini(void) | |
57 | { | |
58 | ||
59 | test_counts[test_status]++; | |
60 | malloc_printf("%s: %s\n", test_name, test_status_string(test_status)); | |
61 | } | |
62 | ||
63 | test_status_t | |
64 | p_test(test_t *t, ...) | |
65 | { | |
66 | test_status_t ret; | |
67 | va_list ap; | |
68 | ||
69 | /* | |
70 | * Make sure initialization occurs prior to running tests. Tests are | |
71 | * special because they may use internal facilities prior to triggering | |
72 | * initialization as a side effect of calling into the public API. This | |
73 | * is a final safety that works even if jemalloc_constructor() doesn't | |
74 | * run, as for MSVC builds. | |
75 | */ | |
76 | if (nallocx(1, 0) == 0) { | |
77 | malloc_printf("Initialization error"); | |
78 | return (test_status_fail); | |
79 | } | |
80 | ||
81 | ret = test_status_pass; | |
82 | va_start(ap, t); | |
83 | for (; t != NULL; t = va_arg(ap, test_t *)) { | |
84 | t(); | |
85 | if (test_status > ret) | |
86 | ret = test_status; | |
87 | } | |
88 | va_end(ap); | |
89 | ||
90 | malloc_printf("--- %s: %u/%u, %s: %u/%u, %s: %u/%u ---\n", | |
91 | test_status_string(test_status_pass), | |
92 | test_counts[test_status_pass], test_count, | |
93 | test_status_string(test_status_skip), | |
94 | test_counts[test_status_skip], test_count, | |
95 | test_status_string(test_status_fail), | |
96 | test_counts[test_status_fail], test_count); | |
97 | ||
98 | return (ret); | |
99 | } | |
100 | ||
101 | void | |
102 | p_test_fail(const char *prefix, const char *message) | |
103 | { | |
104 | ||
105 | malloc_cprintf(NULL, NULL, "%s%s\n", prefix, message); | |
106 | test_status = test_status_fail; | |
107 | } |