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 220d78a090SDavid Matlack void report_pass(void) 230d78a090SDavid Matlack { 240d78a090SDavid Matlack spin_lock(&lock); 250d78a090SDavid Matlack tests++; 260d78a090SDavid Matlack spin_unlock(&lock); 270d78a090SDavid Matlack } 280d78a090SDavid Matlack 2917e80e71SPeter Feiner void report_prefix_pushf(const char *prefix_fmt, ...) 3017e80e71SPeter Feiner { 3117e80e71SPeter Feiner va_list va; 320537dbecSDavid Hildenbrand unsigned int len; 3317e80e71SPeter Feiner int start; 3417e80e71SPeter Feiner 3517e80e71SPeter Feiner spin_lock(&lock); 3617e80e71SPeter Feiner 3717e80e71SPeter Feiner len = strlen(prefixes); 382ff95b37SRadim Krčmář assert_msg(len < sizeof(prefixes), "%d >= %zu", 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); 452ff95b37SRadim Krčmář assert_msg(len < sizeof(prefixes), "%d >= %zu", 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); 532ff95b37SRadim Krčmář assert_msg(len < sizeof(prefixes), "%d >= %zu", 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 699064d89bSPeng Hao if (!*prefixes) { 709064d89bSPeng Hao spin_unlock(&lock); 7153da5cc0SAndrew Jones return; 729064d89bSPeng Hao } 7353da5cc0SAndrew Jones 7417e80e71SPeter Feiner for (p = prefixes, q = strstr(p, PREFIX_DELIMITER) + 2; 7553da5cc0SAndrew Jones *q; 7617e80e71SPeter Feiner p = q, q = strstr(p, PREFIX_DELIMITER) + 2) 7753da5cc0SAndrew Jones ; 7853da5cc0SAndrew Jones *p = '\0'; 79c5b6469dSAndrew Jones 80c5b6469dSAndrew Jones spin_unlock(&lock); 8153da5cc0SAndrew Jones } 82a5af7b8aSAndrew Jones 83a0833bfcSRadim Krčmář static void va_report(const char *msg_fmt, 84a0833bfcSRadim Krčmář bool pass, bool xfail, bool skip, va_list va) 85a5af7b8aSAndrew Jones { 86797d79a2SThomas Huth const char *prefix = skip ? "SKIP" 87a0833bfcSRadim Krčmář : xfail ? (pass ? "XPASS" : "XFAIL") 88a0833bfcSRadim Krčmář : (pass ? "PASS" : "FAIL"); 89a5af7b8aSAndrew Jones 90c5b6469dSAndrew Jones spin_lock(&lock); 91c5b6469dSAndrew Jones 92a5af7b8aSAndrew Jones tests++; 93a0833bfcSRadim Krčmář printf("%s: ", prefix); 9453da5cc0SAndrew Jones puts(prefixes); 95cb12ecccSAndrew Jones vprintf(msg_fmt, va); 96a5af7b8aSAndrew Jones puts("\n"); 97a0833bfcSRadim Krčmář if (skip) 98a0833bfcSRadim Krčmář skipped++; 99a0833bfcSRadim Krčmář else if (xfail && !pass) 100a5af7b8aSAndrew Jones xfailures++; 101a0833bfcSRadim Krčmář else if (xfail || !pass) 102a5af7b8aSAndrew Jones failures++; 103c5b6469dSAndrew Jones 104c5b6469dSAndrew Jones spin_unlock(&lock); 105a5af7b8aSAndrew Jones } 106f3cdd159SJan Kiszka 107*a299895bSThomas Huth void report(bool pass, const char *msg_fmt, ...) 108f3cdd159SJan Kiszka { 109f3cdd159SJan Kiszka va_list va; 110*a299895bSThomas Huth va_start(va, msg_fmt); 111a0833bfcSRadim Krčmář va_report(msg_fmt, pass, false, false, va); 112f3cdd159SJan Kiszka va_end(va); 113a5af7b8aSAndrew Jones } 114a5af7b8aSAndrew Jones 115*a299895bSThomas Huth void report_xfail(bool xfail, bool pass, const char *msg_fmt, ...) 116a5af7b8aSAndrew Jones { 117a5af7b8aSAndrew Jones va_list va; 118*a299895bSThomas Huth va_start(va, msg_fmt); 119a0833bfcSRadim Krčmář va_report(msg_fmt, pass, xfail, false, va); 120a0833bfcSRadim Krčmář va_end(va); 121a0833bfcSRadim Krčmář } 122a0833bfcSRadim Krčmář 123a0833bfcSRadim Krčmář void report_skip(const char *msg_fmt, ...) 124a0833bfcSRadim Krčmář { 125a0833bfcSRadim Krčmář va_list va; 126a0833bfcSRadim Krčmář va_start(va, msg_fmt); 127a0833bfcSRadim Krčmář va_report(msg_fmt, false, false, true, va); 128a5af7b8aSAndrew Jones va_end(va); 129f3cdd159SJan Kiszka } 130f3cdd159SJan Kiszka 1312acf2e69SAndrew Jones void report_info(const char *msg_fmt, ...) 1322acf2e69SAndrew Jones { 1332acf2e69SAndrew Jones va_list va; 1342acf2e69SAndrew Jones 1352acf2e69SAndrew Jones spin_lock(&lock); 1362acf2e69SAndrew Jones puts("INFO: "); 1372acf2e69SAndrew Jones puts(prefixes); 1382acf2e69SAndrew Jones va_start(va, msg_fmt); 1392acf2e69SAndrew Jones vprintf(msg_fmt, va); 1402acf2e69SAndrew Jones va_end(va); 1412acf2e69SAndrew Jones puts("\n"); 1422acf2e69SAndrew Jones spin_unlock(&lock); 1432acf2e69SAndrew Jones } 1442acf2e69SAndrew Jones 145f3cdd159SJan Kiszka int report_summary(void) 146f3cdd159SJan Kiszka { 1479064d89bSPeng Hao int ret; 148c5b6469dSAndrew Jones spin_lock(&lock); 149c5b6469dSAndrew Jones 150f1071c6dSAndrew Jones printf("SUMMARY: %d tests", tests); 1513d742d17SRadim Krčmář if (failures) 1523d742d17SRadim Krčmář printf(", %d unexpected failures", failures); 153a5af7b8aSAndrew Jones if (xfailures) 154a0833bfcSRadim Krčmář printf(", %d expected failures", xfailures); 155a0833bfcSRadim Krčmář if (skipped) 156a0833bfcSRadim Krčmář printf(", %d skipped", skipped); 157a5af7b8aSAndrew Jones printf("\n"); 158a0833bfcSRadim Krčmář 1599064d89bSPeng Hao if (tests == skipped) { 1609064d89bSPeng Hao spin_unlock(&lock); 161a0833bfcSRadim Krčmář /* Blame AUTOTOOLS for using 77 for skipped test and QEMU for 162a0833bfcSRadim Krčmář * mangling error codes in a way that gets 77 if we ... */ 163a0833bfcSRadim Krčmář return 77 >> 1; 1649064d89bSPeng Hao } 165a0833bfcSRadim Krčmář 1669064d89bSPeng Hao ret = failures > 0 ? 1 : 0; 167c5b6469dSAndrew Jones spin_unlock(&lock); 1689064d89bSPeng Hao return ret; 169f3cdd159SJan Kiszka } 170e7c68b43SAndrew Jones 171e7c68b43SAndrew Jones void report_abort(const char *msg_fmt, ...) 172e7c68b43SAndrew Jones { 173e7c68b43SAndrew Jones va_list va; 174e7c68b43SAndrew Jones 17575b3e681SAndrew Jones spin_lock(&lock); 176e7c68b43SAndrew Jones puts("ABORT: "); 177e7c68b43SAndrew Jones puts(prefixes); 178e7c68b43SAndrew Jones va_start(va, msg_fmt); 179e7c68b43SAndrew Jones vprintf(msg_fmt, va); 180e7c68b43SAndrew Jones va_end(va); 181e7c68b43SAndrew Jones puts("\n"); 18275b3e681SAndrew Jones spin_unlock(&lock); 183e7c68b43SAndrew Jones report_summary(); 184e7c68b43SAndrew Jones abort(); 185e7c68b43SAndrew Jones } 186