xref: /kvm-unit-tests/lib/report.c (revision 6ed97c50871a0d85e9ef5e1f4da96bc4263b4b97)
1 /*
2  * Test result reporting
3  *
4  * Copyright (c) Siemens AG, 2014
5  *
6  * Authors:
7  *  Jan Kiszka <jan.kiszka@siemens.com>
8  *  Andrew Jones <drjones@redhat.com>
9  *
10  * This work is licensed under the terms of the GNU LGPL, version 2.
11  */
12 
13 #include "libcflat.h"
14 #include "asm/spinlock.h"
15 
16 static unsigned int tests, failures, xfailures;
17 static char prefixes[256];
18 static struct spinlock lock;
19 
20 void report_prefix_push(const char *prefix)
21 {
22 	spin_lock(&lock);
23 	strcat(prefixes, prefix);
24 	strcat(prefixes, ": ");
25 	spin_unlock(&lock);
26 }
27 
28 void report_prefix_pop(void)
29 {
30 	char *p, *q;
31 
32 	spin_lock(&lock);
33 
34 	if (!*prefixes)
35 		return;
36 
37 	for (p = prefixes, q = strstr(p, ": ") + 2;
38 			*q;
39 			p = q, q = strstr(p, ": ") + 2)
40 		;
41 	*p = '\0';
42 
43 	spin_unlock(&lock);
44 }
45 
46 void va_report_xfail(const char *msg_fmt, bool xfail, bool cond, va_list va)
47 {
48 	char *pass = xfail ? "XPASS" : "PASS";
49 	char *fail = xfail ? "XFAIL" : "FAIL";
50 
51 	spin_lock(&lock);
52 
53 	tests++;
54 	printf("%s: ", cond ? pass : fail);
55 	puts(prefixes);
56 	vprintf(msg_fmt, va);
57 	puts("\n");
58 	if (xfail && cond)
59 		failures++;
60 	else if (xfail)
61 		xfailures++;
62 	else if (!cond)
63 		failures++;
64 
65 	spin_unlock(&lock);
66 }
67 
68 void report(const char *msg_fmt, bool pass, ...)
69 {
70 	va_list va;
71 	va_start(va, pass);
72 	va_report_xfail(msg_fmt, false, pass, va);
73 	va_end(va);
74 }
75 
76 void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...)
77 {
78 	va_list va;
79 	va_start(va, pass);
80 	va_report_xfail(msg_fmt, xfail, pass, va);
81 	va_end(va);
82 }
83 
84 int report_summary(void)
85 {
86 	spin_lock(&lock);
87 
88 	printf("\nSUMMARY: %d tests, %d unexpected failures", tests, failures);
89 	if (xfailures)
90 		printf(", %d expected failures\n", xfailures);
91 	else
92 		printf("\n");
93 	return failures > 0 ? 1 : 0;
94 
95 	spin_unlock(&lock);
96 }
97 
98 void report_abort(const char *msg_fmt, ...)
99 {
100 	va_list va;
101 
102 	puts("ABORT: ");
103 	puts(prefixes);
104 	va_start(va, msg_fmt);
105 	vprintf(msg_fmt, va);
106 	va_end(va);
107 	puts("\n");
108 	report_summary();
109 	abort();
110 }
111