Author: pekka.klarck
Date: Thu Mar 26 13:50:59 2009
New Revision: 1551
Modified:
trunk/src/robot/__init__.py
trunk/src/robot/output/systemlogger.py
trunk/utest/output/test_systemlogger.py
Log:
Added start/end_suite/test/kw methods to SYSLOG -- first step to make
SYSLOG the one-and-only logger. This new functionality is not in use yet
but I want to submit this as a separate commit since it also takes into use
new way to register loggers. Commit also includes adding more doc to
SystemLogger and renaming register_command_line_monitor to
register_console_logger (which should've been submitted separately).
Modified: trunk/src/robot/__init__.py
==============================================================================
--- trunk/src/robot/__init__.py (original)
+++ trunk/src/robot/__init__.py Thu Mar 26 13:50:59 2009
@@ -50,7 +50,7 @@
except Information, msg:
_exit(INFO_PRINTED, str(msg))
except DataError, err:
- SYSLOG.register_command_line_monitor()
+ SYSLOG.register_console_logger()
_exit(DATA_ERROR, str(err))
try:
@@ -82,8 +82,8 @@
pybot --log mylog.html /path/to/tests.html /path/to/tests2.html
"""
settings = RobotSettings(options)
- SYSLOG.register_command_line_monitor(settings['MonitorWidth'],
- settings['MonitorColors'])
+ SYSLOG.register_console_logger(settings['MonitorWidth'],
+ settings['MonitorColors'])
output = Output(settings)
init_global_variables(settings)
_syslog_start_info('Robot', datasources, settings)
@@ -120,7 +120,7 @@
rebot --report myrep.html --log NONE /path/out1.xml /path/out2.xml
"""
settings = RebotSettings(options)
- SYSLOG.register_command_line_monitor(colors=settings['MonitorColors'])
+ SYSLOG.register_console_logger(colors=settings['MonitorColors'])
SYSLOG.disable_message_cache()
_syslog_start_info('Rebot', datasources, settings)
testoutput = RebotTestOutput(datasources, settings)
Modified: trunk/src/robot/output/systemlogger.py
==============================================================================
--- trunk/src/robot/output/systemlogger.py (original)
+++ trunk/src/robot/output/systemlogger.py Thu Mar 26 13:50:59 2009
@@ -27,12 +27,14 @@
Whenever something is written to SYSLOG in code, all registered
loggers are
notified. Messages are also cached and cached messasges written to new
loggers when they are registered.
+
+ Tools using Robot Framework's internal modules should register their
own
+ loggers at least to get notifications about errors and warnings. A
shortcut
+ to get errors/warnings into console is using 'register_console_logger'.
"""
def __init__(self):
- self._writers = []
- self._output_filers = []
- self._closers = []
+ self._loggers = []
self._message_cache = []
self.monitor = None
@@ -40,18 +42,14 @@
self._message_cache = None
def register_logger(self, *loggers):
- for logger in loggers:
- if hasattr(logger, 'write'):
- self._writers.append(logger.write)
- if self._message_cache:
- for msg in self._message_cache:
- logger.write(msg, msg.level)
- if hasattr(logger, 'output_file'):
- self._output_filers.append(logger.output_file)
- if hasattr(logger, 'close'):
- self._closers.append(logger.close)
+ for log in loggers:
+ logger = _Logger(log)
+ self._loggers.append(logger)
+ if self._message_cache:
+ for msg in self._message_cache:
+ logger.write(msg, msg.level)
- def register_command_line_monitor(self, width=78, colors=True):
+ def register_console_logger(self, width=78, colors=True):
self.monitor = CommandLineMonitor(width, colors)
self.register_logger(self.monitor)
@@ -71,19 +69,53 @@
def write(self, message, level='INFO'):
msg = Message(message, level)
- for write in self._writers:
- write(msg, level)
+ for logger in self._loggers:
+ logger.write(msg, level)
if self._message_cache is not None:
self._message_cache.append(msg)
+ def start_suite(self, suite):
+ for logger in self._loggers:
+ logger.start_suite(suite)
+
+ def end_suite(self, suite):
+ for logger in self._loggers:
+ logger.end_suite(suite)
+
+ def start_test(self, test):
+ for logger in self._loggers:
+ logger.start_test(test)
+
+ def end_test(self, test):
+ for logger in self._loggers:
+ logger.end_test(test)
+
+ def start_keyword(self, keyword):
+ for logger in self._loggers:
+ logger.start_keyword(keyword)
+
+ def end_keyword(self, keyword):
+ for logger in self._loggers:
+ logger.end_keyword(keyword)
+
def output_file(self, name, path):
- for output_file in self._output_filers:
- output_file(name, path)
+ for logger in self._loggers:
+ logger.output_file(name, path)
def close(self):
- for close in self._closers:
- close()
+ for logger in self._loggers:
+ logger.close()
self.__init__()
+
+
+class _Logger:
+
+ def __init__(self, logger):
+ for name in ['write', 'output_file', 'close',
+ 'start_suite', 'end_suite', 'start_test', 'end_test',
+ 'start_keyword', 'end_keyword']:
+ method = getattr(logger, name, lambda *args: None)
+ setattr(self, name, method)
class _FileLogger(AbstractLogger):
Modified: trunk/utest/output/test_systemlogger.py
==============================================================================
--- trunk/utest/output/test_systemlogger.py (original)
+++ trunk/utest/output/test_systemlogger.py Thu Mar 26 13:50:59 2009
@@ -126,13 +126,11 @@
logger2 = LoggerMock2(('Hello, world!', 'INFO'))
self.syslog.register_logger(logger, logger2)
self.syslog.close()
- assert_true(self.syslog._writers ==
- self.syslog._output_filers ==
- self.syslog._closers == [])
+ assert_equals(self.syslog._loggers, [])
def test_registering_file_logger_with_none_path_does_nothing(self):
self.syslog.register_file_logger('None')
- assert_equals(len(self.syslog._writers), 0)
+ assert_equals(self.syslog._loggers, [])
def test_cached_messages_are_given_to_registered_writers(self):
self.syslog.write('This is a cached message', 'INFO')
@@ -148,6 +146,21 @@
logger = LoggerMock(('', ''))
self.syslog.register_logger(logger)
assert_false(hasattr(logger, 'msg'))
+
+ def test_start_and_end_suite_test_and_keyword(self):
+ class Logger:
+ def start_suite(self, suite): self.started_suite = suite
+ def end_suite(self, suite): self.ended_suite = suite
+ def start_test(self, test): self.started_test = test
+ def end_test(self, test): self.ended_test = test
+ def start_keyword(self, keyword): self.started_keyword =
keyword
+ def end_keyword(self, keyword): self.ended_keyword = keyword
+ logger = Logger()
+ self.syslog.register_logger(logger)
+ for name in 'suite', 'test', 'keyword':
+ for stend in 'start', 'end':
+ getattr(self.syslog, stend+'_'+name)(name)
+ assert_equals(getattr(logger, stend+'ed_'+name), name)
if __name__ == "__main__":