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 16a0833bfcSRadim Krčmář static unsigned int tests, failures, xfailures, skipped; 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 46a0833bfcSRadim Krčmář static void va_report(const char *msg_fmt, 47a0833bfcSRadim Krčmář bool pass, bool xfail, bool skip, va_list va) 48a5af7b8aSAndrew Jones { 49a0833bfcSRadim Krčmář char *prefix = skip ? "SKIP" 50a0833bfcSRadim Krčmář : xfail ? (pass ? "XPASS" : "XFAIL") 51a0833bfcSRadim Krčmář : (pass ? "PASS" : "FAIL"); 52a5af7b8aSAndrew Jones 53c5b6469dSAndrew Jones spin_lock(&lock); 54c5b6469dSAndrew Jones 55a5af7b8aSAndrew Jones tests++; 56a0833bfcSRadim Krčmář printf("%s: ", prefix); 5753da5cc0SAndrew Jones puts(prefixes); 58cb12ecccSAndrew Jones vprintf(msg_fmt, va); 59a5af7b8aSAndrew Jones puts("\n"); 60a0833bfcSRadim Krčmář if (skip) 61a0833bfcSRadim Krčmář skipped++; 62a0833bfcSRadim Krčmář else if (xfail && !pass) 63a5af7b8aSAndrew Jones xfailures++; 64a0833bfcSRadim Krčmář else if (xfail || !pass) 65a5af7b8aSAndrew Jones failures++; 66c5b6469dSAndrew Jones 67c5b6469dSAndrew 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); 74a0833bfcSRadim Krčmář va_report(msg_fmt, pass, false, false, 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); 82a0833bfcSRadim Krčmář va_report(msg_fmt, pass, xfail, false, va); 83a0833bfcSRadim Krčmář va_end(va); 84a0833bfcSRadim Krčmář } 85a0833bfcSRadim Krčmář 86a0833bfcSRadim Krčmář void report_skip(const char *msg_fmt, ...) 87a0833bfcSRadim Krčmář { 88a0833bfcSRadim Krčmář va_list va; 89a0833bfcSRadim Krčmář va_start(va, msg_fmt); 90a0833bfcSRadim Krčmář va_report(msg_fmt, false, false, true, va); 91a5af7b8aSAndrew Jones va_end(va); 92f3cdd159SJan Kiszka } 93f3cdd159SJan Kiszka 94*2acf2e69SAndrew Jones void report_info(const char *msg_fmt, ...) 95*2acf2e69SAndrew Jones { 96*2acf2e69SAndrew Jones va_list va; 97*2acf2e69SAndrew Jones 98*2acf2e69SAndrew Jones spin_lock(&lock); 99*2acf2e69SAndrew Jones puts("INFO: "); 100*2acf2e69SAndrew Jones puts(prefixes); 101*2acf2e69SAndrew Jones va_start(va, msg_fmt); 102*2acf2e69SAndrew Jones vprintf(msg_fmt, va); 103*2acf2e69SAndrew Jones va_end(va); 104*2acf2e69SAndrew Jones puts("\n"); 105*2acf2e69SAndrew Jones spin_unlock(&lock); 106*2acf2e69SAndrew Jones } 107*2acf2e69SAndrew Jones 108f3cdd159SJan Kiszka int report_summary(void) 109f3cdd159SJan Kiszka { 110c5b6469dSAndrew Jones spin_lock(&lock); 111c5b6469dSAndrew Jones 1123d742d17SRadim Krčmář printf("\nSUMMARY: %d tests", tests); 1133d742d17SRadim Krčmář if (failures) 1143d742d17SRadim Krčmář printf(", %d unexpected failures", failures); 115a5af7b8aSAndrew Jones if (xfailures) 116a0833bfcSRadim Krčmář printf(", %d expected failures", xfailures); 117a0833bfcSRadim Krčmář if (skipped) 118a0833bfcSRadim Krčmář printf(", %d skipped", skipped); 119a5af7b8aSAndrew Jones printf("\n"); 120a0833bfcSRadim Krčmář 121a0833bfcSRadim Krčmář if (tests == skipped) 122a0833bfcSRadim Krčmář /* Blame AUTOTOOLS for using 77 for skipped test and QEMU for 123a0833bfcSRadim Krčmář * mangling error codes in a way that gets 77 if we ... */ 124a0833bfcSRadim Krčmář return 77 >> 1; 125a0833bfcSRadim Krčmář 126f3cdd159SJan Kiszka return failures > 0 ? 1 : 0; 127c5b6469dSAndrew Jones 128c5b6469dSAndrew Jones spin_unlock(&lock); 129f3cdd159SJan Kiszka } 130e7c68b43SAndrew Jones 131e7c68b43SAndrew Jones void report_abort(const char *msg_fmt, ...) 132e7c68b43SAndrew Jones { 133e7c68b43SAndrew Jones va_list va; 134e7c68b43SAndrew Jones 13575b3e681SAndrew Jones spin_lock(&lock); 136e7c68b43SAndrew Jones puts("ABORT: "); 137e7c68b43SAndrew Jones puts(prefixes); 138e7c68b43SAndrew Jones va_start(va, msg_fmt); 139e7c68b43SAndrew Jones vprintf(msg_fmt, va); 140e7c68b43SAndrew Jones va_end(va); 141e7c68b43SAndrew Jones puts("\n"); 14275b3e681SAndrew Jones spin_unlock(&lock); 143e7c68b43SAndrew Jones report_summary(); 144e7c68b43SAndrew Jones abort(); 145e7c68b43SAndrew Jones } 146