f24a904dd3
The Python context named `ExceptionLogger` can be used to route exceptions to a specified logging service. Change-Id: I85d74339ac8857e7d577302d29c5951b76a1d127
103 lines
3.2 KiB
Python
103 lines
3.2 KiB
Python
# Copyright 2014: Mirantis Inc.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import logging
|
|
|
|
import mock
|
|
|
|
from rally.common import log
|
|
from tests.unit import test
|
|
|
|
|
|
class LogTestCase(test.TestCase):
|
|
|
|
@mock.patch("rally.common.log.CONF")
|
|
@mock.patch("rally.common.log.oslogging")
|
|
def test_setup(self, mock_oslogger, mock_conf):
|
|
|
|
proj = "fakep"
|
|
version = "fakev"
|
|
mock_oslogger.ColorHandler.LEVEL_COLORS = {
|
|
logging.DEBUG: "debug_color"}
|
|
mock_conf.rally_debug = True
|
|
|
|
log.setup(proj, version)
|
|
|
|
self.assertIn(logging.RDEBUG, mock_oslogger.ColorHandler.LEVEL_COLORS)
|
|
self.assertEqual(
|
|
mock_oslogger.ColorHandler.LEVEL_COLORS[logging.DEBUG],
|
|
mock_oslogger.ColorHandler.LEVEL_COLORS[logging.RDEBUG])
|
|
|
|
mock_oslogger.setup.assert_called_once_with(proj, version)
|
|
mock_oslogger.getLogger(None).logger.setLevel.assert_called_once_with(
|
|
logging.RDEBUG)
|
|
|
|
@mock.patch("rally.common.log.logging")
|
|
@mock.patch("rally.common.log.RallyContextAdapter")
|
|
@mock.patch("rally.common.log.oslogging")
|
|
def test_getLogger(self, mock_oslogger, mock_radapter, mock_pylogging):
|
|
|
|
proj = "fake"
|
|
vers = "fake"
|
|
mock_oslogger._loggers = dict()
|
|
|
|
returned_logger = log.getLogger(proj, vers)
|
|
|
|
self.assertIn(proj, mock_oslogger._loggers)
|
|
mock_radapter.assert_called_once_with(mock_pylogging.getLogger(proj),
|
|
proj, vers)
|
|
self.assertEqual(mock_oslogger._loggers[proj], returned_logger)
|
|
|
|
|
|
class LogRallyContaxtAdapter(test.TestCase):
|
|
|
|
@mock.patch("rally.common.log.logging")
|
|
@mock.patch("rally.common.log.oslogging.ContextAdapter")
|
|
def test_debug(self, mock_oslo_adapter, mock_logging):
|
|
|
|
mock_logging.RDEBUG = 123
|
|
fake_msg = "fake message"
|
|
radapter = log.RallyContextAdapter(mock.MagicMock(), "fakep", "fakev")
|
|
radapter.log = mock.MagicMock()
|
|
|
|
radapter.debug(fake_msg)
|
|
|
|
radapter.log.assert_called_once_with(mock_logging.RDEBUG,
|
|
fake_msg)
|
|
|
|
|
|
class ExceptionLoggerTestCase(test.TestCase):
|
|
|
|
@mock.patch("rally.common.log.is_debug")
|
|
def test_context(self, mock_is_debug):
|
|
# Prepare
|
|
mock_is_debug.return_value = True
|
|
|
|
logger = mock.MagicMock()
|
|
exception = Exception()
|
|
|
|
# Run
|
|
with log.ExceptionLogger(logger, "foo") as e:
|
|
raise exception
|
|
|
|
# Assertions
|
|
logger.warning.assert_called_once_with("foo")
|
|
|
|
logger.exception.assert_called_once_with(exception)
|
|
|
|
logger.debug.assert_called_once_with(exception)
|
|
|
|
self.assertEqual(e.exception, exception)
|