aboutsummaryrefslogtreecommitdiff
path: root/include/junitxml.h
blob: 777ee27dfdc094c700bdad5d97c17085fd903e89 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/// @file junitxml.h
#ifndef STASIS_JUNITXML_H
#define STASIS_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 3

/**
 * 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;
};

/**
 * 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;
        struct JUNIT_Error *error;
    } result_state; ///< Result data
};

/**
 * Represents a junit test suite
 */
struct JUNIT_Testsuite {
    /// Test suite name
    char *name;
    /// Total number of test terminated due to an error
    int errors;
    /// Total number of failed tests
    int failures;
    /// Total number of skipped tests
    int skipped;
    /// Total number of tests
    int tests;
    /// Total duration in fractional seconds
    float time;
    /// Timestamp
    char *timestamp;
    /// Test runner host name
    char *hostname;
    /// Array of test cases
    struct JUNIT_Testcase **testcase;
    /// Total number of test cases in use
    size_t _tc_inuse;
    /// Total number of test cases allocated
    size_t _tc_alloc;
};

/**
 * Extract information from a junit XML file
 *
 * ~~~{.c}
 * struct JUNIT_Testsuite *testsuite;
 * const char *filename = "/path/to/result.xml";
 *
 * testsuite = junitxml_testsuite_read(filename);
 * if (testsuite) {
 *     // Did any test cases fail?
 *     if (testsuite->failures) {
 *         printf("Test suite '%s' has %d failure(s)\n", testsuite->name, testsuite->failures
 *         // Scan test cases for failure data
 *         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) {
 *                 if (testcase->tc_result_state_type == JUNIT_RESULT_STATE_FAILURE) {
 *                     // Display information from failed test case
 *                     printf("[FAILED] %s::%s\nOutput:\n%s\n",
 *                         testcase->classname,
 *                         testcase->name,
 *                         testcase->result_state.failure->message);
 *                 }
 *             }
 *         }
 *     }
 *     // Release test suite resources
 *     junitxml_testsuite_free(&testsuite);
 * } else {
 *     // handle error
 * }
 * ~~~
 *
 * @param filename path to junit XML file
 * @return pointer to JUNIT_Testsuite
 */
struct JUNIT_Testsuite *junitxml_testsuite_read(const char *filename);

/**
 * Free memory allocated by junitxml_testsuite_read
 * @param testsuite pointer to JUNIT_Testsuite
 */
void junitxml_testsuite_free(struct JUNIT_Testsuite **testsuite);

#endif //STASIS_JUNITXML_H