Commit 2a486b27 authored by Markus Kauppila's avatar Markus Kauppila

Added identation to the output of XML logger.

parent 2e8932b1
...@@ -57,25 +57,6 @@ SetupPlainLogger() ...@@ -57,25 +57,6 @@ SetupPlainLogger()
Log = PlainLog; Log = PlainLog;
} }
/*!
* Prints the given message to stderr. Function adds nesting
* to the output.
*
* \return Possible error value (\todo)
*/
int
LogGenericOutput(const char *message, ...)
{
va_list list;
va_start(list, message);
char buffer[1024];
SDL_vsnprintf(buffer, sizeof(buffer), message, list);
fprintf(stderr, "%s\n", buffer);
fflush(stderr);
}
#if 0 #if 0
/*! /*!
* Test app for logging functionality * Test app for logging functionality
...@@ -91,7 +72,7 @@ main(int argc, char *argv[]) ...@@ -91,7 +72,7 @@ main(int argc, char *argv[])
SetupPlainLogger(); SetupPlainLogger();
} }
RunStarted(LogGenericOutput, "some_<data_>here&here", 0); RunStarted(Output, "some_<data_>here&here", 0);
SuiteStarted("Suite data here", 0); SuiteStarted("Suite data here", 0);
TestStarted("test1", "suite", "desc", 0); TestStarted("test1", "suite", "desc", 0);
......
...@@ -54,7 +54,7 @@ typedef void (*AssertSummaryFp)(int numAsserts, int numAssertsFailed, int numAss ...@@ -54,7 +54,7 @@ typedef void (*AssertSummaryFp)(int numAsserts, int numAssertsFailed, int numAss
typedef void (*LogFp)(const char *logMessage, time_t eventTime); typedef void (*LogFp)(const char *logMessage, time_t eventTime);
int LogGenericOutput(const char *message, ...); int Output(const char *message, ...);
extern RunStartedFp RunStarted; extern RunStartedFp RunStarted;
extern RunEndedFp RunEnded; extern RunEndedFp RunEnded;
......
...@@ -4,53 +4,69 @@ ...@@ -4,53 +4,69 @@
#include <stdio.h> #include <stdio.h>
#include <SDL/SDL.h>
#include "plain_logger.h" #include "plain_logger.h"
LogOutputFp logger = 0; /*!
* Pritns out the output of the logger
* \return Possible error value (\todo)
*/
int
Output(const char *message, ...)
{
va_list list;
va_start(list, message);
char buffer[1024];
SDL_vsnprintf(buffer, sizeof(buffer), message, list);
fprintf(stderr, "%s\n", buffer);
fflush(stderr);
}
void void
PlainRunStarted(LogOutputFp outputFn, const char *runnerParameters, time_t eventTime) PlainRunStarted(const char *runnerParameters, time_t eventTime)
{ {
logger = outputFn; Output("Test run started");
logger("Test run started"); Output("Given command line options: %s", "add options");
logger("Given command line options: %s", "add options");
} }
void void
PlainRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount, PlainRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount,
time_t endTime, time_t totalRuntime) time_t endTime, time_t totalRuntime)
{ {
logger("Ran %d tests in %0.5f seconds.", testCount, totalRuntime); Output("Ran %d tests in %0.5f seconds.", testCount, totalRuntime);
logger("%d tests passed", testPassCount); Output("%d tests passed", testPassCount);
logger("%d tests failed", testFailCount); Output("%d tests failed", testFailCount);
} }
void void
PlainSuiteStarted(const char *suiteName, time_t eventTime) PlainSuiteStarted(const char *suiteName, time_t eventTime)
{ {
logger("Executing tests in %s", suiteName); Output("Executing tests in %s", suiteName);
} }
void void
PlainSuiteEnded(int testsPassed, int testsFailed, int testsSkipped, PlainSuiteEnded(int testsPassed, int testsFailed, int testsSkipped,
double endTime, time_t totalRuntime) double endTime, time_t totalRuntime)
{ {
logger("Suite executed. %d passed, %d failed and %d skipped", testsPassed, testsFailed, testsSkipped); Output("Suite executed. %d passed, %d failed and %d skipped", testsPassed, testsFailed, testsSkipped);
} }
void void
PlainTestStarted(const char *testName, const char *suiteName, const char *testDescription, time_t startTime) PlainTestStarted(const char *testName, const char *suiteName, const char *testDescription, time_t startTime)
{ {
logger("test %s (in %s) started", testName, suiteName); Output("test %s (in %s) started", testName, suiteName);
} }
void void
PlainTestEnded(const char *testName, const char *suiteName, PlainTestEnded(const char *testName, const char *suiteName,
int testResult, time_t endTime, time_t totalRuntime) int testResult, time_t endTime, time_t totalRuntime)
{ {
logger("%s: ok", testName); Output("%s: ok", testName);
} }
void void
...@@ -58,19 +74,19 @@ PlainAssert(const char *assertName, int assertResult, const char *assertMessage, ...@@ -58,19 +74,19 @@ PlainAssert(const char *assertName, int assertResult, const char *assertMessage,
time_t eventTime) time_t eventTime)
{ {
const char *result = (assertResult) ? "passed" : "failed"; const char *result = (assertResult) ? "passed" : "failed";
logger("%s %d: %s", assertName, assertResult, assertMessage); Output("%s %d: %s", assertName, assertResult, assertMessage);
} }
void void
PlainAssertSummary(int numAsserts, int numAssertsFailed, int numAssertsPass) PlainAssertSummary(int numAsserts, int numAssertsFailed, int numAssertsPass)
{ {
logger("Asserts:%d", numAsserts); Output("Asserts:%d", numAsserts);
} }
void void
PlainLog(const char *logMessage, time_t eventTime) PlainLog(const char *logMessage, time_t eventTime)
{ {
logger("%s %d", logMessage, eventTime); Output("%s %d", logMessage, eventTime);
} }
#endif #endif
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include "logger.h" #include "logger.h"
void PlainRunStarted(LogOutputFp outputFn, const char *runnerParameters, time_t eventTime); void PlainRunStarted(const char *runnerParameters, time_t eventTime);
void PlainRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount, void PlainRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount,
time_t endTime, time_t totalRuntime); time_t endTime, time_t totalRuntime);
......
...@@ -670,7 +670,7 @@ main(int argc, char *argv[]) ...@@ -670,7 +670,7 @@ main(int argc, char *argv[])
return 0; return 0;
} }
RunStarted(LogGenericOutput, NULL, 0); RunStarted(Output, NULL, 0);
char *currentSuiteName = NULL; char *currentSuiteName = NULL;
...@@ -708,6 +708,8 @@ main(int argc, char *argv[]) ...@@ -708,6 +708,8 @@ main(int argc, char *argv[])
} }
} }
SuiteEnded(0, 0, 0, 0.0f, 0);
UnloadTestCases(testCases); UnloadTestCases(testCases);
UnloadTestSuites(suites); UnloadTestSuites(suites);
......
...@@ -153,8 +153,14 @@ const char *EscapeString(const char *string) { ...@@ -153,8 +153,14 @@ const char *EscapeString(const char *string) {
while(token) { while(token) {
char *nextToken = strtok(NULL, character); char *nextToken = strtok(NULL, character);
//! \todo use strncat and count the bytes left in the buffer int bytesLeft = bufferSize - SDL_strlen(buffer);
strcat(buffer, token); if(bytesLeft) {
strncat(buffer, token, bytesLeft);
} else {
// \! todo there's probably better way to report an error?
fprintf(stderr, "xml.c | EscapingString: Buffer is full");
}
if(nextToken) if(nextToken)
strcat(buffer, entity); strcat(buffer, entity);
...@@ -211,7 +217,7 @@ static char buffer[bufferSize]; ...@@ -211,7 +217,7 @@ static char buffer[bufferSize];
char * char *
XMLOpenDocument(const char *rootTag) XMLOpenDocument(const char *rootTag)
{ {
const char *doctype = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"; const char *doctype = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
memset(buffer, 0, bufferSize); memset(buffer, 0, bufferSize);
snprintf(buffer, bufferSize, "<%s>", rootTag); snprintf(buffer, bufferSize, "<%s>", rootTag);
...@@ -303,8 +309,13 @@ XMLCloseElement(const char *tag) ...@@ -303,8 +309,13 @@ XMLCloseElement(const char *tag)
SDL_free(lowOpenTag); SDL_free(lowOpenTag);
SDL_free(lowTag); SDL_free(lowTag);
// \todo use strNcat int bytesLeft = bufferSize - SDL_strlen(ret);
strcat(ret, buffer); if(bytesLeft) {
strncat(ret, buffer, bytesLeft);
} else {
// \! todo there's probably better way to report an error?
fprintf(stderr, "xml.c | XMLCloseElement: Buffer is full");
}
RemoveOpenTag(openTag->tag); RemoveOpenTag(openTag->tag);
......
...@@ -28,27 +28,70 @@ ...@@ -28,27 +28,70 @@
#include "xml_logger.h" #include "xml_logger.h"
LogOutputFp logger; /*!
* Helper functions. Turns the given integer in to a string
*
* \param integer The converted integer
* \returns Given integer as string
*/
char *IntToString(const int integer) {
static char buffer[sizeof(int) * 8 + 1]; // malloc might work better
memset(buffer, 0, sizeof(buffer));
SDL_snprintf(buffer, sizeof(buffer), "%d", integer);
return buffer;
}
static int indentLevel;
//! Constants for XMLOuputters EOL parameter
#define YES 1
#define NO 0
/*! Controls printing the identation in relation to line breaks */
static int prevEOL = YES;
/*
* Prints out the given xml element etc.
*
* \param identLevel 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 il, int EOL, const char *message) {
int ident = 0;
for( ; ident < il && prevEOL; ++ident) {
printf(" ");
}
prevEOL = EOL;
if(EOL) {
printf("%s\n", message);
} else {
printf("%s", message);
}
}
void void
XMLRunStarted(LogOutputFp outputFn, const char *runnerParameters, time_t eventTime) XMLRunStarted(const char *runnerParameters, time_t eventTime)
{ {
logger = outputFn;
char *output = XMLOpenDocument("testlog"); char *output = XMLOpenDocument("testlog");
logger(output); XMLOutputter(indentLevel++, YES, output);
SDL_free(output); SDL_free(output);
output = XMLOpenElement("parameters"); output = XMLOpenElement("parameters");
logger(output); XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
output = XMLAddContent("Add: runner parameter"); output = XMLAddContent("Add: runner parameter");
logger(output); XMLOutputter(indentLevel, NO, output);
SDL_free(output); SDL_free(output);
output = XMLCloseElement("parameters"); output = XMLCloseElement("parameters");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
} }
...@@ -57,7 +100,7 @@ XMLRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount, ...@@ -57,7 +100,7 @@ XMLRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount,
time_t endTime, time_t totalRuntime) time_t endTime, time_t totalRuntime)
{ {
char *output = XMLCloseDocument("testlog"); char *output = XMLCloseDocument("testlog");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
} }
...@@ -65,16 +108,19 @@ void ...@@ -65,16 +108,19 @@ void
XMLSuiteStarted(const char *suiteName, time_t eventTime) XMLSuiteStarted(const char *suiteName, time_t eventTime)
{ {
char *output = XMLOpenElement("suite"); char *output = XMLOpenElement("suite");
logger(output); XMLOutputter(indentLevel++, YES, output);
SDL_free(output);
output = XMLOpenElement("eventTime");
XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
output = XMLOpenElement("eventtime"); output = XMLAddContent(IntToString(eventTime));
logger(output); XMLOutputter(indentLevel, NO, output);
SDL_free(output); SDL_free(output);
//XMLAddContent(evenTime); output = XMLCloseElement("eventTime");
output = XMLCloseElement("eventtime"); XMLOutputter(--indentLevel, YES, output);
logger(output);
SDL_free(output); SDL_free(output);
} }
...@@ -83,51 +129,56 @@ XMLSuiteEnded(int testsPassed, int testsFailed, int testsSkipped, ...@@ -83,51 +129,56 @@ XMLSuiteEnded(int testsPassed, int testsFailed, int testsSkipped,
double endTime, time_t totalRuntime) double endTime, time_t totalRuntime)
{ {
char *output = XMLCloseElement("suite"); char *output = XMLCloseElement("suite");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
//! \todo endTime and totalRuntiem
} }
void void
XMLTestStarted(const char *testName, const char *suiteName, const char *testDescription, time_t startTime) XMLTestStarted(const char *testName, const char *suiteName, const char *testDescription, time_t startTime)
{ {
char * output = XMLOpenElement("test"); char * output = XMLOpenElement("test");
logger(output); XMLOutputter(indentLevel++, YES, output);
SDL_free(output); SDL_free(output);
//Attribute attribute = {"test", "value"}; //Attribute attribute = {"test", "value"};
//XMLOpenElementWithAttribute("name", &attribute); //XMLOpenElementWithAttribute("name", &attribute);
output = XMLOpenElement("name"); output = XMLOpenElement("name");
logger(output); XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
output = XMLAddContent(testName); output = XMLAddContent(testName);
logger(output); XMLOutputter(indentLevel, NO, output);
SDL_free(output); SDL_free(output);
output = XMLCloseElement("name"); output = XMLCloseElement("name");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
output = XMLOpenElement("description"); output = XMLOpenElement("description");
logger(output); XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
output = XMLAddContent(testDescription); output = XMLAddContent(testDescription);
logger(output); XMLOutputter(indentLevel, NO, output);
SDL_free(output); SDL_free(output);
output = XMLCloseElement("description"); output = XMLCloseElement("description");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output);
output = XMLOpenElement("startTime");
XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
output = XMLOpenElement("starttime"); XMLAddContent(IntToString(startTime));
logger(output); XMLOutputter(indentLevel, NO, output);
SDL_free(output); SDL_free(output);
//XMLAddContent(startTime); output = XMLCloseElement("startTime");
output = XMLCloseElement("starttime"); XMLOutputter(--indentLevel, YES, output);
logger(output);
SDL_free(output); SDL_free(output);
} }
...@@ -136,7 +187,7 @@ XMLTestEnded(const char *testName, const char *suiteName, ...@@ -136,7 +187,7 @@ XMLTestEnded(const char *testName, const char *suiteName,
int testResult, time_t endTime, time_t totalRuntime) int testResult, time_t endTime, time_t totalRuntime)
{ {
char *output = XMLOpenElement("result"); char *output = XMLOpenElement("result");
logger(output); XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
if(testResult) { if(testResult) {
...@@ -145,20 +196,22 @@ XMLTestEnded(const char *testName, const char *suiteName, ...@@ -145,20 +196,22 @@ XMLTestEnded(const char *testName, const char *suiteName,
} else { } else {
output = XMLAddContent("failed"); output = XMLAddContent("failed");
} }
logger(output); XMLOutputter(indentLevel, NO, output);
SDL_free(output); SDL_free(output);
} else { } else {
output = XMLAddContent("passed"); output = XMLAddContent("passed");
logger(output); XMLOutputter(indentLevel, NO, output);
SDL_free(output); SDL_free(output);
} }
output = XMLCloseElement("result"); output = XMLCloseElement("result");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
//! \todo add endTime and TotalRuntime
output = XMLCloseElement("test"); output = XMLCloseElement("test");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
} }
...@@ -167,23 +220,50 @@ XMLAssert(const char *assertName, int assertResult, const char *assertMessage, ...@@ -167,23 +220,50 @@ XMLAssert(const char *assertName, int assertResult, const char *assertMessage,
time_t eventTime) time_t eventTime)
{ {
char *output = XMLOpenElement("assert"); char *output = XMLOpenElement("assert");
logger(output); XMLOutputter(indentLevel++, YES, output);
SDL_free(output); SDL_free(output);
// log assert result
output = XMLOpenElement("result"); output = XMLOpenElement("result");
logger(output); XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
output = XMLAddContent((assertResult) ? "pass" : "failure"); output = XMLAddContent((assertResult) ? "pass" : "failure");
logger(output); XMLOutputter(indentLevel, NO, output);
SDL_free(output); SDL_free(output);
output = XMLCloseElement("result"); output = XMLCloseElement("result");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output);
// log assert message
output = XMLOpenElement("message");
XMLOutputter(indentLevel++, NO, output);
SDL_free(output);
output = XMLAddContent(assertMessage);
XMLOutputter(indentLevel, NO, output);
SDL_free(output);
output = XMLCloseElement("message");
XMLOutputter(--indentLevel, YES, output);
SDL_free(output);
// log event time
output = XMLOpenElement("eventTime");
XMLOutputter(indentLevel++, NO, output);
SDL_free(output);
output = XMLAddContent(IntToString(eventTime));
XMLOutputter(indentLevel, NO, output);
SDL_free(output);
output = XMLCloseElement("eventTime");
XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
output = XMLCloseElement("assert"); output = XMLCloseElement("assert");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
} }
...@@ -191,50 +271,47 @@ void ...@@ -191,50 +271,47 @@ void
XMLAssertSummary(int numAsserts, int numAssertsFailed, int numAssertsPass) XMLAssertSummary(int numAsserts, int numAssertsFailed, int numAssertsPass)
{ {
char *output = XMLOpenElement("assertSummary"); char *output = XMLOpenElement("assertSummary");
logger(output); XMLOutputter(indentLevel++, YES, output);
SDL_free(output); SDL_free(output);
output = XMLOpenElement("assertCount"); output = XMLOpenElement("assertCount");
logger(output); XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
//XMLAddContent() \todo add string conversion output = XMLAddContent(IntToString(numAsserts));
XMLOutputter(indentLevel, NO, output);
SDL_free(output);
output = XMLCloseElement("assertCount"); output = XMLCloseElement("assertCount");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
output = XMLOpenElement("assertsPassed"); output = XMLOpenElement("assertsPassed");
logger(output); XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
const int bufferSize = sizeof(int) * 8 + 1; output = XMLAddContent(IntToString(numAssertsPass));
//char buffer[bufferSize]; XMLOutputter(indentLevel, NO, output);
char *buffer = SDL_malloc(bufferSize); SDL_free(output);
memset(buffer, 'a', bufferSize);
//SDL_vsnprintf(buffer, bufferSize, "%d", numAssertsPass);
snprintf(buffer, sizeof(buffer), "%d", numAssertsPass);
buffer[3] = 'a';
//printf("DEBUG |%s == %d of size %d", buffer, numAssertsPass, bufferSize);
XMLAddContent(buffer);
output = XMLCloseElement("assertsPassed"); output = XMLCloseElement("assertsPassed");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
output = XMLOpenElement("assertsFailed"); output = XMLOpenElement("assertsFailed");
logger(output); XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
//XMLAddContent() \todo add string conversion output = XMLAddContent(IntToString(numAsserts));
XMLOutputter(indentLevel, NO, output);
SDL_free(output);
output = XMLCloseElement("assertsFailed"); output = XMLCloseElement("assertsFailed");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
output = XMLCloseElement("assertSummary"); output = XMLCloseElement("assertSummary");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
} }
...@@ -242,15 +319,36 @@ void ...@@ -242,15 +319,36 @@ void
XMLLog(const char *logMessage, time_t eventTime) XMLLog(const char *logMessage, time_t eventTime)
{ {
char *output = XMLOpenElement("log"); char *output = XMLOpenElement("log");
logger(output); XMLOutputter(indentLevel++, NO, output);
SDL_free(output);
// log message
output = XMLOpenElement("message");
XMLOutputter(indentLevel++, NO, output);
SDL_free(output); SDL_free(output);
output = XMLAddContent(logMessage); output = XMLAddContent(logMessage);
logger(output); XMLOutputter(indentLevel, NO, output);
SDL_free(output);
output = XMLCloseElement("message");
XMLOutputter(--indentLevel, YES, output);
SDL_free(output);
// log eventTime
output = XMLOpenElement("eventTime");
XMLOutputter(indentLevel++, NO, output);
SDL_free(output);
output = XMLAddContent(IntToString(eventTime));
XMLOutputter(indentLevel, NO, output);
SDL_free(output);
output = XMLCloseElement("eventTime");
XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
output = XMLCloseElement("log"); output = XMLCloseElement("log");
logger(output); XMLOutputter(--indentLevel, YES, output);
SDL_free(output); SDL_free(output);
} }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include "logger.h" #include "logger.h"
void XMLRunStarted(LogOutputFp outputFn, const char *runnerParameters, time_t eventTime); void XMLRunStarted(const char *runnerParameters, time_t eventTime);
void XMLRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount, void XMLRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount,
time_t endTime, time_t totalRuntime); time_t endTime, time_t totalRuntime);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment