Refining XML-output module
authorMarkus Kauppila <markus.kauppila@gmail.com>
Sun, 19 Jun 2011 19:52:35 +0300
changeset 5704 fc4aa27fe7dc
parent 5703 1ff0072c6e36
child 5705 b320f7a66ac4
Refining XML-output module
test/test-automation/logger.h
test/test-automation/xml_logger.c
--- a/test/test-automation/logger.h	Sun Jun 19 18:07:37 2011 +0300
+++ b/test/test-automation/logger.h	Sun Jun 19 19:52:35 2011 +0300
@@ -21,23 +21,6 @@
 #ifndef _LOGGER_H
 #define _LOGGER_H
 
-/*!
- * Init the logger.
- */
-//int LogInit();
-
-/*!
- * Quit the logger.
- */
-//int LogQuit();
-
-/*!
- * Generic ouput function for the logger. Prints the
- * message to stderr.
- *
- * \param scope Source of message (eg. suite, test, harness)
- * \return non-zero if logging fails, zero on success
- */
-//int LogGenericOutput(int scope, const char *message, ...);
+// Put function pointers here
 
 #endif
--- a/test/test-automation/xml_logger.c	Sun Jun 19 18:07:37 2011 +0300
+++ b/test/test-automation/xml_logger.c	Sun Jun 19 19:52:35 2011 +0300
@@ -23,45 +23,55 @@
 
 #include "logger.h"
 
+#include <SDL/SDL.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
 
 /* \todo
- * - Fp to LogGenericOutput
- * - print <?xml version="1.0" encoding="utf-8" ?> as header
- * - use SDL_malloc etc...
- * - nest output /OK
- * - dummy functions for no-xml execution
- * - Make XML (and relevant comparisions) case-insensitive
+ * - Make XML (and relevant comparisons) case-insensitive
  */
 
-
-/*! Function pointer definitions. \todo Move to logger.h */
-typedef int (*LogInitFp)(void);
-typedef int (*LogCleanUptFp)(void);
-
-/*! Function prototypes */
-int LogGenericOutput(char *message);
-int XMLLogOutput(const char *tag, const char *fmt, va_list list);
-
 static int xml_enabled = 1;
 
 static int loggingPriority = 0;
 static int nestingDepth = 0;
 
-enum Priority {
+/*! Definitions of log priorities */
+typedef enum Priority {
 	VERBOSE,
 	DEFAULT,
-	SILENT
-};
+} Priority;
+
+/*! Function pointer definitions. \todo Move to logger.h */
+typedef int (*LogOutputFp)(char *);
+
+typedef int (*LogInitFp)(LogOutputFp, Priority);
+typedef int (*LogCleanUptFp)(void);
+
+typedef int (*StartTagFp)(Priority, const char *);
+typedef int (*EndTagFp)(Priority, const char *);
+typedef int (*TagFp)(Priority, const char *, const char *, ...);
 
 
+/*! Function pointer to output function */
+static LogOutputFp OutputFp = NULL;
+
+
+/*! Definitions for tag styles used in Tagify() */
 #define TAG_START 0x00000001
 #define TAG_END   0x00000002
 #define TAG_BOTH  (TAG_START & TAG_END)
 
+/*! Function prototypes \todo move to xml_logger.h */
+int XMLStartTag(Priority priority, const char *tag);
+int XMLEndTag(Priority priority, const char *tag);
+
+int LogGenericOutput(char *message);
+
+
 /*!
  * Defines structure used for "counting" open XML-tags
  */
