LGTM, pushed, Thanks.
On Tue, Apr 08, 2014 at 10:53:40AM +0800, Yi Sun wrote: > From: Sun, Yi <[email protected]> > > 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 <[email protected]> > Signed-off-by: Yangwei Shui <[email protected]> > > 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 <sys/ioctl.h> > #include <unistd.h> > #include <cstring> > +#include <stdlib.h> > +#include <csignal> > > -#define MAX_SUM_LINE 256 > +struct signalMap > +{ > + const char* signalName; > + int signalNum; > +}; > > using namespace std; > vector<UTest> *UTest::utestList = NULL; > @@ -38,7 +44,7 @@ vector<UTest> *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<UTest>; > - 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) > -- > 1.8.5.3 > > _______________________________________________ > Beignet mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
