xref: /kvm-unit-tests/lib/report.c (revision 0d78a090f0e91fcb6fb535c9cd6cc109a15e7902)
1f3cdd159SJan Kiszka /*
2f3cdd159SJan Kiszka  * Test result reporting
3f3cdd159SJan Kiszka  *
4f3cdd159SJan Kiszka  * Copyright (c) Siemens AG, 2014
5f3cdd159SJan Kiszka  *
6f3cdd159SJan Kiszka  * Authors:
7f3cdd159SJan Kiszka  *  Jan Kiszka <jan.kiszka@siemens.com>
8a5af7b8aSAndrew Jones  *  Andrew Jones <drjones@redhat.com>
9f3cdd159SJan Kiszka  *
10f3cdd159SJan Kiszka  * This work is licensed under the terms of the GNU LGPL, version 2.
11f3cdd159SJan Kiszka  */
12f3cdd159SJan Kiszka 
13f3cdd159SJan Kiszka #include "libcflat.h"
14c5b6469dSAndrew Jones #include "asm/spinlock.h"
15f3cdd159SJan Kiszka 
16a0833bfcSRadim Krčmář static unsigned int tests, failures, xfailures, skipped;
1753da5cc0SAndrew Jones static char prefixes[256];
18c5b6469dSAndrew Jones static struct spinlock lock;
1953da5cc0SAndrew Jones 
2017e80e71SPeter Feiner #define PREFIX_DELIMITER ": "
2117e80e71SPeter Feiner 
22*0d78a090SDavid Matlack void report_pass(void)
23*0d78a090SDavid Matlack {
24*0d78a090SDavid Matlack 	spin_lock(&lock);
25*0d78a090SDavid Matlack 	tests++;
26*0d78a090SDavid Matlack 	spin_unlock(&lock);
27*0d78a090SDavid Matlack }
28*0d78a090SDavid Matlack 
2917e80e71SPeter Feiner void report_prefix_pushf(const char *prefix_fmt, ...)
3017e80e71SPeter Feiner {
3117e80e71SPeter Feiner 	va_list va;
3217e80e71SPeter Feiner 	int len;
3317e80e71SPeter Feiner 	int start;
3417e80e71SPeter Feiner 
3517e80e71SPeter Feiner 	spin_lock(&lock);
3617e80e71SPeter Feiner 
3717e80e71SPeter Feiner 	len = strlen(prefixes);
3817e80e71SPeter Feiner 	assert_msg(len < sizeof(prefixes), "%d >= %lu", len, sizeof(prefixes));
3917e80e71SPeter Feiner 	start = len;
4017e80e71SPeter Feiner 
4117e80e71SPeter Feiner 	va_start(va, prefix_fmt);
4217e80e71SPeter Feiner 	len += vsnprintf(&prefixes[len], sizeof(prefixes) - len, prefix_fmt,
4317e80e71SPeter Feiner 			 va);
4417e80e71SPeter Feiner 	va_end(va);
4517e80e71SPeter Feiner 	assert_msg(len < sizeof(prefixes), "%d >= %lu", len, sizeof(prefixes));
4617e80e71SPeter Feiner 
4717e80e71SPeter Feiner 	assert_msg(!strstr(&prefixes[start], PREFIX_DELIMITER),
4817e80e71SPeter Feiner 		   "Prefix \"%s\" contains delimiter \"" PREFIX_DELIMITER "\"",
4917e80e71SPeter Feiner 		   &prefixes[start]);
5017e80e71SPeter Feiner 
5117e80e71SPeter Feiner 	len += snprintf(&prefixes[len], sizeof(prefixes) - len,
5217e80e71SPeter Feiner 			PREFIX_DELIMITER);
5317e80e71SPeter Feiner 	assert_msg(len < sizeof(prefixes), "%d >= %lu", len, sizeof(prefixes));
5417e80e71SPeter Feiner 
5517e80e71SPeter Feiner 	spin_unlock(&lock);
5617e80e71SPeter Feiner }
5717e80e71SPeter Feiner 
5853da5cc0SAndrew Jones void report_prefix_push(const char *prefix)
5953da5cc0SAndrew Jones {
6017e80e71SPeter Feiner 	report_prefix_pushf("%s", prefix);
6153da5cc0SAndrew Jones }
6253da5cc0SAndrew Jones 
6353da5cc0SAndrew Jones void report_prefix_pop(void)
6453da5cc0SAndrew Jones {
6553da5cc0SAndrew Jones 	char *p, *q;
6653da5cc0SAndrew Jones 
67c5b6469dSAndrew Jones 	spin_lock(&lock);
68c5b6469dSAndrew Jones 
6953da5cc0SAndrew Jones 	if (!*prefixes)
7053da5cc0SAndrew Jones 		return;
7153da5cc0SAndrew Jones 
7217e80e71SPeter Feiner 	for (p = prefixes, q = strstr(p, PREFIX_DELIMITER) + 2;
7353da5cc0SAndrew Jones 			*q;
7417e80e71SPeter Feiner 			p = q, q = strstr(p, PREFIX_DELIMITER) + 2)
7553da5cc0SAndrew Jones 		;
7653da5cc0SAndrew Jones 	*p = '\0';
77c5b6469dSAndrew Jones 
78c5b6469dSAndrew Jones 	spin_unlock(&lock);
7953da5cc0SAndrew Jones }
80a5af7b8aSAndrew Jones 
81a0833bfcSRadim Krčmář static void va_report(const char *msg_fmt,
82a0833bfcSRadim Krčmář 		bool pass, bool xfail, bool skip, va_list va)
83a5af7b8aSAndrew Jones {
84a0833bfcSRadim Krčmář 	char *prefix = skip ? "SKIP"
85a0833bfcSRadim Krčmář 	                    : xfail ? (pass ? "XPASS" : "XFAIL")
86a0833bfcSRadim Krčmář 	                            : (pass ? "PASS"  : "FAIL");
87a5af7b8aSAndrew Jones 
88c5b6469dSAndrew Jones 	spin_lock(&lock);
89c5b6469dSAndrew Jones 
90a5af7b8aSAndrew Jones 	tests++;
91a0833bfcSRadim Krčmář 	printf("%s: ", prefix);
9253da5cc0SAndrew Jones 	puts(prefixes);
93cb12ecccSAndrew Jones 	vprintf(msg_fmt, va);
94a5af7b8aSAndrew Jones 	puts("\n");
95a0833bfcSRadim Krčmář 	if (skip)
96a0833bfcSRadim Krčmář 		skipped++;
97a0833bfcSRadim Krčmář 	else if (xfail && !pass)
98a5af7b8aSAndrew Jones 		xfailures++;
99a0833bfcSRadim Krčmář 	else if (xfail || !pass)
100a5af7b8aSAndrew Jones 		failures++;
101c5b6469dSAndrew Jones 
102c5b6469dSAndrew Jones 	spin_unlock(&lock);
103a5af7b8aSAndrew Jones }
104f3cdd159SJan Kiszka 
105f3cdd159SJan Kiszka void report(const char *msg_fmt, bool pass, ...)
106f3cdd159SJan Kiszka {
107f3cdd159SJan Kiszka 	va_list va;
108f3cdd159SJan Kiszka 	va_start(va, pass);
109a0833bfcSRadim Krčmář 	va_report(msg_fmt, pass, false, false, va);
110f3cdd159SJan Kiszka 	va_end(va);
111a5af7b8aSAndrew Jones }
112a5af7b8aSAndrew Jones 
113a5af7b8aSAndrew Jones void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...)
114a5af7b8aSAndrew Jones {
115a5af7b8aSAndrew Jones 	va_list va;
116a5af7b8aSAndrew Jones 	va_start(va, pass);
117a0833bfcSRadim Krčmář 	va_report(msg_fmt, pass, xfail, false, va);
118a0833bfcSRadim Krčmář 	va_end(va);
119a0833bfcSRadim Krčmář }
120a0833bfcSRadim Krčmář 
121a0833bfcSRadim Krčmář void report_skip(const char *msg_fmt, ...)
122a0833bfcSRadim Krčmář {
123a0833bfcSRadim Krčmář 	va_list va;
124a0833bfcSRadim Krčmář 	va_start(va, msg_fmt);
125a0833bfcSRadim Krčmář 	va_report(msg_fmt, false, false, true, va);
126a5af7b8aSAndrew Jones 	va_end(va);
127f3cdd159SJan Kiszka }
128f3cdd159SJan Kiszka 
1292acf2e69SAndrew Jones void report_info(const char *msg_fmt, ...)
1302acf2e69SAndrew Jones {
1312acf2e69SAndrew Jones 	va_list va;
1322acf2e69SAndrew Jones 
1332acf2e69SAndrew Jones 	spin_lock(&lock);
1342acf2e69SAndrew Jones 	puts("INFO: ");
1352acf2e69SAndrew Jones 	puts(prefixes);
1362acf2e69SAndrew Jones 	va_start(va, msg_fmt);
1372acf2e69SAndrew Jones 	vprintf(msg_fmt, va);
1382acf2e69SAndrew Jones 	va_end(va);
1392acf2e69SAndrew Jones 	puts("\n");
1402acf2e69SAndrew Jones 	spin_unlock(&lock);
1412acf2e69SAndrew Jones }
1422acf2e69SAndrew Jones 
143f3cdd159SJan Kiszka int report_summary(void)
144f3cdd159SJan Kiszka {
145c5b6469dSAndrew Jones 	spin_lock(&lock);
146c5b6469dSAndrew Jones 
147f1071c6dSAndrew Jones 	printf("SUMMARY: %d tests", tests);
1483d742d17SRadim Krčmář 	if (failures)
1493d742d17SRadim Krčmář 		printf(", %d unexpected failures", failures);
150a5af7b8aSAndrew Jones 	if (xfailures)
151a0833bfcSRadim Krčmář 		printf(", %d expected failures", xfailures);
152a0833bfcSRadim Krčmář 	if (skipped)
153a0833bfcSRadim Krčmář 		printf(", %d skipped", skipped);
154a5af7b8aSAndrew Jones 	printf("\n");
155a0833bfcSRadim Krčmář 
156a0833bfcSRadim Krčmář 	if (tests == skipped)
157a0833bfcSRadim Krčmář 		/* Blame AUTOTOOLS for using 77 for skipped test and QEMU for
158a0833bfcSRadim Krčmář 		 * mangling error codes in a way that gets 77 if we ... */
159a0833bfcSRadim Krčmář 		return 77 >> 1;
160a0833bfcSRadim Krčmář 
161f3cdd159SJan Kiszka 	return failures > 0 ? 1 : 0;
162c5b6469dSAndrew Jones 
163c5b6469dSAndrew Jones 	spin_unlock(&lock);
164f3cdd159SJan Kiszka }
165e7c68b43SAndrew Jones 
166e7c68b43SAndrew Jones void report_abort(const char *msg_fmt, ...)
167e7c68b43SAndrew Jones {
168e7c68b43SAndrew Jones 	va_list va;
169e7c68b43SAndrew Jones 
17075b3e681SAndrew Jones 	spin_lock(&lock);
171e7c68b43SAndrew Jones 	puts("ABORT: ");
172e7c68b43SAndrew Jones 	puts(prefixes);
173e7c68b43SAndrew Jones 	va_start(va, msg_fmt);
174e7c68b43SAndrew Jones 	vprintf(msg_fmt, va);
175e7c68b43SAndrew Jones 	va_end(va);
176e7c68b43SAndrew Jones 	puts("\n");
17775b3e681SAndrew Jones 	spin_unlock(&lock);
178e7c68b43SAndrew Jones 	report_summary();
179e7c68b43SAndrew Jones 	abort();
180e7c68b43SAndrew Jones }
181