@@ -74,11 +84,13 @@
 
 /*!
  * Prepend the open tags list
+ *
+ * \return On error returns non-zero value, otherwise zero will returned
  */
 static int
 AddOpenTag(const char *tag)
 {
-	TagList *openTag = malloc(sizeof(TagList));
+	TagList *openTag = SDL_malloc(sizeof(TagList));
 	if(openTag == NULL) {
 		return 1;
 	}
@@ -94,6 +106,8 @@
 
 /*!
  * Removes the first tag from the open tag list
+ *
+ * \return On error returns non-zero value, otherwise zero will returned
  */
 static int
 RemoveOpenTag(const char *tag)
@@ -105,14 +119,14 @@
 	int retVal = 0;
 
 	// Tag should always be the same as previously opened tag
-	// to prevent opening and ending tag mismatch
-	if(strcmp(openTags->tag, tag) == 0) {
+	// It prevents opening and ending tag mismatch
+	if(SDL_strcmp(openTags->tag, tag) == 0) {
 		TagList *openTag = openTags;
 		openTags  = openTags->next;
 
 		free(openTag);
 	} else {
-		printf("Else activated!");
+		printf("Debug | RemoveOpenTag(): open/end tag mismatch");
 		retVal = 1;
 	}
 
@@ -120,31 +134,9 @@
 }
 
 /*!
- * Goes through the open tag list and checks if
- * given tag is already opened
- *
- * \return 1 is tag is open, 0 if not
- */
-static int
-IsTagOpen(const char *tag)
-{
-	int retVal = 0;
-
-	TagList *openTag = NULL;
-	for(openTag = openTags; openTag; openTag = openTag->next) {
-		if(strcmp(openTag->tag, tag) == 0) {
-			retVal = 1;
-			break;
-		}
-	}
-
-	return retVal;
-}
-
-/*!
  * Debug function. Prints the contents of the open tags list.
  */
-static int
+static void
 PrintOpenTags()
 {
 	printf("\nOpen tags:\n");
@@ -155,24 +147,37 @@
 	}
 }
 
-//! \TODO move these to upwards!!
-int XMLStartTag(int priority, const char *tag);
-int XMLEndTag(int priority, const char *tag);
-
+/*!
+ * Initializes the XML-logger for creating test reports in XML.
+ *
+ * \return Error code. \todo
+ */
 int
-XMLLogInit()
+XMLInit(LogOutputFp logOutputFp, Priority priority)
 {
+	OutputFp = logOutputFp;
+	loggingPriority = priority;
 
-	LogGenericOutput("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
-
-	XMLStartTag(0, "testlog");
+	//! make "doctype" work with priority level?
+	OutputFp("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
+	XMLStartTag(DEFAULT, "testlog");
 }
 
+/*!
+ * Cleans up the logger and closes all open XML-tags
+ *
+ * \return Error code. \todo
+ */
 int
-XMLLogCleanUp()
+XMLCleanUp()
 {
-	//! \todo do CloseOpenTags() instead
-	XMLEndTag(0, "testlog");
+	// Close the open tags
+	TagList *openTag = openTags;
+	while(openTag) {
+		TagList *temp = openTag->next;
+		XMLEndTag(DEFAULT, openTag->tag);
+		openTag = temp;
+	}
 }
 
 /*!
@@ -181,6 +186,8 @@
  * \param tag XML-tag to create
  * \param tagStyle Do start or end tag, or both.
  * \param message text content of the tags
+ *
+ * \return Well-formed XML tag
  */
 static char *
 Tagify(const char *tag, const int tagStyle, const char *message)
@@ -207,17 +214,24 @@
 	}
 
 
-	const int size = strlen(buffer) + 1;
-	char *newTag = malloc(size * sizeof(char));
+	const int size = SDL_strlen(buffer) + 1;
+	char *newTag = SDL_malloc(size * sizeof(char));
 	memset(newTag, 0, size * sizeof(char));
 	memcpy(newTag, buffer, size);
 
 	return newTag;
 }
 
-
+/*!
+ * Creates and outputs an start tag
+ *
+ * \param priority Priority of the tag
+ * \param tag Tag for outputting
+ *
+ * \return Error code. Non-zero on failure. Zero on success
+ */
 int
