6
from cinder import context
7
from cinder import flags
9
from cinder.notifier import api as notifier
10
from cinder import test
13
flags.DECLARE('list_notifier_drivers',
14
'cinder.notifier.list_notifier')
18
return context.RequestContext(1, 1)
21
class LoggerTestCase(test.TestCase):
23
super(LoggerTestCase, self).setUp()
24
self.log = log.getLogger()
26
def test_handlers_have_cinder_formatter(self):
28
for h in self.log.logger.handlers:
30
if isinstance(f, log.LegacyCinderFormatter):
32
self.assert_(formatters)
33
self.assertEqual(len(formatters), len(self.log.logger.handlers))
35
def test_handles_context_kwarg(self):
36
self.log.info("foo", context=_fake_context())
37
self.assert_(True) # didn't raise exception
39
def test_audit_handles_context_arg(self):
40
self.log.audit("foo", context=_fake_context())
41
self.assert_(True) # didn't raise exception
43
def test_will_be_verbose_if_verbose_flag_set(self):
44
self.flags(verbose=True)
46
self.assertEqual(logging.DEBUG, self.log.logger.getEffectiveLevel())
48
def test_will_not_be_verbose_if_verbose_flag_not_set(self):
49
self.flags(verbose=False)
51
self.assertEqual(logging.INFO, self.log.logger.getEffectiveLevel())
53
def test_no_logging_via_module(self):
54
for func in ('critical', 'error', 'exception', 'warning', 'warn',
55
'info', 'debug', 'log', 'audit'):
56
self.assertRaises(AttributeError, getattr, log, func)
59
class LogHandlerTestCase(test.TestCase):
60
def test_log_path_logdir(self):
61
self.flags(logdir='/some/path', logfile=None)
62
self.assertEquals(log._get_log_file_path(binary='foo-bar'),
63
'/some/path/foo-bar.log')
65
def test_log_path_logfile(self):
66
self.flags(logfile='/some/path/foo-bar.log')
67
self.assertEquals(log._get_log_file_path(binary='foo-bar'),
68
'/some/path/foo-bar.log')
70
def test_log_path_none(self):
71
self.flags(logdir=None, logfile=None)
72
self.assertTrue(log._get_log_file_path(binary='foo-bar') is None)
74
def test_log_path_logfile_overrides_logdir(self):
75
self.flags(logdir='/some/other/path',
76
logfile='/some/path/foo-bar.log')
77
self.assertEquals(log._get_log_file_path(binary='foo-bar'),
78
'/some/path/foo-bar.log')
81
class PublishErrorsHandlerTestCase(test.TestCase):
82
"""Tests for cinder.log.PublishErrorsHandler"""
84
super(PublishErrorsHandlerTestCase, self).setUp()
85
self.publiserrorshandler = log.PublishErrorsHandler(logging.ERROR)
87
def test_emit_cfg_list_notifier_drivers_in_flags(self):
90
def fake_notifier(*args, **kwargs):
93
self.stubs.Set(notifier, 'notify', fake_notifier)
94
logrecord = logging.LogRecord('name', 'WARN', '/tmp', 1,
95
'Message', None, None)
96
self.publiserrorshandler.emit(logrecord)
97
self.assertTrue(self.stub_flg)
99
def test_emit_cfg_log_notifier_in_list_notifier_drivers(self):
100
self.flags(list_notifier_drivers=['cinder.notifier.rabbit_notifier',
101
'cinder.notifier.log_notifier'])
104
def fake_notifier(*args, **kwargs):
105
self.stub_flg = False
107
self.stubs.Set(notifier, 'notify', fake_notifier)
108
logrecord = logging.LogRecord('name', 'WARN', '/tmp', 1,
109
'Message', None, None)
110
self.publiserrorshandler.emit(logrecord)
111
self.assertTrue(self.stub_flg)
114
class CinderFormatterTestCase(test.TestCase):
116
super(CinderFormatterTestCase, self).setUp()
117
self.flags(logging_context_format_string="HAS CONTEXT "
120
logging_default_format_string="NOCTXT: %(message)s",
121
logging_debug_format_suffix="--DBG")
122
self.log = log.getLogger()
123
self.stream = cStringIO.StringIO()
124
self.handler = logging.StreamHandler(self.stream)
125
self.handler.setFormatter(log.LegacyCinderFormatter())
126
self.log.logger.addHandler(self.handler)
127
self.level = self.log.logger.getEffectiveLevel()
128
self.log.logger.setLevel(logging.DEBUG)
131
self.log.logger.setLevel(self.level)
132
self.log.logger.removeHandler(self.handler)
133
super(CinderFormatterTestCase, self).tearDown()
135
def test_uncontextualized_log(self):
137
self.assertEqual("NOCTXT: foo\n", self.stream.getvalue())
139
def test_contextualized_log(self):
140
ctxt = _fake_context()
141
self.log.info("bar", context=ctxt)
142
expected = "HAS CONTEXT [%s]: bar\n" % ctxt.request_id
143
self.assertEqual(expected, self.stream.getvalue())
145
def test_debugging_log(self):
146
self.log.debug("baz")
147
self.assertEqual("NOCTXT: baz --DBG\n", self.stream.getvalue())
150
class CinderLoggerTestCase(test.TestCase):
152
super(CinderLoggerTestCase, self).setUp()
153
levels = FLAGS.default_log_levels
154
levels.append("cinder-test=AUDIT")
155
self.flags(default_log_levels=levels,
158
self.log = log.getLogger('cinder-test')
160
def test_has_level_from_flags(self):
161
self.assertEqual(logging.AUDIT, self.log.logger.getEffectiveLevel())
163
def test_child_log_has_level_of_parent_flag(self):
164
l = log.getLogger('cinder-test.foo')
165
self.assertEqual(logging.AUDIT, l.logger.getEffectiveLevel())
168
class JSONFormatterTestCase(test.TestCase):
170
super(JSONFormatterTestCase, self).setUp()
171
self.log = log.getLogger('test-json')
172
self.stream = cStringIO.StringIO()
173
handler = logging.StreamHandler(self.stream)
174
handler.setFormatter(log.JSONFormatter())
175
self.log.logger.addHandler(handler)
176
self.log.logger.setLevel(logging.DEBUG)
179
test_msg = 'This is a %(test)s line'
180
test_data = {'test': 'log'}
181
self.log.debug(test_msg, test_data)
183
data = json.loads(self.stream.getvalue())
184
self.assertTrue(data)
185
self.assertTrue('extra' in data)
186
self.assertEqual('test-json', data['name'])
188
self.assertEqual(test_msg % test_data, data['message'])
189
self.assertEqual(test_msg, data['msg'])
190
self.assertEqual(test_data, data['args'])
192
self.assertEqual('test_log.py', data['filename'])
193
self.assertEqual('test_json', data['funcname'])
195
self.assertEqual('DEBUG', data['levelname'])
196
self.assertEqual(logging.DEBUG, data['levelno'])
197
self.assertFalse(data['traceback'])
199
def test_json_exception(self):
200
test_msg = 'This is %s'
201
test_data = 'exceptional'
203
raise Exception('This is exceptional')
205
self.log.exception(test_msg, test_data)
207
data = json.loads(self.stream.getvalue())
208
self.assertTrue(data)
209
self.assertTrue('extra' in data)
210
self.assertEqual('test-json', data['name'])
212
self.assertEqual(test_msg % test_data, data['message'])
213
self.assertEqual(test_msg, data['msg'])
214
self.assertEqual([test_data], data['args'])
216
self.assertEqual('ERROR', data['levelname'])
217
self.assertEqual(logging.ERROR, data['levelno'])
218
self.assertTrue(data['traceback'])