xref: /kvm-unit-tests/lib/report.c (revision 2acf2e69a5801a67f344269130351ec40a005f87)
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 
2053da5cc0SAndrew Jones void report_prefix_push(const char *prefix)
2153da5cc0SAndrew Jones {
22c5b6469dSAndrew Jones 	spin_lock(&lock);
2353da5cc0SAndrew Jones 	strcat(prefixes, prefix);
2453da5cc0SAndrew Jones 	strcat(prefixes, ": ");
25c5b6469dSAndrew Jones 	spin_unlock(&lock);
2653da5cc0SAndrew Jones }
2753da5cc0SAndrew Jones 
2853da5cc0SAndrew Jones void report_prefix_pop(void)
2953da5cc0SAndrew Jones {
3053da5cc0SAndrew Jones 	char *p, *q;
3153da5cc0SAndrew Jones 
32c5b6469dSAndrew Jones 	spin_lock(&lock);
33c5b6469dSAndrew Jones 
3453da5cc0SAndrew Jones 	if (!*prefixes)
3553da5cc0SAndrew Jones 		return;
3653da5cc0SAndrew Jones 
3753da5cc0SAndrew Jones 	for (p = prefixes, q = strstr(p, ": ") + 2;
3853da5cc0SAndrew Jones 			*q;
3953da5cc0SAndrew Jones 			p = q, q = strstr(p, ": ") + 2)
4053da5cc0SAndrew Jones 		;
4153da5cc0SAndrew Jones 	*p = '\0';
42c5b6469dSAndrew Jones 
43c5b6469dSAndrew Jones 	spin_unlock(&lock);
4453da5cc0SAndrew Jones }
45a5af7b8aSAndrew Jones 
46a0833bfcSRadim Krčmář static void va_report(const char *msg_fmt,
47a0833bfcSRadim Krčmář 		bool pass, bool xfail, bool skip, va_list va)
48a5af7b8aSAndrew Jones {
49a0833bfcSRadim Krčmář 	char *prefix = skip ? "SKIP"
50a0833bfcSRadim Krčmář 	                    : xfail ? (pass ? "XPASS" : "XFAIL")
51a0833bfcSRadim Krčmář 	                            : (pass ? "PASS"  : "FAIL");
52a5af7b8aSAndrew Jones 
53c5b6469dSAndrew Jones 	spin_lock(&lock);
54c5b6469dSAndrew Jones 
55a5af7b8aSAndrew Jones 	tests++;
56a0833bfcSRadim Krčmář 	printf("%s: ", prefix);
5753da5cc0SAndrew Jones 	puts(prefixes);
58cb12ecccSAndrew Jones 	vprintf(msg_fmt, va);
59a5af7b8aSAndrew Jones 	puts("\n");
60a0833bfcSRadim Krčmář 	if (skip)
61a0833bfcSRadim Krčmář 		skipped++;
62a0833bfcSRadim Krčmář 	else if (xfail && !pass)
63a5af7b8aSAndrew Jones 		xfailures++;
64a0833bfcSRadim Krčmář 	else if (xfail || !pass)
65a5af7b8aSAndrew Jones 		failures++;
66c5b6469dSAndrew Jones 
67c5b6469dSAndrew Jones 	spin_unlock(&lock);
68a5af7b8aSAndrew Jones }
69f3cdd159SJan Kiszka 
70f3cdd159SJan Kiszka void report(const char *msg_fmt, bool pass, ...)
71f3cdd159SJan Kiszka {
72f3cdd159SJan Kiszka 	va_list va;
73f3cdd159SJan Kiszka 	va_start(va, pass);
74a0833bfcSRadim Krčmář 	va_report(msg_fmt, pass, false, false, va);
75f3cdd159SJan Kiszka 	va_end(va);
76a5af7b8aSAndrew Jones }
77a5af7b8aSAndrew Jones 
78a5af7b8aSAndrew Jones void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...)
79a5af7b8aSAndrew Jones {
80a5af7b8aSAndrew Jones 	va_list va;
81a5af7b8aSAndrew Jones 	va_start(va, pass);
82a0833bfcSRadim Krčmář 	va_report(msg_fmt, pass, xfail, false, va);
83a0833bfcSRadim Krčmář 	va_end(va);
84a0833bfcSRadim Krčmář }
85a0833bfcSRadim Krčmář 
86a0833bfcSRadim Krčmář void report_skip(const char *msg_fmt, ...)
87a0833bfcSRadim Krčmář {
88a0833bfcSRadim Krčmář 	va_list va;
89a0833bfcSRadim Krčmář 	va_start(va, msg_fmt);
90a0833bfcSRadim Krčmář 	va_report(msg_fmt, false, false, true, va);
91a5af7b8aSAndrew Jones 	va_end(va);
92f3cdd159SJan Kiszka }
93f3cdd159SJan Kiszka 
94*2acf2e69SAndrew Jones void report_info(const char *msg_fmt, ...)
95*2acf2e69SAndrew Jones {
96*2acf2e69SAndrew Jones 	va_list va;
97*2acf2e69SAndrew Jones 
98*2acf2e69SAndrew Jones 	spin_lock(&lock);
99*2acf2e69SAndrew Jones 	puts("INFO: ");
100*2acf2e69SAndrew Jones 	puts(prefixes);
101*2acf2e69SAndrew Jones 	va_start(va, msg_fmt);
102*2acf2e69SAndrew Jones 	vprintf(msg_fmt, va);
103*2acf2e69SAndrew Jones 	va_end(va);
104*2acf2e69SAndrew Jones 	puts("\n");
105*2acf2e69SAndrew Jones 	spin_unlock(&lock);
106*2acf2e69SAndrew Jones }
107*2acf2e69SAndrew Jones 
108f3cdd159SJan Kiszka int report_summary(void)
109f3cdd159SJan Kiszka {
110c5b6469dSAndrew Jones 	spin_lock(&lock);
111c5b6469dSAndrew Jones 
1123d742d17SRadim Krčmář 	printf("\nSUMMARY: %d tests", tests);
1133d742d17SRadim Krčmář 	if (failures)
1143d742d17SRadim Krčmář 		printf(", %d unexpected failures", failures);
115a5af7b8aSAndrew Jones 	if (xfailures)
116a0833bfcSRadim Krčmář 		printf(", %d expected failures", xfailures);
117a0833bfcSRadim Krčmář 	if (skipped)
118a0833bfcSRadim Krčmář 		printf(", %d skipped", skipped);
119a5af7b8aSAndrew Jones 	printf("\n");
120a0833bfcSRadim Krčmář 
121a0833bfcSRadim Krčmář 	if (tests == skipped)
122a0833bfcSRadim Krčmář 		/* Blame AUTOTOOLS for using 77 for skipped test and QEMU for
123a0833bfcSRadim Krčmář 		 * mangling error codes in a way that gets 77 if we ... */
124a0833bfcSRadim Krčmář 		return 77 >> 1;
125a0833bfcSRadim Krčmář 
126f3cdd159SJan Kiszka 	return failures > 0 ? 1 : 0;
127c5b6469dSAndrew Jones 
128c5b6469dSAndrew Jones 	spin_unlock(&lock);
129f3cdd159SJan Kiszka }
130e7c68b43SAndrew Jones 
131e7c68b43SAndrew Jones void report_abort(const char *msg_fmt, ...)
132e7c68b43SAndrew Jones {
133e7c68b43SAndrew Jones 	va_list va;
134e7c68b43SAndrew Jones 
13575b3e681SAndrew Jones 	spin_lock(&lock);
136e7c68b43SAndrew Jones 	puts("ABORT: ");
137e7c68b43SAndrew Jones 	puts(prefixes);
138e7c68b43SAndrew Jones 	va_start(va, msg_fmt);
139e7c68b43SAndrew Jones 	vprintf(msg_fmt, va);
140e7c68b43SAndrew Jones 	va_end(va);
141e7c68b43SAndrew Jones 	puts("\n");
14275b3e681SAndrew Jones 	spin_unlock(&lock);
143e7c68b43SAndrew Jones 	report_summary();
144e7c68b43SAndrew Jones 	abort();
145e7c68b43SAndrew Jones }
146