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