aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2024-05-17 10:02:42 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2024-05-17 10:02:42 -0400
commit4941015cd05ff771249b65e7ecab07a20ab1a5a3 (patch)
treed4ab901e4694317711b3fd5c4068048c1d3516c2
parent029ddc1fdf4002b23a8471ad8f762a843059e141 (diff)
downloadstasis-4941015cd05ff771249b65e7ecab07a20ab1a5a3.tar.gz
junitxml: add missing "error" type
-rw-r--r--include/junitxml.h67
-rw-r--r--src/junitxml.c23
2 files changed, 72 insertions, 18 deletions
diff --git a/include/junitxml.h b/include/junitxml.h
index 430b627..290ce6f 100644
--- a/include/junitxml.h
+++ b/include/junitxml.h
@@ -1,54 +1,86 @@
-// @file junitxml.h
+/// @file junitxml.h
#ifndef OMC_JUNITXML_H
#define OMC_JUNITXML_H
#include <libxml/xmlreader.h>
+#define JUNIT_RESULT_STATE_NONE 0
+#define JUNIT_RESULT_STATE_FAILURE 1
+#define JUNIT_RESULT_STATE_SKIPPED 2
+#define JUNIT_RESULT_STATE_ERROR 2
+
+/**
+ * Represents a failed test case
+ */
struct JUNIT_Failure {
+ /// Error text
+ char *message;
+};
+
+/**
+ * Represents a test case error
+ */
+struct JUNIT_Error {
+ /// Error text
char *message;
};
+/**
+ * Represents a skipped test case
+ */
struct JUNIT_Skipped {
+ /// Type of skip event
char *type;
+ /// Reason text
char *message;
};
-#define JUNIT_RESULT_STATE_NONE 0
-#define JUNIT_RESULT_STATE_FAILURE 1
-#define JUNIT_RESULT_STATE_SKIPPED 2
+/**
+ * Represents a junit test case
+ */
struct JUNIT_Testcase {
+ /// Class name
char *classname;
+ /// Name of test
char *name;
+ /// Test duration in fractional seconds
float time;
+ /// Standard output message
char *message;
+ /// Result type
int tc_result_state_type;
+ /// Type container for result (there can only be one)
union tc_state_ptr {
struct JUNIT_Failure *failure;
struct JUNIT_Skipped *skipped;
- } result_state;
+ struct JUNIT_Error *error;
+ } result_state; ///< Result data
};
+/**
+ * Represents a junit test suite
+ */
struct JUNIT_Testsuite {
- //< Test suite name
+ /// Test suite name
char *name;
- //< Total number of test terminated due to an error
+ /// Total number of test terminated due to an error
int errors;
- //< Total number of failed tests
+ /// Total number of failed tests
int failures;
- //< Total number of skipped tests
+ /// Total number of skipped tests
int skipped;
- //< Total number of tests
+ /// Total number of tests
int tests;
- //< Total duration in fractional seconds
+ /// Total duration in fractional seconds
float time;
- //< Timestamp
+ /// Timestamp
char *timestamp;
- //< Test runner host name
+ /// Test runner host name
char *hostname;
- //< Array of test cases
+ /// Array of test cases
struct JUNIT_Testcase **testcase;
- //< Total number of test cases in use
+ /// Total number of test cases in use
size_t _tc_inuse;
- //< Total number of test cases allocated
+ /// Total number of test cases allocated
size_t _tc_alloc;
};
@@ -68,6 +100,7 @@ struct JUNIT_Testsuite {
* for (size_t i = 0; i < testsuite->_tc_inuse; i++) {
* // Check result state (one of)
* // JUNIT_RESULT_STATE_FAILURE
+ * // JUNIT_RESULT_STATE_ERROR
* // JUNIT_RESULT_STATE_SKIPPED
* struct JUNIT_Testcase testcase = testsuite->testcase[i];
* if (testcase->tc_result_state_type) {
@@ -86,8 +119,6 @@ struct JUNIT_Testsuite {
* } else {
* // handle error
* }
- *
- *
* ~~~
*
* @param filename path to junit XML file
diff --git a/src/junitxml.c b/src/junitxml.c
index df0514b..c1bf1be 100644
--- a/src/junitxml.c
+++ b/src/junitxml.c
@@ -65,6 +65,23 @@ static struct JUNIT_Failure *testcase_failure_from_attributes(struct StrList *at
return result;
}
+static struct JUNIT_Error *testcase_error_from_attributes(struct StrList *attrs) {
+ struct JUNIT_Error *result;
+
+ result = calloc(1, sizeof(*result));
+ if(!result) {
+ return NULL;
+ }
+ for (size_t x = 0; x < strlist_count(attrs); x += 2) {
+ char *attr_name = strlist_item(attrs, x);
+ char *attr_value = strlist_item(attrs, x + 1);
+ if (!strcmp(attr_name, "message")) {
+ result->message = strdup(attr_value);
+ }
+ }
+ return result;
+}
+
static struct JUNIT_Skipped *testcase_skipped_from_attributes(struct StrList *attrs) {
struct JUNIT_Skipped *result;
@@ -133,6 +150,7 @@ static int read_xml_data(xmlTextReaderPtr reader, struct JUNIT_Testsuite **tests
name = xmlTextReaderConstName(reader);
if (!name) {
+ // name could not be converted to string
name = BAD_CAST "--";
}
value = xmlTextReaderConstValue(reader);
@@ -171,6 +189,11 @@ static int read_xml_data(xmlTextReaderPtr reader, struct JUNIT_Testsuite **tests
struct JUNIT_Failure *failure = testcase_failure_from_attributes(attrs);
(*testsuite)->testcase[cur_tc]->tc_result_state_type = JUNIT_RESULT_STATE_FAILURE;
(*testsuite)->testcase[cur_tc]->result_state.failure = failure;
+ } else if (!strcmp(node_name, "error")) {
+ size_t cur_tc = (*testsuite)->_tc_inuse > 0 ? (*testsuite)->_tc_inuse - 1 : (*testsuite)->_tc_inuse;
+ struct JUNIT_Error *error = testcase_error_from_attributes(attrs);
+ (*testsuite)->testcase[cur_tc]->tc_result_state_type = JUNIT_RESULT_STATE_ERROR;
+ (*testsuite)->testcase[cur_tc]->result_state.error = error;
} else if (!strcmp(node_name, "skipped")) {
size_t cur_tc = (*testsuite)->_tc_inuse > 0 ? (*testsuite)->_tc_inuse - 1 : (*testsuite)->_tc_inuse;
struct JUNIT_Skipped *skipped = testcase_skipped_from_attributes(attrs);