xref: /kvm-unit-tests/lib/report.c (revision cb12ecccb3d57b7a93f2c4b2393e462c3deb84e9)
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 
16a5af7b8aSAndrew Jones static unsigned int tests, failures, xfailures;
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 
46a5af7b8aSAndrew Jones void va_report_xfail(const char *msg_fmt, bool xfail, bool cond, va_list va)
47a5af7b8aSAndrew Jones {
48a5af7b8aSAndrew Jones 	char *pass = xfail ? "XPASS" : "PASS";
49a5af7b8aSAndrew Jones 	char *fail = xfail ? "XFAIL" : "FAIL";
50a5af7b8aSAndrew Jones 
51c5b6469dSAndrew Jones 	spin_lock(&lock);
52c5b6469dSAndrew Jones 
53a5af7b8aSAndrew Jones 	tests++;
54a5af7b8aSAndrew Jones 	printf("%s: ", cond ? pass : fail);
5553da5cc0SAndrew Jones 	puts(prefixes);
56*cb12ecccSAndrew Jones 	vprintf(msg_fmt, va);
57a5af7b8aSAndrew Jones 	puts("\n");
58a5af7b8aSAndrew Jones 	if (xfail && cond)
59a5af7b8aSAndrew Jones 		failures++;
60a5af7b8aSAndrew Jones 	else if (xfail)
61a5af7b8aSAndrew Jones 		xfailures++;
62a5af7b8aSAndrew Jones 	else if (!cond)
63a5af7b8aSAndrew Jones 		failures++;
64c5b6469dSAndrew Jones 
65c5b6469dSAndrew Jones 	spin_unlock(&lock);
66a5af7b8aSAndrew Jones }
67f3cdd159SJan Kiszka 
68f3cdd159SJan Kiszka void report(const char *msg_fmt, bool pass, ...)
69f3cdd159SJan Kiszka {
70f3cdd159SJan Kiszka 	va_list va;
71f3cdd159SJan Kiszka 	va_start(va, pass);
72a5af7b8aSAndrew Jones 	va_report_xfail(msg_fmt, false, pass, va);
73f3cdd159SJan Kiszka 	va_end(va);
74a5af7b8aSAndrew Jones }
75a5af7b8aSAndrew Jones 
76a5af7b8aSAndrew Jones void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...)
77a5af7b8aSAndrew Jones {
78a5af7b8aSAndrew Jones 	va_list va;
79a5af7b8aSAndrew Jones 	va_start(va, pass);
80a5af7b8aSAndrew Jones 	va_report_xfail(msg_fmt, xfail, pass, va);
81a5af7b8aSAndrew Jones 	va_end(va);
82f3cdd159SJan Kiszka }
83f3cdd159SJan Kiszka 
84f3cdd159SJan Kiszka int report_summary(void)
85f3cdd159SJan Kiszka {
86c5b6469dSAndrew Jones 	spin_lock(&lock);
87c5b6469dSAndrew Jones 
88a5af7b8aSAndrew Jones 	printf("\nSUMMARY: %d tests, %d unexpected failures", tests, failures);
89a5af7b8aSAndrew Jones 	if (xfailures)
90a5af7b8aSAndrew Jones 		printf(", %d expected failures\n", xfailures);
91a5af7b8aSAndrew Jones 	else
92a5af7b8aSAndrew Jones 		printf("\n");
93f3cdd159SJan Kiszka 	return failures > 0 ? 1 : 0;
94c5b6469dSAndrew Jones 
95c5b6469dSAndrew Jones 	spin_unlock(&lock);
96f3cdd159SJan Kiszka }
97