Merge lp:~jml/launchpad/recipebuilder-expect-deferred into lp:launchpad

Proposed by Jonathan Lange
Status: Merged
Approved by: Julian Edwards
Approved revision: no longer in the source branch.
Merged at revision: 11606
Proposed branch: lp:~jml/launchpad/recipebuilder-expect-deferred
Merge into: lp:launchpad
Prerequisite: lp:~julian-edwards/launchpad/move-buildd-helpers
Diff against target: 206 lines (+67/-45)
3 files modified
lib/lp/buildmaster/tests/mock_slaves.py (+0/-2)
lib/lp/code/model/tests/test_recipebuilder.py (+65/-41)
lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py (+2/-2)
To merge this branch: bzr merge lp:~jml/launchpad/recipebuilder-expect-deferred
Reviewer Review Type Date Requested Status
Julian Edwards (community) Approve
Review via email: mp+36336@code.launchpad.net

Commit message

Make the recipe builder behavior tests work with an asynchronous API.

To post a comment you must log in.
Revision history for this message
Julian Edwards (julian-edwards) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/buildmaster/tests/mock_slaves.py'
2--- lib/lp/buildmaster/tests/mock_slaves.py 2010-09-22 16:14:42 +0000
3+++ lib/lp/buildmaster/tests/mock_slaves.py 2010-09-22 16:14:44 +0000
4@@ -122,13 +122,11 @@
5 return ('1.0', self.arch_tag, 'debian')
6
7 def sendFileToSlave(self, sha1, url, username="", password=""):
8- self.call_log.append('sendFileToSlave')
9 present, info = self.ensurepresent(sha1, url, username, password)
10 if not present:
11 raise CannotFetchFile(url, info)
12
13 def cacheFile(self, logger, libraryfilealias):
14- self.call_log.append('cacheFile')
15 return self.sendFileToSlave(
16 libraryfilealias.content.sha1, libraryfilealias.http_url)
17
18
19=== modified file 'lib/lp/code/model/tests/test_recipebuilder.py'
20--- lib/lp/code/model/tests/test_recipebuilder.py 2010-09-22 16:14:42 +0000
21+++ lib/lp/code/model/tests/test_recipebuilder.py 2010-09-22 16:14:44 +0000
22@@ -12,16 +12,20 @@
23 import unittest
24
25 import transaction
26+from twisted.internet import defer
27+from twisted.trial.unittest import TestCase as TrialTestCase
28 from zope.security.proxy import removeSecurityProxy
29
30 from canonical.launchpad.scripts.logger import BufferLogger
31-from canonical.testing import LaunchpadFunctionalLayer
32+from canonical.testing import (
33+ LaunchpadFunctionalLayer,
34+ TwistedLaunchpadZopelessLayer,
35+ )
36 from lp.buildmaster.enums import BuildFarmJobType
37 from lp.buildmaster.interfaces.builder import CannotBuild
38 from lp.buildmaster.interfaces.buildfarmjobbehavior import (
39 IBuildFarmJobBehavior,
40 )
41-from lp.buildmaster.manager import RecordingSlave
42 from lp.buildmaster.model.buildqueue import BuildQueue
43 from lp.buildmaster.tests.mock_slaves import (
44 MockBuilder,
45@@ -36,25 +40,16 @@
46 from lp.soyuz.model.processor import ProcessorFamilySet
47 from lp.soyuz.tests.test_publishing import SoyuzTestPublisher
48 from lp.testing import (
49+ ANONYMOUS,
50+ login_as,
51+ logout,
52 person_logged_in,
53 TestCaseWithFactory,
54 )
55-
56-
57-class TestRecipeBuilder(TestCaseWithFactory):
58-
59- layer = LaunchpadFunctionalLayer
60-
61- def test_providesInterface(self):
62- # RecipeBuildBehavior provides IBuildFarmJobBehavior.
63- recipe_builder = RecipeBuildBehavior(None)
64- self.assertProvides(recipe_builder, IBuildFarmJobBehavior)
65-
66- def test_adapts_ISourcePackageRecipeBuildJob(self):
67- # IBuildFarmJobBehavior adapts a ISourcePackageRecipeBuildJob
68- job = self.factory.makeSourcePackageRecipeBuild().makeJob()
69- job = IBuildFarmJobBehavior(job)
70- self.assertProvides(job, IBuildFarmJobBehavior)
71+from lp.testing.factory import LaunchpadObjectFactory
72+
73+
74+class RecipeBuilderTestsMixin:
75
76 def makeJob(self, recipe_registrant=None, recipe_owner=None):
77 """Create a sample `ISourcePackageRecipeBuildJob`."""
78@@ -87,6 +82,22 @@
79 job = IBuildFarmJobBehavior(job)
80 return job
81
82+
83+class TestRecipeBuilder(TestCaseWithFactory, RecipeBuilderTestsMixin):
84+
85+ layer = LaunchpadFunctionalLayer
86+
87+ def test_providesInterface(self):
88+ # RecipeBuildBehavior provides IBuildFarmJobBehavior.
89+ recipe_builder = RecipeBuildBehavior(None)
90+ self.assertProvides(recipe_builder, IBuildFarmJobBehavior)
91+
92+ def test_adapts_ISourcePackageRecipeBuildJob(self):
93+ # IBuildFarmJobBehavior adapts a ISourcePackageRecipeBuildJob
94+ job = self.factory.makeSourcePackageRecipeBuild().makeJob()
95+ job = IBuildFarmJobBehavior(job)
96+ self.assertProvides(job, IBuildFarmJobBehavior)
97+
98 def test_display_name(self):
99 # display_name contains a sane description of the job
100 job = self.makeJob()
101@@ -241,32 +252,51 @@
102 job.build, distroarchseries, None)
103 self.assertEqual(args["archives"], expected_archives)
104
105+ def test_getById(self):
106+ job = self.makeJob()
107+ transaction.commit()
108+ self.assertEquals(
109+ job.build, SourcePackageRecipeBuild.getById(job.build.id))
110+
111+
112+class TestDispatchBuildToSlave(TrialTestCase, RecipeBuilderTestsMixin):
113+
114+ layer = TwistedLaunchpadZopelessLayer
115+
116+ def setUp(self):
117+ super(TestDispatchBuildToSlave, self).setUp()
118+ self.factory = LaunchpadObjectFactory()
119+ login_as(ANONYMOUS)
120+ self.addCleanup(logout)
121+ self.layer.switchDbUser('testadmin')
122
123 def test_dispatchBuildToSlave(self):
124 # Ensure dispatchBuildToSlave will make the right calls to the slave
125 job = self.makeJob()
126 test_publisher = SoyuzTestPublisher()
127 test_publisher.addFakeChroots(job.build.distroseries)
128- slave = RecordingSlave("i386-slave-1", "http://myurl", "vmhost")
129+ slave = OkSlave()
130 builder = MockBuilder("bob-de-bouwer", slave)
131 processorfamily = ProcessorFamilySet().getByProcessorName('386')
132 builder.processor = processorfamily.processors[0]
133 job.setBuilder(builder)
134 logger = BufferLogger()
135- job.dispatchBuildToSlave("someid", logger)
136- logger.buffer.seek(0)
137- self.assertEquals(
138- "DEBUG: Initiating build 1-someid on http://fake:0000\n",
139- logger.buffer.readline())
140- self.assertEquals(["ensurepresent", "build"],
141- [call[0] for call in slave.calls])
142- build_args = slave.calls[1][1]
143- self.assertEquals(
144- build_args[0], job.buildfarmjob.generateSlaveBuildCookie())
145- self.assertEquals(build_args[1], "sourcepackagerecipe")
146- self.assertEquals(build_args[3], {})
147- distroarchseries = job.build.distroseries.architectures[0]
148- self.assertEqual(build_args[4], job._extraBuildArgs(distroarchseries))
149+ d = defer.maybeDeferred(job.dispatchBuildToSlave, "someid", logger)
150+ def check_dispatch(ignored):
151+ logger.buffer.seek(0)
152+ self.assertEquals(
153+ "DEBUG: Initiating build 1-someid on http://fake:0000\n",
154+ logger.buffer.readline())
155+ self.assertEquals(["ensurepresent", "build"],
156+ [call[0] for call in slave.call_log])
157+ build_args = slave.call_log[1][1:]
158+ self.assertEquals(
159+ build_args[0], job.buildfarmjob.generateSlaveBuildCookie())
160+ self.assertEquals(build_args[1], "sourcepackagerecipe")
161+ self.assertEquals(build_args[3], [])
162+ distroarchseries = job.build.distroseries.architectures[0]
163+ self.assertEqual(build_args[4], job._extraBuildArgs(distroarchseries))
164+ return d.addCallback(check_dispatch)
165
166 def test_dispatchBuildToSlave_nochroot(self):
167 # dispatchBuildToSlave will fail when there is not chroot tarball
168@@ -277,14 +307,8 @@
169 builder.processor = processorfamily.processors[0]
170 job.setBuilder(builder)
171 logger = BufferLogger()
172- self.assertRaises(CannotBuild, job.dispatchBuildToSlave,
173- "someid", logger)
174-
175- def test_getById(self):
176- job = self.makeJob()
177- transaction.commit()
178- self.assertEquals(
179- job.build, SourcePackageRecipeBuild.getById(job.build.id))
180+ d = defer.maybeDeferred(job.dispatchBuildToSlave, "someid", logger)
181+ return self.assertFailure(d, CannotBuild)
182
183
184 def test_suite():
185
186=== modified file 'lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py'
187--- lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py 2010-09-22 16:14:42 +0000
188+++ lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py 2010-09-22 16:14:44 +0000
189@@ -94,7 +94,7 @@
190 extra_urls = []
191
192 upload_logs = [
193- ['cacheFile', 'sendFileToSlave', ('ensurepresent', url, '', '')]
194+ ('ensurepresent', url, '', '')
195 for url in [chroot.http_url] + extra_urls]
196
197 extra_args = {
198@@ -110,7 +110,7 @@
199 build_log = [
200 ('build', build_id, 'binarypackage', chroot.content.sha1,
201 filemap_names, extra_args)]
202- return sum(upload_logs, []) + build_log
203+ return upload_logs + build_log
204
205 def startBuild(self, builder, candidate):
206 builder = removeSecurityProxy(builder)