xref: /kvm-unit-tests/lib/report.c (revision 53da5cc0dfb5df4cd27645c635a8c04603912105)
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"
14f3cdd159SJan Kiszka 
15a5af7b8aSAndrew Jones static unsigned int tests, failures, xfailures;
16*53da5cc0SAndrew Jones static char prefixes[256];
17*53da5cc0SAndrew Jones 
18*53da5cc0SAndrew Jones void report_prefix_push(const char *prefix)
19*53da5cc0SAndrew Jones {
20*53da5cc0SAndrew Jones 	strcat(prefixes, prefix);
21*53da5cc0SAndrew Jones 	strcat(prefixes, ": ");
22*53da5cc0SAndrew Jones }
23*53da5cc0SAndrew Jones 
24*53da5cc0SAndrew Jones void report_prefix_pop(void)
25*53da5cc0SAndrew Jones {
26*53da5cc0SAndrew Jones 	char *p, *q;
27*53da5cc0SAndrew Jones 
28*53da5cc0SAndrew Jones 	if (!*prefixes)
29*53da5cc0SAndrew Jones 		return;
30*53da5cc0SAndrew Jones 
31*53da5cc0SAndrew Jones 	for (p = prefixes, q = strstr(p, ": ") + 2;
32*53da5cc0SAndrew Jones 			*q;
33*53da5cc0SAndrew Jones 			p = q, q = strstr(p, ": ") + 2)
34*53da5cc0SAndrew Jones 		;
35*53da5cc0SAndrew Jones 	*p = '\0';
36*53da5cc0SAndrew Jones }
37a5af7b8aSAndrew Jones 
38a5af7b8aSAndrew Jones void va_report_xfail(const char *msg_fmt, bool xfail, bool cond, va_list va)
39a5af7b8aSAndrew Jones {
40a5af7b8aSAndrew Jones 	char *pass = xfail ? "XPASS" : "PASS";
41a5af7b8aSAndrew Jones 	char *fail = xfail ? "XFAIL" : "FAIL";
42a5af7b8aSAndrew Jones 	char buf[2000];
43a5af7b8aSAndrew Jones 
44a5af7b8aSAndrew Jones 	tests++;
45a5af7b8aSAndrew Jones 	printf("%s: ", cond ? pass : fail);
46*53da5cc0SAndrew Jones 	puts(prefixes);
47a5af7b8aSAndrew Jones 	vsnprintf(buf, sizeof(buf), msg_fmt, va);
48a5af7b8aSAndrew Jones 	puts(buf);
49a5af7b8aSAndrew Jones 	puts("\n");
50a5af7b8aSAndrew Jones 	if (xfail && cond)
51a5af7b8aSAndrew Jones 		failures++;
52a5af7b8aSAndrew Jones 	else if (xfail)
53a5af7b8aSAndrew Jones 		xfailures++;
54a5af7b8aSAndrew Jones 	else if (!cond)
55a5af7b8aSAndrew Jones 		failures++;
56a5af7b8aSAndrew Jones }
57f3cdd159SJan Kiszka 
58f3cdd159SJan Kiszka void report(const char *msg_fmt, bool pass, ...)
59f3cdd159SJan Kiszka {
60f3cdd159SJan Kiszka 	va_list va;
61f3cdd159SJan Kiszka 	va_start(va, pass);
62a5af7b8aSAndrew Jones 	va_report_xfail(msg_fmt, false, pass, va);
63f3cdd159SJan Kiszka 	va_end(va);
64a5af7b8aSAndrew Jones }
65a5af7b8aSAndrew Jones 
66a5af7b8aSAndrew Jones void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...)
67a5af7b8aSAndrew Jones {
68a5af7b8aSAndrew Jones 	va_list va;
69a5af7b8aSAndrew Jones 	va_start(va, pass);
70a5af7b8aSAndrew Jones 	va_report_xfail(msg_fmt, xfail, pass, va);
71a5af7b8aSAndrew Jones 	va_end(va);
72f3cdd159SJan Kiszka }
73f3cdd159SJan Kiszka 
74f3cdd159SJan Kiszka int report_summary(void)
75f3cdd159SJan Kiszka {
76a5af7b8aSAndrew Jones 	printf("\nSUMMARY: %d tests, %d unexpected failures", tests, failures);
77a5af7b8aSAndrew Jones 	if (xfailures)
78a5af7b8aSAndrew Jones 		printf(", %d expected failures\n", xfailures);
79a5af7b8aSAndrew Jones 	else
80a5af7b8aSAndrew Jones 		printf("\n");
81f3cdd159SJan Kiszka 	return failures > 0 ? 1 : 0;
82f3cdd159SJan Kiszka }
83