def testRestartWithLoadInstalled(self): simpleRecipe = 'loadInstalled("foo")\n' + recipes.simpleRecipe simpleSource = self.addComponent('simple:source=1-1', [('simple.recipe', simpleRecipe)]) fooSource = self.addComponent('foo:source=1-1', [('foo.recipe', fooRecipe)]) simpleRun = self.addComponent('simple:runtime=1-1-1') simpleColl = self.addCollection('simple=1-1-1', [':runtime'], loadedReqs=[(fooSource, 'ssl')]) job = self.newJob(simpleSource) db = self.openRmakeDatabase() b = builder.Builder(self.rmakeCfg, job, [], db) b.initializeBuild() simpleBt = job.iterTroves().next() simpleBt.troveBuilt([ simpleColl.getNameVersionFlavor(), simpleRun.getNameVersionFlavor() ]) restartJob = self.getRestartJob(job) jobContext = [job.jobId] b = builder.Builder(self.rmakeCfg, restartJob, jobContext, db) b.initializeBuild() trove = restartJob.iterTroves().next() assert (trove.isPrebuilt()) assert (trove.superClassesMatch) fooSource = self.addComponent('foo:source=1-2', [('foo.recipe', fooRecipe)]) restartJob = self.getRestartJob(job) jobContext = [job.jobId] b = builder.Builder(self.rmakeCfg, restartJob, jobContext, db) b.initializeBuild() trove = restartJob.iterTroves().next() assert (trove.isPrebuilt()) assert (not trove.superClassesMatch)
def testLoad2LevelsDeep(self): myLoadedRecipe = loadedRecipe.replace('@@', '1') myLoadedRecipe = "loadSuperClass('loaded2')\n" + myLoadedRecipe loadedSrc = self.addComponent('loaded:source', ':branch/1', [('loaded.recipe', myLoadedRecipe)]) self.addComponent('loaded:runtime', ':branch/1') loaded = self.addCollection('loaded', ':branch/1', ['loaded:runtime']) loaded2 = self.addComponent('loaded2:source', ':branch2/1', [('loaded2.recipe', loaded2Recipe)]) loadInstalled = self.addComponent( 'loadinstalled:source', '1', [('loadinstalled.recipe', loadInstalledRecipe)]) buildCfg = copy.deepcopy(self.buildCfg) buildCfg.resolveTroveTups = [[ loaded.getNameVersionFlavor(), loaded2.getNameVersionFlavor() ]] job = self.newJob(loadInstalled, buildConfig=buildCfg) b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() buildTrove = job.iterTroves().next() assert (buildTrove.packages == set(['loadinstalled', 'loaded-1'])) assert (buildTrove.getLoadedSpecs() == dict( loaded=(loadedSrc.getNameVersionFlavor(), dict(loaded2=(loaded2.getNameVersionFlavor(), {}))))) # make sure that the correct version are loaded using loadRecipeClass # normally using loadRecipeClass we'd just load out of the repository self.addComponent('loaded:source', '1', [('loaded.recipe', myLoadedRecipe)]) n, v, f = loadInstalled.getNameVersionFlavor() repos = self.openRepository() repos = self.openRmakeRepository() loader, recipeClass = recipeutil.loadRecipeClass( repos, n, v, f, overrides=buildTrove.getLoadedSpecs())[0:2] if hasattr(loader, 'getLoadedSpecs'): assert (loader.getLoadedSpecs().values()[0][0] == loadedSrc.getNameVersionFlavor()) else: assert(recipeClass._loadedSpecs.values()[0][0] \ == loadedSrc.getNameVersionFlavor()) # test that again, except for this time, make sure that cook # gets the same info - cook would never find these troves # without having it passed in from the outside. job = self.newJob(loadInstalled, buildConfig=buildCfg) b = builder.Builder(self.rmakeCfg, job) txt = self.captureOutput(b.build)[1] assert (b.job.isBuilt()) buildTrove = b.job.iterTroves().next() builtTroves = repos.getTroves( [x for x in buildTrove.getBinaryTroves() if ':' not in x[0]]) builtTroves = dict((x.getName(), x) for x in builtTroves) assert (set(builtTroves['loadinstalled'].getLoadedTroves()) == set( [loadedSrc.getNameVersionFlavor(), loaded2.getNameVersionFlavor()]))
def testLoadInstalledFromBuildingTroves(self): # this loaded is in resolveTroveTups self.addComponent('loaded:runtime', ':branch/1') trv = self.addCollection('loaded', ':branch/1', ['loaded:runtime']) # we're building this one though - it wins. # We also need to see a build ordering here. loaded = self.addComponent( 'loaded:source', ':branch2/2', [('loaded.recipe', loadedRecipe.replace('@@', '2'))]) loadInstalled = self.addComponent( 'loadinstalled:source', '1', [('loadinstalled.recipe', loadInstalledRecipe)]) buildCfg = copy.deepcopy(self.buildCfg) buildCfg.resolveTroveTups = [[trv.getNameVersionFlavor()]] job = self.newJob(loadInstalled, loaded, buildConfig=buildCfg) b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() buildTrove = [ x for x in job.iterTroves() if x.getName() == 'loadinstalled:source' ][0] assert (buildTrove.packages == set(['loadinstalled', 'loaded-2'])) resolveJob = b.dh.getNextResolveJob() assert (resolveJob.getTrove().getName() == 'loaded:source') assert (not b.dh.getNextResolveJob())
def testBuildImages(self): rbuildServer = self.startMockRbuilder() oldSleep = time.sleep self.mock(time, 'sleep', lambda x: oldSleep(.1)) self.addComponent('foo:run') trv = self.addCollection('group-foo', ['foo:run']) db = self.openRmakeDatabase() job = self.newJob() trv = self.newImageTrove(job.jobId, productName='product', imageType='imageType', imageOptions={}, *trv.getNameVersionFlavor()) trv.setConfig(self.buildCfg) job.addBuildTrove(trv) job.setBuildTroves([trv]) b = builder.Builder(self.rmakeCfg, job) self.logFilter.add() logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() try: b.build() except Exception: b.worker.stopAllCommands() raise log = db.getTroveBuildLog(1, job.troves.values()[0].getNameVersionFlavor(), 0)[1] expectedLog = '''\ 0: Working: 51 0: Working: 101 0: Working: 151 0: Finished. ''' assert(expectedLog in log)
def testPrebuiltBinaries(self): trv = self.addComponent('testcase:source', '1.0-1', '', [('testcase.recipe', workingRecipe)]) trv2 = self.addComponent('simple:source', '1.0-2', [('simple.recipe', recipes.simpleRecipe)]) binTrv = self.addCollection('testcase=1.0-1-1[ssl]', [':runtime'], createComps=True) binTrv2 = self.addCollection('testcase=1.0-1-1[!ssl]', [':runtime'], createComps=True) binTrv3 = self.addCollection('testcase=1.0-1-1', [':runtime'], createComps=True) binTrv4 = self.addCollection('simple=1.0-1-1', [':runtime']) job = self.newJob(trv, trv2) prebuilt = [ x.getNameVersionFlavor() for x in (binTrv, binTrv2, binTrv3, binTrv4)] job.getMainConfig().prebuiltBinaries = prebuilt b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() for trv in job.iterTroves(): if trv.getName().split(':')[0] in ['testcase']: assert(trv.isPrebuilt()) assert(trv.prebuiltIsSourceMatch()) else: assert(trv.isPrebuilt()) assert(not trv.prebuiltIsSourceMatch()) job = self.newJob(trv2) job.getMainConfig().prebuiltBinaries = prebuilt b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() for trv in job.iterTroves(): assert(trv.isPrebuilt()) assert(not trv.prebuiltIsSourceMatch()) binTrv5 = self.addCollection('simple=1.0-2-1', [':runtime'], loadedReqs=[binTrv.getNameVersionFlavor()]) prebuilt.append(binTrv5.getNameVersionFlavor()) job.getMainConfig().prebuiltBinaries = prebuilt b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() for trv in job.iterTroves(): assert(trv.isPrebuilt()) assert(not trv.prebuiltIsSourceMatch()) job.getMainConfig().ignoreAllRebuildDeps = True b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() for trv in job.iterTroves(): assert(trv.isPrebuilt())
def testRestart(self): self.openRepository() self.openRmakeRepository() jobId = fixtures.addBuiltJob1(self) db = self.openRmakeDatabase() job = db.getJob(jobId) logPath = job.troves.values()[0].logPath jobContext = [jobId] restartJob = self.getRestartJob(job) b = builder.Builder(self.rmakeCfg, restartJob, jobContext, db) b.initializeBuild() trove = restartJob.iterTroves().next() assert (trove.isPrebuilt()) b.build() assert (restartJob.isBuilt()) assert (trove.isBuilt()) assert (logPath == restartJob.troves.values()[0].logPath) # update the source and make sure it needs a rebuild fixtures.updateBuiltJob1(self) restartJob = self.getRestartJob(job) b = builder.Builder(self.rmakeCfg, restartJob, jobContext, db) b.initializeBuild() trove = restartJob.iterTroves().next() assert (not trove.isPrebuilt()) b.build() assert (restartJob.isBuilt()) assert (trove.isBuilt()) assert (logPath != restartJob.troves.values()[0].logPath) buildReqRun = self.addComponent('buildreq:runtime', '2', ['/buildreq']) buildReq = self.addCollection('buildreq', '2', [':runtime']) # now update build req - that should start out as prebuilt # but in the end it should create new binaries not existing before. jobContext = [restartJob.jobId] restartJob2 = self.getRestartJob(restartJob) b = builder.Builder(self.rmakeCfg, restartJob2, jobContext, db) b.initializeBuild() trove2 = restartJob2.iterTroves().next() assert (trove2.isPrebuilt()) b.dh.updateBuildableTroves() assert (trove2.isBuildable())
def testInfoRecipe(self): self.openRmakeRepository() db = self.openRmakeDatabase() trv = self.addComponent('info-sys:source', '1.0-1', '', [('info-sys.recipe', infoRecipe)]) troveList = [ trv.getNameVersionFlavor() ] job = self.newJob(*troveList) b = builder.Builder(self.rmakeCfg, job) logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() b.build() logFile.restoreOutput() assert(b.job.isBuilt())
def testFilesetRecipe(self): self.openRmakeRepository() self.addComponent('orig:run', '1', ['/bin/foo']) self.addCollection('orig', '1', [':run']) trv = self.addComponent('fileset-foo:source', '1.0-1', '', [('fileset-foo.recipe', filesetRecipe)]) troveList = [ trv.getNameVersionFlavor() ] job = self.newJob(*troveList) b = builder.Builder(self.rmakeCfg, job) logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() b.build() logFile.restoreOutput() assert b.job.isBuilt(), b.job.troves.values()[0].getFailureReason()
def testGroupRecipe(self): if compat.ConaryVersion().conaryVersion[0:2] == [1,2]: raise testhelp.SkipTestException('test fails on 1.2') repos = self.openRmakeRepository() db = self.openRmakeDatabase() self.buildCfg.shortenGroupFlavors = True self.buildCfg.setSection('foo') # add context foo self.buildCfg.configLine('buildFlavor desktop is:x86') self.buildCfg.setSection('bar') self.buildCfg.configLine('buildFlavor !desktop is:x86') simple = self.addComponent('simple:runtime', '1.0-1-1', '') other1 = self.addComponent('other:runtime', '1.0-1-1', '!desktop', filePrimer=1) other2 = self.addComponent('other:runtime', '1.0-1-1', 'desktop', filePrimer=1) # Prevent the desktop flag from being pre-filtered out recipe = groupRecipe + '\n if Use.desktop: pass\n' trv = self.addComponent('group-foo:source', '/localhost@rpl:linux//rmakehost@local:linux/1:1.0-1', [('group-foo.recipe', recipe)]) troveList = [ trv.getNameVersionFlavor() + ('foo',), trv.getNameVersionFlavor() + ('bar',), ] job = self.newJob(*troveList) b = builder.Builder(self.rmakeCfg, job) logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() b.build() logFile.restoreOutput() assert b.job.isBuilt(), str(b.job.getFailureReason()) assert len(b.job.getBuiltTroveList()) == 2, b.job.getBuiltTroveList() for tup in b.job.getBuiltTroveList(): groupTrove = repos.getTrove(*tup) # this is just a very basic test of builder -> group build. # tests of the group cook code's ability to include the right # version in particular cases should be in cooktest.py if '!desktop' in str(groupTrove.getFlavor()): other = other1 else: other = other2 self.assertEqual(sorted(groupTrove.iterTroveList(strongRefs=True)), [other.getNameVersionFlavor(), simple.getNameVersionFlavor()])
def testMacrosRecipe(self): self.openRmakeRepository() db = self.openRmakeDatabase() trv = self.addComponent('testcase:source', '1.0-1', '', [('testcase.recipe', macrosRecipe)]) self.buildCfg.configLine('macros foo readline') self.buildCfg.macros['multi'] = 'line1\nline2' job = self.newJob(trv) b = builder.Builder(self.rmakeCfg, job) logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() b.build() logFile.restoreOutput() assert(b.job.isBuilt())
def testLoadSuperClassMultipleFlavors(self): repos = self.openRepository() repos = self.openRmakeRepository() # load the same superclass with two different flavors self.addComponent('group-superclass:source', '1.0', '', [('group-superclass.recipe', superClass)]) main = self.addComponent('group-main:source', '1.0', '', [('group-main.recipe', mainClass)]) self.addComponent('foo:run', '1') mainSsl = (main.getName(), main.getVersion(), parseFlavor('ssl')) mainNoSsl = (main.getName(), main.getVersion(), parseFlavor('!ssl')) job = self.newJob(mainSsl, mainNoSsl) b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() txt = self.captureOutput(b.build)[1] assert b.job.isBuilt(), b.job.getFailureReason()
def testLoadInstalledFromResolveTroves(self): self.addComponent('loaded:source', ':branch/1', [('loaded.recipe', loadedRecipe.replace('@@', '1'))]) self.addComponent('loaded:runtime', ':branch/1') trv = self.addCollection('loaded', ':branch/1', ['loaded:runtime']) loadInstalled = self.addComponent( 'loadinstalled:source', '1', [('loadinstalled.recipe', loadInstalledRecipe)]) buildCfg = copy.deepcopy(self.buildCfg) buildCfg.resolveTroveTups = [[trv.getNameVersionFlavor()]] job = self.newJob(loadInstalled, buildConfig=buildCfg) b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() buildTrove = job.iterTroves().next() assert (buildTrove.packages == set(['loadinstalled', 'loaded-1']))
def testLoadInstalledFallsBackToInstallLabelPath(self): # loaded is on the ILP, but loadInstalled:source doesn't mention # that label at all. self.addComponent('loaded:source', ':branch2/1', [('loaded.recipe', loadedRecipe.replace('@@', '1'))]) loadInstalled = self.addComponent( 'loadinstalled:source', ':branch/1', [('loadinstalled.recipe', loadInstalledRecipe)]) buildCfg = copy.deepcopy(self.buildCfg) buildCfg.resolveTroveTups = [] buildCfg.installLabelPath.append( versions.Label('localhost@rpl:branch2')) job = self.newJob(loadInstalled, buildConfig=buildCfg) b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() buildTrove = job.iterTroves().next() assert (buildTrove.packages == set(['loadinstalled', 'loaded-1']))
def testPrebuiltGroups(self): """ Groups should never be pre-built. @tests: RMK-903 """ self.addComponent('foo:runtime') groupSource = self.addComponent('group-foo:source=1.0-1', [('group-foo.recipe', groupRecipe)]) groupTrove = self.addCollection('group-foo=1.0-1-1', ['foo:runtime']) job = self.newJob(groupSource) job.getMainConfig().prebuiltBinaries = [ groupTrove.getNameVersionFlavor()] build = builder.Builder(self.rmakeCfg, job) build.initializeBuild() for buildTrove in job.iterTroves(): self.failIf(buildTrove.isPrebuilt(), "Group trove is pre-built")
def testRedirectRecipe(self): self.openRmakeRepository() db = self.openRmakeDatabase() self.addComponent('redirect:run', '1') self.addCollection('redirect', '1', [':run']) self.addComponent('target:run', '1') self.addCollection('target', '1', [':run']) # simulate building a checkout trv = self.addComponent( 'redirect:source=/localhost@rpl:linux//rmakehost@local:linux/1.0-1', [('redirect.recipe', redirectRecipe)]) os.chdir(self.workDir) troveList = [ trv.getNameVersionFlavor() ] job = self.newJob(*troveList) b = builder.Builder(self.rmakeCfg, job) logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() b.build() logFile.restoreOutput() assert b.job.isBuilt(), b.job.getFailureReason()
def testBasic(self): trv = self.addComponent('nocross:source', '1.0-1', '', [('nocross.recipe', nocrossRecipe)]) trv2 = self.addComponent('crosstool:source', '1.0-1', '', [('crosstool.recipe', crosstoolRecipe)]) ccRoot = self.rmakeCfg.buildDir + '/chroots/crosscompiled' trv3 = self.addComponent( 'crosscompiled:source', '1.0-1', '', [('crosscompiled.recipe', crosscompiledRecipe % (ccRoot, ccRoot))]) self.openRmakeRepository() troveList = [(trv.getName(), trv.getVersion(), deps.parseFlavor('!cross target: x86_64')), (trv2.getName(), trv2.getVersion(), deps.parseFlavor('cross target: x86_64')), (trv3.getName(), trv3.getVersion(), deps.parseFlavor('!cross target: x86_64'))] db = self.openRmakeDatabase() self.buildCfg.flavor = [ deps.overrideFlavor( self.buildCfg.flavor[0], deps.parseFlavor('~cross is:x86 target:x86_64')) ] job = self.newJob(*troveList) db.subscribeToJob(job) b = builder.Builder(self.rmakeCfg, job) self.logFilter.add() logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() try: b.build() except Exception: b.worker.stopAllCommands() raise logFile.restoreOutput() assert (set([x.getName() for x in b.dh.depState.getBuiltTroves() ]) == set([trv.getName(), trv2.getName(), trv3.getName()]))
def testMultipleDelayedRecipes(self): self.openRmakeRepository() db = self.openRmakeDatabase() trv = self.addComponent('redirect:source', '1.0-1', '', [('redirect.recipe', redirectRecipe)]) trv2 = self.addComponent('fileset-foo:source', '1.0-1', '', [('fileset-foo.recipe', filesetRecipe)]) troveList = [ trv.getNameVersionFlavor(), trv2.getNameVersionFlavor() ] job = self.newJob(*troveList) db.subscribeToJob(job) b = builder.Builder(self.rmakeCfg, job) logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() b.build() logFile.restoreOutput() assert(b.job.isFailed()) failedTroves = list(b.job.iterFailedTroves()) assert(len(failedTroves) == 2) group = [ x for x in failedTroves if x.getName() == trv.getName()][0] assert(str(group.getFailureReason()) == 'Trove failed sanity check: redirect and fileset packages must be alone in their own job') assert(str(b.job.getFailureReason()) == 'Job failed sanity check: redirect and fileset packages must be alone in their own job: fileset-foo, redirect')
def testCopyInPolicy(self): trv = self.addComponent('testcase:source', '1.0-1', '', [('testcase.recipe', workingRecipe)]) self.openRmakeRepository() troveList = [ trv.getNameVersionFlavor() ] db = self.openRmakeDatabase() buildCfg = copy.deepcopy(self.buildCfg) buildCfg.strictMode = False buildCfg.copyInConary = True fakePolicyPath = resources.get_archive('policy') buildCfg.policyDirs = buildCfg.policyDirs + [ fakePolicyPath ] job = self.newJob(buildConfig=buildCfg, *troveList) b = builder.Builder(self.rmakeCfg, job) self.logFilter.add() logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() b.build() logFile.restoreOutput() trove = b.job.troves.values()[0] assert(str(trove.getFailureReason()).endswith( 'This fake policy always breaks.'))
def testDerivedRecipe(self): self.openRmakeRepository() db = self.openRmakeDatabase() trv = self.addComponent('testcase:source', '1.0-1', '', [('testcase.recipe', workingRecipe)]) self.addComponent('testcase:run', '1.0-1-1', ['/foo', '/bar']) self.addCollection('testcase', '1.0-1-1', [':run']) trv = self.addComponent('testcase:source', '/localhost@rpl:linux//branch/1.0-1', [('testcase.recipe', workingRecipe)]) trv = self.addComponent('testcase:source', '/localhost@rpl:linux//branch/1.0-1.1', [('testcase.recipe', derivedRecipe)]) troveList = [ trv.getNameVersionFlavor() ] job = self.newJob(*troveList) b = builder.Builder(self.rmakeCfg, job) logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() b.build() logFile.restoreOutput() assert(b.job.isBuilt())
def testBuildReqs(self): self.addComponent('foo:runtime[!cross]') self.addComponent('foo:runtime=2[cross]', filePrimer=1) trv = self.addComponent('testcase:source', '1.0-1', '', [('testcase.recipe', buildReqsRecipe)]) self.openRmakeRepository() db = self.openRmakeDatabase() job = self.newJob(trv.getNameVersionFlavor()) db.subscribeToJob(job) b = builder.Builder(self.rmakeCfg, job) self.logFilter.add() logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() try: b.build() except Exception: b.worker.stopAllCommands() raise logFile.restoreOutput() assert b.job.isBuilt(), b.job.troves.values()[0].getFailureReason().getTraceback() trv = self.findAndGetTrove('testcase=rmakehost@local:linux') buildReqs = trv.getBuildRequirements() assert len(buildReqs) == 2, "Got cross req twice!"
def getBuilder(self, job): """Create a Builder instance to build the given job""" return builder.Builder(self.cfg, job, db=self.db)
def getBuilder(self, job): b = builder.Builder(self.cfg, job, db=self.db) self.plugins.callServerHook('server_builderInit', self, b) return b
def testBasic(self): # FIXME: this is really slow - ~20 seconds. # Perhaps we need to make hooks to make this test faster? trv = self.addComponent('testcase:source', '1.0-1', '', [('testcase.recipe', workingRecipe)]) trv2 = self.addComponent('testcase2:source', '1.0-1', '', [('testcase2.recipe', failingRecipe)]) trv3 = self.addComponent('testcase3:source', '1.0-1', '', [('testcase3.recipe', failedSetupRecipe)]) trv4 = self.addComponent('testcase4:source', '1.0-1', '', [('testcase4.recipe', failedLoadRecipe)]) trv5 = self.addComponent('testcase5:source', '1.0-1', '', [('testcase5.recipe', failedBuildReqRecipe)]) self.openRmakeRepository() troveList = [ (trv.getName(), trv.getVersion(), deps.parseFlavor('!ssl')), trv2.getNameVersionFlavor(), trv3.getNameVersionFlavor(), trv4.getNameVersionFlavor(), trv5.getNameVersionFlavor(), ] db = self.openRmakeDatabase() job = self.newJob(*troveList) db.subscribeToJob(job) b = builder.Builder(self.rmakeCfg, job) self.logFilter.add() logFile = logfile.LogFile(self.workDir + '/buildlog') logFile.redirectOutput() try: b.build() except Exception: b.worker.stopAllCommands() raise logFile.restoreOutput() assert(set([x.getName() for x in b.dh.depState.getFailedTroves()]) == set([trv2.getName(), trv3.getName(), trv4.getName(), trv5.getName()])) repos = self.openRepository() results = repos.findTrove(None, ('testcase', 'rmakehost@local:linux', deps.parseFlavor('!ssl')), self.buildCfg.flavor) assert(len(results) == 1) assert(results[0][2] == deps.parseFlavor('~!ssl')) troveDict = dict((x.getName(), x) for x in db.getJob(1).iterFailedTroves()) assert(len(troveDict) == 4) trv2 = troveDict['testcase2:source'] failureReason = str(trv2.getFailureReason()) # remove the arch-specific flavor here, we're not testing that failureReason = re.sub(r'\[.*\]', '[FLAVOR]', failureReason) assert(str(failureReason) == 'Failed while building: Error building recipe testcase2:source=/localhost@rpl:linux/1.0-1[FLAVOR]: Shell command "exit 1" exited with exit code 1') trv3 = troveDict['testcase3:source'] assert(str(trv3.getFailureReason()) == "Failed while loading recipe: global name 'b' is not defined") trv4 = troveDict['testcase4:source'] failureReason = str(trv4.getFailureReason()) failureReason = re.sub('/tmp.*\.recipe', 'TEMP.recipe', failureReason) failureReason = re.sub('temp-testcase4.*\.recipe', 'testcase4.recipe', failureReason) errStr = '''\ Failed while loading recipe: unable to load recipe file /varTEMP.recipe: Error in recipe file "testcase4.recipe": Traceback (most recent call last): File "/varTEMP.recipe", line 1, in ? class TestRecipe(PackageRecipe): File "/varTEMP.recipe", line 4, in TestRecipe a = b # NameError NameError: name 'b' is not defined ''' if sys.version_info > (2, 5): errStr = errStr.replace('?', '<module>') self.assertEquals(failureReason, errStr) trv5 = troveDict['testcase5:source'] self.assertEquals(str(trv5.getFailureReason()), 'Could not satisfy build requirements: bbbbbbb:devel=[]') assert(str(b.job.getFailureReason()) == """\ Failed while building: Build job had failures: * testcase2:source: Error building recipe testcase2:source=/localhost@rpl:linux/1.0-1[%s]: Shell command "exit 1" exited with exit code 1 * testcase3:source: Failed while loading recipe * testcase4:source: Failed while loading recipe * testcase5:source: Could not satisfy build requirements: bbbbbbb:devel=[] """ % self.getArchFlavor())