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()

Reply via email to