From d42f74cedc8bf1811efc2e91fbcc29ea6152c93c Mon Sep 17 00:00:00 2001 From: James Henstridge Date: Sat, 24 Jan 2009 18:13:32 +1100 Subject: Update code to reset() resources if they have been used by a test. --- lib/testresources/__init__.py | 18 ++++- .../tests/test_resourced_test_case.py | 6 ++ lib/testresources/tests/test_test_resource.py | 91 ++++++++++++++-------- 3 files changed, 81 insertions(+), 34 deletions(-) diff --git a/lib/testresources/__init__.py b/lib/testresources/__init__.py index 01b407e..2fec2c0 100644 --- a/lib/testresources/__init__.py +++ b/lib/testresources/__init__.py @@ -196,6 +196,7 @@ class TestResource(object): def __init__(self): self._dirty = False + self._needsReset = False self._uses = 0 self._currentResource = None self.resources = list(getattr(self.__class__, "resources", [])) @@ -232,8 +233,6 @@ class TestResource(object): if self._uses == 0: self.clean_all(resource) self._setResource(None) - else: - self._setResource(self.reset(resource)) def getResource(self): """Get the resource for this class and record that it's being used. @@ -245,11 +244,21 @@ class TestResource(object): """ if self._uses == 0: self._setResource(self.make_all()) - else: + elif self._needsReset: self._setResource(self.reset(self._currentResource)) self._uses += 1 return self._currentResource + def markUsed(self, resource): + """Mark the resource as having been used. + + A used resource must be reset before it is used again. + """ + if not self._needsReset: + self._needsReset = True + for name, manager in self.resources: + manager.markUsed(getattr(resource, name)) + def make_all(self): """Make the dependencies of this resource and this resource.""" dependency_resources = {} @@ -304,6 +313,7 @@ class TestResource(object): """Set the current resource to a new value.""" self._currentResource = new_resource self._dirty = False + self._needsReset = False class ResourcedTestCase(unittest.TestCase): @@ -324,6 +334,8 @@ class ResourcedTestCase(unittest.TestCase): """Set up any resources that this test needs.""" for resource in self.resources: setattr(self, resource[0], resource[1].getResource()) + for resource in self.resources: + resource[1].markUsed(getattr(self, resource[0])) def tearDown(self): self.tearDownResources() diff --git a/lib/testresources/tests/test_resourced_test_case.py b/lib/testresources/tests/test_resourced_test_case.py index 73fffac..461cacb 100644 --- a/lib/testresources/tests/test_resourced_test_case.py +++ b/lib/testresources/tests/test_resourced_test_case.py @@ -86,6 +86,12 @@ class TestResourcedTestCase(testtools.TestCase): self.resourced_case.setUpResources() self.assertEqual(self.resource_manager._uses, 1) + def testSetUpResourcesMarksUsed(self): + # resources used by a test need resetting afterwards. + self.resourced_case.resources = [("foo", self.resource_manager)] + self.resourced_case.setUpResources() + self.assertEqual(self.resource_manager._needsReset, True) + def testTearDownResourcesDeletesResourceAttributes(self): self.resourced_case.resources = [("foo", self.resource_manager)] self.resourced_case.setUpResources() diff --git a/lib/testresources/tests/test_test_resource.py b/lib/testresources/tests/test_test_resource.py index 88a0634..7c1a146 100644 --- a/lib/testresources/tests/test_test_resource.py +++ b/lib/testresources/tests/test_test_resource.py @@ -69,6 +69,10 @@ class TestTestResource(testtools.TestCase): resource_manager = testresources.TestResource() self.assertEqual(False, resource_manager._dirty) + def testInitiallyNotNeedsReset(self): + resource_manager = testresources.TestResource() + self.assertEqual(False, resource_manager._needsReset) + def testInitiallyUnused(self): resource_manager = testresources.TestResource() self.assertEqual(0, resource_manager._uses) @@ -148,6 +152,16 @@ class TestTestResource(testtools.TestCase): resource_manager.getResource() self.assertEqual(1, resource_manager.makes) + def testGetResourceResetsUsedResource(self): + resource_manager = MockResettableResource() + resource_manager.getResource() + resource = resource_manager.getResource() + self.assertEqual(1, resource_manager.makes) + resource_manager.markUsed(resource) + resource_manager.getResource() + self.assertEqual(1, resource_manager.makes) + self.assertEqual(1, resource_manager.resets) + def testFinishedWithDecrementsUses(self): resource_manager = MockResource() resource = resource_manager.getResource() @@ -195,6 +209,13 @@ class TestTestResource(testtools.TestCase): resource_manager.finishedWith(resource) self.assertEqual(False, resource_manager._dirty) + def testFinishedWithMarksNeedsReset(self): + resource_manager = MockResource() + resource = resource_manager.getResource() + resource_manager.markUsed(resource) + resource_manager.finishedWith(resource) + self.assertEqual(False, resource_manager._needsReset) + def testResourceAvailableBetweenFinishedWithCalls(self): resource_manager = MockResource() resource = resource_manager.getResource() @@ -202,6 +223,30 @@ class TestTestResource(testtools.TestCase): resource_manager.finishedWith(resource) self.assertIs(resource, resource_manager._currentResource) + def testMarkUsedSetsNeedsReset(self): + resource_manager = MockResettableResource() + resource = resource_manager.getResource() + self.assertEqual(False, resource_manager._needsReset) + resource_manager.markUsed(resource) + self.assertEqual(True, resource_manager._needsReset) + + def testUsedResourceResetBetweenUses(self): + resource_manager = MockResettableResource() + resource_manager.getResource() + resource = resource_manager.getResource() + resource_manager.markUsed(resource) + resource_manager.finishedWith(resource) + resource = resource_manager.getResource() + resource_manager.markUsed(resource) + resource_manager.finishedWith(resource) + resource_manager.finishedWith(resource) + # The resource is made once, reset once and cleaned once. + self.assertEqual(1, resource_manager.makes) + self.assertEqual(1, resource_manager.resets) + self.assertEqual(1, resource_manager.cleans) + + # The default implementation of reset() performs a make/clean if + # the dirty flag is set. def testDirtiedSetsDirty(self): resource_manager = MockResource() resource = resource_manager.getResource() @@ -209,25 +254,23 @@ class TestTestResource(testtools.TestCase): resource_manager.dirtied(resource) self.assertEqual(True, resource_manager._dirty) - def testDirtyingResourceTriggersClean(self): + def testDefaultResetMethodPreservesCleanResource(self): resource_manager = MockResource() - resource1 = resource_manager.getResource() - resource2 = resource_manager.getResource() - resource_manager.dirtied(resource2) - resource_manager.finishedWith(resource2) - self.assertEqual(1, resource_manager.cleans) - resource_manager.finishedWith(resource1) - self.assertEqual(2, resource_manager.cleans) + resource = resource_manager.getResource() + self.assertEqual(1, resource_manager.makes) + self.assertEqual(False, resource_manager._dirty) + resource_manager.reset(resource) + self.assertEqual(1, resource_manager.makes) + self.assertEqual(0, resource_manager.cleans) - def testDirtyingResourceTriggersRemake(self): + def testDefaultResetMethodRecreatesDirtyResource(self): resource_manager = MockResource() resource = resource_manager.getResource() self.assertEqual(1, resource_manager.makes) resource_manager.dirtied(resource) - resource_manager.getResource() - self.assertEqual(1, resource_manager.cleans) + resource_manager.reset(resource) self.assertEqual(2, resource_manager.makes) - self.assertEqual(False, resource_manager._dirty) + self.assertEqual(1, resource_manager.cleans) def testDirtyingWhenUnused(self): resource_manager = MockResource() @@ -238,25 +281,11 @@ class TestTestResource(testtools.TestCase): resource = resource_manager.getResource() self.assertEqual(2, resource_manager.makes) - def testGetResourceResetsResource(self): - resource_manager = MockResettableResource() - resource = resource_manager.getResource() - self.assertEqual(1, resource_manager.makes) - resource = resource_manager.getResource() - self.assertEqual(1, resource_manager.makes) - self.assertEqual(1, resource_manager.resets) - - def testFinishedWithResetsResource(self): - resource_manager = MockResettableResource() + def testMarkUsedWhenUnused(self): + resource_manager = MockResource() resource = resource_manager.getResource() + resource_manager.finishedWith(resource) + resource_manager.markUsed(resource) self.assertEqual(1, resource_manager.makes) resource = resource_manager.getResource() - self.assertEqual(1, resource_manager.makes) - self.assertEqual(1, resource_manager.resets) - - resource_manager.finishedWith(resource) - self.assertEqual(2, resource_manager.resets) - self.assertEqual(0, resource_manager.cleans) - resource_manager.finishedWith(resource) - self.assertEqual(2, resource_manager.resets) - self.assertEqual(1, resource_manager.cleans) + self.assertEqual(2, resource_manager.makes) -- cgit v1.2.1