From 3838a4d70aaee73f681e81344821955af1a1a627 Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Wed, 17 Jun 2009 22:01:49 +1000 Subject: Allow tracing of TestResource activity by passing a trace_function to TestResource, fixing bug 284125. --- NEWS | 4 ++++ lib/testresources/__init__.py | 11 ++++++++++- lib/testresources/tests/test_test_resource.py | 14 ++++++++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 004e376..260b7d9 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,10 @@ IN DEVELOPMENT * Started keeping a NEWS file! (Jonathan Lange) + * A trace_function can be supplied when constructing TestResource objects, + to allow debugging of when resources are made/cleaned. (Robert Collins, + #284125) + BUG FIXES: * Calling getResource on a dirty resource now triggers a clean and re-make diff --git a/lib/testresources/__init__.py b/lib/testresources/__init__.py index 4bc7ef4..adccecd 100644 --- a/lib/testresources/__init__.py +++ b/lib/testresources/__init__.py @@ -197,14 +197,22 @@ class TestResource(object): setUpCost = 1 tearDownCost = 1 - def __init__(self): + def __init__(self, trace_function=None): + """Create a TestResource object. + + :param trace_function: A callable that takes strings to output. This + will be called with trace messages when the resource is made and + cleaned. + """ self._dirty = False self._uses = 0 self._currentResource = None self.resources = list(getattr(self.__class__, "resources", [])) + self._trace = trace_function or (lambda x:"") def _clean_all(self, resource): """Clean the dependencies from resource, and then resource itself.""" + self._trace("clean: %s\n" % self) self.clean(resource) for name, manager in self.resources: manager.finishedWith(getattr(resource, name)) @@ -271,6 +279,7 @@ class TestResource(object): def _make_all(self): """Make the dependencies of this resource and this resource.""" + self._trace("make: %s\n" % self) dependency_resources = {} for name, resource in self.resources: dependency_resources[name] = resource.getResource() diff --git a/lib/testresources/tests/test_test_resource.py b/lib/testresources/tests/test_test_resource.py index a11c987..83abfbe 100644 --- a/lib/testresources/tests/test_test_resource.py +++ b/lib/testresources/tests/test_test_resource.py @@ -44,8 +44,8 @@ class MockResourceInstance(object): class MockResource(testresources.TestResource): """Mock resource that logs the number of make and clean calls.""" - def __init__(self): - testresources.TestResource.__init__(self) + def __init__(self, trace_function=None): + testresources.TestResource.__init__(self, trace_function=trace_function) self.makes = 0 self.cleans = 0 @@ -275,3 +275,13 @@ class TestTestResource(testtools.TestCase): self.assertEqual(1, resource_manager.makes) resource = resource_manager.getResource() self.assertEqual(2, resource_manager.makes) + + def testTraceFunction(self): + output = [] + resource_manager = MockResource(trace_function=output.append) + expected = ["make: %s\n" % resource_manager] + r = resource_manager.getResource() + self.assertEqual(expected, output) + expected.append("clean: %s\n" % resource_manager) + resource_manager.finishedWith(r) + self.assertEqual(expected, output) -- cgit v1.2.1