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
=== modified file 'lib/lp/buildmaster/tests/mock_slaves.py'
--- lib/lp/buildmaster/tests/mock_slaves.py 2010-09-22 16:14:42 +0000
+++ lib/lp/buildmaster/tests/mock_slaves.py 2010-09-22 16:14:44 +0000
@@ -122,13 +122,11 @@
122 return ('1.0', self.arch_tag, 'debian')122 return ('1.0', self.arch_tag, 'debian')
123123
124 def sendFileToSlave(self, sha1, url, username="", password=""):124 def sendFileToSlave(self, sha1, url, username="", password=""):
125 self.call_log.append('sendFileToSlave')
126 present, info = self.ensurepresent(sha1, url, username, password)125 present, info = self.ensurepresent(sha1, url, username, password)
127 if not present:126 if not present:
128 raise CannotFetchFile(url, info)127 raise CannotFetchFile(url, info)
129128
130 def cacheFile(self, logger, libraryfilealias):129 def cacheFile(self, logger, libraryfilealias):
131 self.call_log.append('cacheFile')
132 return self.sendFileToSlave(130 return self.sendFileToSlave(
133 libraryfilealias.content.sha1, libraryfilealias.http_url)131 libraryfilealias.content.sha1, libraryfilealias.http_url)
134132
135133
=== modified file 'lib/lp/code/model/tests/test_recipebuilder.py'
--- lib/lp/code/model/tests/test_recipebuilder.py 2010-09-22 16:14:42 +0000
+++ lib/lp/code/model/tests/test_recipebuilder.py 2010-09-22 16:14:44 +0000
@@ -12,16 +12,20 @@
12import unittest12import unittest
1313
14import transaction14import transaction
15from twisted.internet import defer
16from twisted.trial.unittest import TestCase as TrialTestCase
15from zope.security.proxy import removeSecurityProxy17from zope.security.proxy import removeSecurityProxy
1618
17from canonical.launchpad.scripts.logger import BufferLogger19from canonical.launchpad.scripts.logger import BufferLogger
18from canonical.testing import LaunchpadFunctionalLayer20from canonical.testing import (
21 LaunchpadFunctionalLayer,
22 TwistedLaunchpadZopelessLayer,
23 )
19from lp.buildmaster.enums import BuildFarmJobType24from lp.buildmaster.enums import BuildFarmJobType
20from lp.buildmaster.interfaces.builder import CannotBuild25from lp.buildmaster.interfaces.builder import CannotBuild
21from lp.buildmaster.interfaces.buildfarmjobbehavior import (26from lp.buildmaster.interfaces.buildfarmjobbehavior import (
22 IBuildFarmJobBehavior,27 IBuildFarmJobBehavior,
23 )28 )
24from lp.buildmaster.manager import RecordingSlave
25from lp.buildmaster.model.buildqueue import BuildQueue29from lp.buildmaster.model.buildqueue import BuildQueue
26from lp.buildmaster.tests.mock_slaves import (30from lp.buildmaster.tests.mock_slaves import (
27 MockBuilder,31 MockBuilder,
@@ -36,25 +40,16 @@
36from lp.soyuz.model.processor import ProcessorFamilySet40from lp.soyuz.model.processor import ProcessorFamilySet
37from lp.soyuz.tests.test_publishing import SoyuzTestPublisher41from lp.soyuz.tests.test_publishing import SoyuzTestPublisher
38from lp.testing import (42from lp.testing import (
43 ANONYMOUS,
44 login_as,
45 logout,
39 person_logged_in,46 person_logged_in,
40 TestCaseWithFactory,47 TestCaseWithFactory,
41 )48 )
4249from lp.testing.factory import LaunchpadObjectFactory
4350
44class TestRecipeBuilder(TestCaseWithFactory):51
4552class RecipeBuilderTestsMixin:
46 layer = LaunchpadFunctionalLayer
47
48 def test_providesInterface(self):
49 # RecipeBuildBehavior provides IBuildFarmJobBehavior.
50 recipe_builder = RecipeBuildBehavior(None)
51 self.assertProvides(recipe_builder, IBuildFarmJobBehavior)
52
53 def test_adapts_ISourcePackageRecipeBuildJob(self):
54 # IBuildFarmJobBehavior adapts a ISourcePackageRecipeBuildJob
55 job = self.factory.makeSourcePackageRecipeBuild().makeJob()
56 job = IBuildFarmJobBehavior(job)
57 self.assertProvides(job, IBuildFarmJobBehavior)
5853
59 def makeJob(self, recipe_registrant=None, recipe_owner=None):54 def makeJob(self, recipe_registrant=None, recipe_owner=None):
60 """Create a sample `ISourcePackageRecipeBuildJob`."""55 """Create a sample `ISourcePackageRecipeBuildJob`."""
@@ -87,6 +82,22 @@
87 job = IBuildFarmJobBehavior(job)82 job = IBuildFarmJobBehavior(job)
88 return job83 return job
8984
85
86class TestRecipeBuilder(TestCaseWithFactory, RecipeBuilderTestsMixin):
87
88 layer = LaunchpadFunctionalLayer
89
90 def test_providesInterface(self):
91 # RecipeBuildBehavior provides IBuildFarmJobBehavior.
92 recipe_builder = RecipeBuildBehavior(None)
93 self.assertProvides(recipe_builder, IBuildFarmJobBehavior)
94
95 def test_adapts_ISourcePackageRecipeBuildJob(self):
96 # IBuildFarmJobBehavior adapts a ISourcePackageRecipeBuildJob
97 job = self.factory.makeSourcePackageRecipeBuild().makeJob()
98 job = IBuildFarmJobBehavior(job)
99 self.assertProvides(job, IBuildFarmJobBehavior)
100
90 def test_display_name(self):101 def test_display_name(self):
91 # display_name contains a sane description of the job102 # display_name contains a sane description of the job
92 job = self.makeJob()103 job = self.makeJob()
@@ -241,32 +252,51 @@
241 job.build, distroarchseries, None)252 job.build, distroarchseries, None)
242 self.assertEqual(args["archives"], expected_archives)253 self.assertEqual(args["archives"], expected_archives)
243254
255 def test_getById(self):
256 job = self.makeJob()
257 transaction.commit()
258 self.assertEquals(
259 job.build, SourcePackageRecipeBuild.getById(job.build.id))
260
261
262class TestDispatchBuildToSlave(TrialTestCase, RecipeBuilderTestsMixin):
263
264 layer = TwistedLaunchpadZopelessLayer
265
266 def setUp(self):
267 super(TestDispatchBuildToSlave, self).setUp()
268 self.factory = LaunchpadObjectFactory()
269 login_as(ANONYMOUS)
270 self.addCleanup(logout)
271 self.layer.switchDbUser('testadmin')
244272
245 def test_dispatchBuildToSlave(self):273 def test_dispatchBuildToSlave(self):
246 # Ensure dispatchBuildToSlave will make the right calls to the slave274 # Ensure dispatchBuildToSlave will make the right calls to the slave
247 job = self.makeJob()275 job = self.makeJob()
248 test_publisher = SoyuzTestPublisher()276 test_publisher = SoyuzTestPublisher()
249 test_publisher.addFakeChroots(job.build.distroseries)277 test_publisher.addFakeChroots(job.build.distroseries)
250 slave = RecordingSlave("i386-slave-1", "http://myurl", "vmhost")278 slave = OkSlave()
251 builder = MockBuilder("bob-de-bouwer", slave)279 builder = MockBuilder("bob-de-bouwer", slave)
252 processorfamily = ProcessorFamilySet().getByProcessorName('386')280 processorfamily = ProcessorFamilySet().getByProcessorName('386')
253 builder.processor = processorfamily.processors[0]281 builder.processor = processorfamily.processors[0]
254 job.setBuilder(builder)282 job.setBuilder(builder)
255 logger = BufferLogger()283 logger = BufferLogger()
256 job.dispatchBuildToSlave("someid", logger)284 d = defer.maybeDeferred(job.dispatchBuildToSlave, "someid", logger)
257 logger.buffer.seek(0)285 def check_dispatch(ignored):
258 self.assertEquals(286 logger.buffer.seek(0)
259 "DEBUG: Initiating build 1-someid on http://fake:0000\n",287 self.assertEquals(
260 logger.buffer.readline())288 "DEBUG: Initiating build 1-someid on http://fake:0000\n",
261 self.assertEquals(["ensurepresent", "build"],289 logger.buffer.readline())
262 [call[0] for call in slave.calls])290 self.assertEquals(["ensurepresent", "build"],
263 build_args = slave.calls[1][1]291 [call[0] for call in slave.call_log])
264 self.assertEquals(292 build_args = slave.call_log[1][1:]
265 build_args[0], job.buildfarmjob.generateSlaveBuildCookie())293 self.assertEquals(
266 self.assertEquals(build_args[1], "sourcepackagerecipe")294 build_args[0], job.buildfarmjob.generateSlaveBuildCookie())
267 self.assertEquals(build_args[3], {})295 self.assertEquals(build_args[1], "sourcepackagerecipe")
268 distroarchseries = job.build.distroseries.architectures[0]296 self.assertEquals(build_args[3], [])
269 self.assertEqual(build_args[4], job._extraBuildArgs(distroarchseries))297 distroarchseries = job.build.distroseries.architectures[0]
298 self.assertEqual(build_args[4], job._extraBuildArgs(distroarchseries))
299 return d.addCallback(check_dispatch)
270300
271 def test_dispatchBuildToSlave_nochroot(self):301 def test_dispatchBuildToSlave_nochroot(self):
272 # dispatchBuildToSlave will fail when there is not chroot tarball302 # dispatchBuildToSlave will fail when there is not chroot tarball
@@ -277,14 +307,8 @@
277 builder.processor = processorfamily.processors[0]307 builder.processor = processorfamily.processors[0]
278 job.setBuilder(builder)308 job.setBuilder(builder)
279 logger = BufferLogger()309 logger = BufferLogger()
280 self.assertRaises(CannotBuild, job.dispatchBuildToSlave,310 d = defer.maybeDeferred(job.dispatchBuildToSlave, "someid", logger)
281 "someid", logger)311 return self.assertFailure(d, CannotBuild)
282
283 def test_getById(self):
284 job = self.makeJob()
285 transaction.commit()
286 self.assertEquals(
287 job.build, SourcePackageRecipeBuild.getById(job.build.id))
288312
289313
290def test_suite():314def test_suite():
291315
=== modified file 'lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py'
--- lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py 2010-09-22 16:14:42 +0000
+++ lib/lp/soyuz/tests/test_binarypackagebuildbehavior.py 2010-09-22 16:14:44 +0000
@@ -94,7 +94,7 @@
94 extra_urls = []94 extra_urls = []
9595
96 upload_logs = [96 upload_logs = [
97 ['cacheFile', 'sendFileToSlave', ('ensurepresent', url, '', '')]97 ('ensurepresent', url, '', '')
98 for url in [chroot.http_url] + extra_urls]98 for url in [chroot.http_url] + extra_urls]
9999
100 extra_args = {100 extra_args = {
@@ -110,7 +110,7 @@
110 build_log = [110 build_log = [
111 ('build', build_id, 'binarypackage', chroot.content.sha1,111 ('build', build_id, 'binarypackage', chroot.content.sha1,
112 filemap_names, extra_args)]112 filemap_names, extra_args)]
113 return sum(upload_logs, []) + build_log113 return upload_logs + build_log
114114
115 def startBuild(self, builder, candidate):115 def startBuild(self, builder, candidate):
116 builder = removeSecurityProxy(builder)116 builder = removeSecurityProxy(builder)