def test_makeDailyBuilds_logs_builds(self): # If a logger is passed into the makeDailyBuilds method, each recipe # that a build is requested for gets logged. owner = self.factory.makePerson(name='eric') self.factory.makeSourcePackageRecipe( owner=owner, name=u'funky-recipe', build_daily=True) logger = BufferLogger() SourcePackageRecipeBuild.makeDailyBuilds(logger) self.assertEqual( 'DEBUG Recipe eric/funky-recipe is stale\n' 'DEBUG - build requested for Warty (4.10)\n', logger.getLogBuffer())
def test_makeDailyBuilds_with_disallowed_series(self): # If a recipe is set to build into a disallowed series, # makeDailyBuilds won't OOPS. recipe = self.factory.makeSourcePackageRecipe(build_daily=True, is_stale=True) self.factory.makeArchive(owner=recipe.owner) logger = BufferLogger() distroseries = list(recipe.distroseries)[0] removeSecurityProxy(distroseries).status = SeriesStatus.OBSOLETE SourcePackageRecipeBuild.makeDailyBuilds(logger) self.assertEqual([], self.oopses) self.assertIn("DEBUG - cannot build against Warty (4.10).", logger.getLogBuffer())
def test_makeDailyBuilds_with_disallowed_series(self): # If a recipe is set to build into a disallowed series, # makeDailyBuilds won't OOPS. recipe = self.factory.makeSourcePackageRecipe( build_daily=True, is_stale=True) self.factory.makeArchive(owner=recipe.owner) logger = BufferLogger() distroseries = list(recipe.distroseries)[0] removeSecurityProxy(distroseries).status = SeriesStatus.OBSOLETE SourcePackageRecipeBuild.makeDailyBuilds(logger) self.assertEquals([], self.oopses) self.assertIn( "DEBUG - cannot build against Warty (4.10).", logger.getLogBuffer())
def test_getByBuildFarmJobs(self): sprbs = [self.makeSourcePackageRecipeBuild() for i in range(10)] Store.of(sprbs[0]).flush() self.assertContentEqual( sprbs, SourcePackageRecipeBuild.getByBuildFarmJobs( [sprb.build_farm_job for sprb in sprbs]))
def test_makeDailyBuilds_skips_builds_already_queued(self): # If the recipe already has an identical build pending, # makeDailyBuilds() won't create a build. owner = self.factory.makePerson(name='eric') recipe = self.factory.makeSourcePackageRecipe(owner=owner, name='funky-recipe', build_daily=True, is_stale=True) series = list(recipe.distroseries)[0] self.factory.makeSourcePackageRecipeBuild( recipe=recipe, archive=recipe.daily_build_archive, requester=recipe.owner, distroseries=series, pocket=PackagePublishingPocket.RELEASE, date_created=datetime.now(utc) - timedelta(hours=24, seconds=1)) removeSecurityProxy(recipe).is_stale = True logger = BufferLogger() daily_builds = SourcePackageRecipeBuild.makeDailyBuilds(logger) self.assertEqual([], daily_builds) self.assertEqual( 'DEBUG Recipe eric/funky-recipe is stale\n' 'DEBUG - build already pending for Warty (4.10)\n', logger.getLogBuffer())
def test_makeDailyBuilds_skips_missing_archive(self): """When creating daily builds, skip ones that are already pending.""" recipe = self.factory.makeSourcePackageRecipe( build_daily=True, is_stale=True) with person_logged_in(recipe.owner): recipe.daily_build_archive = None builds = SourcePackageRecipeBuild.makeDailyBuilds() self.assertEqual([], builds)
def test_makeDailyBuilds_skips_if_built_in_last_24_hours(self): # We won't create a build during makeDailyBuilds() if the recipe # has been built in the last 24 hours. recipe = self.factory.makeSourcePackageRecipe( build_daily=True, is_stale=True) recipe.requestBuild( recipe.daily_build_archive, recipe.owner, list(recipe.distroseries)[0], PackagePublishingPocket.RELEASE) daily_builds = SourcePackageRecipeBuild.makeDailyBuilds() self.assertEqual([], daily_builds)
def test_makeDailyBuilds_with_an_older_build(self): # If a previous build is more than 24 hours old, and the recipe is # stale, we'll fire another off. recipe = self.factory.makeSourcePackageRecipe( build_daily=True, is_stale=True) build = self.factory.makeSourcePackageRecipeBuild( recipe=recipe, archive=recipe.daily_build_archive, requester=recipe.owner, distroseries=list(recipe.distroseries)[0], pocket=PackagePublishingPocket.RELEASE, date_created=datetime.now(utc) - timedelta(hours=24, seconds=1), status=BuildStatus.FULLYBUILT) daily_builds = SourcePackageRecipeBuild.makeDailyBuilds() self.assertEquals(1, len(daily_builds)) actual_title = [b.title for b in daily_builds] self.assertEquals([build.title], actual_title)
def test_makeDailyBuilds_with_an_older_and_newer_build(self): # If a recipe has been built twice, and the most recent build is # within 24 hours, makeDailyBuilds() won't create a build. recipe = self.factory.makeSourcePackageRecipe( build_daily=True, is_stale=True) for timediff in (timedelta(hours=24, seconds=1), timedelta(hours=8)): self.factory.makeSourcePackageRecipeBuild( recipe=recipe, archive=recipe.daily_build_archive, requester=recipe.owner, distroseries=list(recipe.distroseries)[0], pocket=PackagePublishingPocket.RELEASE, date_created=datetime.now(utc) - timediff, status=BuildStatus.FULLYBUILT) daily_builds = SourcePackageRecipeBuild.makeDailyBuilds() self.assertEquals([], list(daily_builds))
def test_makeDailyBuilds_with_new_build_different_archive(self): # If a recipe has been built into an archive that isn't the # daily_build_archive, we will create a build. recipe = self.factory.makeSourcePackageRecipe( build_daily=True, is_stale=True) archive = self.factory.makeArchive(owner=recipe.owner) build = self.factory.makeSourcePackageRecipeBuild( recipe=recipe, archive=archive, requester=recipe.owner, distroseries=list(recipe.distroseries)[0], pocket=PackagePublishingPocket.RELEASE, date_created=datetime.now(utc) - timedelta(hours=8), status=BuildStatus.FULLYBUILT) daily_builds = SourcePackageRecipeBuild.makeDailyBuilds() actual_title = [b.title for b in daily_builds] self.assertEquals([build.title], actual_title)
def test_makeDailyBuilds_skips_disabled_archive(self): # If the recipe's daily build archive is disabled, makeDailyBuilds() # won't create a build. owner = self.factory.makePerson(name='eric') recipe = self.factory.makeSourcePackageRecipe( owner=owner, name=u'funky-recipe', build_daily=True, is_stale=True) archive = self.factory.makeArchive(owner=recipe.owner, name="ppa") removeSecurityProxy(recipe).daily_build_archive = archive removeSecurityProxy(archive).disable() logger = BufferLogger() daily_builds = SourcePackageRecipeBuild.makeDailyBuilds(logger) self.assertEqual([], daily_builds) self.assertEqual( 'DEBUG Recipe eric/funky-recipe is stale\n' 'DEBUG - daily build failed for Warty (4.10): ' + "ArchiveDisabled(u'PPA for Eric is disabled.',)\n", logger.getLogBuffer())
def test_makeDailyBuilds_skips_archive_with_no_permission(self): # If the recipe's daily build archive cannot be uploaded to due to # insufficient permissions, makeDailyBuilds() won't create a build. owner = self.factory.makePerson(name='eric') recipe = self.factory.makeSourcePackageRecipe( owner=owner, name=u'funky-recipe', build_daily=True, is_stale=True) archive = self.factory.makeArchive(name="ppa") removeSecurityProxy(recipe).daily_build_archive = archive logger = BufferLogger() daily_builds = SourcePackageRecipeBuild.makeDailyBuilds(logger) self.assertEqual([], daily_builds) self.assertEqual( 'DEBUG Recipe eric/funky-recipe is stale\n' 'DEBUG - daily build failed for Warty (4.10): ' "CannotUploadToPPA('Signer has no upload rights " "to this PPA.',)\n", logger.getLogBuffer())
def test_makeDailyBuilds_skips_builds_already_queued(self): # If the recipe already has an identical build pending, # makeDailyBuilds() won't create a build. owner = self.factory.makePerson(name='eric') recipe = self.factory.makeSourcePackageRecipe( owner=owner, name=u'funky-recipe', build_daily=True, is_stale=True) series = list(recipe.distroseries)[0] self.factory.makeSourcePackageRecipeBuild( recipe=recipe, archive=recipe.daily_build_archive, requester=recipe.owner, distroseries=series, pocket=PackagePublishingPocket.RELEASE, date_created=datetime.now(utc) - timedelta(hours=24, seconds=1)) removeSecurityProxy(recipe).is_stale = True logger = BufferLogger() daily_builds = SourcePackageRecipeBuild.makeDailyBuilds(logger) self.assertEqual([], daily_builds) self.assertEqual( 'DEBUG Recipe eric/funky-recipe is stale\n' 'DEBUG - build already pending for Warty (4.10)\n', logger.getLogBuffer())
def isOverQuota(self, requester, distroseries): """See `ISourcePackageRecipe`.""" return SourcePackageRecipeBuild.getRecentBuilds( requester, self, distroseries).count() >= 5
def test_getByID(self): job = self.makeJob() transaction.commit() self.assertEquals(job.build, SourcePackageRecipeBuild.getByID(job.build.id))
def preloadJobsData(cls, jobs): load_related(Job, jobs, ['job_id']) builds = load_related( SourcePackageRecipeBuild, jobs, ['build_id']) SourcePackageRecipeBuild.preloadBuildsData(builds)
def test_getByBuildFarmJobs_empty(self): self.assertContentEqual( [], SourcePackageRecipeBuild.getByBuildFarmJobs([]))
def preloadJobsData(cls, jobs): load_related(Job, jobs, ['job_id']) builds = load_related(SourcePackageRecipeBuild, jobs, ['build_id']) SourcePackageRecipeBuild.preloadBuildsData(builds)
def test_getByBuildFarmJob(self): sprb = self.makeSourcePackageRecipeBuild() Store.of(sprb).flush() self.assertEqual( sprb, SourcePackageRecipeBuild.getByBuildFarmJob(sprb.build_farm_job))
def get_recent(): Store.of(build).flush() return SourcePackageRecipeBuild.getRecentBuilds( requester, recipe, series, _now=now)
def test_makeDailyBuilds(self): self.assertEqual([], SourcePackageRecipeBuild.makeDailyBuilds()) recipe = self.factory.makeSourcePackageRecipe(build_daily=True) [build] = SourcePackageRecipeBuild.makeDailyBuilds() self.assertEqual(recipe, build.recipe) self.assertEqual(list(recipe.distroseries), [build.distroseries])
def test_makeDailyBuilds_clears_is_stale(self): recipe = self.factory.makeSourcePackageRecipe( build_daily=True, is_stale=True) SourcePackageRecipeBuild.makeDailyBuilds()[0] self.assertFalse(recipe.is_stale)
def test_makeDailyBuilds_skips_non_stale_builds(self): # If the recipe isn't stale, makeDailyBuilds() won't create a build. self.factory.makeSourcePackageRecipe( build_daily=True, is_stale=False) daily_builds = SourcePackageRecipeBuild.makeDailyBuilds() self.assertEqual([], daily_builds)