summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Collins <robertc@robertcollins.net>2009-07-07 21:11:21 +1000
committerRobert Collins <robertc@robertcollins.net>2009-07-07 21:11:21 +1000
commitac557b5c20ac3c0d60cbfd9682ccc70594a7db28 (patch)
tree4737105d0f71106199dd3ff8f99f32796620fae9
parentbb6ffa43e6302160f1ef8d67f33e8316d8c1ceff (diff)
parent6c40fbcb817b9c9ab49585184db6f3209c32a702 (diff)
downloadtestresources-ac557b5c20ac3c0d60cbfd9682ccc70594a7db28.tar.gz
Merge support for trace_functions in TestResource.
-rw-r--r--NEWS4
-rw-r--r--lib/testresources/__init__.py13
-rw-r--r--lib/testresources/tests/test_test_resource.py18
3 files changed, 32 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index e78c696..ffaf75f 100644
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,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 da26136..2c1b086 100644
--- a/lib/testresources/__init__.py
+++ b/lib/testresources/__init__.py
@@ -197,17 +197,26 @@ 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 (event_label,
+ "start"|"stop", resource). This will be called with to tracec
+ events 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,y,z:"")
def _clean_all(self, resource):
"""Clean the dependencies from resource, and then resource itself."""
+ self._trace("clean", "start", self)
self.clean(resource)
for name, manager in self.resources:
manager.finishedWith(getattr(resource, name))
+ self._trace("clean", "stop", self)
def clean(self, resource):
"""Override this to class method to hook into resource removal."""
@@ -271,12 +280,14 @@ class TestResource(object):
def _make_all(self):
"""Make the dependencies of this resource and this resource."""
+ self._trace("make", "start", self)
dependency_resources = {}
for name, resource in self.resources:
dependency_resources[name] = resource.getResource()
result = self.make(dependency_resources)
for name, value in dependency_resources.items():
setattr(result, name, value)
+ self._trace("make", "stop", self)
return result
def make(self, dependency_resources):
diff --git a/lib/testresources/tests/test_test_resource.py b/lib/testresources/tests/test_test_resource.py
index 4d89469..9a3bedd 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
@@ -325,3 +325,17 @@ class TestTestResource(testtools.TestCase):
self.assertEqual(1, resource_manager.makes)
resource = resource_manager.getResource()
self.assertEqual(2, resource_manager.makes)
+
+ def testTraceFunction(self):
+ output = []
+ def trace(operation, phase, mgr):
+ output.append((operation, phase, mgr))
+ resource_manager = MockResource(trace_function=trace)
+ expected = [("make", "start", resource_manager),
+ ("make", "stop", resource_manager)]
+ r = resource_manager.getResource()
+ self.assertEqual(expected, output)
+ expected.extend([("clean", "start", resource_manager),
+ ("clean", "stop", resource_manager)])
+ resource_manager.finishedWith(r)
+ self.assertEqual(expected, output)