From: Sun, Yi Date: Tue, 8 Apr 2014 02:53:40 +0000 (+0800) Subject: Delete the printing of dynamic statistics line. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8f0015e349c1428496a19236c1dd4132ef4554e5;p=contrib%2Fbeignet.git Delete the printing of dynamic statistics line. summary: --------------------- 1. Delete the printing of dynamic statistics line. 2. Add function to catch signals(like CTRL+C,core dumped ...), if caught, reminder user the signal name. core dumped example: ... displacement_map_element() [SUCCESS] compiler_clod() Interrupt signal (SIGSEGV) received. summary: ---------- total: 657 run: 297 pass: 271 fail: 26 pass rate: 0.960426 Signed-off-by: Yi Sun Signed-off-by: Yangwei Shui Reviewed-by: Zhigang Gong --- diff --git a/utests/utest.cpp b/utests/utest.cpp index e747309..b491cae 100644 --- a/utests/utest.cpp +++ b/utests/utest.cpp @@ -29,8 +29,14 @@ #include #include #include +#include +#include -#define MAX_SUM_LINE 256 +struct signalMap +{ + const char* signalName; + int signalNum; +}; using namespace std; vector *UTest::utestList = NULL; @@ -38,7 +44,7 @@ vector *UTest::utestList = NULL; RStatistics UTest::retStatistics; void releaseUTestList(void) { delete UTest::utestList; } -void runAllNoIssueAtExit(void) { +void runSummaryAtExit(void) { // If case crashes, count it as fail, and accumulate finishrun if(UTest::retStatistics.finishrun != UTest::utestList->size()) { UTest::retStatistics.finishrun++; @@ -50,64 +56,86 @@ void runAllNoIssueAtExit(void) { printf(" pass: %zu\n",UTest::retStatistics.passCount); printf(" fail: %zu\n",UTest::retStatistics.failCount); printf(" pass rate: %f\n",1-(float)UTest::retStatistics.failCount/(float)UTest::utestList->size()); + + releaseUTestList(); +} + +void signalHandler( int signum ) +{ + const char* name = NULL; + + signalMap arr[] = { + {"SIGILL", SIGILL}, + {"SIGFPE", SIGFPE}, + {"SIGABRT", SIGABRT}, + {"SIGBUS", SIGBUS}, + {"SIGSEGV", SIGSEGV}, + {"SIGHUP", SIGHUP}, + {"SIGINT", SIGINT}, + {"SIGQUIT", SIGQUIT}, + {"SIGTERM", SIGTERM}, + {NULL, -1} + }; + + for(int i=0; arr[i].signalNum != -1 && arr[i].signalName != NULL; i++) { + if(arr[i].signalNum == signum) + + name = arr[i].signalName; } + printf(" Interrupt signal (%s) received.", name); + + exit(signum); +} + +void catch_signal(void){ + struct sigaction sa; + int sigs[] = { + SIGILL, SIGFPE, SIGABRT, SIGBUS, + SIGSEGV, SIGHUP, SIGINT, SIGQUIT, + SIGTERM + }; + + sa.sa_handler = signalHandler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESETHAND; + + for(unsigned int i = 0; i < sizeof(sigs)/sizeof(sigs[0]); ++i) { + if (sigaction(sigs[i], &sa, NULL) == -1) + perror("Could not set signal handler"); + } +} + UTest::UTest(Function fn, const char *name, bool haveIssue, bool needDestroyProgram) : fn(fn), name(name), haveIssue(haveIssue), needDestroyProgram(needDestroyProgram) { if (utestList == NULL) { utestList = new vector; - atexit(releaseUTestList); + + catch_signal(); + atexit(runSummaryAtExit); } utestList->push_back(*this); } + static bool strequal(const char *s1, const char *s2) { if (strcmp(s1, s2) == 0) return true; return false; } void UTest::do_run(struct UTest utest){ - // winsize is a struct in ioctl.h, contains terminal column number - struct winsize size; - char spaceList[MAX_SUM_LINE] = {0}; - - //Obtain terminal column size - ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); - - //A string contain MAX_SUM_LINE spaces, to hide the statistic line in stdout - for (size_t j = 0; j < size.ws_col; j++){ - if ( j >= MAX_SUM_LINE - 1 ) break; - spaceList[j] = ' '; - spaceList[j+1] = '\0'; - } - printf("\r%s\r%s()", spaceList, utest.name); + // Print function name + printf("%s()", utest.name); + fflush(stdout); - // Run one case in utestList + // Run one case in utestList, print result [SUCCESS] or [FAILED] (utest.fn)(); - - // Print dynamic statistics line - sprintf(spaceList, "\n [run/total: %zu/%zu]\ - pass: %zu; fail: %zu; pass rate: %f\r", - retStatistics.finishrun+1, utestList->size(), - retStatistics.passCount, - retStatistics.failCount, - 1-(float)retStatistics.failCount/(float)utestList->size()); - - // If terminal column size lower than length of statistic line, print nothing, If not, print the statistics line - if (size.ws_col > strlen(spaceList)) - printf("%s", spaceList); - else - printf("\n"); - - // Refresh console - fflush(stdout); } void UTest::run(const char *name) { if (name == NULL) return; if (utestList == NULL) return; - atexit(runAllNoIssueAtExit); for (; retStatistics.finishrun < utestList->size(); ++retStatistics.finishrun) { const UTest &utest = (*utestList)[retStatistics.finishrun]; @@ -122,7 +150,6 @@ void UTest::run(const char *name) { void UTest::runAll(void) { if (utestList == NULL) return; - atexit(runAllNoIssueAtExit); for (; retStatistics.finishrun < utestList->size(); ++retStatistics.finishrun) { const UTest &utest = (*utestList)[retStatistics.finishrun]; @@ -135,7 +162,6 @@ void UTest::runAll(void) { void UTest::runAllNoIssue(void) { if (utestList == NULL) return; - atexit(runAllNoIssueAtExit); for (; retStatistics.finishrun < utestList->size(); ++retStatistics.finishrun) { const UTest &utest = (*utestList)[retStatistics.finishrun]; diff --git a/utests/utest.hpp b/utests/utest.hpp index e6a7749..0381bfe 100644 --- a/utests/utest.hpp +++ b/utests/utest.hpp @@ -96,12 +96,12 @@ struct UTest do { \ try { \ EXPR; \ - std::cout << " [SUCCESS]"; \ + std::cout << " [SUCCESS]" << std::endl; \ UTest::retStatistics.passCount += 1; \ } \ catch (Exception e) { \ - std::cout << " [FAILED]"; \ - std::cout << "\n " << e.what(); \ + std::cout << " [FAILED]" << std::endl; \ + std::cout << " " << e.what() << std::endl; \ UTest::retStatistics.failCount++; \ } \ } while (0) @@ -110,11 +110,11 @@ struct UTest do { \ try { \ EXPR; \ - std::cout << " [FAILED]"; \ + std::cout << " [FAILED]" << std::endl; \ retStatistics.failCount++; \ } \ catch (gbe::Exception e) { \ - std::cout << " [SUCCESS]"; \ + std::cout << " [SUCCESS]" << std::endl; \ retStatistics.passCount++; \ } \ } while (0)