From 5d9332e95f5fec27fd3274497bc351ec2c94e60f Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Fri, 30 Jan 2015 11:23:48 -0500 Subject: [PATCH] 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 --- oslo_log/fixture/setlevel.py | 47 ++++++++++++++++++++ oslo_log/tests/unit/fixture/test_setlevel.py | 36 +++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 oslo_log/fixture/setlevel.py create mode 100644 oslo_log/tests/unit/fixture/test_setlevel.py diff --git a/oslo_log/fixture/setlevel.py b/oslo_log/fixture/setlevel.py new file mode 100644 index 00000000..4938911a --- /dev/null +++ b/oslo_log/fixture/setlevel.py @@ -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) diff --git a/oslo_log/tests/unit/fixture/test_setlevel.py b/oslo_log/tests/unit/fixture/test_setlevel.py new file mode 100644 index 00000000..c4f4c12f --- /dev/null +++ b/oslo_log/tests/unit/fixture/test_setlevel.py @@ -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)