diff options
Diffstat (limited to 'runtime/org.eclipse.etrice.runtime.c/src/common/etUnit/etUnit.c')
-rw-r--r-- | runtime/org.eclipse.etrice.runtime.c/src/common/etUnit/etUnit.c | 138 |
1 files changed, 102 insertions, 36 deletions
diff --git a/runtime/org.eclipse.etrice.runtime.c/src/common/etUnit/etUnit.c b/runtime/org.eclipse.etrice.runtime.c/src/common/etUnit/etUnit.c index c8ebfe68a..dfdcc1ce9 100644 --- a/runtime/org.eclipse.etrice.runtime.c/src/common/etUnit/etUnit.c +++ b/runtime/org.eclipse.etrice.runtime.c/src/common/etUnit/etUnit.c @@ -16,6 +16,7 @@ #include <string.h> #include <time.h> #include <stdlib.h> +#include <assert.h> #include "debugging/etLogger.h" #include "osal/etSema.h" #include "runtime/etRuntime.h" @@ -25,13 +26,16 @@ /* file handling */ static FILE* etUnit_reportfile = NULL; +static etUnit_WriteFunction etUnit_write = NULL; /* counters */ static etInt16 etUnit_nextCaseId; static etInt32 etUnit_errorCounter; -#define ETUNIT_MAX_TEST_CASES 512 -static etBool etUnit_testcaseSuccess[ETUNIT_MAX_TEST_CASES]; +static etBool etUnit_parallelTestCases = ET_FALSE; +#define ETUNIT_MAX_PARALLEL_TEST_CASES 2 +static etBool etUnit_testcaseSuccess[ETUNIT_MAX_PARALLEL_TEST_CASES]; +static etBool etUnit_testcaseOpen[ETUNIT_MAX_PARALLEL_TEST_CASES]; #define ETUNIT_FAILURE_TEXT_LEN 256 @@ -39,8 +43,35 @@ static etBool etUnit_testcaseSuccess[ETUNIT_MAX_TEST_CASES]; static etTime etUnit_startTime; static etTime etUnit_lastTestCaseTime; -etInt16 getCurrentEtUnitId() { - return etUnit_nextCaseId - 1; + +/* + * Returns index to store current test case state + * - 'caseId' for parallel test cases + * - 0 for singleton test case + */ +static etInt16 getParallelIndex(etInt16 caseId) { + etInt16 id = (etUnit_parallelTestCases) ? caseId - 1 : 0; + assert(id >= 0 && id <= ETUNIT_MAX_PARALLEL_TEST_CASES); + return id; +} + +/* Lookup valid open test case id */ +static etInt16 getOpenTestCaseId(etInt16 id) { + etInt16 caseId; + if (etUnit_parallelTestCases) { + // index is id of parallel test case + assert(id > 0); + caseId = id; + } else { + // index is 0, return current open test case + assert(id == 0); + caseId = etUnit_nextCaseId - 1; + } + if(!etUnit_testcaseOpen[getParallelIndex(caseId)]) { + etLogger_logErrorF("Test case was not opened"); + } + + return caseId; } /* order */ @@ -54,9 +85,9 @@ typedef struct OrderInfo { static OrderInfo etUnit_orderInfo[ETUNIT_ORDER_MAX]; static OrderInfo* getOrderInfo(etInt16 id) { - int i; - for (i = 0; i < ETUNIT_ORDER_MAX; ++i) - if (etUnit_orderInfo[i].id == id) + etInt16 caseId = getOpenTestCaseId(id); + for (int i = 0; i < ETUNIT_ORDER_MAX; ++i) + if (etUnit_orderInfo[i].id == caseId) return etUnit_orderInfo + i; return NULL; @@ -89,6 +120,16 @@ static void expect_range_float(etInt16 id, const char* message, etUnitFloat min, static void etUnit_handleExpect(etInt16 id, etBool result, const char *trace, const char* expected, const char* actual, const char* file, int line); +/* configuration functions */ + +void etUnit_setParallelTestCases(etBool enabled) { + etUnit_parallelTestCases = enabled; +} + +void etUnit_setWriteFunction(etUnit_WriteFunction fct) { + etUnit_write = fct; +} + /* public functions */ void etUnit_open(const char* testResultPath, const char* testFileName) { @@ -96,7 +137,6 @@ void etUnit_open(const char* testResultPath, const char* testFileName) { { char filename[ETUNIT_FAILURE_TEXT_LEN]; - int i; if (testResultPath != NULL) snprintf(filename, sizeof(filename), "%s/%s.etu", testResultPath, testFileName); @@ -104,21 +144,28 @@ void etUnit_open(const char* testResultPath, const char* testFileName) { snprintf(filename, sizeof(filename),"%s.etu", testFileName); /* init global data */ - for (i = 0; i < ETUNIT_ORDER_MAX; ++i) + for (int i = 0; i < ETUNIT_ORDER_MAX; ++i) { etUnit_orderInfo[i].id = 0; - for (i = 0; i < ETUNIT_MAX_TEST_CASES; ++i) + } + for (int i = 0; i < ETUNIT_MAX_PARALLEL_TEST_CASES; ++i) { etUnit_testcaseSuccess[i] = ET_TRUE; + etUnit_testcaseOpen[i] = ET_FALSE; + } etUnit_errorCounter = 0; etUnit_nextCaseId = 1; - if (etUnit_reportfile == NULL) { + if (etUnit_write == NULL && etUnit_reportfile == NULL) { + // default write to file etUnit_reportfile = etLogger_fopen(filename, "w+"); if (etUnit_reportfile != NULL) { - etLogger_fprintf(etUnit_reportfile, "etUnit report\n"); + etUnit_setWriteFunction((etUnit_WriteFunction) etLogger_fprintf); } else { etLogger_logErrorF("Unable to open file %s", filename); } } + if(etUnit_write != null) { + etUnit_write(etUnit_reportfile, "etUnit report\n"); + } } /* prepare time measurement */ @@ -130,6 +177,7 @@ void etUnit_close(void) { if (etUnit_reportfile != NULL) { etLogger_fclose(etUnit_reportfile); etUnit_reportfile = NULL; + etUnit_write = NULL; } getTimeFromTarget(&endTime); etTimeHelpers_subtract(&endTime, &etUnit_startTime); @@ -142,51 +190,65 @@ void etUnit_close(void) { } void etUnit_openTestSuite(const char* testSuiteName) { - if (etUnit_reportfile != NULL) { - etLogger_fprintf(etUnit_reportfile, "ts start: %s\n", testSuiteName); + if(etUnit_write != NULL) { + etUnit_write(etUnit_reportfile, "ts start: %s\n", testSuiteName); } } void etUnit_closeTestSuite(void) { } +/* Opens new test case, if parallel is activated returns new test case id otherwise 0*/ etInt16 etUnit_openTestCase(const char* testCaseName) { + if(etUnit_nextCaseId >= INT16_MAX) { + etLogger_logErrorF("Too many test cases. Maximum number is %d", INT16_MAX); + exit(-1); + } etInt16 caseId = etUnit_nextCaseId++; - - if (caseId >= ETUNIT_MAX_TEST_CASES) { - etLogger_logErrorF("Too many test cases. Maximum number of test cases is %d\n", - ETUNIT_MAX_TEST_CASES); - etLogger_logErrorF("ETUNIT_MAX_TEST_CASES (etUnit_openTestCase, %s: %d)", __FILE__, - __LINE__); + etInt16 idx = getParallelIndex(caseId); + if (etUnit_parallelTestCases && idx >= ETUNIT_MAX_PARALLEL_TEST_CASES) { + etLogger_logErrorF("Too many parallel test cases. Maximum number is %d", ETUNIT_MAX_PARALLEL_TEST_CASES); exit(-1); } - if (etUnit_reportfile != NULL) { - etLogger_fprintf(etUnit_reportfile, "tc start %d: %s\n", caseId, testCaseName); + if(etUnit_write != NULL) { + etUnit_write(etUnit_reportfile, "tc start %d: %s\n", caseId, testCaseName); getTimeFromTarget(&etUnit_lastTestCaseTime); } - return caseId; + + if(etUnit_testcaseOpen[idx]) { + etLogger_logErrorF("Previous test case was not closed"); + } + etUnit_testcaseOpen[idx] = ET_TRUE; + etUnit_testcaseSuccess[idx] = ET_TRUE; + + return (etUnit_parallelTestCases) ? caseId : 0; } void etUnit_closeTestCase(etInt16 id) { + etInt16 caseId = getOpenTestCaseId(id); OrderInfo* info = getOrderInfo(id); if(info != NULL){ if (info->currentIndex != info->size) { etUnit_handleExpect(id, ET_FALSE, "EXPECT_ORDER was not completed", NULL, NULL, 0, 0); + info->id = 0; } } + etInt16 parallelId = getParallelIndex(caseId); + etUnit_testcaseOpen[parallelId] = ET_FALSE; - if (etUnit_reportfile != NULL) { + if(etUnit_write != NULL) { etTime time; getTimeFromTarget(&time); etTimeHelpers_subtract(&time, &etUnit_lastTestCaseTime); - etLogger_fprintf(etUnit_reportfile, "tc end %d: %d\n", id, etTimeHelpers_convertToMSec(&time)); + etUnit_write(etUnit_reportfile, "tc end %d: %d\n", caseId, etTimeHelpers_convertToMSec(&time)); } } void etUnit_skipTestCase(etInt16 id, const char* msg) { - if (etUnit_reportfile != NULL) { - etLogger_fprintf(etUnit_reportfile, "tc skip %d: %s\n", id, msg); + etInt16 caseId = getOpenTestCaseId(id); + if(etUnit_write != NULL) { + etUnit_write(etUnit_reportfile, "tc skip %d: %s\n", caseId, msg); } } @@ -294,10 +356,11 @@ void expectRangeFloat64(etInt16 id, const char* message, etFloat64 min, etFloat6 #endif void expectOrderStart(etInt16 id, etInt16* list, etInt16 size, const char* file, int line) { - int i; - for (i = 0; i < ETUNIT_ORDER_MAX; ++i) + // TODO report error if previous order was not closed + etInt16 caseId = getOpenTestCaseId(id); + for (int i = 0; i < ETUNIT_ORDER_MAX; ++i) if (etUnit_orderInfo[i].id == 0) { - etUnit_orderInfo[i].id = id; + etUnit_orderInfo[i].id = caseId; etUnit_orderInfo[i].currentIndex = 0; etUnit_orderInfo[i].size = size; etUnit_orderInfo[i].list = list; @@ -341,7 +404,7 @@ void expectOrderEnd(etInt16 id, const char* message, etInt16 identifier, const c } etBool etUnit_isSuccess(etInt16 id) { - return etUnit_testcaseSuccess[id]; + return etUnit_testcaseSuccess[getParallelIndex(id)]; } /* private functions */ @@ -446,18 +509,21 @@ static void expect_range_float(etInt16 id, const char* message, etUnitFloat min, #endif static void etUnit_handleExpect(etInt16 id, etBool result, const char *resulttext, const char* exp, const char* act, const char* file, int line) { + // check open + etInt16 caseId = getOpenTestCaseId(id); if (result == ET_TRUE) { /* nothing to do because no failure */ } else { etUnit_errorCounter++; - if (etUnit_testcaseSuccess[id] == ET_TRUE) { + etInt16 parallelId = getParallelIndex(caseId); + if (etUnit_testcaseSuccess[parallelId] == ET_TRUE) { /* first failure will be remembered */ - etUnit_testcaseSuccess[id] = ET_FALSE; - + etUnit_testcaseSuccess[parallelId] = ET_FALSE; + if (act != NULL && exp != NULL) - etLogger_fprintf(etUnit_reportfile, "tc fail %d: #%s#%s#%s:%d#%s\n", id, exp, act, file, line, resulttext); + etUnit_write(etUnit_reportfile, "tc fail %d: #%s#%s#%s:%d#%s\n", caseId, exp, act, file, line, resulttext); else - etLogger_fprintf(etUnit_reportfile, "tc fail %d: ###%s:%d#%s\n", id, file, line, resulttext); + etUnit_write(etUnit_reportfile, "tc fail %d: ###%s:%d#%s\n", caseId, file, line, resulttext); } else { /* more than one error will be ignored */ } |