This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
xml_logger.c
674 lines (513 loc) · 20.5 KB
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
/*
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.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <SDL/SDL.h>
#include "../../include/SDL_test.h"
#include "../runner/logger.h"
#include "xml.h"
#include "logger_helpers.h"
#include "xml_logger.h"
/*! Static strings for XML elements */
const char *documentRoot = "testlog";
const char *parametersElementName = "parameters";
const char *parameterElementName = "parameter";
const char *startTimeElementName = "startTime";
const char *seedElementName = "seed";
const char *execKeyElementName = "executionKey";
const char *numSuitesElementName = "numSuites";
const char *numTestElementName = "numTests";
const char *numPassedTestsElementName = "numPassedTests";
const char *numFailedTestsElementName = "numFailedTests";
const char *numSkippedTestsElementName = "numSkippedTests";
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 *resultDescriptionElementName = "resultDescription";
const char *assertElementName = "assert";
const char *messageElementName = "message";
const char *timeElementName = "time";
const char *assertSummaryElementName = "assertSummary";
const char *assertCountElementName = "assertCount";
const char *assertsPassedElementName = "assertsPassed";
const char *assertsFailedElementName = "assertsFailed";
const char *logElementName = "log";
/*! Current indentationt level */
static int indentLevel;
/*! Logging level of the logger */
static Level level = LOGGER_TERSE;
//! Constants for XMLOuputters EOL parameter
#define YES 1
#define NO 0
/*! Controls printing the indentation in relation to line breaks */
static int prevEOL = YES;
//! Handle to log file
static FILE *logFile = NULL;
/*
* Prints out the given xml element etc.
*
* \todo Make the destination of the output changeable (defaults to stdout)
*
* \param currentIndentLevel the indent level of the message
* \param EOL will it print end of line character or not
* \param the XML element itself
*
*/
void
XMLOutputter(const int currentIndentLevel,
96
int EOL, const char *message)
97
{
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
if(ValidateString(message)) {
int indent = 0;
for( ; indent < currentIndentLevel && prevEOL; ++indent) {
fprintf(logFile, " "); // \todo make configurable?
}
prevEOL = EOL;
if(EOL) {
fprintf(logFile, "%s\n", message);
} else {
fprintf(logFile, "%s", message);
}
fflush(logFile);
} else {
fprintf(logFile, "Error: Tried to output invalid string!");
}
SDL_free((char *)message);
118
119
120
121
}
void
XMLRunStarted(int parameterCount, char *runnerParameters[], char *runSeed,
122
time_t eventTime, LoggerData *data)
123
{
124
125
126
127
128
129
130
131
132
133
// Set up the logging destination
if(data->stdoutEnabled) {
logFile = stdout;
} else {
logFile = fopen(data->filename, "w");
if(logFile == NULL) {
fprintf(stderr, "Log file %s couldn't opened\n", data->filename);
exit(3);
}
}
134
135
136
137
138
// Set up the style sheet
char *xslStylesheet = (char *)data->custom;
level = data->level;
//printf("Debug: %d == %d\n", level, data->level);
139
140
141
char *output = XMLOpenDocument(documentRoot, xslStylesheet);
XMLOutputter(indentLevel++, YES, output);
142
143
144
145
// log harness parameters
output = XMLOpenElement(parametersElementName);
XMLOutputter(indentLevel++, YES, output);
146
147
148
149
int counter = 0;
for(counter = 0; counter < parameterCount; counter++) {
char *parameter = runnerParameters[counter];
150
151
152
output = XMLOpenElement(parameterElementName);
XMLOutputter(indentLevel++, NO, output);
153
154
155
output = XMLAddContent(parameter);
XMLOutputter(indentLevel, NO, output);
156
157
158
159
output = XMLCloseElement(parameterElementName);
XMLOutputter(--indentLevel, YES, output);
}
160
161
162
output = XMLCloseElement(parametersElementName);
XMLOutputter(--indentLevel, YES, output);
163
164
165
166
// log seed
output = XMLOpenElement(seedElementName);
XMLOutputter(indentLevel++, NO, output);
167
168
169
output = XMLAddContent(runSeed);
XMLOutputter(indentLevel, NO, output);
170
171
172
output = XMLCloseElement(seedElementName);
XMLOutputter(--indentLevel, YES, output);
173
174
175
176
// log start time
output = XMLOpenElement(startTimeElementName);
XMLOutputter(indentLevel++, NO, output);
177
178
179
output = XMLAddContent(TimestampToString(eventTime));
XMLOutputter(indentLevel, NO, output);
180
181
182
output = XMLCloseElement(startTimeElementName);
XMLOutputter(--indentLevel, YES, output);
183
184
185
186
}
void
XMLRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount,
187
int testSkippedCount, time_t endTime, double totalRuntime)
188
{
189
190
191
// log suite count
char *output = XMLOpenElement(numSuitesElementName);
XMLOutputter(indentLevel++, NO, output);
192
193
194
output = XMLAddContent(IntToString(suiteCount));
XMLOutputter(indentLevel, NO, output);
195
196
197
output = XMLCloseElement(numSuitesElementName);
XMLOutputter(--indentLevel, YES, output);
198
199
200
201
// log test count
output = XMLOpenElement(numTestElementName);
XMLOutputter(indentLevel++, NO, output);
202
203
204
output = XMLAddContent(IntToString(testCount));
XMLOutputter(indentLevel, NO, output);
205
206
207
output = XMLCloseElement(numTestElementName);
XMLOutputter(--indentLevel, YES, output);
208
209
210
211
// log passed test count
output = XMLOpenElement(numPassedTestsElementName);
XMLOutputter(indentLevel++, NO, output);
212
213
214
output = XMLAddContent(IntToString(testPassCount));
XMLOutputter(indentLevel, NO, output);
215
216
217
output = XMLCloseElement(numPassedTestsElementName);
XMLOutputter(--indentLevel, YES, output);
218
219
220
221
// log failed test count
output = XMLOpenElement(numFailedTestsElementName);
XMLOutputter(indentLevel++, NO, output);
222
223
224
output = XMLAddContent(IntToString(testFailCount));
XMLOutputter(indentLevel, NO, output);
225
226
227
output = XMLCloseElement(numFailedTestsElementName);
XMLOutputter(--indentLevel, YES, output);
228
229
230
231
// log skipped test count
output = XMLOpenElement(numSkippedTestsElementName);
XMLOutputter(indentLevel++, NO, output);
232
233
234
output = XMLAddContent(IntToString(testSkippedCount));
XMLOutputter(indentLevel, NO, output);
235
236
237
output = XMLCloseElement(numSkippedTestsElementName);
XMLOutputter(--indentLevel, YES, output);
238
239
240
241
// log end tite
output = XMLOpenElement(endTimeElementName);
XMLOutputter(indentLevel++, NO, output);
242
243
244
output = XMLAddContent(TimestampToString(endTime));
XMLOutputter(indentLevel, NO, output);
245
246
247
output = XMLCloseElement(endTimeElementName);
XMLOutputter(--indentLevel, YES, output);
248
249
250
251
// log total runtime
output = XMLOpenElement(totalRuntimeElementName);
XMLOutputter(indentLevel++, NO, output);
252
253
254
output = XMLAddContent(DoubleToString(totalRuntime));
XMLOutputter(indentLevel, NO, output);
255
256
257
output = XMLCloseElement(totalRuntimeElementName);
XMLOutputter(--indentLevel, YES, output);
258
259
260
output = XMLCloseDocument(documentRoot);
XMLOutputter(--indentLevel, YES, output);
261
262
263
// close the log file
fclose(logFile);
264
265
266
267
268
}
void
XMLSuiteStarted(const char *suiteName, time_t eventTime)
{
269
270
271
// log suite name
char *output = XMLOpenElement(suiteElementName);
XMLOutputter(indentLevel++, YES, output);
272
273
274
output = XMLOpenElement(nameElementName);
XMLOutputter(indentLevel++, NO, output);
275
276
277
output = XMLAddContent(suiteName);
XMLOutputter(indentLevel, NO, output);
278
279
280
281
// log test name
output = XMLCloseElement(nameElementName);
XMLOutputter(--indentLevel, YES, output);
282
283
284
output = XMLOpenElement(startTimeElementName);
XMLOutputter(indentLevel++, NO, output);
285
286
287
288
// log beginning time
output = XMLAddContent(TimestampToString(eventTime));
XMLOutputter(indentLevel, NO, output);
289
290
291
output = XMLCloseElement(startTimeElementName);
XMLOutputter(--indentLevel, YES, output);
292
293
294
295
296
297
}
void
XMLSuiteEnded(int testsPassed, int testsFailed, int testsSkipped,
time_t endTime, double totalRuntime)
{
298
299
300
// log tests passed
char *output = XMLOpenElement(testsPassedElementName);
XMLOutputter(indentLevel++, NO, output);
301
302
303
output = XMLAddContent(IntToString(testsPassed));
XMLOutputter(indentLevel, NO, output);
304
305
306
output = XMLCloseElement(testsPassedElementName);
XMLOutputter(--indentLevel, YES, output);
307
308
309
310
// log tests failed
output = XMLOpenElement(testsFailedElementName);
XMLOutputter(indentLevel++, NO, output);
311
312
313
output = XMLAddContent(IntToString(testsFailed));
XMLOutputter(indentLevel, NO, output);
314
315
316
output = XMLCloseElement(testsFailedElementName);
XMLOutputter(--indentLevel, YES, output);
317
318
319
320
// log tests skipped
output = XMLOpenElement(testsSkippedElementName);
XMLOutputter(indentLevel++, NO, output);
321
322
323
output = XMLAddContent(IntToString(testsSkipped));
XMLOutputter(indentLevel, NO, output);
324
325
326
output = XMLCloseElement(testsSkippedElementName);
XMLOutputter(--indentLevel, YES, output);
327
328
329
330
// log tests skipped
output = XMLOpenElement(endTimeElementName);
XMLOutputter(indentLevel++, NO, output);
331
332
333
output = XMLAddContent(TimestampToString(endTime));
XMLOutputter(indentLevel, NO, output);
334
335
336
output = XMLCloseElement(endTimeElementName);
XMLOutputter(--indentLevel, YES, output);
337
338
339
340
// log total runtime
output = XMLOpenElement(totalRuntimeElementName);
XMLOutputter(indentLevel++, NO, output);
341
342
343
output = XMLAddContent(DoubleToString(totalRuntime));
XMLOutputter(indentLevel, NO, output);
344
345
346
output = XMLCloseElement(totalRuntimeElementName);
XMLOutputter(--indentLevel, YES, output);
347
348
349
350
output = XMLCloseElement(suiteElementName);
XMLOutputter(--indentLevel, YES, output);
351
352
353
354
}
void
XMLTestStarted(const char *testName, const char *suiteName,
355
const char *testDescription, Uint64 execKey, time_t startTime)
356
{
357
358
char * output = XMLOpenElement(testElementName);
XMLOutputter(indentLevel++, YES, output);
359
360
361
362
// log test name
output = XMLOpenElement(nameElementName);
XMLOutputter(indentLevel++, NO, output);
363
364
365
output = XMLAddContent(testName);
XMLOutputter(indentLevel, NO, output);
366
367
368
output = XMLCloseElement(nameElementName);
XMLOutputter(--indentLevel, YES, output);
369
370
371
372
// log test description
output = XMLOpenElement(descriptionElementName);
XMLOutputter(indentLevel++, NO, output);
373
374
375
output = XMLAddContent(testDescription);
XMLOutputter(indentLevel, NO, output);
376
377
378
output = XMLCloseElement(descriptionElementName);
XMLOutputter(--indentLevel, YES, output);
379
380
381
382
// log execution key
output = XMLOpenElement(execKeyElementName);
XMLOutputter(indentLevel++, NO, output);
383
384
385
output = XMLAddContent(IntToHexString(execKey));
XMLOutputter(indentLevel, NO, output);
386
387
388
output = XMLCloseElement(execKeyElementName);
XMLOutputter(--indentLevel, YES, output);
389
390
391
392
// log start time
output = XMLOpenElement(startTimeElementName);
XMLOutputter(indentLevel++, NO, output);
393
394
395
output = XMLAddContent(TimestampToString(startTime));
XMLOutputter(indentLevel, NO, output);
396
397
398
output = XMLCloseElement(startTimeElementName);
XMLOutputter(--indentLevel, YES, output);
399
400
401
402
403
404
}
void
XMLTestEnded(const char *testName, const char *suiteName,
int testResult, time_t endTime, double totalRuntime)
{
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
// Log test result
char *output = XMLOpenElement(resultElementName);
XMLOutputter(indentLevel++, NO, output);
switch(testResult) {
case TEST_RESULT_PASS:
output = XMLAddContent("passed");
break;
case TEST_RESULT_FAILURE:
output = XMLAddContent("failed");
break;
case TEST_RESULT_NO_ASSERT:
output = XMLAddContent("failed");
break;
case TEST_RESULT_SKIPPED:
output = XMLAddContent("skipped");
break;
case TEST_RESULT_KILLED:
output = XMLAddContent("failed");
break;
case TEST_RESULT_SETUP_FAILURE:
output = XMLAddContent("failed");
break;
}
XMLOutputter(indentLevel, NO, output);
output = XMLCloseElement(resultElementName);
XMLOutputter(--indentLevel, YES, output);
// Log description of test result. Why the test failed,
// if there's some specific reason
output = XMLOpenElement(resultDescriptionElementName);
XMLOutputter(indentLevel++, NO, output);
switch(testResult) {
case TEST_RESULT_PASS:
case TEST_RESULT_FAILURE:
case TEST_RESULT_SKIPPED:
output = XMLAddContent("");
break;
case TEST_RESULT_NO_ASSERT:
output = XMLAddContent("No assert");
break;
case TEST_RESULT_KILLED:
output = XMLAddContent("Timeout exceeded");
break;
case TEST_RESULT_SETUP_FAILURE:
output = XMLAddContent("Setup failure, couldn't be executed");
break;
}
XMLOutputter(indentLevel, NO, output);
output = XMLCloseElement(resultDescriptionElementName);
XMLOutputter(--indentLevel, YES, output);
// log total runtime
output = XMLOpenElement(endTimeElementName);
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(TimestampToString(endTime));
XMLOutputter(indentLevel, NO, output);
output = XMLCloseElement(endTimeElementName);
XMLOutputter(--indentLevel, YES, output);
// log total runtime
output = XMLOpenElement(totalRuntimeElementName);
XMLOutputter(indentLevel++, NO, output);
output = XMLAddContent(DoubleToString(totalRuntime));
XMLOutputter(indentLevel, NO, output);
output = XMLCloseElement(totalRuntimeElementName);
XMLOutputter(--indentLevel, YES, output);
output = XMLCloseElement(testElementName);
XMLOutputter(--indentLevel, YES, output);
482
483
484
485
}
void
XMLAssert(const char *assertName, int assertResult, const char *assertMessage,
486
time_t eventTime)
487
{
488
489
490
491
// Log passed asserts only on VERBOSE level
if(level <= LOGGER_TERSE && assertResult == ASSERT_PASS) {
return ;
}
492
493
494
char *output = XMLOpenElement(assertElementName);
XMLOutputter(indentLevel++, YES, output);
495
496
497
498
// log assert name
output = XMLOpenElement(nameElementName);
XMLOutputter(indentLevel++, NO, output);
499
500
501
output = XMLAddContent(assertName);
XMLOutputter(indentLevel, NO, output);
502
503
504
output = XMLCloseElement(nameElementName);
XMLOutputter(--indentLevel, YES, output);
505
506
507
508
509
// log assert result
output = XMLOpenElement(resultElementName);
XMLOutputter(indentLevel++, NO, output);
510
511
512
output = XMLAddContent((assertResult) ? "pass" : "failure");
XMLOutputter(indentLevel, NO, output);
513
514
515
output = XMLCloseElement(resultElementName);
XMLOutputter(--indentLevel, YES, output);
516
517
518
519
// log assert message
output = XMLOpenElement(messageElementName);
XMLOutputter(indentLevel++, NO, output);
520
521
522
output = XMLAddContent(assertMessage);
XMLOutputter(indentLevel, NO, output);
523
524
525
output = XMLCloseElement(messageElementName);
XMLOutputter(--indentLevel, YES, output);
526
527
528
529
// log event time
output = XMLOpenElement(timeElementName);
XMLOutputter(indentLevel++, NO, output);
530
531
532
output = XMLAddContent(TimestampToString(eventTime));
XMLOutputter(indentLevel, NO, output);
533
534
535
output = XMLCloseElement(timeElementName);
XMLOutputter(--indentLevel, YES, output);
536
537
538
output = XMLCloseElement(assertElementName);
XMLOutputter(--indentLevel, YES, output);
539
540
541
542
}
void
XMLAssertWithValues(const char *assertName, int assertResult, const char *assertMessage,
543
int actualValue, int excpected, time_t eventTime)
544
{
545
546
547
548
// Log passed asserts only on VERBOSE level
if(level <= LOGGER_TERSE && assertResult == ASSERT_PASS) {
return ;
}
549
550
551
char *output = XMLOpenElement(assertElementName);
XMLOutputter(indentLevel++, YES, output);
552
553
554
555
// log assert name
output = XMLOpenElement(nameElementName);
XMLOutputter(indentLevel++, NO, output);
556
557
558
output = XMLAddContent(assertName);
XMLOutputter(indentLevel, NO, output);
559
560
561
output = XMLCloseElement(nameElementName);
XMLOutputter(--indentLevel, YES, output);
562
563
564
565
566
// log assert result
output = XMLOpenElement(resultElementName);
XMLOutputter(indentLevel++, NO, output);
567
568
569
output = XMLAddContent((assertResult) ? "pass" : "failure");
XMLOutputter(indentLevel, NO, output);
570
571
572
output = XMLCloseElement(resultElementName);
XMLOutputter(--indentLevel, YES, output);
573
574
575
576
// log assert message
output = XMLOpenElement(messageElementName);
XMLOutputter(indentLevel++, NO, output);
577
578
579
output = XMLAddContent(assertMessage);
XMLOutputter(indentLevel, NO, output);
580
581
582
output = XMLCloseElement(messageElementName);
XMLOutputter(--indentLevel, YES, output);
583
584
585
586
// log event time
output = XMLOpenElement(timeElementName);
XMLOutputter(indentLevel++, NO, output);
587
588
589
output = XMLAddContent(TimestampToString(eventTime));
XMLOutputter(indentLevel, NO, output);
590
591
592
output = XMLCloseElement(timeElementName);
XMLOutputter(--indentLevel, YES, output);
593
594
595
output = XMLCloseElement(assertElementName);
XMLOutputter(--indentLevel, YES, output);
596
597
598
599
}
void
XMLAssertSummary(int numAsserts, int numAssertsFailed,
600
int numAssertsPass, time_t eventTime)
601
{
602
603
char *output = XMLOpenElement(assertSummaryElementName);
XMLOutputter(indentLevel++, YES, output);
604
605
606
output = XMLOpenElement(assertCountElementName);
XMLOutputter(indentLevel++, NO, output);
607
608
609
output = XMLAddContent(IntToString(numAsserts));
XMLOutputter(indentLevel, NO, output);
610
611
612
output = XMLCloseElement(assertCountElementName);
XMLOutputter(--indentLevel, YES, output);
613
614
615
output = XMLOpenElement(assertsPassedElementName);
XMLOutputter(indentLevel++, NO, output);
616
617
618
output = XMLAddContent(IntToString(numAssertsPass));
XMLOutputter(indentLevel, NO, output);
619
620
621
output = XMLCloseElement(assertsPassedElementName);
XMLOutputter(--indentLevel, YES, output);
622
623
624
output = XMLOpenElement(assertsFailedElementName);
XMLOutputter(indentLevel++, NO, output);
625
626
627
output = XMLAddContent(IntToString(numAsserts));
XMLOutputter(indentLevel, NO, output);
628
629
630
output = XMLCloseElement(assertsFailedElementName);
XMLOutputter(--indentLevel, YES, output);
631
632
633
output = XMLCloseElement(assertSummaryElementName);
XMLOutputter(--indentLevel, YES, output);
634
635
636
637
638
}
void
XMLLog(time_t eventTime, char *fmt, ...)
{
639
640
641
642
// create the log message
va_list args;
char logMessage[1024];
memset(logMessage, 0, sizeof(logMessage));
643
644
645
646
va_start( args, fmt );
SDL_vsnprintf( logMessage, sizeof(logMessage), fmt, args );
va_end( args );
647
648
649
char *output = XMLOpenElement(logElementName);
XMLOutputter(indentLevel++, YES, output);
650
651
652
653
// log message
output = XMLOpenElement(messageElementName);
XMLOutputter(indentLevel++, NO, output);
654
655
656
657
// fix this here!
output = XMLAddContent(logMessage);
XMLOutputter(indentLevel, NO, output);
658
659
660
output = XMLCloseElement(messageElementName);
XMLOutputter(--indentLevel, YES, output);
661
662
663
664
// log eventTime
output = XMLOpenElement(timeElementName);
XMLOutputter(indentLevel++, NO, output);
665
666
667
output = XMLAddContent(TimestampToString(eventTime));
XMLOutputter(indentLevel, NO, output);
668
669
670
output = XMLCloseElement(timeElementName);
XMLOutputter(--indentLevel, YES, output);
671
672
673
output = XMLCloseElement(logElementName);
XMLOutputter(--indentLevel, YES, output);
674
}