def testTags(self): # tags is a list. ensure nothing sloppy is done wrt class attributes foo = filetypes.RegularFile(tags=['1', '2', '3']) fileObj = foo.get(pathId) self.assertEquals(fileObj.tags(), ['1', '2', '3']) # test that each invocation is separate foo = filetypes.RegularFile(tags=['4', '5']) fileObj = foo.get(pathId) self.assertEquals(fileObj.tags(), ['4', '5']) # test that we didn't affect the default foo = filetypes.RegularFile() fileObj = foo.get(pathId) self.assertEquals(fileObj.tags(), [])
def testModeAlias(self): foo = filetypes.RegularFile(mode=0777) bar = filetypes.RegularFile(perms=0777) self.assertEquals( foo.get(pathId).inode.perms(), bar.get(pathId).inode.perms()) self.assertRaises(filetypes.ParameterError, filetypes.RegularFile, mode=0600, perms=0600) self.assertRaises(filetypes.ParameterError, filetypes.RegularFile, mode=0600, perms=0700)
def testPackageRecipeDeps2(self): # ensure that we don't force any particular trovename to be associated # with a given recipe name. pkgRecipe = """class PackageRecipe(SourcePackageRecipe): name = 'differentname' version = '1.0.0' abstractBaseClass = 1 clearBuildReqs() buildRequires = ['foo:devel']""" simpleRecipe = """class Simple(PackageRecipe): name = 'simple' version = '1' # don't clear the buildReqs. that's what we're trying to test def setup(r): r.Create('/opt/foo')""" self.addComponent('foo:devel') self.addComponent('differentname:recipe', fileContents = [('/differentname.recipe', filetypes.RegularFile(contents = pkgRecipe))]) self.addCollection('differentname', strongList = ['differentname:recipe']) self.cfg.autoLoadRecipes = ['differentname'] err = self.assertRaises(errors.RecipeDependencyError, self.buildRecipe, simpleRecipe, "Simple") self.updatePkg('foo:devel') self.buildRecipe(simpleRecipe, 'Simple')
def testRegularFileContents(self): foo = filetypes.RegularFile(contents=StringIO('foo1')) fileObj = foo.get(pathId) f = foo.getContents() self.assertEquals(f.read(), 'foo1') tmpDir = tempfile.mkdtemp() try: tmpPath = os.path.join(tmpDir, 'foo.txt') f = open(tmpPath, 'w') f.write('foo2') f.close() f = open(tmpPath) foo = filetypes.RegularFile(contents=f) f = foo.getContents() self.assertEquals(f.read(), 'foo2') finally: util.rmtree(tmpDir)
def testRegularFileBasics(self): foo = filetypes.RegularFile(contents='foo1') fileObj = foo.get(pathId) f = foo.getContents() self.assertEquals(f.read(), 'foo1') self.assertEquals(fileObj.flags(), 0) self.assertEquals(fileObj.flavor(), deps.Flavor()) self.assertEquals(fileObj.provides(), deps.DependencySet()) self.assertEquals(fileObj.requires(), deps.DependencySet()) self.assertEquals(fileObj.inode.perms(), 0644) self.assertEquals(fileObj.inode.owner(), 'root') self.assertEquals(fileObj.inode.group(), 'root') self.assertEquals(fileObj.lsTag, '-') self.assertEquals(fileObj.linkGroup(), None) self.assertEquals( fileObj.fileId(), '(\x01\x9a\xcbz\xbb\x93\x15\x01c\xcf\xd5\x14\xef\xf7,S\xbb\xf8p') requires = deps.ThawDependencySet('4#foo::runtime') provides = deps.ThawDependencySet('11#foo') flv = deps.parseFlavor('xen,domU is: x86') bar = filetypes.RegularFile(contents=StringIO('bar'), config=True, provides=provides, requires=requires, flavor=flv, owner='foo', group='bar', perms=0700, mtime=12345, tags=['tag1', 'tag2']) fileObj = bar.get(pathId) self.assertEquals(bool(fileObj.flags.isInitialContents()), False) self.assertEquals(bool(fileObj.flags.isTransient()), False) self.assertEquals(bool(fileObj.flags.isConfig()), True) self.assertEquals(fileObj.requires(), requires) self.assertEquals(fileObj.provides(), provides) self.assertEquals(fileObj.flavor(), flv) self.assertEquals(fileObj.inode.perms(), 0700) self.assertEquals(fileObj.inode.owner(), 'foo') self.assertEquals(fileObj.inode.group(), 'bar') self.assertEquals(fileObj.inode.mtime(), 12345) self.assertEquals(fileObj.tags(), ['tag1', 'tag2'])
def testRegularFileDeps(self): reqStr = 'trove: bar:lib' provStr = 'python: tarfile(2.4 lib64)' flavorStr = '~sse2 is: x86_64' foo = filetypes.RegularFile(requires=reqStr, provides=provStr, flavor=flavorStr) fileObj = foo.get(pathId) self.assertEquals(fileObj.flavor(), deps.parseFlavor(flavorStr)) self.assertEquals(fileObj.requires(), deps.parseDep(reqStr)) self.assertEquals(fileObj.provides(), deps.parseDep(provStr))
def testPathIdParam(self): pathId1 = 16 * '1' pathId2 = 16 * '2' foo = filetypes.RegularFile(mode=0777, mtime=1) fileObj1 = foo.get(pathId1) fileObj2 = foo.get(pathId2) self.assertEquals(fileObj1.freeze(), fileObj2.freeze()) self.assertNotEquals(fileObj1.pathId(), fileObj2.pathId())
def testBaseRequiresRecipeDeps(self): baseReqRecipe = """class BaseRequiresRecipe(AbstractPackageRecipe): name = 'baserequires' version = '1.0.0' abstractBaseClass = 1 buildRequires = ['foo:devel']""" pkgRecipe = defaultrecipes.PackageRecipe.replace( \ 'internalAbstractBaseClass', 'abstractBaseClass') pkgRecipe += "\n version = '1'" simpleRecipe = """class Simple(PackageRecipe): name = 'simple' version = '1' # don't clear the buildReqs. that's what we're trying to test def setup(r): r.Create('/opt/foo')""" self.addComponent('baserequires:recipe', fileContents = [('/baserequires.recipe', filetypes.RegularFile(contents = baseReqRecipe))]) self.addCollection('baserequires', strongList = ['baserequires:recipe']) self.addComponent('package:recipe', fileContents = [('/package.recipe', filetypes.RegularFile(contents = pkgRecipe))]) self.addCollection('package', strongList = ['package:recipe']) self.cfg.autoLoadRecipes = ['baserequires', 'package'] err = self.assertRaises(errors.RecipeDependencyError, self.buildRecipe, simpleRecipe, "Simple") for comp in ('foo:devel', 'bzip2:runtime', 'gzip:runtime', 'tar:runtime', 'cpio:runtime', 'patch:runtime'): self.addComponent(comp) self.updatePkg(comp) self.buildRecipe(simpleRecipe, 'Simple')
def testUserInfoRecipeDeps(self): baseReqRecipe = """class BaseRequiresRecipe(AbstractPackageRecipe): name = 'baserequires' version = '1' abstractBaseClass = 1 buildRequires = ['foo:devel']""" userInfoRecipe = defaultrecipes.UserInfoRecipe.replace( \ 'internalAbstractBaseClass', 'abstractBaseClass') userInfoRecipe += "\n version = '1'" infoRecipe = """class InfoFoo(UserInfoRecipe): name = 'info-foo' version = '1' # don't clear the buildReqs. that's what we're trying to test def setup(r): r.User('foo', 2121)""" self.addComponent('foo:devel') self.addComponent('baserequires:recipe', fileContents = [('/baserequires.recipe', filetypes.RegularFile(contents = baseReqRecipe))]) self.addCollection('baserequires', strongList = ['baserequires:recipe']) self.addComponent('userinfo:recipe', fileContents = [('/userinfo.recipe', filetypes.RegularFile(contents = userInfoRecipe))]) self.addCollection('userinfo', strongList = ['userinfo:recipe']) self.cfg.autoLoadRecipes = ['baserequires', 'userinfo'] err = self.assertRaises(errors.RecipeDependencyError, self.buildRecipe, infoRecipe, "InfoFoo") self.updatePkg('foo:devel') self.buildRecipe(infoRecipe, 'InfoFoo')
def testGroupInfoRecipeCook2(self): groupInfoRecipe = """ class GroupInfoRecipe(UserGroupInfoRecipe, BaseRequiresRecipe): name = 'groupinfo' clearBuildReqs() version = '1' abstractBaseClass = 1 """ # if we don't re-direct this setting, we can't build self.cfg.baseClassDir = '/usr/share/conary/baseclasses' self.openRepository() client = self.getConaryClient() repos = client.getRepos() fileDict = {'groupinfo.recipe' : filetypes.RegularFile(contents = groupInfoRecipe, config = True)} chLog = changelog.ChangeLog(name = 'foo', contact = 'bar', message = 'test\n') cs = client.createSourceTrove('groupinfo:source', str(self.cfg.buildLabel), '1', fileDict, chLog) repos.commitChangeSet(cs) res = self.cookFromRepository('groupinfo:source', buildLabel = self.cfg.buildLabel, repos = repos, logBuild = True) self.assertEquals(res[0][0], 'groupinfo:recipe')
def _makeSourceTrove(package, helper): cs = ChangeSet() filesToAdd = {} ver = macro.expand(package.getBaseVersion(), package) version = _createVersion(package, helper, ver) latestSpec = (package.getName(), str(version.trailingLabel()), None) results = helper.getRepos().findTroves(None,[latestSpec],allowMissing=True, getLeaves=False,troveTypes=trovesource.TROVE_QUERY_ALL) if results: existingVersions = [x[1] for x in results.get(latestSpec, ())] while version in existingVersions: version.incrementSourceCount() new = Trove(package.name, version, deps.Flavor()) new.setFactory(package.targetConfig.factory) message = "Temporary Source for %s" % version message = message.rstrip() + "\n" new.changeChangeLog(ChangeLog(name=helper.cfg.name, contact=helper.cfg.contact, message=message)) for path, contents in package.recipeFiles.iteritems(): isText = path == package.getRecipeName() pathId = hashlib.md5(path).digest() fileHelper = filetypes.RegularFile(contents=contents, config=isText) fileStream = fileHelper.get(pathId) fileStream.flags.isSource(set=True) fileId = fileStream.fileId() fileVersion = new.getVersion() key = pathId + fileId filesToAdd[key] = (fileStream, fileHelper.contents, isText) new.addFile(pathId, path, fileVersion, fileId) new.invalidateDigests() new.computeDigests() for key, (fileObj, fileContents, cfgFile) in filesToAdd.items(): cs.addFileContents(fileObj.pathId(), fileObj.fileId(), ChangedFileTypes.file, fileContents, cfgFile) cs.addFile(None, fileObj.fileId(), fileObj.freeze()) cs.newTrove(new.diff(None, absolute=True)[0]) return new.getNameVersionFlavor(), cs
def _addFile(path, contents, isText): if path in oldFiles: # Always recycle pathId if available. pathId, _, oldFileId, oldFileVersion = oldFiles[path] else: pathId = hashlib.md5(path).digest() oldFileId = oldFileVersion = None fileHelper = filetypes.RegularFile(contents=contents, config=isText) fileStream = fileHelper.get(pathId) fileStream.flags.isSource(set=True) fileId = fileStream.fileId() # If the fileId matches, recycle the fileVersion too. if fileId == oldFileId: fileVersion = oldFileVersion else: fileVersion = newTrove.getVersion() filesToAdd[fileId] = (fileStream, fileHelper.contents, isText) newTrove.addFile(pathId, path, fileVersion, fileId)
def _addPhantomTrove(self, changeSet, rpmlibHeader, callback, num, total): header = rpmhelper.headerFromBlob(rpmlibHeader.unload()) callback.capsuleSyncCreate(self.kind, str(header.getNevra()), num, total) name, version, flavor = self._getPhantomNVF(header) # Fake trove trv = trove.Trove(name, version, flavor) provides = header.getProvides() provides.addDep(deps.TroveDependencies, deps.Dependency(name)) trv.setProvides(provides) trv.setRequires(header.getRequires(enableRPMVersionDeps=False)) # Fake capsule file path = str(header.getNevra()) + '.rpm' fileHelper = filetypes.RegularFile(contents='') fileStream = fileHelper.get(pathId=trove.CAPSULE_PATHID) trv.addRpmCapsule(path, version, fileStream.fileId(), header) changeSet.addFile(None, fileStream.fileId(), fileStream.freeze()) # Fake encapsulated files self._addPhantomContents(changeSet, trv, header) trv.computeDigests() changeSet.newTrove(trv.diff(None)[0]) # Make a fake package to contain the fake component pkgName = name.split(':')[0] if self.db.hasTrove(pkgName, version, flavor): # It's possible to erase just the component and leave the package, # so don't try to create it again. return pkg = trove.Trove(pkgName, version, flavor) provides = deps.DependencySet() provides.addDep(deps.TroveDependencies, deps.Dependency(pkgName)) pkg.setProvides(provides) pkg.setIsCollection(True) pkg.addTrove(name, version, flavor, byDefault=True) pkg.computeDigests() changeSet.newTrove(pkg.diff(None)[0])
def testLinkGroup(self): foo = filetypes.RegularFile(linkGroup='12345') fileObj = foo.get(pathId) self.assertEquals(fileObj.linkGroup(), '12345')