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