def testTroveFilterFlavors2(self): recipe = self.getRecipe() filt1 = trovefilter.TroveFilter(recipe, flavor='xen,domU is: x86') filt2 = trovefilter.TroveFilter(recipe, flavor='xen,domU is: x86_64') filt3 = trovefilter.TroveFilter(recipe, flavor='xen,domU is: x86_64 x86') nvf1 = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor('is: x86')) nvf2 = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor('xen,domU is: x86')) nvf3 = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor('xen,domU is: x86_64')) nvf4 = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor('xen,domU is: x86 x86_64')) self.assertEquals(filt1.match((nvf1, )), False) self.assertEquals(filt1.match((nvf2, )), True) self.assertEquals(filt2.match((nvf2, )), False) self.assertEquals(filt2.match((nvf3, )), True) self.assertEquals(filt2.match((nvf4, )), False) self.assertEquals(filt3.match((nvf4, )), True) self.assertEquals(filt3.match((nvf1, )), False) self.assertEquals(filt3.match((nvf2, )), False) self.assertEquals(filt3.match((nvf3, )), False)
def testTroveFilterVersion(self): recipe = self.getRecipe() filt = trovefilter.TroveFilter(recipe, 'foo', version='test.rpath.local@rpl:linux') filt2 = trovefilter.TroveFilter(recipe, 'bar', version='test.rpath.local@rpl:linux') nvf = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), True) self.assertEquals(filt2.match((nvf, )), False) filt = trovefilter.TroveFilter(recipe, 'foo', version='/test.rpath.local@rpl:linux') self.assertEquals(filt.match((nvf, )), True) filt = trovefilter.TroveFilter( recipe, 'foo', version='/test.rpath.local@rpl:linux/1-1-1') self.assertEquals(filt.match((nvf, )), True) filt = trovefilter.TroveFilter(recipe, 'foo', version='test.rpath.local@rpl:linux') nvf = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:devel/1-1-1'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), False) filt = trovefilter.TroveFilter(recipe, 'foo', version='/test.rpath.local@rpl:linux') self.assertEquals(filt.match((nvf, )), False) filt = trovefilter.TroveFilter( recipe, 'foo', version='/test.rpath.local@rpl:linux/1-1-1') self.assertEquals(filt.match((nvf, )), False)
def testShadowed(self): self.repos = self.openRepository() self.addTestPkg(1, content='''r.Create("/etc/foo", contents="old contents\\n")''') self.mkbranch(self.cfg.buildLabel, "@rpl:branch", "test1:source", shadow=True) self.cfg.buildLabel = versions.Label('localhost@rpl:branch') self.cfg.installLabelPath = \ conarycfg.CfgLabelList([self.cfg.buildLabel]) # modify the trove on the shadow self.addTestPkg(1, content='''r.Create("/etc/foo", contents="new contents\\n")''') self.cookTestPkg(1) self.updatePkg(self.rootDir, 'test1', depCheck=False) self.writeFile(self.rootDir + "/etc/foo", 'newer contents\\n') (fd, path) = tempfile.mkstemp() os.close(fd) self.localChangeset(self.rootDir, 'test1', path) commit.doCommit(self.cfg, path, 'localhost@commit:branch') assert(self.repos.hasTrove('test1', versions.VersionFromString( '/localhost@rpl:linux//branch//commit:branch/1.0-1.1-1.0.1'), deps.Flavor())) # commit it again to make sure the version gets incremented commit.doCommit(self.cfg, path, 'localhost@commit:branch') assert(self.repos.hasTrove('test1', versions.VersionFromString( '/localhost@rpl:linux//branch//commit:branch/1.0-1.1-1.0.2'), deps.Flavor())) os.remove(path)
def findTroves(self, labelPath, troveSpecs, defaultFlavor=None, allowMissing=False): results = {} if labelPath: if not isinstance(labelPath, (tuple, list)): labelPath = labelPath, else: labelPath = tuple(labelPath) for troveSpec in troveSpecs: self.recordFindTroveArgs.append((labelPath, troveSpec)) if troveSpec[2] is not None: flavor = troveSpec[2] else: flavor = deps.parseFlavor('') if labelPath: if troveSpec[1]: verPart = troveSpec[1] else: verPart = '1.0-1-1' troveTup = (troveSpec[0], versions.VersionFromString( '/%s/%s' % (labelPath[0], verPart)), flavor) else: troveTup = (troveSpec[0], versions.VersionFromString(troveSpec[1]), flavor) results[troveSpec] = [troveTup] return results
def testRPMCapsuleDepCulling(self): """ Make sure that RPMRequires redundent rpm requires are culled""" recipestr1 = r""" class TestDepCulling(CapsuleRecipe): name = 'test' version = '0' clearBuildReqs() def setup(r): r.addCapsule('gnome-main-menu-0.9.10-26.x86_64.rpm') """ self.cfg.enableRPMVersionDeps = False self.overrideBuildFlavor('is: x86_64') built, d = self.buildRecipe(recipestr1, "TestDepCulling") nvf = built[0] nvf = nvf[0], versions.VersionFromString(nvf[1]), nvf[2] repos = self.openRepository() trv = repos.getTrove(*nvf) reqGot = list(trv.requires().iterDepsByClass(deps.RpmDependencies)) reqExpected = "[Dependency('hal'), Dependency('gnome-main-menu-lang'), Dependency('gnome-panel'), Dependency('tango-icon-theme'), Dependency('coreutils'), Dependency('dbus-1-glib'), Dependency('libssui'), Dependency('eel'), Dependency('wireless-tools')]" self.assertEquals(str(reqGot), reqExpected) self.cfg.enableRPMVersionDeps = True built, d = self.buildRecipe(recipestr1, "TestDepCulling") nvf = built[0] nvf = nvf[0], versions.VersionFromString(nvf[1]), nvf[2] repos = self.openRepository() trv = repos.getTrove(*nvf) reqGot = list(trv.requires().iterDepsByClass(deps.RpmDependencies)) reqExpected = "[Dependency('hal'), Dependency('gnome-main-menu-lang'), Dependency('gnome-main-menu-lang-0.9.10'), Dependency('gnome-panel'), Dependency('tango-icon-theme'), Dependency('coreutils'), Dependency('dbus-1-glib'), Dependency('libssui'), Dependency('eel'), Dependency('wireless-tools')]" self.assertEquals(str(reqGot), reqExpected)
def testLoadedTroves(self): # we don't check the output of this test. self.logFilter.add() repos = self.openRepository() header = ''' if Use.%s: foo = '1.0-readline' else: foo = '1.0-noreadline' ''' self.addTestPkg(1, version='1.0', header=header % 'readline') self.addTestPkg(2, header='loadRecipe("test1")' + header % 'ssl') test3Recipe = self.addTestPkg(3, header='loadRecipe("test2")' + header % 'bootstrap') use.track() rldep = deps.parseFlavor('readline') ssldep = deps.parseFlavor('ssl') nobsdep = deps.parseFlavor('~!bootstrap') v1 = versions.VersionFromString('/localhost@rpl:linux/1.0-1') loader = self._testSubload(repos, "loadInstalled('test3')") FooLoaded = loader.getLoadedSpecs() assert (FooLoaded['test3'][0] == ('test3:source', v1, nobsdep)) Test3Loaded = FooLoaded['test3'][1] assert (Test3Loaded['test2'][0] == ('test2:source', v1, ssldep)) Test2Loaded = Test3Loaded['test2'][1] assert (Test2Loaded['test1'][0] == ('test1:source', v1, rldep)) Test1Loaded = Test2Loaded['test1'][1] assert (Test1Loaded == {}) loadedTroves = loader.getLoadedTroves() assert (len(loadedTroves) == 3) assert (loadedTroves[0] == ('test1:source', v1, rldep)) assert (loadedTroves[1] == ('test2:source', v1, ssldep)) assert (loadedTroves[2] == ('test3:source', v1, nobsdep)) # Now reset and load again w/ overrides specified branch = versions.VersionFromString('/localhost@rpl:foo/') oldLoadedSpecs = loader.getLoadedSpecs() # move ILP and buildLabel over to another branch, and use overrides # to load exactly what we want anyway. cfg = copy.copy(self.cfg) cfg.installLabelPath = [versions.Label('localhost@rpl:foo')] cfg.buildLabel = versions.Label('localhost@rpl:foo') self.overrideBuildFlavor('!readline, !ssl') overrides = oldLoadedSpecs loader = self._testSubload(repos, "loadInstalled('test3')", cfg=cfg, overrides=overrides) assert (loadedTroves[0] == ('test1:source', v1, rldep)) assert (loadedTroves[1] == ('test2:source', v1, ssldep)) assert (loadedTroves[2] == ('test3:source', v1, nobsdep))
def testLoadedTrovesWithAutoLoad(self): self.logFilter.add() repos = self.openRepository() if 'x86_64' not in str(self.cfg.buildFlavor): raise testhelp.SkipTestException('Skip test on x86 arch') self.cfg.autoLoadRecipes.append('other') self.overrideBuildFlavor('is: x86 x86_64') header = ''' if Arch.x86: pass ''' self.addComponent( 'other:recipe=2.0[is:x86 x86_64]', [('simplesuper.recipe', simpleSuperRecipe.replace('1.0', '2.0'))]) self.addCollection('other=2.0[is:x86 x86_64]', [':recipe']) self.addTestPkg(1, version='1.0', header=header) self.addTestPkg(2, header='loadRecipe("test1")') use.track() rldep = deps.parseFlavor('readline') ssldep = deps.parseFlavor('ssl') nobsdep = deps.parseFlavor('~!bootstrap') emptydep = deps.Flavor() x64dep = deps.parseFlavor('is:x86_64') v1 = versions.VersionFromString('/localhost@rpl:linux/1.0-1') loader = self._testSubload(repos, "loadInstalled('test2')") FooLoaded = loader.getLoadedSpecs() assertEq = self.assertEqual assertEq(FooLoaded['test2'][0], ('test2:source', v1, emptydep)) Test2Loaded = FooLoaded['test2'][1] assertEq(Test2Loaded['test1'][0], ('test1:source', v1, x64dep)) Test1Loaded = Test2Loaded['test1'][1] assertEq(Test1Loaded, {}) loadedTroves = loader.getLoadedTroves() assertEq(len(loadedTroves), 2) assertEq(loadedTroves[0], ('test1:source', v1, x64dep)) assertEq(loadedTroves[1], ('test2:source', v1, emptydep)) # Now reset and load again w/ overrides specified branch = versions.VersionFromString('/localhost@rpl:foo/') oldLoadedSpecs = loader.getLoadedSpecs() # move ILP and buildLabel over to another branch, and use overrides # to load exactly what we want anyway. cfg = copy.copy(self.cfg) self.overrideBuildFlavor('!readline, !ssl') overrides = oldLoadedSpecs loader = self._testSubload(repos, "loadInstalled('test2')", cfg=cfg, overrides=overrides) assert (loadedTroves[0] == ('test1:source', v1, x64dep)) assert (loadedTroves[1] == ('test2:source', v1, emptydep))
def testNonRecursiveGroupSigs(self): fingerprint = '95B457D16843B21EA3FC73BBC7C32FC1F94E405E' # supply the pass phrase for our private key keyCache = openpgpkey.getKeyCache() keyCache.getPrivateKey(fingerprint, '111111') # make all components before assigning a key, so all start out blank self.addQuickTestComponent("test:doc", "1.0-1-1") self.makeSourceTrove('testcase', testRecipe) repos = self.openRepository() built = self.cookItem(repos, self.cfg, 'testcase', ignoreDeps=True) group = self.build(testGroup, "GroupTest") group = self.build(outerGroup, "OuterGroup") signatureKey = self.cfg.signatureKey self.cfg.signatureKey = fingerprint self.cfg.quiet = True v = versions.VersionFromString('/localhost@rpl:linux/1.0-1-1') f = deps.parseFlavor('') try: # first sign the outer group trove #signtrove.signTroves(self.cfg, [ "group-outer" ]) cvccmd.sourceCommand(self.cfg, ["sign", "group-outer"], {}) try: t = repos.getTrove('group-outer', v, f) self._checkDigitalSig(t, fingerprint) except openpgpfile.KeyNotFound: self.fail('Group signing failed to cover %s' % t) # check the sig on each trove in the group, since group signing # should be recursive for trvName in ('group-test', 'test:doc', 'testcase', 'testcase:runtime'): try: t = repos.getTrove(trvName, v, f) t.getDigitalSignature(fingerprint) self.fail('Group signing inadvenderntly signed %s' % trvName) except openpgpfile.KeyNotFound: pass # then check that the source trove wasn't signed... it wasn't # explicitly part of the group v = versions.VersionFromString('/localhost@rpl:linux/1.0-1') f = deps.parseFlavor('') t = repos.getTrove('testcase:source', v, f) try: signature = t.getDigitalSignature(fingerprint) self._checkDigitalSig(t, fingerprint) self.fail('signing group inadvendently signed source trove') except openpgpfile.KeyNotFound: pass finally: self.cfg.signatureKey = signatureKey
def testTroveFilterBlank(self): recipe = self.getRecipe() filt = trovefilter.TroveFilter(recipe) nvf = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), True) nvf = ('bar', versions.VersionFromString( \ '/test.rpath.local@rpl:devel/1.0-6-4'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), True)
def testRPMCapsuleDepPolicy(self): """ Make sure that RPMProvide and RPMProvide work""" recipestr1 = r""" class TestEpoch(CapsuleRecipe): name = 'test' version = '0' clearBuildReqs() def setup(r): r.addCapsule('epoch-1.0-1.i386.rpm') r.RPMProvides('rpm: nonsenseProvision(FOO BAR)', 'epoch:rpm' ) r.RPMRequires('rpm: nonsenseRequirement(BAZ QUX)', 'epoch' ) """ self.cfg.enableRPMVersionDeps = False built, d = self.buildRecipe(recipestr1, "TestEpoch") nvf = built[0] nvf = nvf[0], versions.VersionFromString(nvf[1]), nvf[2] repos = self.openRepository() trv = repos.getTrove(*nvf) self.assertEquals( str(trv.provides()), '\n'.join( ('trove: epoch:rpm', 'rpm: epoch', 'rpm: epoch[x86-32]', 'rpm: nonsenseProvision(BAR FOO)'))) self.assertEquals( str(trv.requires), '\n'.join(('rpm: nonsenseRequirement(BAZ QUX)', 'rpmlib: CompressedFileNames', 'rpmlib: PayloadFilesHavePrefix'))) self.cfg.enableRPMVersionDeps = True built, d = self.buildRecipe(recipestr1, "TestEpoch") nvf = built[0] nvf = nvf[0], versions.VersionFromString(nvf[1]), nvf[2] repos = self.openRepository() trv = repos.getTrove(*nvf) self.assertEquals( str(trv.provides()), '\n'.join( ('trove: epoch:rpm', 'rpm: epoch', 'rpm: epoch-17:1.0', 'rpm: epoch-17:1.0-1', 'rpm: epoch[x86-32]', 'rpm: epoch[x86-32]-17:1.0', 'rpm: epoch[x86-32]-17:1.0-1', 'rpm: nonsenseProvision(BAR FOO)'))) self.assertEquals( str(trv.requires), '\n'.join(('rpm: nonsenseRequirement(BAZ QUX)', 'rpmlib: CompressedFileNames', 'rpmlib: PayloadFilesHavePrefix')))
def testTroveFilterRegexps(self): recipe = self.getRecipe() recipe.macros.name = 'foo' # test a regexp in the name element filt = trovefilter.TroveFilter(recipe, '%(name)s1+', version='test.rpath.local@rpl:linux') nvf = ('foo11', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), True) # test that name regexp is anchored nvf = ('foo113', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), False)
def testCookPackage(self): fingerprint = '95B457D16843B21EA3FC73BBC7C32FC1F94E405E' self.makeSourceTrove('testcase', testRecipe) v = versions.VersionFromString('/localhost@rpl:linux/1.0-1-1') f = deps.parseFlavor('') repos = self.openRepository() # excercise signatureKeyMap codepath signatureKeyMap = self.cfg.signatureKeyMap try: self.cfg.signatureKeyMap = [('localhost@rpl:linux', fingerprint)] built = self.cookItem(repos, self.cfg, 'testcase', ignoreDeps=True) trv = repos.getTrove('testcase', v, f) self.assertFalse(not trv.getSigs().digitalSigs.freeze(), "Package was not signed when cooked") self.assertFalse( trv.verifyDigitalSignatures() != (openpgpfile.TRUST_TRUSTED, [], set()), "Bad digital signature for cooked package") finally: self.cfg.signatureKeyMap = signatureKeyMap
def testTroveFilterFlavors3(self): recipe = self.getRecipe() filt1 = trovefilter.TroveFilter(recipe, flavor='xen,domU is: x86') filt2 = trovefilter.TroveFilter( recipe, flavor='xen,domU is: x86(sse, sse2, 486, 586, 686)') nvf1 = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor('xen,domU is: x86')) nvf2 = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor('xen,domU is: x86(sse, sse2, 486, 586, 686)')) self.assertEquals(filt1.match((nvf1, )), True) self.assertEquals(filt2.match((nvf2, )), True) # most important test. x86 filter matches x86(sse) self.assertEquals(filt1.match((nvf2, )), True) self.assertEquals(filt2.match((nvf1, )), False)
def testFileObjMissing(self): # create an absolute changeset cs = changeset.ChangeSet() # add a pkg diff flavor = deps.deps.parseFlavor('') v = versions.VersionFromString('/%s/1.0-1-1' %self.cfg.buildLabel.asString()).copy() v.resetTimeStamps() t = trove.Trove('test:test', v, flavor, None) path = self.workDir + '/blah' f = open(path, 'w') f.write('hello, world!\n') f.close() pathId = sha1helper.md5String('/blah') f = files.FileFromFilesystem(path, pathId) # add the file, and SKIP including # the filestream by using cs.addFile(). This creates an # incomplete changeset t.addFile(pathId, '/blah', v, f.fileId()) cs.addFileContents(pathId, f.fileId(), changeset.ChangedFileTypes.file, filecontents.FromFilesystem(path), f.flags.isConfig()) t.computeDigests() diff = t.diff(None, absolute = 1)[0] cs.newTrove(diff) repos = self.openRepository() try: repos.commitChangeSet(cs) assert 0, "Did not raise IntegrityError" except errors.IntegrityError, e: assert(str(e).startswith("Incomplete changeset specified: missing pathId e806729b6a2b568fa7e77c3efa3a9684 fileId"))
def testUseOwnDb(self): # We can pass our own database to loadInstalled to cause its behavior # to differ from the original expected behavior a bit. # rMake uses this to fiddle w/ the troves that match a hostname/label # request. repos = self.openRepository() cfg = copy.copy(self.cfg) branch = versions.VersionFromString('/localhost@rpl:devel//shadow/') db = trovesource.SimpleTroveSource() self.addTestPkg(1, version='1.0') test2Recipe = recipes.createRecipe(2, version='1.0', header='loadInstalled("test1")') cfg.buildLabel = versions.Label('localhost@rpl:branch') cfg.installLabelPath = [cfg.buildLabel] self.addComponent('test2:source', '/localhost@rpl:branch/1.0', [('test2.recipe', test2Recipe)]) try: loader = self._testSubload(repos, "loadSuperClass('test2')", cfg=cfg, branch=branch) assert (0) except Exception, err: assert (str(err).find('cannot find source component test1:source:') != -1) pass
def _createCs(version): # create an absolute changeset flavor = deps.parseFlavor('') cs = changeset.ChangeSet() # add a pkg diff v = versions.VersionFromString(version, timeStamps=[1.000]) old = trove.Trove('test', v, flavor, None) old.setIsCollection(True) old.addTrove('test:foo', v, flavor, byDefault=True) old.addTrove('test:bar', v, flavor, byDefault=False) old.computeDigests() # add the 'test' package diff = old.diff(None)[0] cs.newTrove(diff) cs.addPrimaryTrove('test', v, flavor) # add the test:foo component oldfoo = trove.Trove('test:foo', v, flavor, None) oldfoo.computeDigests() diff = oldfoo.diff(None)[0] cs.newTrove(diff) # add the test:bar component oldbar = trove.Trove('test:bar', v, flavor, None) oldbar.computeDigests() diff = oldbar.diff(None)[0] cs.newTrove(diff) return cs
def testFileContentsMissing(self): # currently causes a 500 error #raise testhelp.SkipTestException # create an absolute changeset cs = changeset.ChangeSet() # add a pkg diff flavor = deps.deps.parseFlavor('') v = versions.VersionFromString('/%s/1.0-1-1' %self.cfg.buildLabel.asString()).copy() v.resetTimeStamps() t = trove.Trove('test:test', v, flavor, None) path = self.workDir + '/blah' f = open(path, 'w') f.write('hello, world!\n') f.close() pathId = sha1helper.md5String('/blah') f = files.FileFromFilesystem(path, pathId) # add the file, but munge the fileid fileId = f.fileId() cs.addFile(None, fileId, f.freeze()) t.addFile(pathId, '/blah', v, fileId) # skip adding the file contents t.computeDigests() diff = t.diff(None, absolute = 1)[0] cs.newTrove(diff) repos = self.openRepository() try: repos.commitChangeSet(cs) assert 0, "Did not raise integrity error" except errors.IntegrityError, e: assert(str(e).startswith("Missing file contents for pathId e806729b6a2b568fa7e77c3efa3a9684, fileId"))
def fixTroveSig(self, repos, instanceId): cu = self.db.cursor() cu.execute( """ select Items.item as name, Versions.version, Flavors.flavor from Instances join Items using (itemId) join Versions on Instances.versionId = Versions.versionId join Flavors on Instances.flavorId = Flavors.flavorId where Instances.instanceId = ?""", instanceId) (name, version, flavor) = cu.fetchall()[0] # check the signature trv = repos.getTrove(name, versions.VersionFromString(version), deps.ThawFlavor(flavor)) if trv.verifyDigests(): return logMe(3, "updating trove sigs: %s %s %s" % (name, version, flavor)) trv.computeDigests() cu.execute( "delete from TroveInfo where instanceId = ? " "and infoType = ?", (instanceId, trove._TROVEINFO_TAG_SIGS)) cu.execute( "insert into TroveInfo (instanceId, infoType, data) " "values (?, ?, ?)", (instanceId, trove._TROVEINFO_TAG_SIGS, cu.binary(trv.troveInfo.sigs.freeze())))
def findAvailableTargetFlavors(self, repos): if self.branchStr is None: # redirect to nothing return set() if self.branchStr[0] == '/': branch = versions.VersionFromString(self.branchStr) if not isinstance(branch, versions.Branch): raise builderrors.RecipeFileError, \ "Redirects must specify branches or labels, " \ "not versions" log.info('redirecting to branches is deprecated; redirects must ' 'be to labels') matches = repos.getTroveLeavesByBranch( {self.destName: { branch: None }}) else: label = versions.Label(self.branchStr) matches = repos.getTroveLatestByLabel( {self.destName: { label: None }}) targetFlavors = set() # Get the flavors and branch available on the target for version, flavorList in matches.get(self.destName, {}).iteritems(): targetFlavors.update((version, x) for x in flavorList) return targetFlavors
def testRedirectFromTrove(self): self.addComponent('test:runtime', '1.0') self.addComponent('test-foo:runtime', '1.0') self.addCollection('test', '1.0', [':runtime']) self.addCollection('test-foo', '1.0', [':runtime']) redirectBranch = '/%s//branch' % self.cfg.buildLabel self.addComponent('redirect:runtime', '%s/0.1' % redirectBranch) self.addComponent('redirect-foo:runtime', '%s/0.1' % redirectBranch) self.addCollection('redirect', '%s/0.1' % redirectBranch, [':runtime']) self.addCollection('redirect-foo', '%s/0.1' % redirectBranch, [':runtime']) v1 = versions.VersionFromString('/%s//branch/1.0-1' % self.cfg.buildLabel) built, d = self.buildRecipe(redirectWithPkgRecipe, "testRedirectWithPkg", sourceVersion=v1) self.checkUpdate(['redirect=:branch', 'redirect-foo=:branch'], [ 'test=--1.0', 'test:runtime=--1.0', 'test-foo=--1.0', 'test-foo:runtime=--1.0' ]) # make sure you can't shadow a redirect try: self.mkbranch("/localhost@rpl:linux//branch/1.0-1-0.1", versions.Label("localhost@foo:bar"), "redirect", shadow=True) except conary.errors.ShadowRedirect, e: assert ( str(e) == 'cannot create a shadow of redirect=/localhost@rpl:linux//branch/1.0-1-0.1[] because it is a redirect' )
def testCookPackageCascade(self): fingerprint = '95B457D16843B21EA3FC73BBC7C32FC1F94E405E' self.makeSourceTrove('testcase', testRecipe) v = versions.VersionFromString('/localhost@rpl:linux/1.0-1-1') f = deps.parseFlavor('') repos = self.openRepository() signatureKey = self.cfg.signatureKey try: self.cfg.signatureKey = fingerprint built = self.cookItem(repos, self.cfg, 'testcase', ignoreDeps=True) # ensure components of cooked trove are also signed. trv = repos.getTrove('testcase:runtime', v, f) self.assertFalse( not trv.getSigs().digitalSigs.freeze(), "Component was not signed when package was cooked") self.assertFalse( trv.verifyDigitalSignatures() != (openpgpfile.TRUST_TRUSTED, [], set()), "Bad digital signature for coponent of cooked package") finally: self.cfg.signatureKey = signatureKey
def testFileIdWrong(self): # create an absolute changeset cs = changeset.ChangeSet() # add a pkg diff flavor = deps.deps.parseFlavor('') v = versions.VersionFromString('/%s/1.0-1-1' %self.cfg.buildLabel.asString()).copy() v.resetTimeStamps() t = trove.Trove('test:test', v, flavor, None) path = self.workDir + '/blah' f = open(path, 'w') f.write('hello, world!\n') f.close() pathId = sha1helper.md5String('/blah') f = files.FileFromFilesystem(path, pathId) # add the file, but munge the fileid brokenFileId = ''.join(reversed(f.fileId())) cs.addFile(None, brokenFileId, f.freeze()) t.addFile(pathId, '/blah', v, brokenFileId) t.computeDigests() diff = t.diff(None, absolute = 1)[0] cs.newTrove(diff) repos = self.openRepository() try: repos.commitChangeSet(cs) assert 0, "Integrity Error not raised" except errors.TroveIntegrityError, e: assert(str(e) == 'fileObj.fileId() != fileId in changeset for ' 'pathId %s' % sha1helper.md5ToString(pathId))
def testInstances(self): cx = self.getDB() schema.createSchema(cx) cx.commit() v = versiontable.VersionTable(cx) f = flavors.Flavors(cx) it = items.Items(cx) item = it.addId('foo') version = v.addId(versions.VersionFromString('/c@r:d/1.0-1-1')) d = deps.parseDep('') flavor = f.get(d, None) idb = instances.InstanceTable(cx) idb.addId(item, version, flavor, clonedFromId=None, troveType=0) self.assertEqual(idb[(item, version, flavor)], 1) self.assertEqual(idb.getId(1), (item, version, flavor, 1)) del idb idb = instances.InstanceTable(cx) self.assertEqual(idb[(item, version, flavor)], 1) cu = cx.cursor() cu.execute( "select isPresent, clonedFromId from instances where instanceid = 1" ) row = cu.fetchall()[0] self.assertEqual(row[0], 1) self.assertEqual(row[1], None) idb.update(1, isPresent=0, clonedFromId=1) cu.execute( "select isPresent, clonedFromId from instances where instanceid = 1" ) row = cu.fetchall()[0] self.assertEqual(row[0], 0) self.assertEqual(row[1], 1)
def getFactory(self, troveSpec, affinityTroves): """ Return a string that describes this troveSpec's versionStr The string returned corresponds to a function name for sorting on that versionStr type. """ name = troveSpec[0] versionStr = troveSpec[1] if not versionStr: labelPath = self._getLabelPath(troveSpec, self.queryOptions, affinityTroves, versionStr) if (not labelPath and not self.queryOptions.allowNoLabel and not self.queryOptions.allowMissing): message = ("No search label path given and no label specified" " for trove %s - set the installLabelPath" % name) raise errors.LabelPathNeeded(message) return QueryByLabelPathSetFactory, labelPath if isinstance(versionStr, versions.Version): return QueryByVersionSetFactory, versionStr elif isinstance(versionStr, versions.Branch): return QueryByBranchSetFactory, versionStr firstChar = versionStr[0] if firstChar == '/': try: version = versions.VersionFromString(versionStr) except errors.ParseError, e: raise errors.TroveNotFound, str(e) if isinstance(version, versions.Branch): return QueryByBranchSetFactory, version else: return QueryByVersionSetFactory, version
def _convertLabelOrBranch(lblStr, template): try: if not lblStr: return None if lblStr[0] == '/': v = versions.VersionFromString(lblStr) if isinstance(v, versions.Branch): return v # Some day we could lift this restriction if its useful. raise errors.ParseError('Cannot specify version to promote' ' - must specify branch or label') if not template: return versions.Label(lblStr) hostName = template.getHost() nameSpace = template.getNamespace() tag = template.branch if lblStr[0] == ':': lblStr = '%s@%s%s' % (hostName, nameSpace, lblStr) elif lblStr[0] == '@': lblStr = '%s%s' % (hostName, lblStr) elif lblStr[-1] == '@': lblStr = '%s%s:%s' % (lblStr, nameSpace, tag) return versions.Label(lblStr) except Exception, msg: raise errors.ParseError('Error parsing %r: %s' % (lblStr, msg))
def _commitIdList(commitList): for n, vStr, fStr in commitList: v = versions.VersionFromString(vStr) f = deps.parseFlavor(fStr) yield (commitId, Items.getOrAddId(n), Versions.getOrAddId(v.asString()), Flavors.getOrAddId(f.freeze()))
def testSearchSourceStackSearchesOtherLabelsFirst(self): ss = self.getSearchSource() self.addComponent('foo:runtime=:branch/1-1-1') self.addComponent('foo:runtime=:branch/1-1-2') self.addComponent('foo:runtime=:branch/2-1-1') self.addComponent('foo:runtime=:linux/3-1-1') self.addComponent('foo:runtime=:linux/3-1-2') self.addComponent('foo:runtime=:linux/4-1-1') stack = searchsource.createSearchSourceStackFromStrings(ss, ['localhost@rpl:1', 'foo:runtime=:branch/1-1-1'], self.cfg.flavor) def _find(verStr): troveSpec = ('foo:runtime', verStr, None) results = stack.findTroves([troveSpec]) assert(len(results[troveSpec]) == 1) return str(results[troveSpec][0][1].trailingRevision()) assert(_find('localhost@rpl:branch') == '1-1-1') assert(_find('localhost@rpl:branch/1') == '1-1-1') assert(_find('localhost@rpl:branch/2') == '2-1-1') assert(_find('localhost@rpl:branch/1-1-2') == '1-1-2') assert(_find('@rpl:branch') == '1-1-1') assert(_find('@rpl:branch/1') == '1-1-1') assert(_find('@rpl:branch/1-1-1') == '1-1-1') assert(_find('@rpl:branch/1-1-2') == '1-1-2') assert(_find('@rpl:branch/2') == '2-1-1') assert(_find(':branch') == '1-1-1') assert(_find(':branch/1') == '1-1-1') assert(_find(':branch/2') == '2-1-1') assert(_find(':branch/1-1-1') == '1-1-1') assert(_find(':branch/1-1-2') == '1-1-2') assert(_find('localhost@') == '1-1-1') assert(_find('/localhost@rpl:branch') == '1-1-1') assert(_find('/localhost@rpl:branch/1-1-1') == '1-1-1') assert(_find('/localhost@rpl:branch/1-1-2') == '1-1-2') assert(_find('/localhost@rpl:branch/2-1-1') == '2-1-1') assert(_find(versions.VersionFromString('/localhost@rpl:branch')) == '1-1-1') assert(_find(versions.VersionFromString('/localhost@rpl:branch/1-1-1')) == '1-1-1') assert(_find(versions.VersionFromString('/localhost@rpl:linux')) == '4-1-1') assert(_find(versions.VersionFromString('/localhost@rpl:linux/4-1-1')) == '4-1-1') assert(_find('localhost@rpl:linux') == '4-1-1') try: _find('/localhost@rpl:branch//') assert(0) except errors.TroveNotFound, msg: assert(str(msg) == 'Error parsing version "/localhost@rpl:branch//": branch tag may not be empty')
def __thaw__(d): d = d.copy() new = CookResults(d.pop('name'), versions.VersionFromString(d.pop('version')), [ThawFlavor(x) for x in d.pop('flavorList')]) new.__dict__.update(d) new.failureReason = thaw('FailureReason', new.failureReason) return new
def testTroveFilterNot(self): recipe = self.getRecipe() filt = -trovefilter.TroveFilter(recipe, name='foo') nvf = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), False) nvf = ('bar', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), True) filt = ~trovefilter.TroveFilter(recipe, name='foo') nvf = ('foo', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), False) nvf = ('bar', versions.VersionFromString( \ '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor('')) self.assertEquals(filt.match((nvf, )), True)
def testFindTrove(self): _, facade = self.prep() r = MockRepositoryClient() self.mock( conaryfacade.ConaryFacade, '_getRepositoryClient', lambda *args: mockedMethod(args[0], None, None, r, *args[1:])) # pointless to mock _getVersion and _getFlavor versionString = '/a@b:c/1.2.3-1' returnedTroveTup = facade._findTrove('foo:source', versionString) assert len(r.recordFindTroveArgs) == 1 labelPath, troveTup = r.recordFindTroveArgs[0] name, versionObject, flavorObject = returnedTroveTup assert troveTup[1] == str(returnedTroveTup[1]) assert labelPath is None assert name == 'foo:source' assert versionObject == versions.VersionFromString(versionString) assert flavorObject == deps.Flavor() r.recordFindTroveArgs = [] returnedTroveTup = facade._findTrove('foo', '1.2.3-1-1', labelPath='a@b:c', flavor='bootstrap') assert len(r.recordFindTroveArgs) == 1 labelPath, troveTup = r.recordFindTroveArgs[0] name, versionObject, flavorObject = returnedTroveTup # transformed due to labelPath: assert troveTup[1] != str(returnedTroveTup[1]) assert labelPath == ('a@b:c', ) assert name == 'foo' assert versionObject == versions.VersionFromString('/a@b:c/1.2.3-1-1') assert flavorObject == deps.parseFlavor('bootstrap') r.findTroves = lambda *args, **kw: {} returnedTroveTup = facade._findTrove('foo', '1.2.3-1-1', labelPath='a@b:c', flavor='bootstrap') assert (returnedTroveTup is None) def findTroves(*args, **kw): raise conaryerrors.LabelPathNeeded r.findTroves = findTroves self.assertRaises(errors.RbuildError, facade._findTrove, 'foo', '1.2.3-1-1')