From 1c4757a9fb41e47867bd9b8d390057ad7636b76f Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Thu, 5 Mar 2015 12:02:00 -0500 Subject: ensure we reset contexts when fixture is used Previously using the ClearRequestContext fixture only reset contexts on fixture teardown. If *all* tests in a test suite use this fixture, this is fine. However if any tests do not, it means you might start with a carry over context from previous tests. Using this fixture means you really wanted a clean slate, so fix it so that you get a clean state when you get started as well as when you finish. Change-Id: I5e6f7bc2866fe66f269c7d5e1f36c711151489c2 Closes-Bug: #1428728 --- oslo_context/fixture.py | 12 +++++++++++- oslo_context/tests/test_fixture.py | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/oslo_context/fixture.py b/oslo_context/fixture.py index 51822e8..a7bb0ff 100644 --- a/oslo_context/fixture.py +++ b/oslo_context/fixture.py @@ -16,10 +16,20 @@ from oslo_context import context class ClearRequestContext(fixtures.Fixture): - """Clears any cached RequestContext at the end of a test case.""" + """Clears any cached RequestContext + + This resets RequestContext at the beginning and end of tests that + use this fixture to ensure that we have a clean slate for running + tests, and that we leave a clean slate for other tests that might + run later in the same process. + """ def setUp(self): super(ClearRequestContext, self).setUp() + # we need to clear both when we start, and when we finish, + # because there might be other tests running that don't handle + # this correctly. + self._remove_cached_context() self.addCleanup(self._remove_cached_context) def _remove_cached_context(self): diff --git a/oslo_context/tests/test_fixture.py b/oslo_context/tests/test_fixture.py index 7a5b3cc..e566b52 100644 --- a/oslo_context/tests/test_fixture.py +++ b/oslo_context/tests/test_fixture.py @@ -28,3 +28,19 @@ class ClearRequestContextTest(test_base.BaseTestCase): self.assertIs(context.get_current(), ctx) fixture.ClearRequestContext()._remove_cached_context() self.assertIsNone(context.get_current()) + + def test_store_current_resets_correctly(self): + # By default a new context is stored. + ctx = context.RequestContext() + + # the use of the fixture should put us in a reset state, not + # doing so is a bug because when this fixture is consumed by + # other test suites there is no guaruntee that all tests use + # this fixture. + self.useFixture(fixture.ClearRequestContext()) + self.assertIsNone(context.get_current()) + + ctx = context.RequestContext() + self.assertIs(context.get_current(), ctx) + fixture.ClearRequestContext()._remove_cached_context() + self.assertIsNone(context.get_current()) -- cgit v1.2.1