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