This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
xml_logger.c
557 lines (417 loc) · 15.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
Copyright (C) 2011 Markus Kauppila <markus.kauppila@gmail.com>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
21
22
#include <stdio.h>
#include <stdlib.h>
23
#include <time.h>
24
25
26
#include <SDL/SDL.h>
27
#include "xml.h"
28
#include "logger_helpers.h"
29
30
#include "xml_logger.h"
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*! Static strings for XML elements */
const char *documentRoot = "testlog";
const char *parametersElementName = "parameters";
const char *parameterElementName = "parameter";
const char *startTimeElementName = "startTime";
const char *numSuitesElementName = "numSuites";
const char *numTestElementName = "numTests";
const char *numPassedTestsElementName = "numPassedTests";
const char *numFailedTestsElementName = "numFailedTests";
const char *endTimeElementName = "endTime";
const char *totalRuntimeElementName = "totalRuntime";
const char *suiteElementName = "suite";
const char *testsPassedElementName = "testsPassed";
const char *testsFailedElementName = "testsFailed";
const char *testsSkippedElementName = "testsSkipped";
const char *testElementName = "test";
const char *nameElementName = "name";
const char *descriptionElementName = "description";
const char *resultElementName = "result";
const char *assertElementName = "assert";
const char *messageElementName = "message";
const char *timeElementName = "time";
const char *assertSummaryElementName = "assertSummary";
55
const char *assertCountElementName = "assertCount";
56
57
58
59
60
61
const char *assertsPassedElementName = "assertsPassed";
const char *assertsFailedElementName = "assertsFailed";
const char *logElementName = "log";
/*! Current indentationt level */
62
63
64
65
66
67
static int indentLevel;
//! Constants for XMLOuputters EOL parameter
#define YES 1
#define NO 0
68
/*! Controls printing the indentation in relation to line breaks */
69
70
71
72
73
static int prevEOL = YES;
/*
* Prints out the given xml element etc.
*
74
75
* \todo Make the destination of the output changeable (defaults to stdout)
*
76
77
78
79
80
* \param identLevel the indent level of the message
* \param EOL will it print end of line character or not
* \param the XML element itself
*
*/
81
82
83
84
85
86
87
88
89
void
XMLOutputter(const int currentIdentLevel,
int EOL, const char *message)
{
if(ValidateString(message)) {
int ident = 0;
for( ; ident < currentIdentLevel && prevEOL; ++ident) {
printf(" "); // \todo make configurable?
}
90
91
prevEOL = EOL;
92
93
94
95
96
97
98
99
if(EOL) {
fprintf(stdout, "%s\n", message);
} else {
fprintf(stdout, "%s", message);
}
fflush(stdout);
100
} else {
101
fprintf(stdout, "Error: Tried to output invalid string!");
102
}
103
104
SDL_free(message);
105
}
106
107
void
108
109
XMLRunStarted(int parameterCount, char *runnerParameters[], time_t eventTime,
void *data)
110
{
111
112
113
114
115
116
117
118
119
char *xslStylesheet = "style.xsl";
if(data != NULL) {
char *tmp = (char *)data;
if(SDL_strlen(tmp) > 0) {
xslStylesheet = tmp;
}
}
char *output = XMLOpenDocument(documentRoot, xslStylesheet);
120
XMLOutputter(indentLevel++, YES, output);
121
122
output = XMLOpenElement(parametersElementName);
123
124
125
126
127
128
XMLOutputter(indentLevel++, YES, output);
int counter = 0;
for(counter = 0; counter < parameterCount; counter++) {
char *parameter = runnerParameters[counter];
129
output = XMLOpenElement(parameterElementName);
130
131
132
133
134
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(parameter);
XMLOutputter(indentLevel, NO, output);
135
output = XMLCloseElement(parameterElementName);
136
137
138
XMLOutputter(--indentLevel, YES, output);
}
139
output = XMLCloseElement(parametersElementName);
140
141
XMLOutputter(--indentLevel, YES, output);
142
output = XMLOpenElement(startTimeElementName);
143
XMLOutputter(indentLevel++, NO, output);
144
145
output = XMLAddContent(TimestampToString(eventTime));
146
XMLOutputter(indentLevel, NO, output);
147
148
output = XMLCloseElement(startTimeElementName);
149
XMLOutputter(--indentLevel, YES, output);
150
151
}
152
void
153
XMLRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount,
154
time_t endTime, double totalRuntime)
155
{
156
// log suite count
157
char *output = XMLOpenElement(numSuitesElementName);
158
159
160
161
162
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(IntToString(suiteCount));
XMLOutputter(indentLevel, NO, output);
163
output = XMLCloseElement(numSuitesElementName);
164
165
166
XMLOutputter(--indentLevel, YES, output);
// log test count
167
output = XMLOpenElement(numTestElementName);
168
169
170
171
172
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(IntToString(testCount));
XMLOutputter(indentLevel, NO, output);
173
output = XMLCloseElement(numTestElementName);
174
175
176
XMLOutputter(--indentLevel, YES, output);
// log passed test count
177
output = XMLOpenElement(numPassedTestsElementName);
178
179
180
181
182
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(IntToString(testPassCount));
XMLOutputter(indentLevel, NO, output);
183
output = XMLCloseElement(numPassedTestsElementName);
184
185
186
XMLOutputter(--indentLevel, YES, output);
// log failed test count
187
output = XMLOpenElement(numFailedTestsElementName);
188
189
190
191
192
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(IntToString(testFailCount));
XMLOutputter(indentLevel, NO, output);
193
output = XMLCloseElement(numFailedTestsElementName);
194
195
196
XMLOutputter(--indentLevel, YES, output);
// log end timte
197
output = XMLOpenElement(endTimeElementName);
198
199
XMLOutputter(indentLevel++, NO, output);
200
output = XMLAddContent(TimestampToString(endTime));
201
202
XMLOutputter(indentLevel, NO, output);
203
output = XMLCloseElement(endTimeElementName);
204
205
206
XMLOutputter(--indentLevel, YES, output);
// log total runtime
207
output = XMLOpenElement(totalRuntimeElementName);
208
209
XMLOutputter(indentLevel++, NO, output);
210
output = XMLAddContent(DoubleToString(totalRuntime));
211
212
XMLOutputter(indentLevel, NO, output);
213
output = XMLCloseElement(totalRuntimeElementName);
214
215
XMLOutputter(--indentLevel, YES, output);
216
output = XMLCloseDocument(documentRoot);
217
XMLOutputter(--indentLevel, YES, output);
218
219
}
220
void
221
XMLSuiteStarted(const char *suiteName, time_t eventTime)
222
{
223
char *output = XMLOpenElement(suiteElementName);
224
225
XMLOutputter(indentLevel++, YES, output);
226
227
228
229
230
231
232
233
234
output = XMLOpenElement(nameElementName);
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(suiteName);
XMLOutputter(indentLevel, NO, output);
output = XMLCloseElement(nameElementName);
XMLOutputter(--indentLevel, YES, output);
235
output = XMLOpenElement(startTimeElementName);
236
XMLOutputter(indentLevel++, NO, output);
237
238
output = XMLAddContent(TimestampToString(eventTime));
239
XMLOutputter(indentLevel, NO, output);
240
241
output = XMLCloseElement(startTimeElementName);
242
XMLOutputter(--indentLevel, YES, output);
243
244
}
245
void
246
XMLSuiteEnded(int testsPassed, int testsFailed, int testsSkipped,
247
time_t endTime, double totalRuntime)
248
{
249
// log tests passed
250
char *output = XMLOpenElement(testsPassedElementName);
251
252
253
254
255
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(IntToString(testsPassed));
XMLOutputter(indentLevel, NO, output);
256
output = XMLCloseElement(testsPassedElementName);
257
258
259
XMLOutputter(--indentLevel, YES, output);
// log tests failed
260
output = XMLOpenElement(testsFailedElementName);
261
262
263
264
265
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(IntToString(testsFailed));
XMLOutputter(indentLevel, NO, output);
266
output = XMLCloseElement(testsFailedElementName);
267
268
269
XMLOutputter(--indentLevel, YES, output);
// log tests skipped
270
output = XMLOpenElement(testsSkippedElementName);
271
272
273
274
275
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(IntToString(testsSkipped));
XMLOutputter(indentLevel, NO, output);
276
output = XMLCloseElement(testsSkippedElementName);
277
278
279
XMLOutputter(--indentLevel, YES, output);
// log tests skipped
280
output = XMLOpenElement(endTimeElementName);
281
282
XMLOutputter(indentLevel++, NO, output);
283
output = XMLAddContent(TimestampToString(endTime));
284
285
XMLOutputter(indentLevel, NO, output);
286
output = XMLCloseElement(endTimeElementName);
287
288
XMLOutputter(--indentLevel, YES, output);
289
// log total runtime
290
output = XMLOpenElement(totalRuntimeElementName);
291
292
XMLOutputter(indentLevel++, NO, output);
293
output = XMLAddContent(DoubleToString(totalRuntime));
294
295
XMLOutputter(indentLevel, NO, output);
296
output = XMLCloseElement(totalRuntimeElementName);
297
298
299
XMLOutputter(--indentLevel, YES, output);
300
output = XMLCloseElement(suiteElementName);
301
XMLOutputter(--indentLevel, YES, output);
302
303
}
304
void
305
306
XMLTestStarted(const char *testName, const char *suiteName,
const char *testDescription, time_t startTime)
307
{
308
char * output = XMLOpenElement(testElementName);
309
XMLOutputter(indentLevel++, YES, output);
310
311
312
//Attribute attribute = {"test", "value"};
//XMLOpenElementWithAttribute("name", &attribute);
313
output = XMLOpenElement(nameElementName);
314
XMLOutputter(indentLevel++, NO, output);
315
316
output = XMLAddContent(testName);
317
XMLOutputter(indentLevel, NO, output);
318
319
output = XMLCloseElement(nameElementName);
320
XMLOutputter(--indentLevel, YES, output);
321
322
output = XMLOpenElement(descriptionElementName);
323
XMLOutputter(indentLevel++, NO, output);
324
325
output = XMLAddContent(testDescription);
326
XMLOutputter(indentLevel, NO, output);
327
328
output = XMLCloseElement(descriptionElementName);
329
330
XMLOutputter(--indentLevel, YES, output);
331
output = XMLOpenElement(startTimeElementName);
332
XMLOutputter(indentLevel++, NO, output);
333
334
output = XMLAddContent(TimestampToString(startTime));
335
XMLOutputter(indentLevel, NO, output);
336
337
output = XMLCloseElement(startTimeElementName);
338
XMLOutputter(--indentLevel, YES, output);
339
340
}
341
void
342
XMLTestEnded(const char *testName, const char *suiteName,
343
int testResult, time_t endTime, double totalRuntime)
344
{
345
char *output = XMLOpenElement(resultElementName);
346
XMLOutputter(indentLevel++, NO, output);
347
348
349
if(testResult) {
if(testResult == 2) {
350
output = XMLAddContent("failed. No assert");
351
352
353
} else {
output = XMLAddContent("failed");
}
354
XMLOutputter(indentLevel, NO, output);
355
356
} else {
output = XMLAddContent("passed");
357
XMLOutputter(indentLevel, NO, output);
358
}
359
360
output = XMLCloseElement(resultElementName);
361
XMLOutputter(--indentLevel, YES, output);
362
363
// log total runtime
364
output = XMLOpenElement(endTimeElementName);
365
366
367
368
369
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(TimestampToString(endTime));
XMLOutputter(indentLevel, NO, output);
370
output = XMLCloseElement(endTimeElementName);
371
372
373
XMLOutputter(--indentLevel, YES, output);
// log total runtime
374
output = XMLOpenElement(totalRuntimeElementName);
375
376
377
378
379
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(DoubleToString(totalRuntime));
XMLOutputter(indentLevel, NO, output);
380
output = XMLCloseElement(totalRuntimeElementName);
381
382
XMLOutputter(--indentLevel, YES, output);
383
output = XMLCloseElement(testElementName);
384
XMLOutputter(--indentLevel, YES, output);
385
386
}
387
void
388
XMLAssert(const char *assertName, int assertResult, const char *assertMessage,
389
390
time_t eventTime)
{
391
char *output = XMLOpenElement(assertElementName);
392
393
XMLOutputter(indentLevel++, YES, output);
394
395
396
397
398
399
400
401
402
403
404
// log assert name
output = XMLOpenElement(nameElementName);
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(assertName);
XMLOutputter(indentLevel, NO, output);
output = XMLCloseElement(nameElementName);
XMLOutputter(--indentLevel, YES, output);
405
// log assert result
406
output = XMLOpenElement(resultElementName);
407
408
409
410
411
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent((assertResult) ? "pass" : "failure");
XMLOutputter(indentLevel, NO, output);
412
output = XMLCloseElement(resultElementName);
413
414
415
XMLOutputter(--indentLevel, YES, output);
// log assert message
416
output = XMLOpenElement(messageElementName);
417
418
419
420
421
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(assertMessage);
XMLOutputter(indentLevel, NO, output);
422
output = XMLCloseElement(messageElementName);
423
424
425
XMLOutputter(--indentLevel, YES, output);
// log event time
426
output = XMLOpenElement(timeElementName);
427
428
429
430
431
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(TimestampToString(eventTime));
XMLOutputter(indentLevel, NO, output);
432
output = XMLCloseElement(timeElementName);
433
434
XMLOutputter(--indentLevel, YES, output);
435
output = XMLCloseElement(assertElementName);
436
437
438
439
440
441
XMLOutputter(--indentLevel, YES, output);
}
void
XMLAssertWithValues(const char *assertName, int assertResult, const char *assertMessage,
int actualValue, int excpected, time_t eventTime)
442
{
443
char *output = XMLOpenElement(assertElementName);
444
XMLOutputter(indentLevel++, YES, output);
445
446
447
448
449
450
451
452
453
454
455
456
// log assert name
output = XMLOpenElement(nameElementName);
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(assertName);
XMLOutputter(indentLevel, NO, output);
output = XMLCloseElement(nameElementName);
XMLOutputter(--indentLevel, YES, output);
457
// log assert result
458
output = XMLOpenElement(resultElementName);
459
XMLOutputter(indentLevel++, NO, output);
460
461
output = XMLAddContent((assertResult) ? "pass" : "failure");
462
XMLOutputter(indentLevel, NO, output);
463
464
output = XMLCloseElement(resultElementName);
465
466
467
XMLOutputter(--indentLevel, YES, output);
// log assert message
468
output = XMLOpenElement(messageElementName);
469
470
471
472
473
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(assertMessage);
XMLOutputter(indentLevel, NO, output);
474
output = XMLCloseElement(messageElementName);
475
476
477
XMLOutputter(--indentLevel, YES, output);
// log event time
478
output = XMLOpenElement(timeElementName);
479
480
XMLOutputter(indentLevel++, NO, output);
481
output = XMLAddContent(TimestampToString(eventTime));
482
483
XMLOutputter(indentLevel, NO, output);
484
output = XMLCloseElement(timeElementName);
485
XMLOutputter(--indentLevel, YES, output);
486
487
output = XMLCloseElement(assertElementName);
488
XMLOutputter(--indentLevel, YES, output);
489
490
}
491
void
492
493
XMLAssertSummary(int numAsserts, int numAssertsFailed,
int numAssertsPass, time_t eventTime)
494
{
495
char *output = XMLOpenElement(assertSummaryElementName);
496
XMLOutputter(indentLevel++, YES, output);
497
498
output = XMLOpenElement(assertCountElementName);
499
XMLOutputter(indentLevel++, NO, output);
500
501
502
output = XMLAddContent(IntToString(numAsserts));
XMLOutputter(indentLevel, NO, output);
503
504
output = XMLCloseElement(assertCountElementName);
505
XMLOutputter(--indentLevel, YES, output);
506
507
output = XMLOpenElement(assertsPassedElementName);
508
XMLOutputter(indentLevel++, NO, output);
509
510
511
output = XMLAddContent(IntToString(numAssertsPass));
XMLOutputter(indentLevel, NO, output);
512
513
output = XMLCloseElement(assertsPassedElementName);
514
XMLOutputter(--indentLevel, YES, output);
515
516
output = XMLOpenElement(assertsFailedElementName);
517
XMLOutputter(indentLevel++, NO, output);
518
519
520
output = XMLAddContent(IntToString(numAsserts));
XMLOutputter(indentLevel, NO, output);
521
522
output = XMLCloseElement(assertsFailedElementName);
523
XMLOutputter(--indentLevel, YES, output);
524
525
output = XMLCloseElement(assertSummaryElementName);
526
XMLOutputter(--indentLevel, YES, output);
527
528
}
529
530
void
XMLLog(const char *logMessage, time_t eventTime)
531
{
532
char *output = XMLOpenElement(logElementName);
533
534
535
XMLOutputter(indentLevel++, NO, output);
// log message
536
output = XMLOpenElement(messageElementName);
537
XMLOutputter(indentLevel++, NO, output);
538
539
output = XMLAddContent(logMessage);
540
541
XMLOutputter(indentLevel, NO, output);
542
output = XMLCloseElement(messageElementName);
543
544
545
XMLOutputter(--indentLevel, YES, output);
// log eventTime
546
output = XMLOpenElement(timeElementName);
547
548
XMLOutputter(indentLevel++, NO, output);
549
output = XMLAddContent(TimestampToString(eventTime));
550
551
XMLOutputter(indentLevel, NO, output);
552
output = XMLCloseElement(timeElementName);
553
XMLOutputter(--indentLevel, YES, output);
554
555
output = XMLCloseElement(logElementName);
556
XMLOutputter(--indentLevel, YES, output);
557
}