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