X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Fdali-toolkit-test-utils%2Ftest-harness.cpp;h=b42b9f9ba0eb0c23f558adafb46f0002f09605d0;hp=840ef0da682c8fd7c590132b248b607a5d0f2882;hb=9f83976fa4a70fe7f64398568efb3212a5a7024b;hpb=e2d3bdc173f657ddf0a0c58062a61bbbaaf6f9da diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-harness.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-harness.cpp index 840ef0d..b42b9f9 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-harness.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-harness.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,11 +23,12 @@ #include #include #include +#include namespace TestHarness { -typedef std::map RunningTestCases; +typedef std::map RunningTestCases; const char* basename(const char* path) { @@ -41,9 +42,23 @@ const char* basename(const char* path) return slash; } -int RunTestCase( struct ::testcase_s& testCase ) +void SuppressLogOutput() { - int result = EXIT_STATUS_TESTCASE_FAILED; + // Close stdout and stderr to suppress the log output + close(STDOUT_FILENO); // File descriptor number for stdout is 1 + close(STDERR_FILENO); // File descriptor number for stderr is 2 + + // The POSIX specification requires that /dev/null must be provided, + // The open function always chooses the lowest unused file descriptor + // It is sufficient for stdout to be writable. + open("/dev/null", O_WRONLY); // Redirect file descriptor number 1 (i.e. stdout) to /dev/null + // When stderr is opened it must be both readable and writable. + open("/dev/null", O_RDWR); // Redirect file descriptor number 2 (i.e. stderr) to /dev/null +} + +int32_t RunTestCase( struct ::testcase_s& testCase ) +{ + int32_t result = EXIT_STATUS_TESTCASE_FAILED; // dont want to catch exception as we want to be able to get // gdb stack trace from the first error @@ -52,7 +67,14 @@ int RunTestCase( struct ::testcase_s& testCase ) { testCase.startup(); } - result = testCase.function(); + try + { + result = testCase.function(); + } + catch( const char* ) + { + // just catch test fail exception, return is already set to EXIT_STATUS_TESTCASE_FAILED + } if( testCase.cleanup ) { testCase.cleanup(); @@ -62,27 +84,26 @@ int RunTestCase( struct ::testcase_s& testCase ) } -int RunTestCaseInChildProcess( struct ::testcase_s& testCase, bool suppressOutput ) +int32_t RunTestCaseInChildProcess( struct ::testcase_s& testCase, bool suppressOutput ) { - int testResult = EXIT_STATUS_TESTCASE_FAILED; + int32_t testResult = EXIT_STATUS_TESTCASE_FAILED; - int pid = fork(); + int32_t pid = fork(); if( pid == 0 ) // Child process { if( suppressOutput ) { - close(STDOUT_FILENO); - close(STDERR_FILENO); + SuppressLogOutput(); } else { printf("\n"); - for(int i=0; i<80; ++i) printf("#"); + for(int32_t i=0; i<80; ++i) printf("#"); printf("\nTC: %s\n", testCase.name); fflush(stdout); } - int status = RunTestCase( testCase ); + int32_t status = RunTestCase( testCase ); if( ! suppressOutput ) { @@ -100,8 +121,8 @@ int RunTestCaseInChildProcess( struct ::testcase_s& testCase, bool suppressOutpu } else // Parent process { - int status = 0; - int childPid = waitpid(pid, &status, 0); + int32_t status = 0; + int32_t childPid = waitpid(pid, &status, 0); if( childPid == -1 ) { perror("waitpid"); @@ -120,7 +141,7 @@ int RunTestCaseInChildProcess( struct ::testcase_s& testCase, bool suppressOutpu } else if(WIFSIGNALED(status) ) { - int signal = WTERMSIG(status); + int32_t signal = WTERMSIG(status); testResult = EXIT_STATUS_TESTCASE_ABORTED; if( signal == SIGABRT ) { @@ -141,7 +162,7 @@ int RunTestCaseInChildProcess( struct ::testcase_s& testCase, bool suppressOutpu return testResult; } -void OutputStatistics( const char* processName, int numPasses, int numFailures ) +void OutputStatistics( const char* processName, int32_t numPasses, int32_t numFailures ) { FILE* fp=fopen("summary.xml", "a"); if( fp != NULL ) @@ -168,15 +189,15 @@ void OutputStatistics( const char* processName, int numPasses, int numFailures ) } } -int RunAll( const char* processName, ::testcase tc_array[] ) +int32_t RunAll( const char* processName, ::testcase tc_array[] ) { - int numFailures = 0; - int numPasses = 0; + int32_t numFailures = 0; + int32_t numPasses = 0; // Run test cases in child process( to kill output/handle signals ), but run serially. - for( unsigned int i=0; tc_array[i].name; i++) + for( uint32_t i=0; tc_array[i].name; i++) { - int result = RunTestCaseInChildProcess( tc_array[i], false ); + int32_t result = RunTestCaseInChildProcess( tc_array[i], false ); if( result == 0 ) { numPasses++; @@ -193,30 +214,29 @@ int RunAll( const char* processName, ::testcase tc_array[] ) } // Constantly runs up to MAX_NUM_CHILDREN processes -int RunAllInParallel( const char* processName, ::testcase tc_array[], bool reRunFailed) +int32_t RunAllInParallel( const char* processName, ::testcase tc_array[], bool reRunFailed) { - int numFailures = 0; - int numPasses = 0; + int32_t numFailures = 0; + int32_t numPasses = 0; RunningTestCases children; - std::vector failedTestCases; + std::vector failedTestCases; // Fork up to MAX_NUM_CHILDREN processes, then // wait. As soon as a proc completes, fork the next. - int nextTestCase = 0; - int numRunningChildren = 0; + int32_t nextTestCase = 0; + int32_t numRunningChildren = 0; while( tc_array[nextTestCase].name || numRunningChildren > 0) { // Create more children (up to the max number or til the end of the array) while( numRunningChildren < MAX_NUM_CHILDREN && tc_array[nextTestCase].name ) { - int pid = fork(); + int32_t pid = fork(); if( pid == 0 ) // Child process { - close(STDOUT_FILENO); - close(STDERR_FILENO); + SuppressLogOutput(); exit( RunTestCase( tc_array[nextTestCase] ) ); } else if(pid == -1) @@ -235,8 +255,8 @@ int RunAllInParallel( const char* processName, ::testcase tc_array[], bool reRu // Wait for the next child to finish - int status=0; - int childPid = waitpid(-1, &status, 0); + int32_t status=0; + int32_t childPid = waitpid(-1, &status, 0); if( childPid == -1 ) { perror("waitpid"); @@ -247,7 +267,7 @@ int RunAllInParallel( const char* processName, ::testcase tc_array[], bool reRu { if( childPid > 0 ) { - int testResult = WEXITSTATUS(status); + int32_t testResult = WEXITSTATUS(status); if( testResult ) { printf("Test case %s failed: %d\n", children[childPid].testCaseName, testResult); @@ -289,12 +309,12 @@ int RunAllInParallel( const char* processName, ::testcase tc_array[], bool reRu if( reRunFailed ) { - for( unsigned int i=0; i