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
This commit is contained in:
Sean Dague 2015-03-05 12:02:00 -05:00
parent 205479f254
commit 1c4757a9fb
2 changed files with 27 additions and 1 deletions

View File

@ -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):

View File

@ -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())