def testRootIsNotDir(self): # CNY-814 fd, fn = tempfile.mkstemp() os.close(fd) try: f = open(fn, 'w') f.close() try: db = database.Database(fn, '/var/lib/conarydb/conarydb') except database.OpenError, e: self.assertEqual( str(e), 'Unable to open database %s/var/lib/conarydb/conarydb: ' '%s is not a directory' % (fn, fn)) finally: os.unlink(fn) d = tempfile.mkdtemp() f = open(d + '/var', 'w') f.close() try: f = open(fn, 'w') f.close() try: db = database.Database(d, '/var/lib/conarydb/conarydb') except database.OpenError, e: self.assertEqual( str(e), 'Unable to open database %s/var/lib/conarydb/conarydb: ' '%s/var is not a directory' % (d, d)) finally: shutil.rmtree(d)
def _getBestOldChroot(self, buildReqs, reuseRoot, goodRootsOnly=False): """ If the chroot is being reused, pick by contents of the chroot. Otherwise, pick oldest If goodRootsOnly is True, be more discerning about which chroot to use - only use ones that have more than half matching packages. """ if not reuseRoot: for chroot in self.listOldChroots(): # return oldest directory return sorted(self.listOldChroots(), key=lambda x: os.stat(x)[stat.ST_MTIME])[0] buildReqsByNLF = set([(x[0], x[1].trailingLabel(), x[2]) for x in buildReqs]) matches = {} for chrootPath in self.listOldChroots(): db = database.Database(chrootPath, '/var/lib/conarydb') chrootContents = db.iterAllTroves() trovesByNLF = set([(x[0], x[1].trailingLabel(), x[2]) for x in chrootContents]) # matches = 2*matches - extras - so an empty chroot is better than # a chroot with lots of wrong troves. matches[chrootPath] = 2 * len(trovesByNLF.intersection(buildReqsByNLF)) - len(trovesByNLF.difference(buildReqsByNLF)) if matches: rank, best = sorted((x[1], x[0]) for x in matches.iteritems())[-1] if rank >= len(buildReqsByNLF) or not goodRootsOnly: return best
def testFindTrove(self): db = database.Database(':memory:', ':memory:') self.assertEqual(db.getTransactionCounter(), 0) flavor = deps.parseFlavor('~readline,!foo') v10 = ThawVersion("/conary.rpath.com@test:trunk/10:1.2-10-1") f1 = files.FileFromFilesystem("/etc/passwd", self.id1) trv = trove.Trove("testcomp", v10, flavor, None) trv.addFile(self.id1, "/bin/1", v10, f1.fileId()) trvInfo = db.addTrove(trv) db.addTroveDone(trvInfo) f2 = files.FileFromFilesystem("/etc/group", self.id2) v20 = ThawVersion("/conary.rpath.com@local:blah/20:1.3-2-1") trv = trove.Trove("testcomp", v20, flavor, None) trv.addFile(self.id2, "/bin/2", v20, f2.fileId()) trvInfo = db.addTrove(trv) db.addTroveDone(trvInfo) tup = [('testcomp', v10, flavor)] tup2 = [('testcomp', v10, flavor), ('testcomp', v20, flavor)] assert (db.findTrove(None, ('testcomp', '1.2-10-1', None)) == tup) assert (db.findTrove(None, ('testcomp', '1.2', None)) == tup) assert (set(db.findTrove( None, ('testcomp', None, parseFlavor('!foo')))) == set(tup2)) assert (db.findTrove(None, ('testcomp', ':trunk', None)) == tup) assert (db.findTrove([Label('conary.rpath.com@test:foo')], ('testcomp', ':trunk', None)) == tup) assert (db.findTrove(None, ('testcomp', ':trunk', None)) == tup) assert (db.findTrove(None, ('testcomp', '@test:trunk', None)) == tup) assert (db.findTrove([Label('conary.rpath.com@blah:foo')], ('testcomp', '@test:trunk', None)) == tup) # Transaction counter changes upon commit self.assertEqual(db.getTransactionCounter(), 0) db.commit() self.assertEqual(db.getTransactionCounter(), 1)
def testFreezeThawJobOrder(self): db = database.Database(':memory:', ':memory:') uJob = database.UpdateJob(db) uJob.setTransactionCounter(100) uJob.freeze(self.workDir) uJob = database.UpdateJob(db) uJob.thaw(self.workDir) self.assertEqual(uJob._jobPreScriptsByJob, None) self.assertEqual(uJob.getTransactionCounter(), 100) shutil.rmtree(self.workDir) os.mkdir(self.workDir) uJob = database.UpdateJob(db) uJob.setTransactionCounter(100) # The third argument is bogus, but thawing should still work uJob._jobPreScriptsByJob = [ [(0, [0, 1], "junk"), (1, [2, 3], "more junk")], [(10, [10, 11], "junk"), (11, [12, 13], "more junk")], [(20, [20, 21], "junk"), (21, [22, 23], "more junk")], ["just junk"], ] uJob.freeze(self.workDir) uJob = database.UpdateJob(db) uJob.thaw(self.workDir) self.assertEqual(uJob._jobPreScriptsByJob, [ [(0, [0, 1]), (1, [2, 3])], [(10, [10, 11]), (11, [12, 13])], [(20, [20, 21]), (21, [22, 23])], ]) shutil.rmtree(self.workDir) os.mkdir(self.workDir)
def testComponentDisappears(self): self.addQuickTestComponent("redirect:runtime", '0.1-1-1') self.addQuickTestComponent("redirect:lib", '0.1-1-1', filePrimer=1) self.addQuickTestComponent("redirect:data", '0.1-1-1', filePrimer=2) self.addQuickTestCollection( "redirect", '0.1-1-1', ["redirect:runtime", "redirect:lib", "redirect:data"]) self.addQuickTestComponent("test:runtime", '1.0-1-1') self.addQuickTestComponent("test:data", '1.0-1-1', filePrimer=2) self.addQuickTestCollection("test", '1.0-1-1', ["test:runtime", "test:data"]) built, d = self.buildRecipe(redirectRecipe, "testRedirect") self.updatePkg(self.cfg.root, 'redirect', version='0.1-1-1') self.updatePkg(self.cfg.root, 'redirect') db = database.Database(self.cfg.root, self.cfg.dbPath) assert ([x for x in sorted(db.iterAllTroveNames()) ] == ['test', 'test:data', 'test:runtime']) self.resetRoot() self.checkUpdate('redirect:lib=0.1-1-1', ['redirect:lib'], apply=True) # the redirect for redirect:lib redirects to nothing (so is an erase) self.checkUpdate('redirect:lib', ['redirect:lib=0.1--']) # test should appear and redirect:lib should # go away self.checkUpdate('redirect', [ 'redirect:lib=0.1--', 'test=--1.0', 'test:runtime=--1.0', 'test:data=--1.0' ])
def testGetCapsulesTroveList(self): # make sure that getCapsulesTroveList is at least not removed... from conary.lib import util d = tempfile.mkdtemp() util.mkdirChain(d + '/var/lib/conarydb/conarydb/') db = database.Database(d, '/var/lib/conarydb/conarydb') db.getCapsulesTroveList(db.iterAllTroves())
def test(self): components = self.recipe.autopkg.components reqDepSet = deps.DependencySet() provDepSet = deps.DependencySet() for pkg in components.values(): reqDepSet.union(pkg.requires) provDepSet.union(pkg.provides) self.depSet = deps.DependencySet() self.depSet.union(reqDepSet - provDepSet) depSetList = [ ] for dep in self.depSet.iterDepsByClass(self.depClass): depSet = deps.DependencySet() depSet.addDep(self.depClass, dep) depSetList.append(depSet) if not depSetList: return False self._initComponentExceptions() cfg = self.recipe.cfg self.db = database.Database(cfg.root, cfg.dbPath) self.systemProvides = self.db.getTrovesWithProvides(depSetList) self.unprovided = [x for x in depSetList if x not in self.systemProvides] self.transitiveBuildRequires = self.recipe._getTransitiveBuildRequiresNames() # For compatibility with older external policy that derives from this self.truncatedBuildRequires = self.transitiveBuildRequires self.setTalk() self.missingBuildRequires = set() return True
def testUpdateTroveFromChangeset(self): self.addQuickTestComponent("test:runtime", '1.0-1-1') self.addQuickTestComponent("test:lib", '1.0-1-1', filePrimer = 1) pkg = self.addQuickTestCollection("test", '1.0-1-1', [ ("test:lib", '1.0-1-1'), ("test:runtime", '1.0-1-1') ]) self.addQuickTestComponent("test2:runtime", '1.0-1-1', filePrimer=3) self.addQuickTestComponent("test:lib", '2.0-1-1', filePrimer=2) repos = self.openRepository() (fd, path) = tempfile.mkstemp() os.close(fd) repos.createChangeSetFile( [('test', (None, None), (pkg.getVersion(), pkg.getFlavor()), True)], path, recurse = True) self.updatePkg(self.rootDir, ["test:lib=2.0"]) self.updatePkg(self.rootDir, ["test:lib=1.0"], fromFiles = [ path ], keepExisting=True) self.updatePkg(self.rootDir, ["test:runtime", 'test2:runtime'], fromFiles = [ path ], keepExisting=True) os.unlink(path) db = database.Database(self.rootDir, self.cfg.dbPath) assert(sorted(db.iterAllTroveNames()) == ['test2:runtime', 'test:lib', 'test:runtime']) assert(len(db.trovesByName('test:lib')) == 2)
def testFreezeThawTroveMap(self): db = database.Database(':memory:', ':memory:') uJob = database.UpdateJob(db) uJob.setTransactionCounter(100) now = 1234567890.0 v1 = VersionFromString('/a@b:c/1.0-1', timeStamps=[now]) v2 = VersionFromString('/a@b:c/1.0-2', timeStamps=[now + 1]) flv1 = parseFlavor("") flv2 = parseFlavor("is: x86") trv1 = trove.Trove("trove1", v1, flv1) trv2 = trove.Trove("trove2", v2, flv2) nvf1 = trv1.getNameVersionFlavor() nvf2 = trv2.getNameVersionFlavor() uJob._troveMap[nvf1] = trv1 uJob._troveMap[nvf2] = trv2 expKeys = set([nvf1, nvf2]) uJob.freeze(self.workDir) uJob = database.UpdateJob(db) uJob.thaw(self.workDir) self.assertEqual(uJob.getTransactionCounter(), 100) self.assertEqual(set(uJob._troveMap.keys()), expKeys) self.assertEqual( trv1.diff(None)[0].freeze(), uJob._troveMap[nvf1].diff(None)[0].freeze()) self.assertEqual( trv2.diff(None)[0].freeze(), uJob._troveMap[nvf2].diff(None)[0].freeze())
def testVerifyToFile(self): db = database.Database(self.rootDir, self.cfg.dbPath) os.chdir(self.workDir) user, group = self._getUserGroup() self.addComponent('foo:runtime', '1.0', fileContents=[('/foo', rephelp.RegularFile(owner=user, group=group))]) self.updatePkg('foo:runtime') s = verify.verify(['foo:runtime'], db, self.cfg, changesetPath='foo.ccs') cs = changeset.ChangeSetFromFile('foo.ccs') assert (list(cs.iterNewTroveList()) == []) f = open(self.rootDir + '/foo', "a") f.write("mod") f.close() s = self.captureOutput(verify.verify, ['foo:runtime'], db, self.cfg, changesetPath='foo.ccs') assert (not s[1]) cs = changeset.ChangeSetFromFile('foo.ccs') assert (list(cs.iterNewTroveList())[0].getName() == 'foo:runtime')
def testVerifyRemovedFiles(self): # CNY-950 self.addComponent('foo:runtime', '1.0', fileContents=['/foo']) self.updatePkg('foo:runtime') self.removeFile(self.rootDir, '/foo') db = database.Database(self.rootDir, self.cfg.dbPath) s = self.captureOutput(verify.verify, ['foo:runtime'], db, self.cfg) assert (not s[1])
def testBugMergeDepSuggestions(self): # Tests a bug in mergeDepSuggestions (referring to r) db = database.Database(':memory:', ':memory:') csjs = ChangeSetJobSource(None, db) allSuggs = {'a': [[]]} newSuggs = {'a': [[2]]} csjs.mergeDepSuggestions(allSuggs, newSuggs) self.assertEqual(allSuggs, newSuggs)
def testDbTimeout(self): # CNY-1840 d = tempfile.mkdtemp() tmout = 12345 try: db = database.Database(d, '/conarydb', timeout=tmout) self.assertEqual(db.db.timeout, tmout) finally: shutil.rmtree(d)
def _checkVersion(self, vers, flavorCheck=None): db = database.Database(self.cfg.root, self.cfg.dbPath) l = db.getTroveVersionList('manyflavors') assert (len(l) == 1) assert (l[0] == vers) if flavorCheck is not None: flavors = db.getAllTroveFlavors({'manyflavors': l}) flavor = deps.parseFlavor(flavorCheck) assert (flavors['manyflavors'][vers] == [flavor])
def testClose(self): dbobj = database.Database(':memory:', ':memory:') dbobj2 = database.Database(':memory:', ':memory:') # Make _db be non-None dbobj.db dbobj2.db uJob = database.UpdateJob(dbobj) uJob.close() self.assertEqual(dbobj._db, None) # We close correctly even if the search source object doesn't have a # db property uJob = database.UpdateJob(dbobj) uJob.troveSource.db = dbobj class MockSearchSource(object): pass uJob.setSearchSource(MockSearchSource()) uJob.close() self.assertEqual(dbobj._db, None) # or the property is None uJob = database.UpdateJob(dbobj) class MockSearchSource(object): db = None uJob.setSearchSource(MockSearchSource()) uJob.close() self.assertEqual(dbobj._db, None) # ... or real uJob = database.UpdateJob(dbobj) uJob = database.UpdateJob(dbobj) class MockSearchSource(object): db = dbobj2 uJob.setSearchSource(MockSearchSource()) uJob.close() self.assertEqual(dbobj._db, None) self.assertEqual(dbobj2._db, None)
def testPrelink(self): user = pwd.getpwuid(os.getuid()).pw_name group = grp.getgrgid(os.getgid()).gr_name archivePath = resources.get_archive() self.addComponent('test:foo=1', fileContents=[ ('/prelinktest', rephelp.RegularFile( contents=open(archivePath + '/prelinktest'), owner=user, group=group, mode=0755)), ('/prelinktest-orig', rephelp.RegularFile( contents=open(archivePath + '/prelinktest'), owner=user, group=group, mode=0755)) ]) self.updatePkg('test:foo=1') db = database.Database(self.rootDir, self.cfg.dbPath) rc, str = self.captureOutput(verify.verify, ['test:foo'], db, self.cfg) self.assertEquals(str, '') binary = self.rootDir + '/prelinktest' # the test suite can't set the mtime on the file; we'll preserve # it ourself sb = os.stat(binary) os.system("cp %s/prelinktest-prelinked %s" % (archivePath, binary)) os.utime(binary, (sb.st_atime, sb.st_mtime)) self.assertEquals(files.PRELINK_CMD, ('/usr/sbin/prelink', )) oldCmd = files.PRELINK_CMD try: files.PRELINK_CMD = (archivePath + '/prelink', ) files._havePrelink = None rc, str = self.captureOutput(verify.verify, ['test:foo'], db, self.cfg, forceHashCheck=True) self.assertEquals(str, '') # Also verify a path used by addCapsule f, nlinks, devino = files.FileFromFilesystem(binary, pathId='\0' * 16, inodeInfo=True) self.assertEquals( digestlib.sha1(open(binary).read()).hexdigest(), '1114f3a978b60d76d7618dc43aaf207bc999f997') self.assertEquals(f.contents.sha1().encode('hex'), '23ad3a2c940a30809b68a5b8a13392196004efab') finally: files.PRELINK_CMD = oldCmd files._havePrelink = None
def testEnsureReadableRollbacks(self): from conary.lib import util d = tempfile.mkdtemp() util.mkdirChain(d + '/var/lib/conarydb/conarydb/rollbacks') try: open(d + '/var/lib/conarydb/conarydb/rollbacks/status', 'w').write('0 0\n') db = database.Database(d, '/var/lib/conarydb/conarydb') db._ensureReadableRollbackStack() finally: shutil.rmtree(d)
def testEraseChangeSet(self): db = database.Database(self.rootDir, self.cfg.dbPath) self.repos = self.openRepository() self.addTestPkg(1, content='r.Create("%(thisdocdir)s/README")') self.cookTestPkg(1) os.chdir(self.workDir) cscmd.ChangeSetCommand(self.cfg, ['test1=1.0--'], 'test.ccs') cs = changeset.ChangeSetFromFile('test.ccs') rc, res = self.captureOutput(displayChangeSet, db, cs, ['test1=1.0'], self.cfg) assert (res == 'Erase test1=1.0-1-1\n')
def testVerifyWithSignatures(self): # Make sure that verify works with troves that have # missing components, which means that the collection's signature # is no good... self.addComponent('foo:runtime', '1.0', '', ['/foo']) self.addComponent('foo:data', '1.0') self.addCollection('foo', '1.0', [':runtime', ':data']) self.updatePkg(['foo', 'foo:runtime'], recurse=False) self.writeFile(self.rootDir + '/foo', 'newtext') db = database.Database(self.rootDir, self.cfg.dbPath) self.captureOutput(verify.verify, ['foo'], db, self.cfg)
def testGetTrovesWithProvides(self): v = '/localhost@rpl:linux/1.0-1-1' f = '' db = database.Database(self.rootDir, self.cfg.dbPath) prov1 = deps.parseDep('trove: test1:runtime') prov2 = deps.parseDep('trove: test2:runtime') self.addQuickDbTestPkg(db, 'test1', v, f, provides=prov1) self.addQuickDbTestPkg(db, 'test2', v, f, provides=prov2) self.addQuickDbTestPkg(db, 'test1-foo', v, f, provides=prov1) provMap = db.getTrovesWithProvides([prov1, prov2]) assert (sorted(x[0] for x in provMap[prov1]) == ['test1', 'test1-foo']) assert ([x[0] for x in provMap[prov2]] == ['test2'])
def test(self): # use flags track their provider only if the # _getTransitiveBuildRequiresNames recipe method exists try: self.transitiveBuildRequires = self.recipe._getTransitiveBuildRequiresNames() except AttributeError: return False cfg = self.recipe.cfg self.db = database.Database(cfg.root, cfg.dbPath) self.setTalk() return True
def testCommitLock(self): d = tempfile.mkdtemp() try: db = database.Database(d, '/var/lib/conarydb/conarydb') db.commitLock(True) childPid = os.fork() if childPid == 0: db.close() db = database.Database(d, '/var/lib/conarydb/conarydb') try: db.commitLock(True) except errors.DatabaseLockedError: os._exit(0) except Exception: pass os._exit(1) pid, status = os.waitpid(childPid, 0) assert (status == 0) finally: shutil.rmtree(d)
def testLoadInstalledScoring(self): # set up all of the variables that loadRecipe expects to be # available at the module level db = database.Database(self.cfg.root, self.cfg.dbPath) repos = self.openRepository() branch = versions.VersionFromString('/localhost@rpl:linux//shadow/') self.addTestPkg(1, version='1.0') self.addTestPkg(1, version='2.0') self.addQuickDbTestPkg(db, 'test1', '/localhost@rpl:linux/1:1.0-1-1', '') self.addQuickDbTestPkg(db, 'test1', '/localhost@rpl:linux/2:2.0-1-1', '') loader = self._testSubload(repos, "loadInstalled('test1')", branch=branch) assert (loader.module.TestRecipe1.version == '2.0') self.resetRoot() db = database.Database(self.cfg.root, self.cfg.dbPath) self.addTestPkg(2, version='3.0') self.addTestPkg(2, version='4.0') self.mkbranch(['test2:source=3.0'], "@rpl:test2") self.mkbranch(['test2:source=:test2'], "@rpl:shadow", shadow=True) self.mkbranch(['test2:source=4.0'], "@rpl:shadow", shadow=True) self.addQuickDbTestPkg( db, 'test2', '/localhost@rpl:linux//test2//shadow/2:3.0-1-1', '') self.addQuickDbTestPkg(db, 'test2', '/localhost@rpl:linux//shadow/1:4.0-1-1', '') loader = self._testSubload(repos, "loadInstalled('test2')", db=db, branch=branch) assert (loader.module.TestRecipe2.version == '4.0')
def testVerifyAll(self): os.chdir(self.workDir) self.addComponent('foo:runtime', '1.0', fileContents=['/bin/b']) self.addComponent('bar:lib', '1.0', fileContents=['/lib/l']) self.addCollection('foo', [':runtime']) self.addCollection('bar', [':lib']) db = database.Database(self.rootDir, self.cfg.dbPath) self.updatePkg('foo') self.updatePkg('bar') verify.verify([], db, self.cfg, all=True, changesetPath='foo.ccs') cs = changeset.ChangeSetFromFile('foo.ccs') assert (sorted([x.getName() for x in cs.iterNewTroveList() ]) == ['bar:lib', 'foo:runtime'])
def testSimple(self): r1 = self.addComponent('test:runtime', '1.0-1-1', fileContents=[], requires='trove: test:doc') r2 = self.addComponent( 'test:runtime', '2.0-1-1', fileContents=[], requires='soname: ELF32/foo.so.0(a b c) trove: test:doc') d1 = self.addComponent('test:doc', '1.0-1-1', filePrimer=1) l1 = self.addComponent('test:lib', '1.0-1-1', filePrimer=2, provides='soname: ELF32/foo.so.0(a b c d)') db = database.Database(':memory:', ':memory:') db.addTrove(r1) repos = self.openRepository() relCs = repos.createChangeSet([ ('test:runtime', (r1.getVersion(), r1.getFlavor()), (r2.getVersion(), r2.getFlavor()), False) ]) absCs = repos.createChangeSet([ ('test:doc', (None, None), (d1.getVersion(), d1.getFlavor()), False), ('test:lib', (None, None), (l1.getVersion(), l1.getFlavor()), False) ]) trvSrc = ChangesetFilesTroveSource(db, storeDeps=True) trvSrc.addChangeSet(relCs) trvSrc.addChangeSet(absCs) for trv in (r2, d1, l1): [otherTrv] = trvSrc.getTroves( [(trv.getName(), trv.getVersion(), trv.getFlavor())], withFiles=False) assert (trv == otherTrv) suggMap = trvSrc.resolveDependencies( None, [r2.getRequires(), r1.getRequires()]) assert (suggMap[r1.getRequires()] == [[(d1.getName(), d1.getVersion(), d1.getFlavor())]]) suggs = suggMap[r2.getRequires()] assert ([(d1.getName(), d1.getVersion(), d1.getFlavor())] in suggs) assert ([(l1.getName(), l1.getVersion(), l1.getFlavor())] in suggs)
def testIntermediateDirNotWritable(self): # CNY-2405 d = tempfile.mkdtemp() try: os.mkdir(d + '/var', 0400) try: db = database.Database(d, '/var/lib/conarydb/conarydb') except database.OpenError, e: self.assertEqual( str(e), 'Unable to open database %s/var/lib/conarydb/conarydb: ' 'cannot create directory %s/var/lib' % (d, d)) finally: os.chmod(d + '/var', 0755) shutil.rmtree(d)
def _cookTrove(cfg, repos, name, version, flavorList, targetLabel, loadSpecsList, csFile, buildReqs, crossReqs, failureFd, logger): baseFlavor = cfg.buildFlavor db = database.Database(cfg.root, cfg.dbPath) buildLabel = version.trailingLabel() buildBranch = version.branch() binaryBranch = version.getBinaryVersion().branch() if targetLabel: source = recipeutil.RemoveHostSource(db, targetLabel.getHost()) if version.trailingLabel() == targetLabel and version.depth() > 1: buildBranch = version.branch().parentBranch() buildLabel = buildBranch.label() revision = versions.Revision('1-1') binaryBranch = buildBranch.createVersion(revision)\ .getBinaryVersion().branch() else: source = db loaders = [] recipeClasses = [] if not isinstance(flavorList, (tuple, list)): flavorList = [flavorList] if not isinstance(loadSpecsList, (tuple, list)): loadSpecsList = [loadSpecsList] * len(flavorList) for flavor, loadSpecs in itertools.izip(flavorList, loadSpecsList): try: logger.debug('Cooking %s=%s[%s] to %s (stored in %s)' % \ (name, version, flavor, targetLabel, csFile)) cfg.buildFlavor = deps.overrideFlavor(baseFlavor, flavor) cfg.initializeFlavors() (loader, recipeClass, localFlags, usedFlags) = \ recipeutil.loadRecipeClass(repos, name, version, cfg.buildFlavor, ignoreInstalled=False, root=cfg.root, loadInstalledSource=source, overrides=loadSpecs, cfg=cfg) loaders.append(loader) recipeClasses.append(recipeClass) recipeClass.buildRequirementsOverride = buildReqs recipeClass.crossRequirementsOverride = crossReqs except Exception, msg: errMsg = 'Error loading recipe %s=%s[%s]: %s' % \ (name, version, flavor, str(msg)) _buildFailed(failureFd, errMsg, traceback.format_exc())
def testUpdateJobiterJobPreScriptsForJobSet(self): db = database.Database(':memory:', ':memory:') uJob = database.UpdateJob(db) js1 = ("trove1", (None, None), ('/a@b:c/1.0-1', ""), True) js2 = ("trove2", ('/a@b:c/1.0-1', None), ('/a@b:c/1.0-2', ""), True) js3 = ("trove3", (None, None), ('/a@b:c/1.0-1', ""), True) js4 = ("trove4", ('/a@b:c/1.0-1', None), ('/a@b:c/1.0-2', ""), True) js5 = ("trove5", ('/a@b:c/1.0-1', None), (None, None), True) js6 = ("trove6", ('/a@b:c/1.0-1', None), (None, None), True) uJob.jobs = [[js1, js2, js5], [js3, js4, js6]] sc1 = (js1, "preinst1", 0, 1, "preinstall") sc2 = (js3, "preinst3", 0, 1, "preinstall") sc3 = (js2, "preup2", 0, 1, "preupdate") sc4 = (js4, "preup4", 0, 1, "preupdate") sc5 = (js5, "preer5", 0, 1, "preerase") sc6 = (js6, "preer6", 0, 1, "preerase") sc7 = (js2, "prerb2", 0, 1, "prerollback") sc8 = (js4, "prerb4", 0, 1, "prerollback") uJob._jobPreScripts = [sc1, sc2, sc3, sc4, sc5, sc6, sc7, sc8] uJob._jobPreScriptsByJob = [ [(0, [6]), (1, [7])], [(0, [0]), (1, [1])], [(0, [2]), (1, [3])], [(0, [4]), (1, [5])], ] ret = list(uJob.iterJobPreScriptsForJobSet(0)) self.assertEqual(ret, [sc7, sc1, sc3, sc5]) ret = list(uJob.iterJobPreScriptsForJobSet(1)) self.assertEqual(ret, [sc8, sc2, sc4, sc6]) # Trigger an AssertionError uJob._jobPreScriptsByJob = [[], [(0, [2]), (1, [3])], [], []] self.assertRaises(AssertionError, list, uJob.iterJobPreScriptsForJobSet(0)) # No data uJob._jobPreScripts = [] uJob._jobPreScriptsByJob = None ret = list(uJob.iterJobPreScriptsForJobSet(0)) self.assertEqual(ret, [])
def testPartialChangeSet(self): db = database.Database(self.rootDir, self.cfg.dbPath) self.repos = self.openRepository() self.addTestPkg(1, content='r.Create("%(thisdocdir)s/README")') self.cookTestPkg(1) self.cfg.configLine('excludeTroves .*:runtime') os.chdir(self.workDir) cscmd.ChangeSetCommand(self.cfg, ['test1'], 'test.ccs') cs = changeset.ChangeSetFromFile('test.ccs') rc, res = self.captureOutput(displayChangeSet, None, cs, ['test1=1.0-1-1'], self.cfg, showTroves=True) assert (res == '''\ test1=1.0-1-1 test1:runtime=1.0-1-1 ''')
def testRollbackPerms(self): rbPath = self.rootDir + self.cfg.dbPath + '/rollbacks' self.addComponent('foo:runtime', '1.0') self.updatePkg('foo:runtime') assert(os.stat(rbPath).st_mode & 0777 == 0700) assert(os.stat(rbPath + '/status').st_mode & 0777 == 0600) assert(os.stat(rbPath + '/0').st_mode & 0777 == 0700) assert(os.stat(rbPath + '/0/count').st_mode & 0777 == 0600) assert(os.stat(rbPath + '/0/local.0').st_mode & 0777 == 0600) assert(os.stat(rbPath + '/0/repos.0').st_mode & 0777 == 0600) # ensure we can open the database even though we can't read the # rollback status try: os.chmod(rbPath + '/status', 000) db = database.Database(self.rootDir, self.cfg.dbPath) # And make sure we get an exception when trying to read the # rollback try: db.getRollbackStack().getList() self.fail("ConaryError not raised") except errors.ConaryError, e: self.assertEqual(str(e), "Unable to open rollback directory") except: self.fail("Wrong exception raised: %s" % sys.exc_info()[1]) # Same deal with hasRollback() since it's a different code path # than getList() try: db.rollbackStack.hasRollback('r.1') self.fail("ConaryError not raised") except errors.ConaryError, e: self.assertEqual(str(e), "Unable to open rollback directory")