22
22
from unittest.mock import Mock
25
from autopilot import tests
25
26
from autopilot.logging import log_action
26
27
from autopilot._logging import TestCaseLoggingFixture
29
class LogHandlerTestCase(testtools.TestCase):
30
"""A mixin that adds a memento loghandler for testing logging.
32
Originally written by:
39
class MementoHandler(logging.Handler):
40
"""A handler class which stores logging records in a list."""
41
def __init__(self, *args, **kwargs):
42
"""Create the instance, and add a records attribute."""
43
logging.Handler.__init__(self, *args, **kwargs)
46
def emit(self, record):
47
"""Just add the record to self.records."""
48
self.records.append(record)
50
def check(self, level, msg, check_traceback=False):
51
"""Check that something is logged."""
53
for rec in self.records:
54
if rec.levelname == level:
55
result = str(msg) in rec.getMessage()
56
if not result and check_traceback:
57
result = str(msg) in rec.exc_text
64
"""Add the memento handler to the root logger."""
65
super(LogHandlerTestCase, self).setUp()
66
self.memento_handler = self.MementoHandler()
67
self.root_logger = logging.getLogger()
68
self.root_logger.addHandler(self.memento_handler)
71
"""Remove the memento handler from the root logger."""
72
self.root_logger.removeHandler(self.memento_handler)
73
super(LogHandlerTestCase, self).tearDown()
75
def assertLogLevelContains(self, level, message, check_traceback=False):
76
check = self.memento_handler.check(
77
level, message, check_traceback=check_traceback)
79
msg = ('Expected logging message/s could not be found:\n%s\n'
80
'Current logging records are:\n%s')
81
expected = '\t%s: %s' % (level, message)
82
records = ['\t%s: %s' % (r.levelname, r.getMessage())
83
for r in self.memento_handler.records]
84
self.assertTrue(check, msg % (expected, '\n'.join(records)))
87
30
class ObjectWithLogDecorator(object):
89
32
@log_action(logging.info)