Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.c138
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 */
}

Back to the top