Revision: 4123
Author: janne.t.harkonen
Date: Fri Sep 24 00:42:36 2010
Log: Test and implementation for being able to have special loggers that
change context
http://code.google.com/p/robotframework/source/detail?r=4123
Modified:
/trunk/src/robot/output/logger.py
/trunk/src/robot/output/output.py
/trunk/utest/output/test_logger.py
=======================================
--- /trunk/src/robot/output/logger.py Fri Sep 24 00:42:21 2010
+++ /trunk/src/robot/output/logger.py Fri Sep 24 00:42:36 2010
@@ -36,6 +36,7 @@
def __init__(self):
self._loggers = []
+ self._context_changing_loggers = []
self._message_cache = []
self._register_console_logger()
self._console_logger_disabled = False
@@ -51,18 +52,28 @@
def register_logger(self, *loggers):
for log in loggers:
logger = self._register_logger(log)
- if self._message_cache:
- for msg in self._message_cache:
- logger.message(msg)
+ self._relay_cached_messages_to(logger)
def _register_logger(self, log):
self._loggers.append(_LoggerProxy(log))
return self._loggers[-1]
+ def _relay_cached_messages_to(self, logger):
+ if self._message_cache:
+ for msg in self._message_cache:
+ logger.message(msg)
+
+ def register_context_changing_logger(self, log):
+ self._context_changing_loggers.append(_LoggerProxy(log))
+ self._relay_cached_messages_to(self._context_changing_loggers[-1])
+
def unregister_logger(self, *loggers):
for log in loggers:
self._loggers = [proxy for proxy in self._loggers
if proxy.logger is not log]
+ self._context_changing_loggers = [proxy for proxy in
self._context_changing_loggers
+ if proxy.logger is not log]
+
def register_console_logger(self, width=78, colors=True):
self.disable_automatic_console_logger()
@@ -90,14 +101,14 @@
def message(self, msg):
"""Messages about what the framework is doing, warnings,
errors, ..."""
- for logger in self._loggers:
+ for logger in self._context_changing_loggers + self._loggers:
logger.message(msg)
if self._message_cache is not None:
self._message_cache.append(msg)
def log_message(self, msg):
"""Log messages written (mainly) by libraries"""
- for logger in self._loggers:
+ for logger in self._context_changing_loggers + self._loggers:
logger.log_message(msg)
if msg.level == 'WARN':
msg.linkable = True
@@ -109,37 +120,38 @@
def output_file(self, name, path):
"""Finished output, report, log, summary or debug file (incl.
split)"""
- for logger in self._loggers:
+ for logger in self._loggers + self._context_changing_loggers:
logger.output_file(name, path)
def close(self):
- for logger in self._loggers:
+ for logger in self._loggers + self._context_changing_loggers:
logger.close()
self._loggers = []
+ self._context_changing_loggers = []
self._message_cache = []
def start_suite(self, suite):
- for logger in self._loggers:
+ for logger in self._context_changing_loggers + self._loggers:
logger.start_suite(suite)
def end_suite(self, suite):
- for logger in self._loggers:
+ for logger in self._loggers + self._context_changing_loggers:
logger.end_suite(suite)
def start_test(self, test):
- for logger in self._loggers:
+ for logger in self._context_changing_loggers + self._loggers:
logger.start_test(test)
def end_test(self, test):
- for logger in self._loggers:
+ for logger in self._loggers + self._context_changing_loggers:
logger.end_test(test)
def start_keyword(self, keyword):
- for logger in self._loggers:
+ for logger in self._context_changing_loggers + self._loggers:
logger.start_keyword(keyword)
def end_keyword(self, keyword):
- for logger in self._loggers:
+ for logger in self._loggers + self._context_changing_loggers:
logger.end_keyword(keyword)
=======================================
--- /trunk/src/robot/output/output.py Mon May 31 05:21:54 2010
+++ /trunk/src/robot/output/output.py Fri Sep 24 00:42:36 2010
@@ -38,7 +38,7 @@
robot.output.OUTPUT = self
def _register_loggers(self, listeners, debugfile):
- LOGGER.register_logger(self._xmllogger)
+ LOGGER.register_context_changing_logger(self._xmllogger)
for logger in Listeners(listeners), DebugFile(debugfile):
if logger: LOGGER.register_logger(logger)
LOGGER.disable_message_cache()
=======================================
--- /trunk/utest/output/test_logger.py Fri Sep 24 00:42:21 2010
+++ /trunk/utest/output/test_logger.py Fri Sep 24 00:42:36 2010
@@ -174,6 +174,53 @@
self.logger.unregister_logger(logger2)
self.logger.unregister_logger(None)
+ def test_registering_context_changing_logger(self):
+ self.logger.register_context_changing_logger(LoggerMock())
+ assert_equals(len(self.logger._context_changing_loggers), 1)
+
+ def test_messages_to_context_chagning_loggers(self):
+ log = LoggerMock(('msg', 'INFO'))
+ self.logger.register_context_changing_logger(log)
+ self.logger.write('msg', 'INFO')
+ assert_true(log.msg is not None)
+
+ def
test_start_methods_are_called_first_for_context_changing_loggers(self):
+ class FirstLogger:
+ def start_suite(self, suite): self.suite = suite
+ def start_test(self, test): self.test = test
+ def start_keyword(self, kw): self.kw = kw
+ class SecondLogger:
+ def __init__(self, logger): self._reference = logger
+ def start_suite(self, suite): assert_equals(suite,
self._reference.suite)
+ def start_test(self, test): assert_equals(test,
self._reference.test)
+ def start_keyword(self, kw): assert_equals(kw,
self._reference.kw)
+ log1 = FirstLogger()
+ log2 = SecondLogger(log1)
+ self.logger.register_logger(log2)
+ self.logger.register_context_changing_logger(log1)
+ self.logger.start_suite('Suite')
+ self.logger.start_test('Test')
+ self.logger.start_keyword('Keyword')
+
+ def
test_end_methods_are_called_last_for_context_changing_loggers(self):
+ class FirstLogger:
+ def end_suite(self, suite): self.suite = suite
+ def end_test(self, test): self.test = test
+ def end_keyword(self, kw): self.kw = kw
+ class SecondLogger:
+ def __init__(self, logger): self._reference = logger
+ def end_suite(self, suite): self.suite = suite;
assert_equals(suite, self._reference.suite)
+ def end_test(self, test): assert_equals(test,
self._reference.test)
+ def end_keyword(self, kw): assert_equals(kw,
self._reference.kw)
+ log1 = FirstLogger()
+ log2 = SecondLogger(log1)
+ self.logger.register_logger(log1)
+ self.logger.register_context_changing_logger(log2)
+ self.logger.end_suite('Suite')
+ self.logger.end_test('Test')
+ self.logger.end_keyword('Keyword')
+ assert_true(log2.suite is not None)
+
if __name__ == "__main__":
unittest.main()