Add fixture to let tests change log levels

Some tests need to alter the log levels for modules dynamically. This
fixture lets them control the level without worrying about resetting the
value or messing around with underlying implementation.

Change-Id: I6ce509725ae23a33704d1f5b5b9af189470f03fc
This commit is contained in:
Doug Hellmann 2015-01-30 11:23:48 -05:00
parent e6235ce26f
commit 5d9332e95f
2 changed files with 83 additions and 0 deletions

View File

@ -0,0 +1,47 @@
# 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 fixtures
class SetLogLevel(fixtures.Fixture):
"""Override the log level for the named loggers, restoring their
previous value at the end of the test.
To use::
self.setFixture(['myapp.foo'], logging.DEBUG)
:param logger_names: Sequence of logger names, as would be passed
to getLogger().
:type logger_names: list(str)
:param level: Logging level, usually one of logging.DEBUG,
logging.INFO, etc.
:type level: int
"""
def __init__(self, logger_names, level):
self.logger_names = logger_names
self.level = level
def setUp(self):
super(SetLogLevel, self).setUp()
for name in self.logger_names:
# NOTE(dhellmann): Use the stdlib version of getLogger()
# so we get the logger and not any adaptor wrapping it.
logger = logging.getLogger(name)
self.addCleanup(logger.setLevel, logger.level)
logger.setLevel(self.level)

View File

@ -0,0 +1,36 @@
# 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
from oslo_log.fixture import setlevel
from oslotest import base as test_base
class TestSetLevelFixture(test_base.BaseTestCase):
def test_unset_before(self):
logger = logging.getLogger('no-such-logger-unset')
self.assertEqual(logging.NOTSET, logger.level)
fix = setlevel.SetLogLevel(['no-such-logger-unset'], logging.DEBUG)
with fix:
self.assertEqual(logging.DEBUG, logger.level)
self.assertEqual(logging.NOTSET, logger.level)
def test_set_before(self):
logger = logging.getLogger('no-such-logger-set')
logger.setLevel(logging.ERROR)
self.assertEqual(logging.ERROR, logger.level)
fix = setlevel.SetLogLevel(['no-such-logger-set'], logging.DEBUG)
with fix:
self.assertEqual(logging.DEBUG, logger.level)
self.assertEqual(logging.ERROR, logger.level)