xref: /kvm-unit-tests/lib/report.c (revision a299895b7abb54e7ba6bb4108f202acbb484ac65)
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 
220d78a090SDavid Matlack void report_pass(void)
230d78a090SDavid Matlack {
240d78a090SDavid Matlack 	spin_lock(&lock);
250d78a090SDavid Matlack 	tests++;
260d78a090SDavid Matlack 	spin_unlock(&lock);
270d78a090SDavid Matlack }
280d78a090SDavid Matlack 
2917e80e71SPeter Feiner void report_prefix_pushf(const char *prefix_fmt, ...)
3017e80e71SPeter Feiner {
3117e80e71SPeter Feiner 	va_list va;
320537dbecSDavid Hildenbrand 	unsigned int len;
3317e80e71SPeter Feiner 	int start;
3417e80e71SPeter Feiner 
3517e80e71SPeter Feiner 	spin_lock(&lock);
3617e80e71SPeter Feiner 
3717e80e71SPeter Feiner 	len = strlen(prefixes);
382ff95b37SRadim Krčmář 	assert_msg(len < sizeof(prefixes), "%d >= %zu", 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);
452ff95b37SRadim Krčmář 	assert_msg(len < sizeof(prefixes), "%d >= %zu", 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);
532ff95b37SRadim Krčmář 	assert_msg(len < sizeof(prefixes), "%d >= %zu", 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 
699064d89bSPeng Hao 	if (!*prefixes) {
709064d89bSPeng Hao 		spin_unlock(&lock);
7153da5cc0SAndrew Jones 		return;
729064d89bSPeng Hao 	}
7353da5cc0SAndrew Jones 
7417e80e71SPeter Feiner 	for (p = prefixes, q = strstr(p, PREFIX_DELIMITER) + 2;
7553da5cc0SAndrew Jones 			*q;
7617e80e71SPeter Feiner 			p = q, q = strstr(p, PREFIX_DELIMITER) + 2)
7753da5cc0SAndrew Jones 		;
7853da5cc0SAndrew Jones 	*p = '\0';
79c5b6469dSAndrew Jones 
80c5b6469dSAndrew Jones 	spin_unlock(&lock);
8153da5cc0SAndrew Jones }
82a5af7b8aSAndrew Jones 
83a0833bfcSRadim Krčmář static void va_report(const char *msg_fmt,
84a0833bfcSRadim Krčmář 		bool pass, bool xfail, bool skip, va_list va)
85a5af7b8aSAndrew Jones {
86797d79a2SThomas Huth 	const char *prefix = skip ? "SKIP"
87a0833bfcSRadim Krčmář 				  : xfail ? (pass ? "XPASS" : "XFAIL")
88a0833bfcSRadim Krčmář 					  : (pass ? "PASS"  : "FAIL");
89a5af7b8aSAndrew Jones 
90c5b6469dSAndrew Jones 	spin_lock(&lock);
91c5b6469dSAndrew Jones 
92a5af7b8aSAndrew Jones 	tests++;
93a0833bfcSRadim Krčmář 	printf("%s: ", prefix);
9453da5cc0SAndrew Jones 	puts(prefixes);
95cb12ecccSAndrew Jones 	vprintf(msg_fmt, va);
96a5af7b8aSAndrew Jones 	puts("\n");
97a0833bfcSRadim Krčmář 	if (skip)
98a0833bfcSRadim Krčmář 		skipped++;
99a0833bfcSRadim Krčmář 	else if (xfail && !pass)
100a5af7b8aSAndrew Jones 		xfailures++;
101a0833bfcSRadim Krčmář 	else if (xfail || !pass)
102a5af7b8aSAndrew Jones 		failures++;
103c5b6469dSAndrew Jones 
104c5b6469dSAndrew Jones 	spin_unlock(&lock);
105a5af7b8aSAndrew Jones }
106f3cdd159SJan Kiszka 
107*a299895bSThomas Huth void report(bool pass, const char *msg_fmt, ...)
108f3cdd159SJan Kiszka {
109f3cdd159SJan Kiszka 	va_list va;
110*a299895bSThomas Huth 	va_start(va, msg_fmt);
111a0833bfcSRadim Krčmář 	va_report(msg_fmt, pass, false, false, va);
112f3cdd159SJan Kiszka 	va_end(va);
113a5af7b8aSAndrew Jones }
114a5af7b8aSAndrew Jones 
115*a299895bSThomas Huth void report_xfail(bool xfail, bool pass, const char *msg_fmt, ...)
116a5af7b8aSAndrew Jones {
117a5af7b8aSAndrew Jones 	va_list va;
118*a299895bSThomas Huth 	va_start(va, msg_fmt);
119a0833bfcSRadim Krčmář 	va_report(msg_fmt, pass, xfail, false, va);
120a0833bfcSRadim Krčmář 	va_end(va);
121a0833bfcSRadim Krčmář }
122a0833bfcSRadim Krčmář 
123a0833bfcSRadim Krčmář void report_skip(const char *msg_fmt, ...)
124a0833bfcSRadim Krčmář {
125a0833bfcSRadim Krčmář 	va_list va;
126a0833bfcSRadim Krčmář 	va_start(va, msg_fmt);
127a0833bfcSRadim Krčmář 	va_report(msg_fmt, false, false, true, va);
128a5af7b8aSAndrew Jones 	va_end(va);
129f3cdd159SJan Kiszka }
130f3cdd159SJan Kiszka 
1312acf2e69SAndrew Jones void report_info(const char *msg_fmt, ...)
1322acf2e69SAndrew Jones {
1332acf2e69SAndrew Jones 	va_list va;
1342acf2e69SAndrew Jones 
1352acf2e69SAndrew Jones 	spin_lock(&lock);
1362acf2e69SAndrew Jones 	puts("INFO: ");
1372acf2e69SAndrew Jones 	puts(prefixes);
1382acf2e69SAndrew Jones 	va_start(va, msg_fmt);
1392acf2e69SAndrew Jones 	vprintf(msg_fmt, va);
1402acf2e69SAndrew Jones 	va_end(va);
1412acf2e69SAndrew Jones 	puts("\n");
1422acf2e69SAndrew Jones 	spin_unlock(&lock);
1432acf2e69SAndrew Jones }
1442acf2e69SAndrew Jones 
145f3cdd159SJan Kiszka int report_summary(void)
146f3cdd159SJan Kiszka {
1479064d89bSPeng Hao 	int ret;
148c5b6469dSAndrew Jones 	spin_lock(&lock);
149c5b6469dSAndrew Jones 
150f1071c6dSAndrew Jones 	printf("SUMMARY: %d tests", tests);
1513d742d17SRadim Krčmář 	if (failures)
1523d742d17SRadim Krčmář 		printf(", %d unexpected failures", failures);
153a5af7b8aSAndrew Jones 	if (xfailures)
154a0833bfcSRadim Krčmář 		printf(", %d expected failures", xfailures);
155a0833bfcSRadim Krčmář 	if (skipped)
156a0833bfcSRadim Krčmář 		printf(", %d skipped", skipped);
157a5af7b8aSAndrew Jones 	printf("\n");
158a0833bfcSRadim Krčmář 
1599064d89bSPeng Hao 	if (tests == skipped) {
1609064d89bSPeng Hao 		spin_unlock(&lock);
161a0833bfcSRadim Krčmář 		/* Blame AUTOTOOLS for using 77 for skipped test and QEMU for
162a0833bfcSRadim Krčmář 		 * mangling error codes in a way that gets 77 if we ... */
163a0833bfcSRadim Krčmář 		return 77 >> 1;
1649064d89bSPeng Hao 	}
165a0833bfcSRadim Krčmář 
1669064d89bSPeng Hao 	ret = failures > 0 ? 1 : 0;
167c5b6469dSAndrew Jones 	spin_unlock(&lock);
1689064d89bSPeng Hao 	return ret;
169f3cdd159SJan Kiszka }
170e7c68b43SAndrew Jones 
171e7c68b43SAndrew Jones void report_abort(const char *msg_fmt, ...)
172e7c68b43SAndrew Jones {
173e7c68b43SAndrew Jones 	va_list va;
174e7c68b43SAndrew Jones 
17575b3e681SAndrew Jones 	spin_lock(&lock);
176e7c68b43SAndrew Jones 	puts("ABORT: ");
177e7c68b43SAndrew Jones 	puts(prefixes);
178e7c68b43SAndrew Jones 	va_start(va, msg_fmt);
179e7c68b43SAndrew Jones 	vprintf(msg_fmt, va);
180e7c68b43SAndrew Jones 	va_end(va);
181e7c68b43SAndrew Jones 	puts("\n");
18275b3e681SAndrew Jones 	spin_unlock(&lock);
183e7c68b43SAndrew Jones 	report_summary();
184e7c68b43SAndrew Jones 	abort();
185e7c68b43SAndrew Jones }
186