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 2017e80e71SPeter Feiner #define PREFIX_DELIMITER ": " 2117e80e71SPeter Feiner 22*0d78a090SDavid Matlack void report_pass(void) 23*0d78a090SDavid Matlack { 24*0d78a090SDavid Matlack spin_lock(&lock); 25*0d78a090SDavid Matlack tests++; 26*0d78a090SDavid Matlack spin_unlock(&lock); 27*0d78a090SDavid Matlack } 28*0d78a090SDavid Matlack 2917e80e71SPeter Feiner void report_prefix_pushf(const char *prefix_fmt, ...) 3017e80e71SPeter Feiner { 3117e80e71SPeter Feiner va_list va; 3217e80e71SPeter Feiner int len; 3317e80e71SPeter Feiner int start; 3417e80e71SPeter Feiner 3517e80e71SPeter Feiner spin_lock(&lock); 3617e80e71SPeter Feiner 3717e80e71SPeter Feiner len = strlen(prefixes); 3817e80e71SPeter Feiner assert_msg(len < sizeof(prefixes), "%d >= %lu", len, sizeof(prefixes)); 3917e80e71SPeter Feiner start = len; 4017e80e71SPeter Feiner 4117e80e71SPeter Feiner va_start(va, prefix_fmt); 4217e80e71SPeter Feiner len += vsnprintf(&prefixes[len], sizeof(prefixes) - len, prefix_fmt, 4317e80e71SPeter Feiner va); 4417e80e71SPeter Feiner va_end(va); 4517e80e71SPeter Feiner assert_msg(len < sizeof(prefixes), "%d >= %lu", len, sizeof(prefixes)); 4617e80e71SPeter Feiner 4717e80e71SPeter Feiner assert_msg(!strstr(&prefixes[start], PREFIX_DELIMITER), 4817e80e71SPeter Feiner "Prefix \"%s\" contains delimiter \"" PREFIX_DELIMITER "\"", 4917e80e71SPeter Feiner &prefixes[start]); 5017e80e71SPeter Feiner 5117e80e71SPeter Feiner len += snprintf(&prefixes[len], sizeof(prefixes) - len, 5217e80e71SPeter Feiner PREFIX_DELIMITER); 5317e80e71SPeter Feiner assert_msg(len < sizeof(prefixes), "%d >= %lu", len, sizeof(prefixes)); 5417e80e71SPeter Feiner 5517e80e71SPeter Feiner spin_unlock(&lock); 5617e80e71SPeter Feiner } 5717e80e71SPeter Feiner 5853da5cc0SAndrew Jones void report_prefix_push(const char *prefix) 5953da5cc0SAndrew Jones { 6017e80e71SPeter Feiner report_prefix_pushf("%s", prefix); 6153da5cc0SAndrew Jones } 6253da5cc0SAndrew Jones 6353da5cc0SAndrew Jones void report_prefix_pop(void) 6453da5cc0SAndrew Jones { 6553da5cc0SAndrew Jones char *p, *q; 6653da5cc0SAndrew Jones 67c5b6469dSAndrew Jones spin_lock(&lock); 68c5b6469dSAndrew Jones 6953da5cc0SAndrew Jones if (!*prefixes) 7053da5cc0SAndrew Jones return; 7153da5cc0SAndrew Jones 7217e80e71SPeter Feiner for (p = prefixes, q = strstr(p, PREFIX_DELIMITER) + 2; 7353da5cc0SAndrew Jones *q; 7417e80e71SPeter Feiner p = q, q = strstr(p, PREFIX_DELIMITER) + 2) 7553da5cc0SAndrew Jones ; 7653da5cc0SAndrew Jones *p = '\0'; 77c5b6469dSAndrew Jones 78c5b6469dSAndrew Jones spin_unlock(&lock); 7953da5cc0SAndrew Jones } 80a5af7b8aSAndrew Jones 81a0833bfcSRadim Krčmář static void va_report(const char *msg_fmt, 82a0833bfcSRadim Krčmář bool pass, bool xfail, bool skip, va_list va) 83a5af7b8aSAndrew Jones { 84a0833bfcSRadim Krčmář char *prefix = skip ? "SKIP" 85a0833bfcSRadim Krčmář : xfail ? (pass ? "XPASS" : "XFAIL") 86a0833bfcSRadim Krčmář : (pass ? "PASS" : "FAIL"); 87a5af7b8aSAndrew Jones 88c5b6469dSAndrew Jones spin_lock(&lock); 89c5b6469dSAndrew Jones 90a5af7b8aSAndrew Jones tests++; 91a0833bfcSRadim Krčmář printf("%s: ", prefix); 9253da5cc0SAndrew Jones puts(prefixes); 93cb12ecccSAndrew Jones vprintf(msg_fmt, va); 94a5af7b8aSAndrew Jones puts("\n"); 95a0833bfcSRadim Krčmář if (skip) 96a0833bfcSRadim Krčmář skipped++; 97a0833bfcSRadim Krčmář else if (xfail && !pass) 98a5af7b8aSAndrew Jones xfailures++; 99a0833bfcSRadim Krčmář else if (xfail || !pass) 100a5af7b8aSAndrew Jones failures++; 101c5b6469dSAndrew Jones 102c5b6469dSAndrew Jones spin_unlock(&lock); 103a5af7b8aSAndrew Jones } 104f3cdd159SJan Kiszka 105f3cdd159SJan Kiszka void report(const char *msg_fmt, bool pass, ...) 106f3cdd159SJan Kiszka { 107f3cdd159SJan Kiszka va_list va; 108f3cdd159SJan Kiszka va_start(va, pass); 109a0833bfcSRadim Krčmář va_report(msg_fmt, pass, false, false, va); 110f3cdd159SJan Kiszka va_end(va); 111a5af7b8aSAndrew Jones } 112a5af7b8aSAndrew Jones 113a5af7b8aSAndrew Jones void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...) 114a5af7b8aSAndrew Jones { 115a5af7b8aSAndrew Jones va_list va; 116a5af7b8aSAndrew Jones va_start(va, pass); 117a0833bfcSRadim Krčmář va_report(msg_fmt, pass, xfail, false, va); 118a0833bfcSRadim Krčmář va_end(va); 119a0833bfcSRadim Krčmář } 120a0833bfcSRadim Krčmář 121a0833bfcSRadim Krčmář void report_skip(const char *msg_fmt, ...) 122a0833bfcSRadim Krčmář { 123a0833bfcSRadim Krčmář va_list va; 124a0833bfcSRadim Krčmář va_start(va, msg_fmt); 125a0833bfcSRadim Krčmář va_report(msg_fmt, false, false, true, va); 126a5af7b8aSAndrew Jones va_end(va); 127f3cdd159SJan Kiszka } 128f3cdd159SJan Kiszka 1292acf2e69SAndrew Jones void report_info(const char *msg_fmt, ...) 1302acf2e69SAndrew Jones { 1312acf2e69SAndrew Jones va_list va; 1322acf2e69SAndrew Jones 1332acf2e69SAndrew Jones spin_lock(&lock); 1342acf2e69SAndrew Jones puts("INFO: "); 1352acf2e69SAndrew Jones puts(prefixes); 1362acf2e69SAndrew Jones va_start(va, msg_fmt); 1372acf2e69SAndrew Jones vprintf(msg_fmt, va); 1382acf2e69SAndrew Jones va_end(va); 1392acf2e69SAndrew Jones puts("\n"); 1402acf2e69SAndrew Jones spin_unlock(&lock); 1412acf2e69SAndrew Jones } 1422acf2e69SAndrew Jones 143f3cdd159SJan Kiszka int report_summary(void) 144f3cdd159SJan Kiszka { 145c5b6469dSAndrew Jones spin_lock(&lock); 146c5b6469dSAndrew Jones 147f1071c6dSAndrew Jones printf("SUMMARY: %d tests", tests); 1483d742d17SRadim Krčmář if (failures) 1493d742d17SRadim Krčmář printf(", %d unexpected failures", failures); 150a5af7b8aSAndrew Jones if (xfailures) 151a0833bfcSRadim Krčmář printf(", %d expected failures", xfailures); 152a0833bfcSRadim Krčmář if (skipped) 153a0833bfcSRadim Krčmář printf(", %d skipped", skipped); 154a5af7b8aSAndrew Jones printf("\n"); 155a0833bfcSRadim Krčmář 156a0833bfcSRadim Krčmář if (tests == skipped) 157a0833bfcSRadim Krčmář /* Blame AUTOTOOLS for using 77 for skipped test and QEMU for 158a0833bfcSRadim Krčmář * mangling error codes in a way that gets 77 if we ... */ 159a0833bfcSRadim Krčmář return 77 >> 1; 160a0833bfcSRadim Krčmář 161f3cdd159SJan Kiszka return failures > 0 ? 1 : 0; 162c5b6469dSAndrew Jones 163c5b6469dSAndrew Jones spin_unlock(&lock); 164f3cdd159SJan Kiszka } 165e7c68b43SAndrew Jones 166e7c68b43SAndrew Jones void report_abort(const char *msg_fmt, ...) 167e7c68b43SAndrew Jones { 168e7c68b43SAndrew Jones va_list va; 169e7c68b43SAndrew Jones 17075b3e681SAndrew Jones spin_lock(&lock); 171e7c68b43SAndrew Jones puts("ABORT: "); 172e7c68b43SAndrew Jones puts(prefixes); 173e7c68b43SAndrew Jones va_start(va, msg_fmt); 174e7c68b43SAndrew Jones vprintf(msg_fmt, va); 175e7c68b43SAndrew Jones va_end(va); 176e7c68b43SAndrew Jones puts("\n"); 17775b3e681SAndrew Jones spin_unlock(&lock); 178e7c68b43SAndrew Jones report_summary(); 179e7c68b43SAndrew Jones abort(); 180e7c68b43SAndrew Jones } 181