xref: /kvm-unit-tests/lib/report.c (revision c5b6469dba9407b852a27c16d233e6df1126d4a8)
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"
14*c5b6469dSAndrew Jones #include "asm/spinlock.h"
15f3cdd159SJan Kiszka 
16a5af7b8aSAndrew Jones static unsigned int tests, failures, xfailures;
1753da5cc0SAndrew Jones static char prefixes[256];
18*c5b6469dSAndrew Jones static struct spinlock lock;
1953da5cc0SAndrew Jones 
2053da5cc0SAndrew Jones void report_prefix_push(const char *prefix)
2153da5cc0SAndrew Jones {
22*c5b6469dSAndrew Jones 	spin_lock(&lock);
2353da5cc0SAndrew Jones 	strcat(prefixes, prefix);
2453da5cc0SAndrew Jones 	strcat(prefixes, ": ");
25*c5b6469dSAndrew Jones 	spin_unlock(&lock);
2653da5cc0SAndrew Jones }
2753da5cc0SAndrew Jones 
2853da5cc0SAndrew Jones void report_prefix_pop(void)
2953da5cc0SAndrew Jones {
3053da5cc0SAndrew Jones 	char *p, *q;
3153da5cc0SAndrew Jones 
32*c5b6469dSAndrew Jones 	spin_lock(&lock);
33*c5b6469dSAndrew 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';
42*c5b6469dSAndrew Jones 
43*c5b6469dSAndrew 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 	char buf[2000];
51a5af7b8aSAndrew Jones 
52*c5b6469dSAndrew Jones 	spin_lock(&lock);
53*c5b6469dSAndrew Jones 
54a5af7b8aSAndrew Jones 	tests++;
55a5af7b8aSAndrew Jones 	printf("%s: ", cond ? pass : fail);
5653da5cc0SAndrew Jones 	puts(prefixes);
57a5af7b8aSAndrew Jones 	vsnprintf(buf, sizeof(buf), msg_fmt, va);
58a5af7b8aSAndrew Jones 	puts(buf);
59a5af7b8aSAndrew Jones 	puts("\n");
60a5af7b8aSAndrew Jones 	if (xfail && cond)
61a5af7b8aSAndrew Jones 		failures++;
62a5af7b8aSAndrew Jones 	else if (xfail)
63a5af7b8aSAndrew Jones 		xfailures++;
64a5af7b8aSAndrew Jones 	else if (!cond)
65a5af7b8aSAndrew Jones 		failures++;
66*c5b6469dSAndrew Jones 
67*c5b6469dSAndrew 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);
74a5af7b8aSAndrew Jones 	va_report_xfail(msg_fmt, false, pass, 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);
82a5af7b8aSAndrew Jones 	va_report_xfail(msg_fmt, xfail, pass, va);
83a5af7b8aSAndrew Jones 	va_end(va);
84f3cdd159SJan Kiszka }
85f3cdd159SJan Kiszka 
86f3cdd159SJan Kiszka int report_summary(void)
87f3cdd159SJan Kiszka {
88*c5b6469dSAndrew Jones 	spin_lock(&lock);
89*c5b6469dSAndrew Jones 
90a5af7b8aSAndrew Jones 	printf("\nSUMMARY: %d tests, %d unexpected failures", tests, failures);
91a5af7b8aSAndrew Jones 	if (xfailures)
92a5af7b8aSAndrew Jones 		printf(", %d expected failures\n", xfailures);
93a5af7b8aSAndrew Jones 	else
94a5af7b8aSAndrew Jones 		printf("\n");
95f3cdd159SJan Kiszka 	return failures > 0 ? 1 : 0;
96*c5b6469dSAndrew Jones 
97*c5b6469dSAndrew Jones 	spin_unlock(&lock);
98f3cdd159SJan Kiszka }
99