Merge lp:~lifeless/testresources/bug-324202 into lp:~lifeless/testresources/trunk

Proposed by Robert Collins
Status: Merged
Merged at revision: not available
Proposed branch: lp:~lifeless/testresources/bug-324202
Merge into: lp:~lifeless/testresources/trunk
Diff against target: None lines
To merge this branch: bzr merge lp:~lifeless/testresources/bug-324202
Reviewer Review Type Date Requested Status
James Henstridge (community) Approve
Jonathan Lange Pending
Review via email: mp+7540@code.launchpad.net
To post a comment you must log in.
Revision history for this message
James Henstridge (jamesh) wrote :

Looks good to me.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'NEWS'
2--- NEWS 2009-06-17 09:11:03 +0000
3+++ NEWS 2009-06-17 10:23:42 +0000
4@@ -29,6 +29,9 @@
5 * All resources are dropped when a test with no declared resources is run.
6 (James Henstridge)
7
8+ * A dirty or changed dependency of a resource makes the resource dirty too.
9+ (Robert Collins, #324202)
10+
11 API CHANGES:
12
13 * adsorbSuite is now deprecated in favour of addTest. addTest now flattens
14
15=== modified file 'lib/testresources/__init__.py'
16--- lib/testresources/__init__.py 2009-06-17 09:32:04 +0000
17+++ lib/testresources/__init__.py 2009-06-17 10:23:42 +0000
18@@ -246,11 +246,29 @@
19 """
20 if self._uses == 0:
21 self._setResource(self.make_all())
22- elif self._dirty:
23+ elif self.isDirty():
24 self._resetResource(self._currentResource)
25 self._uses += 1
26 return self._currentResource
27
28+ def isDirty(self):
29+ """Return True if this managers cached resource is dirty.
30+
31+ Calling when the resource is not currently held has undefined
32+ behaviour.
33+ """
34+ if self._dirty:
35+ return True
36+ for name, mgr in self.resources:
37+ if mgr.isDirty():
38+ return True
39+ res = mgr.getResource()
40+ try:
41+ if res is not getattr(self._currentResource, name):
42+ return True
43+ finally:
44+ mgr.finishedWith(res)
45+
46 def make_all(self):
47 """Make the dependencies of this resource and this resource."""
48 dependency_resources = {}
49
50=== modified file 'lib/testresources/tests/test_test_resource.py'
51--- lib/testresources/tests/test_test_resource.py 2009-06-17 09:32:04 +0000
52+++ lib/testresources/tests/test_test_resource.py 2009-06-17 10:23:42 +0000
53@@ -29,6 +29,18 @@
54 return result
55
56
57+class MockResourceInstance(object):
58+
59+ def __init__(self, name):
60+ self._name = name
61+
62+ def __cmp__(self, other):
63+ return cmp(self.__dict__, other.__dict__)
64+
65+ def __repr__(self):
66+ return self._name
67+
68+
69 class MockResource(testresources.TestResource):
70 """Mock resource that logs the number of make and clean calls."""
71
72@@ -42,7 +54,7 @@
73
74 def make(self, dependency_resources):
75 self.makes += 1
76- return "Boo!"
77+ return MockResourceInstance("Boo!")
78
79
80 class TestTestResource(testtools.TestCase):
81@@ -130,6 +142,41 @@
82 resource_manager.getResource()
83 self.assertEqual(1, resource_manager.makes)
84
85+ def testIsDirty(self):
86+ resource_manager = MockResource()
87+ r = resource_manager.getResource()
88+ resource_manager.dirtied(r)
89+ self.assertTrue(resource_manager.isDirty())
90+ resource_manager.finishedWith(r)
91+
92+ def testIsDirtyIsTrueIfDependenciesChanged(self):
93+ resource_manager = MockResource()
94+ dep1 = MockResource()
95+ dep2 = MockResource()
96+ dep3 = MockResource()
97+ resource_manager.resources.append(("dep1", dep1))
98+ resource_manager.resources.append(("dep2", dep2))
99+ resource_manager.resources.append(("dep3", dep3))
100+ r = resource_manager.getResource()
101+ dep2.dirtied(r.dep2)
102+ r2 =dep2.getResource()
103+ self.assertTrue(resource_manager.isDirty())
104+ resource_manager.finishedWith(r)
105+ dep2.finishedWith(r2)
106+
107+ def testIsDirtyIsTrueIfDependenciesAreDirty(self):
108+ resource_manager = MockResource()
109+ dep1 = MockResource()
110+ dep2 = MockResource()
111+ dep3 = MockResource()
112+ resource_manager.resources.append(("dep1", dep1))
113+ resource_manager.resources.append(("dep2", dep2))
114+ resource_manager.resources.append(("dep3", dep3))
115+ r = resource_manager.getResource()
116+ dep2.dirtied(r.dep2)
117+ self.assertTrue(resource_manager.isDirty())
118+ resource_manager.finishedWith(r)
119+
120 def testRepeatedGetResourceCallsMakeResourceOnceOnly(self):
121 resource_manager = MockResource()
122 resource_manager.getResource()

Subscribers

People subscribed via source and target branches

to all changes: