Logging system added to harness. Logging system doesn't
authorMarkus Kauppila <markus.kauppila@gmail.com>
Sun, 26 Jun 2011 23:04:37 +0300
changeset 5713 08edd9b3ec32
parent 5712 dabff57811e4
child 5714 d35019d2dcfb
Logging system added to harness. Logging system doesn't yet utilize all the given parameters.
test/test-automation/Makefile.am
test/test-automation/SDL_test.c
test/test-automation/SDL_test.h
test/test-automation/logger.c
test/test-automation/logger.h
test/test-automation/plain_logger.c
test/test-automation/plain_logger.h
test/test-automation/runner.c
test/test-automation/xml.c
test/test-automation/xml_logger.c
test/test-automation/xml_logger.h
--- a/test/test-automation/Makefile.am	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/Makefile.am	Sun Jun 26 23:04:37 2011 +0300
@@ -3,15 +3,10 @@
 SUBDIRS = testdummy testrect testplatform
 
 bin_PROGRAMS = runner
-runner_SOURCES = runner.c SDL_test.c
+runner_SOURCES = runner.c SDL_test.c logger.c xml_logger.c plain_logger.c xml.c
 runner_CLAGS = -W -Wall -Wextra -g `sdl-config --cflags` -DSDL_NO_COMPAT
 runner_LDFLAGS = `sdl-config --libs` 
 
-bin_PROGRAMS = logger
-logger_SOURCES = xml_logger.c xml.c plain_logger.c logger.c
-logger_CLAGS = -W -Wall -Wextra -g `sdl-config --cflags` -DSDL_NO_COMPAT
-logger_LDFLAGS = `sdl-config --libs` 
-
 install: install-tests
 install-tests:
 	-mkdir tests
--- a/test/test-automation/SDL_test.c	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/SDL_test.c	Sun Jun 26 23:04:37 2011 +0300
@@ -24,6 +24,8 @@
 #include <stdio.h> /* printf/fprintf */
 #include <stdarg.h> /* va_list */
 
+#include "logger.h"
+
 #include "SDL_test.h"
 
 /*! \brief return value of test case. Non-zero value means that the test failed */
@@ -36,8 +38,16 @@
 int _testAssertsPassed;
 
 void
-_TestCaseInit()
+_TestCaseInit(const int enable_xml_logging)
 {
+	// setup logging functions
+	// rather afwul way to do it, but function pointers didn't work
+	if(enable_xml_logging) {
+		SetupXMLLogger();
+	} else {
+		SetupPlainLogger();
+	}
+
 	_testReturnValue = 0;
 	_testAssertsFailed = 0;
 	_testAssertsPassed = 0;
@@ -46,8 +56,9 @@
 int
 _TestCaseQuit()
 {
-	//! \todo make the test fail, if it does not contain any asserts
-	printf("Asserts: passed %d, failed %d\n", _testAssertsPassed, _testAssertsFailed);
+	//printf("Asserts: passed %d, failed %d\n", _testAssertsPassed, _testAssertsFailed);
+	AssertSummary(_testAssertsFailed + _testAssertsPassed,
+                  _testAssertsFailed, _testAssertsPassed);
 
 	if(_testAssertsFailed == 0 && _testAssertsPassed == 0) {
 		_testReturnValue = 2;
@@ -66,11 +77,15 @@
       va_start( args, message );
       SDL_vsnprintf( buf, sizeof(buf), message, args );
       va_end( args );
-      printf("AssertEquals failed: expected %d, got %d; %s\n", expected, actual, buf);
+      //printf("AssertEquals failed: expected %d, got %d; %s\n", expected, actual, buf);
+      Assert("AssertEquals", 0, buf, 0);
+
       _testReturnValue = 1;
       _testAssertsFailed++;
    } else {
-      printf("AssertEquals passed\n");
+      //printf("AssertEquals passed\n");
+      Assert("AssertEquals", 1, "AssertEquals passed", 0);
+
       _testAssertsPassed++;
    }
 }
@@ -86,12 +101,15 @@
       SDL_vsnprintf( buf, sizeof(buf), message, args );
       va_end( args );
 
-      printf("AssertTrue failed: %s\n", buf);
+      //printf("AssertTrue failed: %s\n", buf);
+      Assert("AssertTrue", 0, buf, 0);
+
       _testReturnValue = 1;
       _testAssertsFailed++;
    } else {
-     printf("AssertTrue passed\n");
-      _testAssertsPassed++;
+     //printf("AssertTrue passed\n");
+	 Assert("AssertTrue", 1, "AssertTrue passed", 0);
+     _testAssertsPassed++;
    }
 }
 
@@ -105,7 +123,8 @@
    SDL_vsnprintf( buf, sizeof(buf), message, args );
    va_end( args );
 
-   printf("AssertPass: %s\n", buf);
+   //printf("AssertPass: %s\n", buf);
+   Assert("AssertPass", 1, buf, 0);
 
    _testAssertsPassed++;
 }
@@ -120,7 +139,8 @@
    SDL_vsnprintf( buf, sizeof(buf), message, args );
    va_end( args );
 
-   printf("AssertFail: %s\n", buf);
+   //printf("AssertFail: %s\n", buf);
+   Assert("AssertFail", 0, buf, 0);
 
    _testAssertsFailed++;
 }
--- a/test/test-automation/SDL_test.h	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/SDL_test.h	Sun Jun 26 23:04:37 2011 +0300
@@ -23,6 +23,8 @@
 
 #include <SDL/SDL.h>
 
+#include "logger.h"
+
 extern int _testReturnValue;
 extern int _testAssertsFailed;
 extern int _testAssertsPassed;
@@ -52,7 +54,7 @@
  *  the beginning of every test case, before doing
  *  anything else.
  */
-void _TestCaseInit();
+void _TestCaseInit(const int enable_xml_logging);
 
 /*! \fn _TestCaseQuit
  *  Deinitializes and exits the test case
--- a/test/test-automation/logger.c	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/logger.c	Sun Jun 26 23:04:37 2011 +0300
@@ -18,8 +18,45 @@
 TestStartedFp TestStarted = 0;
 TestEndedFp TestEnded = 0;
 AssertFp Assert = 0;
+AssertSummaryFp AssertSummary = 0;
 LogFp Log = 0;
 
+int
+SetupXMLLogger()
+{
+	RunStarted = XMLRunStarted;
+	RunEnded = XMLRunEnded;
+
+	SuiteStarted = XMLSuiteStarted;
+	SuiteEnded = XMLSuiteEnded;
+
+	TestStarted = XMLTestStarted;
+	TestEnded = XMLTestEnded;
+
+	Assert = XMLAssert;
+	AssertSummary = XMLAssertSummary;
+
+	Log = XMLLog;
+}
+
+int
+SetupPlainLogger()
+{
+	RunStarted = PlainRunStarted;
+	RunEnded = PlainRunEnded;
+
+	SuiteStarted = PlainSuiteStarted;
+	SuiteEnded = PlainSuiteEnded;
+
+	TestStarted = PlainTestStarted;
+	TestEnded = PlainTestEnded;
+
+	Assert = PlainAssert;
+	AssertSummary = PlainAssertSummary;
+
+	Log = PlainLog;
+}
+
 /*!
  * Prints the given message to stderr. Function adds nesting
  * to the output.
@@ -39,6 +76,7 @@
 	fflush(stderr);
 }
 
+#if 0
 /*!
  * Test app for logging functionality
  */
@@ -48,29 +86,9 @@
 	int xml_enabled = 1;
 
 	if(xml_enabled) {
-		RunStarted = XMLRunStarted;
-		RunEnded = XMLRunEnded;
-
-		SuiteStarted = XMLSuiteStarted;
-		SuiteEnded = XMLSuiteEnded;
-
-		TestStarted = XMLTestStarted;
-		TestEnded = XMLTestEnded;
-
-		Assert = XMLAssert;
-		Log = XMLLog;
+		SetupXMLLogger();
 	} else {
-		RunStarted = PlainRunStarted;
-		RunEnded = PlainRunEnded;
-
-		SuiteStarted = PlainSuiteStarted;
-		SuiteEnded = PlainSuiteEnded;
-
-		TestStarted = PlainTestStarted;
-		TestEnded = PlainTestEnded;
-
-		Assert = PlainAssert;
-		Log = PlainLog;
+		SetupPlainLogger();
 	}
 
 	RunStarted(LogGenericOutput, "some_<data_>here&here", 0);
@@ -84,3 +102,4 @@
 
 	return 0;
 }
+#endif
--- a/test/test-automation/logger.h	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/logger.h	Sun Jun 26 23:04:37 2011 +0300
@@ -26,7 +26,6 @@
 // Function pointer to function which handles to output
 typedef int (*LogOutputFp)(const char *, ...);
 
-
 /*!
  * Generic logger interface
  *
@@ -42,12 +41,29 @@
 typedef	void (*TestStartedFp)(const char *testName, const char *suiteName,
                               const char *testDescription, time_t startTime);
 typedef	void (*TestEndedFp)(const char *testName, const char *suiteName, int testResult,
-		               int numAsserts, time_t endTime, time_t totalRuntime);
+                            time_t endTime, time_t totalRuntime);
 
+/*!
+ * Note: for assertResult, non-zero == pass, zero == failure
+ *
+ */
 typedef	void (*AssertFp)(const char *assertName, int assertResult, const char *assertMessage,
 		            time_t eventTime);
+typedef	void (*AssertSummaryFp)(int numAsserts, int numAssertsFailed, int numAssertsPass);
+
 
 typedef	void (*LogFp)(const char *logMessage, time_t eventTime);
 
+int LogGenericOutput(const char *message, ...);
+
+extern RunStartedFp RunStarted;
+extern RunEndedFp RunEnded;
+extern SuiteStartedFp SuiteStarted;
+extern SuiteEndedFp SuiteEnded;
+extern TestStartedFp TestStarted;
+extern TestEndedFp TestEnded;
+extern AssertFp Assert;
+extern AssertSummaryFp AssertSummary;
+extern LogFp Log;
 
 #endif
--- a/test/test-automation/plain_logger.c	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/plain_logger.c	Sun Jun 26 23:04:37 2011 +0300
@@ -13,39 +13,44 @@
 PlainRunStarted(LogOutputFp outputFn, const char *runnerParameters, time_t eventTime)
 {
 	logger = outputFn;
+	logger("Test run started");
+	logger("Given command line options: %s", "add options");
 }
 
 void
 PlainRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount,
               time_t endTime, time_t totalRuntime)
 {
-	// \todo add total number of tests, suites, pass/failure test count
+	logger("Ran %d tests in %0.5f seconds.", testCount, totalRuntime);
+
+	logger("%d tests passed", testPassCount);
+	logger("%d tests failed", testFailCount);
 }
 
 void
 PlainSuiteStarted(const char *suiteName, time_t eventTime)
 {
-	logger("Executing tests in %s\n", suiteName);
+	logger("Executing tests in %s", suiteName);
 }
 
 void
 PlainSuiteEnded(int testsPassed, int testsFailed, int testsSkipped,
            double endTime, time_t totalRuntime)
 {
-	logger("Suite executed. %d passed, %d failed and %d skipped\n", testsPassed, testsFailed, testsSkipped);
+	logger("Suite executed. %d passed, %d failed and %d skipped", testsPassed, testsFailed, testsSkipped);
 }
 
 void
 PlainTestStarted(const char *testName, const char *suiteName, const char *testDescription, time_t startTime)
 {
+	logger("test %s (in %s) started", testName, suiteName);
 }
 
 void
 PlainTestEnded(const char *testName, const char *suiteName,
-          int testResult, int numAsserts, time_t endTime, time_t totalRuntime)
+          int testResult, time_t endTime, time_t totalRuntime)
 {
-	logger("Asserts:%d\n", numAsserts);
-	logger("%s: ok\n", testName);
+	logger("%s: ok", testName);
 }
 
 void
@@ -53,12 +58,19 @@
        time_t eventTime)
 {
 	const char *result = (assertResult) ? "passed" : "failed";
-	logger("%s %d: %s\n", assertName, assertResult, assertMessage);
+	logger("%s %d: %s", assertName, assertResult, assertMessage);
+}
+
+void
+PlainAssertSummary(int numAsserts, int numAssertsFailed, int numAssertsPass)
+{
+	logger("Asserts:%d", numAsserts);
 }
 
 void
 PlainLog(const char *logMessage, time_t eventTime)
 {
+	logger("%s %d", logMessage, eventTime);
 }
 
 #endif
--- a/test/test-automation/plain_logger.h	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/plain_logger.h	Sun Jun 26 23:04:37 2011 +0300
@@ -17,11 +17,15 @@
                       const char *testDescription, time_t startTime);
 
 void PlainTestEnded(const char *testName, const char *suiteName,
-          int testResult, int numAsserts, time_t endTime, time_t totalRuntime);
+          int testResult, time_t endTime, time_t totalRuntime);
+
 
 void PlainAssert(const char *assertName, int assertResult, const char *assertMessage,
        time_t eventTime);
 
+void PlainAssertSummary(int numAsserts, int numAssertsFailed, int numAssertsPass);
+
+
 void PlainLog(const char *logMessage, time_t eventTime);
 
 #endif
--- a/test/test-automation/runner.c	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/runner.c	Sun Jun 26 23:04:37 2011 +0300
@@ -29,12 +29,12 @@
 #include <sys/types.h>
 
 #include "SDL_test.h"
-
+#include "logger.h"
 
 //!< Function pointer to a test case function
 typedef void (*TestCaseFp)(void *arg);
 //!< Function pointer to a test case init function
-typedef void (*TestCaseInitFp)(void);
+typedef void (*TestCaseInitFp)(const int);
 //!< Function pointer to a test case quit function
 typedef int  (*TestCaseQuitFp)(void);
 
@@ -49,6 +49,8 @@
 static int only_selected_suite = 0;
 //!< Flag for executing only tests that contain certain string in their name
 static int only_tests_with_string = 0;
+//!< Flag for enabling XML logging
+static int xml_enabled = 0;
 
 
 //!< Size of the test and suite name buffers
@@ -86,6 +88,10 @@
 	char *testName;
 	char *suiteName;
 
+	char *description;
+	long requirements;
+	long timeout;
+
 	TestCaseInitFp testCaseInit;
 	TestCaseFp testCase;
 	TestCaseQuitFp testCaseQuit;
@@ -213,14 +219,24 @@
 				item->testCase = testCase;
 				item->testCaseQuit = testCaseQuit;
 
+				// copy suite name
 				int length = strlen(suiteReference->name) + 1;
 				item->suiteName = SDL_malloc(length);
 				strcpy(item->suiteName, suiteReference->name);
 
+				// copy test name
 				length = strlen(testReference->name) + 1;
 				item->testName = SDL_malloc(length);
 				strcpy(item->testName, testReference->name);
 
+				// copy test description
+				length = strlen(testReference->description) + 1;
+				item->description = SDL_malloc(length);
+				strcpy(item->testName, testReference->name);
+
+				item->requirements = testReference->requirements;
+				item->timeout = testReference->timeout;
+
 				// prepend the list
 				item->next = testCases;
 				testCases = item;
