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" 14f3cdd159SJan Kiszka 15a5af7b8aSAndrew Jones static unsigned int tests, failures, xfailures; 16*53da5cc0SAndrew Jones static char prefixes[256]; 17*53da5cc0SAndrew Jones 18*53da5cc0SAndrew Jones void report_prefix_push(const char *prefix) 19*53da5cc0SAndrew Jones { 20*53da5cc0SAndrew Jones strcat(prefixes, prefix); 21*53da5cc0SAndrew Jones strcat(prefixes, ": "); 22*53da5cc0SAndrew Jones } 23*53da5cc0SAndrew Jones 24*53da5cc0SAndrew Jones void report_prefix_pop(void) 25*53da5cc0SAndrew Jones { 26*53da5cc0SAndrew Jones char *p, *q; 27*53da5cc0SAndrew Jones 28*53da5cc0SAndrew Jones if (!*prefixes) 29*53da5cc0SAndrew Jones return; 30*53da5cc0SAndrew Jones 31*53da5cc0SAndrew Jones for (p = prefixes, q = strstr(p, ": ") + 2; 32*53da5cc0SAndrew Jones *q; 33*53da5cc0SAndrew Jones p = q, q = strstr(p, ": ") + 2) 34*53da5cc0SAndrew Jones ; 35*53da5cc0SAndrew Jones *p = '\0'; 36*53da5cc0SAndrew Jones } 37a5af7b8aSAndrew Jones 38a5af7b8aSAndrew Jones void va_report_xfail(const char *msg_fmt, bool xfail, bool cond, va_list va) 39a5af7b8aSAndrew Jones { 40a5af7b8aSAndrew Jones char *pass = xfail ? "XPASS" : "PASS"; 41a5af7b8aSAndrew Jones char *fail = xfail ? "XFAIL" : "FAIL"; 42a5af7b8aSAndrew Jones char buf[2000]; 43a5af7b8aSAndrew Jones 44a5af7b8aSAndrew Jones tests++; 45a5af7b8aSAndrew Jones printf("%s: ", cond ? pass : fail); 46*53da5cc0SAndrew Jones puts(prefixes); 47a5af7b8aSAndrew Jones vsnprintf(buf, sizeof(buf), msg_fmt, va); 48a5af7b8aSAndrew Jones puts(buf); 49a5af7b8aSAndrew Jones puts("\n"); 50a5af7b8aSAndrew Jones if (xfail && cond) 51a5af7b8aSAndrew Jones failures++; 52a5af7b8aSAndrew Jones else if (xfail) 53a5af7b8aSAndrew Jones xfailures++; 54a5af7b8aSAndrew Jones else if (!cond) 55a5af7b8aSAndrew Jones failures++; 56a5af7b8aSAndrew Jones } 57f3cdd159SJan Kiszka 58f3cdd159SJan Kiszka void report(const char *msg_fmt, bool pass, ...) 59f3cdd159SJan Kiszka { 60f3cdd159SJan Kiszka va_list va; 61f3cdd159SJan Kiszka va_start(va, pass); 62a5af7b8aSAndrew Jones va_report_xfail(msg_fmt, false, pass, va); 63f3cdd159SJan Kiszka va_end(va); 64a5af7b8aSAndrew Jones } 65a5af7b8aSAndrew Jones 66a5af7b8aSAndrew Jones void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...) 67a5af7b8aSAndrew Jones { 68a5af7b8aSAndrew Jones va_list va; 69a5af7b8aSAndrew Jones va_start(va, pass); 70a5af7b8aSAndrew Jones va_report_xfail(msg_fmt, xfail, pass, va); 71a5af7b8aSAndrew Jones va_end(va); 72f3cdd159SJan Kiszka } 73f3cdd159SJan Kiszka 74f3cdd159SJan Kiszka int report_summary(void) 75f3cdd159SJan Kiszka { 76a5af7b8aSAndrew Jones printf("\nSUMMARY: %d tests, %d unexpected failures", tests, failures); 77a5af7b8aSAndrew Jones if (xfailures) 78a5af7b8aSAndrew Jones printf(", %d expected failures\n", xfailures); 79a5af7b8aSAndrew Jones else 80a5af7b8aSAndrew Jones printf("\n"); 81f3cdd159SJan Kiszka return failures > 0 ? 1 : 0; 82f3cdd159SJan Kiszka } 83