From 74a0ec8b1c4b3ca6c700d110d6bfd77348cc970a Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Wed, 2 Dec 2015 14:43:32 -0500 Subject: setUp/tearDown decorator for set/clear override Problem with recursion shows up only in full runs of Nova for example. So split the code that sets up the decorator and add a method to cleanup the decorated set_override during teardown. Also add a decorator for clear_override similar to the one for set_override. Added more tests for all the above. Change-Id: Ib16af2e770e96d971aef7f5c5d48ffd781477cfe --- oslo_messaging/conffixture.py | 32 +++++++++++++++++++++-- oslo_messaging/tests/test_fixture.py | 49 ++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/oslo_messaging/conffixture.py b/oslo_messaging/conffixture.py index 42e9d51..0d05a58 100644 --- a/oslo_messaging/conffixture.py +++ b/oslo_messaging/conffixture.py @@ -71,6 +71,7 @@ class ConfFixture(fixtures.Fixture): '_notifier_opts', 'oslo_messaging_notifications') + def _setup_decorator(self): # Support older test cases that still use the set_override # with the old config key names def decorator_for_set_override(wrapped_function): @@ -84,13 +85,40 @@ class ConfFixture(fixtures.Fixture): elif args[0] == 'notification_topics': args = ('topics', args[1], group) return wrapped_function(*args, **kwargs) + _wrapper.wrapped = wrapped_function return _wrapper - self.conf.set_override = decorator_for_set_override( - self.conf.set_override) + def decorator_for_clear_override(wrapped_function): + @wraps(wrapped_function) + def _wrapper(*args, **kwargs): + group = 'oslo_messaging_notifications' + if args[0] == 'notification_driver': + args = ('driver', group) + elif args[0] == 'notification_transport_url': + args = ('transport_url', group) + elif args[0] == 'notification_topics': + args = ('topics', group) + return wrapped_function(*args, **kwargs) + _wrapper.wrapped = wrapped_function + return _wrapper + + if not hasattr(self.conf.set_override, 'wrapped'): + self.conf.set_override = decorator_for_set_override( + self.conf.set_override) + if not hasattr(self.conf.clear_override, 'wrapped'): + self.conf.clear_override = decorator_for_clear_override( + self.conf.clear_override) + + def _teardown_decorator(self): + if hasattr(self.conf.set_override, 'wrapped'): + self.conf.set_override = self.conf.set_override.wrapped + if hasattr(self.conf.clear_override, 'wrapped'): + self.conf.clear_override = self.conf.clear_override.wrapped def setUp(self): super(ConfFixture, self).setUp() + self._setup_decorator() + self.addCleanup(self._teardown_decorator) self.addCleanup(self.conf.reset) @property diff --git a/oslo_messaging/tests/test_fixture.py b/oslo_messaging/tests/test_fixture.py index dfa78b6..2ad1117 100644 --- a/oslo_messaging/tests/test_fixture.py +++ b/oslo_messaging/tests/test_fixture.py @@ -12,10 +12,48 @@ # License for the specific language governing permissions and limitations # under the License. +from oslo_config import cfg + +from oslo_messaging import conffixture from oslo_messaging.tests import utils as test_utils class TestConfFixture(test_utils.BaseTestCase): + + def test_fixture_wraps_set_override(self): + conf = self.messaging_conf.conf + self.assertIsNotNone(conf.set_override.wrapped) + self.messaging_conf._teardown_decorator() + self.assertFalse(hasattr(conf.set_override, 'wrapped')) + + def test_fixture_wraps_clear_override(self): + conf = self.messaging_conf.conf + self.assertIsNotNone(conf.clear_override.wrapped) + self.messaging_conf._teardown_decorator() + self.assertFalse(hasattr(conf.clear_override, 'wrapped')) + + def test_fixture_setup_teardown_decorator(self): + conf = cfg.ConfigOpts() + self.assertFalse(hasattr(conf.set_override, 'wrapped')) + self.assertFalse(hasattr(conf.clear_override, 'wrapped')) + fixture = conffixture.ConfFixture(conf) + self.assertFalse(hasattr(conf.set_override, 'wrapped')) + self.assertFalse(hasattr(conf.clear_override, 'wrapped')) + self.useFixture(fixture) + self.assertTrue(hasattr(conf.set_override, 'wrapped')) + self.assertTrue(hasattr(conf.clear_override, 'wrapped')) + fixture._teardown_decorator() + self.assertFalse(hasattr(conf.set_override, 'wrapped')) + self.assertFalse(hasattr(conf.clear_override, 'wrapped')) + + def test_fixture_properties(self): + conf = self.messaging_conf.conf + self.messaging_conf.transport_driver = 'fake' + self.assertEqual('fake', + self.messaging_conf.transport_driver) + self.assertEqual('fake', + conf.rpc_backend) + def test_old_notifications_config_override(self): conf = self.messaging_conf.conf conf.set_override( @@ -31,3 +69,14 @@ class TestConfFixture(test_utils.BaseTestCase): conf.oslo_messaging_notifications.transport_url) self.assertEqual(['topic1'], conf.oslo_messaging_notifications.topics) + + conf.clear_override("notification_driver") + conf.clear_override("notification_transport_url") + conf.clear_override("notification_topics") + + self.assertEqual([], + conf.oslo_messaging_notifications.driver) + self.assertEqual(None, + conf.oslo_messaging_notifications.transport_url) + self.assertEqual(['notifications'], + conf.oslo_messaging_notifications.topics) \ No newline at end of file -- cgit v1.2.1