Author: janne.t.harkonen
Date: Mon Mar 23 06:30:05 2009
New Revision: 1487

Modified:
   trunk/src/robot/output/abstractlogger.py
   trunk/src/robot/output/systemlogger.py
   trunk/utest/output/test_systemlogger.py

Log:
Implemented proxy for improved SystemLogger, issue 254.
This code is not yet used anywhere.

Modified: trunk/src/robot/output/abstractlogger.py
==============================================================================
--- trunk/src/robot/output/abstractlogger.py    (original)
+++ trunk/src/robot/output/abstractlogger.py    Mon Mar 23 06:30:05 2009
@@ -38,9 +38,12 @@
             if int_value == old_int:
                 return level

-    def write(self, msg='', level='INFO', html=False):
+    def write(self, msg, level='INFO', html=False):
+        """Implementing classes must override this or implement _write."""
         if self._is_logged(level):
-            self._write(Message(msg, level, html))
+            if not isinstance(msg, Message):
+                msg = Message(msg, level, html)
+            self._write(msg)

     def _is_logged(self, msg_level_str, threshold_level_str=None):
         msg_level = get_level(msg_level_str)
@@ -50,26 +53,29 @@
             threshold_level = get_level(threshold_level_str)
         return msg_level >= threshold_level

-    def _write(self, message):
-        raise NotImplementedError
-
-    def trace(self, msg=''):
+    def trace(self, msg):
         self.write(msg, 'TRACE')

-    def debug(self, msg=''):
+    def debug(self, msg):
         self.write(msg, 'DEBUG')

-    def info(self, msg=''):
+    def info(self, msg):
         self.write(msg, 'INFO')

-    def warn(self, msg=''):
+    def warn(self, msg):
         self.write(msg, 'WARN')

-    def fail(self, msg=''):
+    def fail(self, msg):
         self.write(msg, 'FAIL')

-    def error(self, msg=''):
+    def error(self, msg):
         self.write(msg, 'ERROR')
+
+    def output_file(self, name, path):
+        pass
+
+    def close(self):
+        pass


 class Message:

Modified: trunk/src/robot/output/systemlogger.py
==============================================================================
--- trunk/src/robot/output/systemlogger.py      (original)
+++ trunk/src/robot/output/systemlogger.py      Mon Mar 23 06:30:05 2009
@@ -16,11 +16,32 @@
 from robot import utils
 from robot.conf import RobotSettings

-from abstractlogger import AbstractLogger
+from abstractlogger import AbstractLogger, Message
 from monitor import CommandLineMonitor
 import robot.output


+class SystemLogger2(AbstractLogger):
+
+    def __init__(self):
+        self._loggers = []
+
+    def write(self, message, level='INFO'):
+        msg = Message(message, level)
+        for logger in self._loggers:
+            logger.write(msg, level)
+
+    def register_logger(self, *loggers):
+        self._loggers.extend(loggers)
+
+    def register_file_logger(self, path=None, level='INFO'):
+        if not path:
+            path = os.env.get('ROBOT_SYSLOG_FILE', None)
+            if not path:
+                return
+            level = os.env.get('ROBOT_SYSLOG_LEVEL', level)
+
+
 class SystemLogger(AbstractLogger):

     def __init__(self, settings=None, monitor=None):
@@ -35,7 +56,7 @@
         else:
             self.monitor = monitor
         try:
- self._file_logger = self._get_file_logger(settings['SyslogFile'], + self._file_logger = self._get_file_logger(settings['SyslogFile'], settings['SyslogLevel'])
         except:
             self._file_logger = None

Modified: trunk/utest/output/test_systemlogger.py
==============================================================================
--- trunk/utest/output/test_systemlogger.py     (original)
+++ trunk/utest/output/test_systemlogger.py     Mon Mar 23 06:30:05 2009
@@ -4,7 +4,8 @@
 from robot import utils
 from robot.utils.asserts import *

-from robot.output.systemlogger import _FileLogger
+from robot.output.systemlogger import _FileLogger, SystemLogger2
+SystemLogger = SystemLogger2


 class MessageMock:
@@ -13,7 +14,23 @@
         self.timestamp = timestamp
         self.level = level
         self.message = message
+
+
+class LoggerMock:
+
+    def __init__(self, *expected):
+        self.expected = list(expected)

+    def write(self, msg, level):
+        assert_equals(msg.level, level)
+        exp_msg, exp_level = self.expected.pop(0)
+        assert_equals(msg.level, exp_level)
+        assert_equals(msg.message, exp_msg)
+        self.msg = msg
+
+    def copy(self):
+        return LoggerMock(*self.expected)
+

 class TestSystemFileLogger(unittest.TestCase):

@@ -48,6 +65,42 @@
         self.logger.write('msg', 'DEBUG')
assert_equals(self.logger._writer.getvalue(), '20060613 08:37:42.123 | DEBUG | msg\n')

+
+class TestSystemLogger(unittest.TestCase):
+
+    def setUp(self):
+        self.syslog = SystemLogger()
+
+    def test_write_to_one_logger(self):
+        logger = LoggerMock(('Hello, world!', 'INFO'))
+        self.syslog.register_logger(logger)
+        self.syslog.write('Hello, world!')
+        assert_true(logger.msg.timestamp.startswith('20'))
+
+    def test_write_to_one_logger_with_trace_level(self):
+        logger = LoggerMock(('expected message', 'TRACE'))
+        self.syslog.register_logger(logger)
+        self.syslog.write('expected message', 'TRACE')
+        assert_true(hasattr(logger, 'msg'))
+
+    def test_write_to_multiple_loggers(self):
+        logger = LoggerMock(('Hello, world!', 'INFO'))
+        logger2 = logger.copy()
+        logger3 = logger.copy()
+        self.syslog.register_logger(logger, logger2, logger3)
+        self.syslog.write('Hello, world!')
+        assert_true(logger.msg is logger2.msg)
+        assert_true(logger.msg is logger.msg)
+
+    def test_write_multiple_messages(self):
+ msgs = [('0', 'ERROR'), ('1', 'WARN'), ('2', 'INFO'), ('3', 'DEBUG'), ('4', 'TRACE')]
+        logger = LoggerMock(*msgs)
+        self.syslog.register_logger(logger)
+        for msg, level in msgs:
+            self.syslog.write(msg, level)
+            assert_equals(logger.msg.message, msg)
+            assert_equals(logger.msg.level, level)

+
 if __name__ == "__main__":
     unittest.main()

Reply via email to