-XMLStartTag(int priority, const char *tag)
+XMLStartTag(Priority priority, const char *tag)
 {
 	if(priority < loggingPriority) {
 		return 1;
@@ -225,18 +239,26 @@
 
 	AddOpenTag(tag);
 	char *newTag = Tagify(tag, TAG_START, NULL);
-	LogGenericOutput(newTag);
-	free(newTag);
+	OutputFp(newTag);
+	SDL_free(newTag);
 
 	nestingDepth++;
 }
 
+/*!
+ * Creates and outputs an end tag
+ *
+ * \param priority Priority of the tag
+ * \param tag Tag for outputting
+ *
+ *  \return Error code. Non-zero on failure. Zero on success
+ */
 int
-XMLEndTag(int priority, const char *tag)
+XMLEndTag(Priority priority, const char *tag)
 {
 	/*
 	Do it before priority check, so incorrect usage of
-	priorities won't mess it up
+	priorities won't mess it up (?)
 	*/
 	nestingDepth--;
 
@@ -247,12 +269,22 @@
 	RemoveOpenTag(tag);
 
 	char *newTag = Tagify(tag, TAG_END, NULL);
-	LogGenericOutput(newTag);
-	free(newTag);
+	OutputFp(newTag);
+	SDL_free(newTag);
 }
 
+/*!
+ * Creates an XML-tag including start and end tags and text content
+ * between them.
+ *
+ * \param priority Priority of the tag
+ * \param tag Tag for outputting
+ * \param fmt Text content of tag as variadic parameter list
+ *
+ *  \return Error code. Non-zero on failure. Zero on success
+ */
 int
-XMLTag(int priority, const char *tag, const char *fmt, ...)
+XMLTag(Priority priority, const char *tag, const char *fmt, ...)
 {
 	if(priority < loggingPriority) {
 		return 1;
@@ -268,14 +300,16 @@
 	va_end(list);
 
 	char *newTag = Tagify(tag, TAG_BOTH, buffer);
-	LogGenericOutput(newTag);
-	free(newTag);
+	//LogGenericOutput(newTag);
+	OutputFp(newTag);
+	SDL_free(newTag);
 }
 
-//! \TODO Make it changeable by using a function pointer
 /*!
  * Prints the given message to stderr. Function adds nesting
  * to the output.
+ *
+ * \return Possible error value (\todo)
  */
 int
 LogGenericOutput(char *message)
@@ -289,33 +323,64 @@
 }
 
 
+
+/*! Quick Dummy functions for testing non-xml output. \todo put to proper place*/
+int DummyInit(LogOutputFp output, Priority priority) {
+	return 0;
+}
+int DummyCleanUp() {
+	return 0;
+}
+int DummyStartTag(Priority priority, const char *tag) {
+	return 0;
+}
+int DummyEndTag(Priority priority, const char *tag) {
+	return 0;
+}
+int DummyTag(Priority priority, const char *tag, const char *fmt, ...) {
+	return 0;
+}
+
+
 /*!
  * Main for testing the logger
  */
 int
-main()
+main(int argc, char *argv[])
 {
 	LogInitFp LogInit = NULL;
 	LogCleanUptFp LogCleanUp = NULL;
+	StartTagFp StartTag = NULL;
+	EndTagFp EndTag = NULL;
+	TagFp Tag = NULL;
 
 	if(xml_enabled) {
 		// set logger functions to XML
-		LogInit = XMLLogInit;
-		LogCleanUp = XMLLogCleanUp;
+		LogInit = XMLInit;
+		LogCleanUp = XMLCleanUp;
+
+		StartTag = XMLStartTag;
+		EndTag = XMLEndTag;
+		Tag = XMLTag;
 	} else {
-		// set up dummy functions
+		// When no XML-output is desired, dummy functions are used
+		LogInit = DummyInit;
+		LogCleanUp = DummyCleanUp;
+
+		StartTag = DummyStartTag;
+		EndTag = DummyEndTag;
+		Tag = DummyTag;
 	}
 
-	LogInit();
-	XMLStartTag(0, "hello");
-	XMLStartTag(0, "world!");
-	XMLEndTag(0, "world!");
-	XMLEndTag(0, "hello");
+	LogInit(LogGenericOutput, VERBOSE);
+
+	StartTag(DEFAULT, "hello");
+	StartTag(DEFAULT, "world");
+	EndTag(DEFAULT, "world");
+	//EndTag(DEFAULT, "hello");
 
 	LogCleanUp();
 
-
-
 #if 0
 	XMLStartTag("log");
 	XMLStartTag("suite");