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 16a5af7b8aSAndrew Jones static unsigned int tests, failures, xfailures; 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 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 51c5b6469dSAndrew Jones spin_lock(&lock); 52c5b6469dSAndrew Jones 53a5af7b8aSAndrew Jones tests++; 54a5af7b8aSAndrew Jones printf("%s: ", cond ? pass : fail); 5553da5cc0SAndrew Jones puts(prefixes); 56*cb12ecccSAndrew Jones vprintf(msg_fmt, va); 57a5af7b8aSAndrew Jones puts("\n"); 58a5af7b8aSAndrew Jones if (xfail && cond) 59a5af7b8aSAndrew Jones failures++; 60a5af7b8aSAndrew Jones else if (xfail) 61a5af7b8aSAndrew Jones xfailures++; 62a5af7b8aSAndrew Jones else if (!cond) 63a5af7b8aSAndrew Jones failures++; 64c5b6469dSAndrew Jones 65c5b6469dSAndrew Jones spin_unlock(&lock); 66a5af7b8aSAndrew Jones } 67f3cdd159SJan Kiszka 68f3cdd159SJan Kiszka void report(const char *msg_fmt, bool pass, ...) 69f3cdd159SJan Kiszka { 70f3cdd159SJan Kiszka va_list va; 71f3cdd159SJan Kiszka va_start(va, pass); 72a5af7b8aSAndrew Jones va_report_xfail(msg_fmt, false, pass, va); 73f3cdd159SJan Kiszka va_end(va); 74a5af7b8aSAndrew Jones } 75a5af7b8aSAndrew Jones 76a5af7b8aSAndrew Jones void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...) 77a5af7b8aSAndrew Jones { 78a5af7b8aSAndrew Jones va_list va; 79a5af7b8aSAndrew Jones va_start(va, pass); 80a5af7b8aSAndrew Jones va_report_xfail(msg_fmt, xfail, pass, va); 81a5af7b8aSAndrew Jones va_end(va); 82f3cdd159SJan Kiszka } 83f3cdd159SJan Kiszka 84f3cdd159SJan Kiszka int report_summary(void) 85f3cdd159SJan Kiszka { 86c5b6469dSAndrew Jones spin_lock(&lock); 87c5b6469dSAndrew Jones 88a5af7b8aSAndrew Jones printf("\nSUMMARY: %d tests, %d unexpected failures", tests, failures); 89a5af7b8aSAndrew Jones if (xfailures) 90a5af7b8aSAndrew Jones printf(", %d expected failures\n", xfailures); 91a5af7b8aSAndrew Jones else 92a5af7b8aSAndrew Jones printf("\n"); 93f3cdd159SJan Kiszka return failures > 0 ? 1 : 0; 94c5b6469dSAndrew Jones 95c5b6469dSAndrew Jones spin_unlock(&lock); 96f3cdd159SJan Kiszka } 97