Author: pekka.klarck
Date: Thu Mar 26 14:51:56 2009
New Revision: 1553
Modified:
trunk/src/robot/output/output.py
trunk/src/robot/output/xmllogger.py
trunk/src/robot/utils/jyxmlwriter.py
trunk/src/robot/utils/pyxmlwriter.py
Log:
now also xmllogger called (mainly) through SYSLOG (which really needs to be
renamed to LOGGER after all these refactorings)
Modified: trunk/src/robot/output/output.py
==============================================================================
--- trunk/src/robot/output/output.py (original)
+++ trunk/src/robot/output/output.py Thu Mar 26 14:51:56 2009
@@ -31,10 +31,9 @@
def __init__(self, settings):
AbstractLogger.__init__(self, settings['LogLevel'])
- self.logger = None
+ self.xmllogger = XmlLogger(settings['Output'],
settings['SplitOutputs'])
listeners = Listeners(settings['Listeners'])
- self._execution_errors = _ExecutionErrorLogger()
- SYSLOG.register_logger(listeners, self._execution_errors)
+ SYSLOG.register_logger(self.xmllogger, listeners)
SYSLOG.disable_message_cache()
self._debugfile = DebugFile(settings['DebugFile'])
self._namegen = self._get_log_name_generator(settings['Log'])
@@ -51,40 +50,35 @@
self._settings['TagStatCombine'],
self._settings['TagDoc'],
self._settings['TagStatLink'])
- stats.serialize(self.logger)
- self._execution_errors.serialize(self.logger)
- self.logger.close()
+ stats.serialize(self.xmllogger)
+ self.xmllogger.close(serialize_errors=True)
SYSLOG.output_file('Output', self._settings['Output'])
if self._debugfile is not None:
SYSLOG.output_file('Debug', self._debugfile.path)
self._debugfile.close()
def close2(self):
- SYSLOG.close()
+ SYSLOG.close() # TODO: move!
def start_suite(self, suite):
- SYSLOG.info("Running test suite '%s'" % suite.longname)
- if self.logger is None:
- self.logger = XmlLogger(self._settings['Output'],
- self._settings['SplitOutputs'])
- outpath = self.logger.start_suite(suite)
- if outpath is not None:
- suite.namespace.variables.set_global('${OUTPUT_FILE}', outpath)
- if self._namegen is not None:
+ SYSLOG.info("Running test suite '%s'" % suite.longname) # TODO:
move!
+ SYSLOG.start_suite(suite)
+ if self.xmllogger.started_output:
+ suite.namespace.variables.set_global('${OUTPUT_FILE}',
+
self.xmllogger.started_output)
+ if self._namegen:
suite.namespace.variables.set_global('${LOG_FILE}',
self._namegen.get_name())
- SYSLOG.start_suite(suite)
if self._debugfile is not None:
self._debugfile.start_suite(suite)
def end_suite(self, suite):
- outpath = self.logger.end_suite(suite)
- if outpath is not None:
- SYSLOG.output_file('Output', outpath)
+ SYSLOG.end_suite(suite)
+ if self.xmllogger.ended_output:
+ SYSLOG.output_file('Output', self.xmllogger.ended_output)
orig_outpath = self._settings['Output']
suite.namespace.variables.set_global('${OUTPUT_FILE}',
orig_outpath)
- self._create_split_log(outpath, suite)
- SYSLOG.end_suite(suite)
+ self._create_split_log(self.xmllogger.ended_output, suite)
if self._debugfile is not None:
self._debugfile.end_suite(suite)
@@ -98,30 +92,27 @@
def start_test(self, test):
SYSLOG.info("Running test case '%s'" % test.name)
- self.logger.start_test(test)
SYSLOG.start_test(test)
if self._debugfile is not None:
self._debugfile.start_test(test)
def end_test(self, test):
- self.logger.end_test(test)
SYSLOG.end_test(test)
if self._debugfile is not None:
self._debugfile.end_test(test)
def start_keyword(self, kw):
- self.logger.start_keyword(kw)
SYSLOG.start_keyword(kw)
if self._debugfile is not None:
self._debugfile.start_keyword(kw)
def end_keyword(self, kw):
- self.logger.end_keyword(kw)
SYSLOG.end_keyword(kw)
if self._debugfile is not None:
self._debugfile.end_keyword(kw)
def write(self, msg='', level='INFO', html=False):
+ # TODO: remove
if self._debugfile is not None and self._is_logged(level, 'DEBUG'):
self._debugfile.message(msg)
if level.upper() == 'WARN':
@@ -129,7 +120,7 @@
AbstractLogger.write(self, msg, level, html)
def _write(self, msg):
- self.logger.message(msg)
+ self.xmllogger.message(msg)
def log_output(self, output):
"""Splits given output to levels and messages and logs them"""
@@ -171,20 +162,3 @@
if token == 'HTML':
return 'INFO', True
return token, False
-
-
-class _ExecutionErrorLogger:
-
- def __init__(self):
- self._messages = []
-
- def write(self, msg, level):
- if level in ['WARN', 'ERROR']:
- self._messages.append(msg)
-
- def serialize(self, serializer):
- serializer.start_syslog(self)
- for msg in self._messages:
- serializer.message(msg)
- serializer.end_syslog(self)
-
Modified: trunk/src/robot/output/xmllogger.py
==============================================================================
--- trunk/src/robot/output/xmllogger.py (original)
+++ trunk/src/robot/output/xmllogger.py Thu Mar 26 14:51:56 2009
@@ -29,6 +29,7 @@
self._index_writer = None
self._split_level = split_level
self._suite_level = 0
+ self._errors = []
def _get_writer(self, path, attrs={}):
try:
@@ -40,11 +41,21 @@
return writer
def _close_writer(self, writer):
- writer.end_element('robot')
- writer.close()
-
- def close(self):
+ if not writer.closed:
+ writer.end_element('robot')
+ writer.close()
+
+ def close(self, serialize_errors=False):
+ if serialize_errors:
+ self.start_syslog()
+ for msg in self._errors:
+ self.message(msg)
+ self.end_syslog()
self._close_writer(self._writer)
+
+ def write(self, msg, level):
+ if level in ['WARN', 'ERROR']:
+ self._errors.append(msg)
def message(self, msg):
html = msg.html and 'yes' or 'no'
@@ -73,13 +84,13 @@
self._writer.end_element('test')
def start_suite(self, suite):
- outpath = None
if self._suite_level == self._split_level:
self._start_split_output(suite)
- outpath = self._writer.path
+ self.started_output = self._writer.path
+ else:
+ self.started_output = None
self._start_suite(suite)
self._suite_level += 1
- return outpath
def _start_split_output(self, suite):
path = self._namegen.get_name()
@@ -103,7 +114,9 @@
self._suite_level -= 1
self._end_suite(suite)
if self._suite_level == self._split_level:
- return self._end_split_output(suite)
+ self.ended_output = self._end_split_output(suite)
+ else:
+ self.ended_output = None
def _end_split_output(self, suite):
outpath = self._writer.path
@@ -157,11 +170,12 @@
if stat.combined is True:
return 'combined'
return ''
-
- def start_syslog(self, syslog):
+
+ # TODO: Remove 1) syslog -> errors 2) why arg to this method?
+ def start_syslog(self, syslog=None):
self._writer.start_element('syslog')
- def end_syslog(self, syslog):
+ def end_syslog(self, syslog=None):
self._writer.end_element('syslog')
def _write_list(self, tag, items, container=None):
Modified: trunk/src/robot/utils/jyxmlwriter.py
==============================================================================
--- trunk/src/robot/utils/jyxmlwriter.py (original)
+++ trunk/src/robot/utils/jyxmlwriter.py Thu Mar 26 14:51:56 2009
@@ -30,6 +30,7 @@
self._writer.setResult(StreamResult(self._output))
self._writer.startDocument()
self.content('\n')
+ self.closed = False
def start_element(self, name, attributes={}, newline=True):
attrs = AttributesImpl()
@@ -52,3 +53,4 @@
def close(self):
self._writer.endDocument()
self._output.close()
+ self.closed = True
Modified: trunk/src/robot/utils/pyxmlwriter.py
==============================================================================
--- trunk/src/robot/utils/pyxmlwriter.py (original)
+++ trunk/src/robot/utils/pyxmlwriter.py Thu Mar 26 14:51:56 2009
@@ -26,6 +26,7 @@
self._output = open(path, 'wb')
self._writer = XMLGenerator(self._output, 'UTF-8')
self._writer.startDocument()
+ self.closed = False
def start_element(self, name, attributes={}, newline=True):
attrs = AttributesImpl(attributes)
@@ -45,3 +46,4 @@
def close(self):
self._writer.endDocument()
self._output.close()
+ self.closed = True