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