@@ -247,6 +263,7 @@
 	while(ref) {
 		SDL_free(ref->testName);
 		SDL_free(ref->suiteName);
+		SDL_free(ref->description);
 
 		TestCase *temp = ref->next;
 		SDL_free(ref);
@@ -482,7 +499,7 @@
 ExecuteTest(TestCase *testItem) {
 	int retVal = 1;
 	if(execute_inproc) {
-		testItem->testCaseInit();
+		testItem->testCaseInit(xml_enabled);
 
 		testItem->testCase(0x0);
 
@@ -490,7 +507,7 @@
 	} else {
 		int childpid = fork();
 		if(childpid == 0) {
-			testItem->testCaseInit();
+			testItem->testCaseInit(xml_enabled);
 
 			testItem->testCase(0x0);
 
@@ -517,6 +534,7 @@
 	  printf("Options:\n");
 	  printf("     --in-proc                Executes tests in-process\n");
 	  printf("     --show-tests             Prints out all the executable tests\n");
+	  printf("     --xml             		Enables XML logger\n");
 	  printf(" -t  --test TEST              Executes only tests with given name\n");
 	  printf(" -ts --name-contains SUBSTR   Executes only tests that have given\n");
 	  printf("                              substring in test name\n");
@@ -545,6 +563,9 @@
       else if(SDL_strcmp(arg, "--show-tests") == 0) {
     	  only_print_tests = 1;
       }
+      else if(SDL_strcmp(arg, "--xml") == 0) {
+    	  xml_enabled = 1;
+      }
       else if(SDL_strcmp(arg, "--test") == 0 || SDL_strcmp(arg, "-t") == 0) {
     	  only_selected_test = 1;
     	  char *testName = NULL;
@@ -625,6 +646,11 @@
 #else
 	char *extension = "dylib";
 #endif
+	if(xml_enabled) {
+		SetupXMLLogger();
+	} else {
+		SetupPlainLogger();
+	}
 
 	const Uint32 startTicks = SDL_GetTicks();
 
@@ -637,29 +663,49 @@
 	if(only_print_tests) {
 		TestCase *testItem = NULL;
 		for(testItem = testCases; testItem; testItem = testItem->next) {
+			//! \todo This should be handled by the logging system?
 			printf("%s (in %s)\n", testItem->testName, testItem->suiteName);
 		}
 
 		return 0;
 	}
 
+	RunStarted(LogGenericOutput, NULL, 0);
+
+	char *currentSuiteName = NULL;
+
 	TestCase *testItem = NULL;
 	for(testItem = testCases; testItem; testItem = testItem->next) {
+		if(currentSuiteName == NULL) {
+			currentSuiteName = testItem->suiteName;
+			SuiteStarted(currentSuiteName, 0);
+		}
+
+		TestStarted(testItem->testName, testItem->suiteName,
+                    testItem->description, 0);
+
 		int retVal = ExecuteTest(testItem);
 
 		if(retVal) {
 			failureCount++;
 			if(retVal == 2) {
-				printf("%s (in %s): FAILED -> No asserts\n", testItem->testName, testItem->suiteName);
+				//printf("%s (in %s): FAILED -> No asserts\n", testItem->testName, testItem->suiteName);
 			} else {
-				printf("%s (in %s): FAILED\n", testItem->testName, testItem->suiteName);
+				//printf("%s (in %s): FAILED\n", testItem->testName, testItem->suiteName);
 			}
 		} else {
 			passCount++;
-			printf("%s (in %s): ok\n", testItem->testName, testItem->suiteName);
+			//printf("%s (in %s): ok\n", testItem->testName, testItem->suiteName);
 		}
 
-		printf("\n");
+		TestEnded(testItem->testName, testItem->suiteName, retVal, 0, 0);
+
+		if(strncmp(currentSuiteName, testItem->suiteName, 100) != 0) {
+			SuiteEnded(0, 0, 0, 0.0f, 0);
+
+			currentSuiteName = testItem->suiteName;
+			SuiteStarted(currentSuiteName, 0);
+		}
 	}
 
 	UnloadTestCases(testCases);
@@ -667,10 +713,14 @@
 
 	const Uint32 endTicks = SDL_GetTicks();
 
+	RunEnded(passCount + failureCount, 1 /*add suiteCount */,
+			 passCount, failureCount, 0, 0);
+	/*
 	printf("Ran %d tests in %0.5f seconds.\n", (passCount + failureCount), (endTicks-startTicks)/1000.0f);
 
 	printf("%d tests passed\n", passCount);
 	printf("%d tests failed\n", failureCount);
+	*/
 
 	return 0;
 }
--- a/test/test-automation/xml.c	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/xml.c	Sun Jun 26 23:04:37 2011 +0300
@@ -55,7 +55,7 @@
 
 	const int tagSize = SDL_strlen(tag) + 1;
 	openTag->tag = SDL_malloc(tagSize);
-	strncpy(openTag->tag, tag, tagSize);
+	strncpy((char *)openTag->tag, (char *)tag, tagSize);
 
 	openTag->next = openTags;
 
@@ -86,7 +86,7 @@
 	// It prevents opening and ending tag mismatch
 	if(SDL_strcmp(tempTag, tag) == 0) {
 		TagList *openTag = openTags;
-		SDL_free(openTag->tag);
+		SDL_free((char *)openTag->tag);
 
 		/*
 		int counter = 0;
@@ -175,7 +175,7 @@
  * \return Lower-case version of the given string
  */
 char *
-ToLowerCase(char *string)
+ToLowerCase(const char *string)
 {
 	const int size = SDL_strlen(string);
 	char *ret = SDL_malloc(size + 1);
--- a/test/test-automation/xml_logger.c	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/xml_logger.c	Sun Jun 26 23:04:37 2011 +0300
@@ -18,6 +18,9 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 
+#include <stdio.h>
+#include <stdlib.h>
+
 #include <SDL/SDL.h>
 
 #include "xml.h"
@@ -32,19 +35,19 @@
 {
 	logger = outputFn;
 
-	char *output = XMLOpenDocument("teSTtlog");
+	char *output = XMLOpenDocument("testlog");
 	logger(output);
 	SDL_free(output);
 
-	output = XMLOpenElement("paRameters");
+	output = XMLOpenElement("parameters");
 	logger(output);
 	SDL_free(output);
 
-	output = XMLAddContent(runnerParameters);
+	output = XMLAddContent("Add: runner parameter");
 	logger(output);
 	SDL_free(output);
 
-	output = XMLCloseElement("Parameters");
+	output = XMLCloseElement("parameters");
 	logger(output);
 	SDL_free(output);
 }
@@ -53,7 +56,7 @@
 XMLRunEnded(int testCount, int suiteCount, int testPassCount, int testFailCount,
             time_t endTime, time_t totalRuntime)
 {
-	char *output = XMLCloseDocument("testlOg");
+	char *output = XMLCloseDocument("testlog");
 	logger(output);
 	SDL_free(output);
 }
@@ -65,12 +68,12 @@
 	logger(output);
 	SDL_free(output);
 
-	output = XMLOpenElement("EVENTTime");
+	output = XMLOpenElement("eventtime");
 	logger(output);
 	SDL_free(output);
 
 	//XMLAddContent(evenTime);
-	output = XMLCloseElement("eventTIME");
+	output = XMLCloseElement("eventtime");
 	logger(output);
 	SDL_free(output);
 }
@@ -130,9 +133,31 @@
 
 void
 XMLTestEnded(const char *testName, const char *suiteName,
-          int testResult, int numAsserts, time_t endTime, time_t totalRuntime)
+          int testResult, time_t endTime, time_t totalRuntime)
 {
-	char *output = XMLCloseElement("test");
+	char *output = XMLOpenElement("result");
+	logger(output);
+	SDL_free(output);
+
+	if(testResult) {
+		if(testResult == 2) {
+			output = XMLAddContent("failed -> no assert");
+		} else {
+			output = XMLAddContent("failed");
+		}
+		logger(output);
+		SDL_free(output);
+	} else {
+		output = XMLAddContent("passed");
+		logger(output);
+		SDL_free(output);
+
+	}
+	output = XMLCloseElement("result");
+	logger(output);
+	SDL_free(output);
+
+	output = XMLCloseElement("test");
 	logger(output);
 	SDL_free(output);
 }
@@ -153,7 +178,7 @@
 	logger(output);
 	SDL_free(output);
 
-	output = XMLOpenElement("result");
+	output = XMLCloseElement("result");
 	logger(output);
 	SDL_free(output);
 
@@ -163,6 +188,57 @@
 }
 
 void
+XMLAssertSummary(int numAsserts, int numAssertsFailed, int numAssertsPass)
+{
+	char *output = XMLOpenElement("assertSummary");
+	logger(output);
+	SDL_free(output);
+
+	output = XMLOpenElement("assertCount");
+	logger(output);
+	SDL_free(output);
+
+	//XMLAddContent() \todo add string conversion
+
+	output = XMLCloseElement("assertCount");
+	logger(output);
+	SDL_free(output);
+
+	output = XMLOpenElement("assertsPassed");
+	logger(output);
+	SDL_free(output);
+
+	const int bufferSize = sizeof(int) * 8 + 1;
+	//char buffer[bufferSize];
+	char *buffer = SDL_malloc(bufferSize);
+	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");
+	logger(output);
+	SDL_free(output);
+
+	output = XMLOpenElement("assertsFailed");
+	logger(output);
+	SDL_free(output);
+
+	//XMLAddContent() \todo add string conversion
+
+	output = XMLCloseElement("assertsFailed");
+	logger(output);
+	SDL_free(output);
+
+	output = XMLCloseElement("assertSummary");
+	logger(output);
+	SDL_free(output);
+}
+
+void
 XMLLog(const char *logMessage, time_t eventTime)
 {
 	char *output = XMLOpenElement("log");
--- a/test/test-automation/xml_logger.h	Fri Jun 24 14:35:14 2011 +0300
+++ b/test/test-automation/xml_logger.h	Sun Jun 26 23:04:37 2011 +0300
@@ -16,11 +16,14 @@
 void XMLTestStarted(const char *testName, const char *suiteName, const char *testDescription, time_t startTime);
 
 void XMLTestEnded(const char *testName, const char *suiteName,
-          int testResult, int numAsserts, time_t endTime, time_t totalRuntime);
+          int testResult, time_t endTime, time_t totalRuntime);
 
 void XMLAssert(const char *assertName, int assertResult, const char *assertMessage,
        time_t eventTime);
 
+void XMLAssertSummary(int numAsserts, int numAssertsFailed, int numAssertsPass);
+
+
 void XMLLog(const char *logMessage, time_t eventTime);
 
 #endif