def testSecureHTTPServer(self): # Checks that the secure SSL server works if not server.SSL: raise testhelp.SkipTestException("m2crypto not installed") cfg = server.ServerConfig() cfg.port = testhelp.findPorts(1)[0] cfg.tmpdir = os.path.join(self.workDir, 'proxyTmpDir') cfg.changesetCacheDir = os.path.join(self.workDir, 'changesetCacheDir') cfg.proxyContentsDir = os.path.join(self.workDir, 'proxyContentsDir') cfg.traceLog = (10, os.path.join(self.workDir, "proxy.debug")) cfg.useSSL = True cfg.sslCert = os.path.join(resources.get_archive(), 'ssl-cert.crt') cfg.sslKey = os.path.join(resources.get_archive(), 'ssl-cert.key') cfgfile = os.path.join(self.workDir, "proxy.conf") serverrc = open(cfgfile, "w+") cfg.store(serverrc, includeDocs=False) serverrc.close() util.mkdirChain(cfg.tmpdir) util.mkdirChain(cfg.changesetCacheDir) util.mkdirChain(cfg.proxyContentsDir) pid = os.fork() if pid == 0: # In the child try: errfd = os.open(os.path.join(self.workDir, "proxy.log"), os.O_RDWR | os.O_CREAT) os.dup2(errfd, sys.stderr.fileno()) os.close(errfd) srvpy = os.path.abspath(server.__file__).replace('.pyc', '.py') os.execv(srvpy, [ srvpy, '--config-file', cfgfile ]) os._exit(0) except: os._exit(70) self.openRepository(2, useSSL=True) # In the parent try: # Set conary proxy self.cfg.configLine("conaryProxy https://localhost:%s" % cfg.port) client = conaryclient.ConaryClient(self.cfg) sock_utils.tryConnect("127.0.0.1", cfg.port) srvVers = client.repos.c['localhost2'].checkVersion() self.assertTrue(srvVers) finally: self.servers.stopServer(2) os.kill(pid, signal.SIGTERM) os.waitpid(pid, 0)
def testGetDeps(self): f = open(resources.get_archive() + "/gnome-main-menu-0.9.10-26.x86_64.rpm") h = rpmhelper.readHeader(f) req, prov = h.getDeps(enableRPMVersionDeps=False) self.assertEqual( req.freeze(), "3#/bin/sh|3#/sbin/ldconfig|3#/usr/bin/gconftool-2|16#coreutils|16#dbus-1-glib|16#eel|16#gnome-main-menu-lang|16#gnome-panel|16#hal|16#libICE.so.6[64bit]|16#libORBit-2.so.0[64bit]|16#libORBitCosNaming-2.so.0[64bit]|16#libSM.so.6[64bit]|16#libX11.so.6[64bit]|16#libXau.so.6[64bit]|16#libXrender.so.1[64bit]|16#libart_lgpl_2.so.2[64bit]|16#libasound.so.2[64bit]|16#libatk-1.0.so.0[64bit]|16#libaudiofile.so.0[64bit]|16#libavahi-client.so.3[64bit]|16#libavahi-common.so.3[64bit]|16#libavahi-glib.so.1[64bit]|16#libbonobo-2.so.0[64bit]|16#libbonobo-activation.so.4[64bit]|16#libbonoboui-2.so.0[64bit]|16#libc.so.6[64bit]:GLIBC_2.2.5:GLIBC_2.3.4:GLIBC_2.4|16#libcairo.so.2[64bit]|16#libcrypto.so.0.9.8[64bit]|16#libdbus-1.so.3[64bit]|16#libdbus-glib-1.so.2[64bit]|16#libdl.so.2[64bit]|16#libeel-2.so.2[64bit]|16#libesd.so.0[64bit]|16#libexpat.so.1[64bit]|16#libfontconfig.so.1[64bit]|16#libfreetype.so.6[64bit]|16#libgailutil.so.18[64bit]|16#libgconf-2.so.4[64bit]|16#libgdk-x11-2.0.so.0[64bit]|16#libgdk_pixbuf-2.0.so.0[64bit]|16#libgio-2.0.so.0[64bit]|16#libglade-2.0.so.0[64bit]|16#libglib-2.0.so.0[64bit]|16#libglitz.so.1[64bit]|16#libgmodule-2.0.so.0[64bit]|16#libgnome-2.so.0[64bit]|16#libgnome-desktop-2.so.2[64bit]|16#libgnome-keyring.so.0[64bit]|16#libgnome-menu.so.2[64bit]|16#libgnomecanvas-2.so.0[64bit]|16#libgnomeui-2.so.0[64bit]|16#libgnomevfs-2.so.0[64bit]|16#libgobject-2.0.so.0[64bit]|16#libgthread-2.0.so.0[64bit]|16#libgtk-x11-2.0.so.0[64bit]|16#libgtop-2.0.so.7[64bit]|16#libhal-storage.so.1[64bit]|16#libhal.so.1[64bit]|16#libiw.so.29[64bit]|16#libjpeg.so.62[64bit]|16#libm.so.6[64bit]|16#libnm-util.so.0[64bit]|16#libnm_glib.so.0[64bit]|16#libnsl.so.1[64bit]|16#libnspr4.so[64bit]|16#libnss3.so[64bit]|16#libnssutil3.so[64bit]|16#libpanel-applet-2.so.0[64bit]|16#libpango-1.0.so.0[64bit]|16#libpangocairo-1.0.so.0[64bit]|16#libpangoft2-1.0.so.0[64bit]|16#libpcre.so.0[64bit]|16#libplc4.so[64bit]|16#libplds4.so[64bit]|16#libpng12.so.0[64bit]|16#libpopt.so.0[64bit]|16#libpthread.so.0[64bit]:GLIBC_2.2.5|16#libresolv.so.2[64bit]|16#librsvg-2.so.2[64bit]|16#librt.so.1[64bit]|16#libslab.so.0[64bit]|16#libsmime3.so[64bit]|16#libssl.so.0.9.8[64bit]|16#libssl3.so[64bit]|16#libssui|16#libstartup-notification-1.so.0[64bit]|16#libutil.so.1[64bit]|16#libuuid.so.1[64bit]|16#libxcb-render-util.so.0[64bit]|16#libxcb-render.so.0[64bit]|16#libxcb-xlib.so.0[64bit]|16#libxcb.so.1[64bit]|16#libxml2.so.2[64bit]|16#libz.so.1[64bit]|16#tango-icon-theme|16#wireless-tools|17#CompressedFileNames|17#PayloadFilesHavePrefix|17#PayloadIsLzma", ) self.assertEqual(prov.freeze(), "16#gnome-main-menu|16#libslab.so.0[64bit]") f = open(resources.get_archive() + "/popt-1.5-4x.i386.rpm") h = rpmhelper.readHeader(f) req, prov = h.getDeps() self.assertEqual(req.freeze(), "") self.assertEqual(prov.freeze(), "16#libpopt.so.0")
def testRpmMagic(self): packages = [ ('rpm-with-bzip-5.0.29-1.i386.rpm', ('rpm-with-bzip', None, '5.0.29', '1', 'i386', False, 'RPM with a bzip payload', 'junk', 'GPL')), ('rpm-with-bzip-5.0.29-1.src.rpm', ('rpm-with-bzip', None, '5.0.29', '1', 'i386', True, 'RPM with a bzip payload', 'junk', 'GPL')), ('fileless-0.1-1.noarch.rpm', ('fileless', None, '0.1', '1', 'noarch', False, 'Foo', 'Foo', 'GPL')), ('fileless-0.1-1.src.rpm', ('fileless', None, '0.1', '1', 'noarch', True, 'Foo', 'Foo', 'GPL')), ('tags-1.2-3.noarch.rpm', ('tags', 4, '1.2', '3', 'noarch', False, 'Some Summary', 'Some Description', 'Some License')), ('tags-1.2-3.src.rpm', ('tags', 4, '1.2', '3', 'noarch', True, 'Some Summary', 'Some Description', 'Some License')), ] for (pkg, data) in packages: pn, pe, pv, pr, pa, isSource, summary, description, license = data fpath = os.path.join(resources.get_archive(), pkg) m = magic.magic(fpath) self.assertEqual(m.contents['name'], pn) self.assertEqual(m.contents['version'], pv) self.assertEqual(m.contents['release'], pr) self.assertEqual(m.contents['arch'], pa) self.assertEqual(m.contents['epoch'], pe) self.assertEqual(m.contents['isSource'], isSource) self.assertEqual(m.contents['summary'], summary) self.assertEqual(m.contents['description'], description) self.assertEqual(m.contents['license'], license)
def testVersion11Migration(self): dbfile = os.path.join(resources.get_archive(), 'conarydbs', 'conarydb-version-11') fd, fn = tempfile.mkstemp() os.close(fd) shutil.copyfile(dbfile, fn) db, str = self.captureOutput(sqldb.Database, fn) cu = db.db.cursor() # make sure there aren't any install buckets left cu.execute("select count(*) from troveinfo where infoType=?", trove._TROVEINFO_TAG_INSTALLBUCKET) assert(cu.next()[0] == 0) # make sure the path hashs look right for libpng:lib cu.execute("select data from troveinfo, instances where " "trovename='libpng:lib' and " "troveinfo.instanceid=instances.instanceid " "and infoType=?", trove._TROVEINFO_TAG_PATH_HASHES) ph = trove.PathHashes(cu.next()[0]) cu.execute("select path from instances, dbtrovefiles where " "instances.instanceid=dbtrovefiles.instanceid " "and troveName='libpng:lib'") for path, in cu: hash = md5String(path)[:8] assert(hash in ph) ph.remove(hash) assert(not ph) db.close() os.unlink(fn)
def testCarArchive(self): # for now, just make sure we don't treat them as zip m = magic.magic(os.path.join(resources.get_archive(), 'Transmitter.car')) if sys.version_info[:2] == (2, 6): self.assertFalse(m is None) else: self.assertEqual(m, None)
def testLoadInvocationInfo(self): # CNY-2580 jobFile = os.path.join(resources.get_archive(), "job-invocation") uJob = database.UpdateJob(None) uJob.loadInvocationInfo(jobFile) self.assertEqual(uJob.getItemList(), [('group-appliance', (None, None), (None, None), True)])
def testDebHeader(self): fobj = file(os.path.join(resources.get_archive(), "bash.deb")) fields = [ debhelper.NAME, debhelper.VERSION, debhelper.RELEASE, debhelper.SUMMARY, debhelper.DESCRIPTION ] expected = dict([ (debhelper.NAME, 'bash'), (debhelper.VERSION, '3.1'), (debhelper.RELEASE, '2ubuntu10'), (debhelper.SUMMARY, 'The GNU Bourne Again SHell'), (debhelper.DESCRIPTION, '''\ Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates useful features from the Korn and C shells (ksh and csh). Bash is ultimately intended to be a conformant implementation of the IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2). Included in the bash package is the Programmable Completion Code, by Ian Macdonald.'''), ]) h = debhelper.DebianPackageHeader(fobj) ret = dict((k, h[k]) for k in fields) self.assertEqual(ret, expected)
def testRPMSHA1SigTag(self): '''make sure that SHA1HEADER/SIG_SHA1 is represented in troveinfo''' recipestr = """ class TestRPMSHA1(CapsuleRecipe): name = 'simple' version = '1.0' clearBuildReqs() def setup(r): r.addCapsule('simple-1.0-1.i386.rpm') """ pkgName = 'simple' rpmName = 'simple-1.0-1.i386.rpm' r = self._cookPkgs(recipestr, rpmName, pkgName, 'simple') trvCs = [ x for x in r[2].iterNewTroveList() if x.getName() == 'simple:rpm' ][0] archivePath = resources.get_archive() trv = trove.Trove(trvCs) f = open(archivePath + '/' + rpmName, "r") h = rpmhelper.readHeader(f) sha1header = trv.troveInfo.capsule.rpm.sha1header() self.assertEqual(h.get(rpmhelper.SIG_SHA1), sha1helper.sha1ToString(sha1header))
def testTroveDisplaySigs(self): # go through a lot of trouble to sign this trove. # copied from sigtest. self.addComponent('foo:runtime', '1.0') from conary.lib import openpgpfile, openpgpkey from conary.build import signtrove fingerprint = 'F7440D78FE813C882212C2BF8AC2828190B1E477' keyCache = openpgpkey.getKeyCache() keyCache.getPrivateKey(fingerprint, '111111') keyRing = open(resources.get_archive() + '/pubring.gpg') keyData = openpgpfile.exportKey(fingerprint, keyRing) keyData.seek(0) keyData = keyData.read() # upload the public key repos = self.openRepository() repos.addNewPGPKey(self.cfg.buildLabel, 'test', keyData) self.cfg.signatureKey = fingerprint self.cfg.quiet = True signtrove.signTroves(self.cfg, ["foo:runtime"]) rs, txt = self.captureOutput(queryrep.displayTroves, self.cfg, ['foo:runtime'], digSigs=True) assert (txt.startswith('''\ foo:runtime=1.0-1-1 Digital Signature: F7440D78FE813C882212C2BF8AC2828190B1E477:'''))
def testVersion11Migration(self): dbfile = os.path.join(resources.get_archive(), 'conarydbs', 'conarydb-version-11') fd, fn = tempfile.mkstemp() os.close(fd) shutil.copyfile(dbfile, fn) db, str = self.captureOutput(sqldb.Database, fn) cu = db.db.cursor() # make sure there aren't any install buckets left cu.execute("select count(*) from troveinfo where infoType=?", trove._TROVEINFO_TAG_INSTALLBUCKET) assert (cu.next()[0] == 0) # make sure the path hashs look right for libpng:lib cu.execute( "select data from troveinfo, instances where " "trovename='libpng:lib' and " "troveinfo.instanceid=instances.instanceid " "and infoType=?", trove._TROVEINFO_TAG_PATH_HASHES) ph = trove.PathHashes(cu.next()[0]) cu.execute("select path from instances, dbtrovefiles where " "instances.instanceid=dbtrovefiles.instanceid " "and troveName='libpng:lib'") for path, in cu: hash = md5String(path)[:8] assert (hash in ph) ph.remove(hash) assert (not ph) db.close() os.unlink(fn)
def testTroveDisplaySigs(self): # go through a lot of trouble to sign this trove. # copied from sigtest. self.addComponent('foo:runtime', '1.0') from conary.lib import openpgpfile, openpgpkey from conary.build import signtrove fingerprint = 'F7440D78FE813C882212C2BF8AC2828190B1E477' keyCache = openpgpkey.getKeyCache() keyCache.getPrivateKey(fingerprint, '111111') keyRing = open(resources.get_archive() + '/pubring.gpg') keyData = openpgpfile.exportKey(fingerprint, keyRing) keyData.seek(0) keyData = keyData.read() # upload the public key repos = self.openRepository() repos.addNewPGPKey(self.cfg.buildLabel, 'test', keyData) self.cfg.signatureKey = fingerprint self.cfg.quiet = True signtrove.signTroves(self.cfg, [ "foo:runtime"]) rs, txt = self.captureOutput(queryrep.displayTroves, self.cfg, ['foo:runtime'], digSigs=True) assert(txt.startswith('''\ foo:runtime=1.0-1-1 Digital Signature: F7440D78FE813C882212C2BF8AC2828190B1E477:'''))
def testRPMObsoletes(self): '''make sure that obsoletes is represented in troveinfo''' recipestr = """ class TestRPMObsoletes(CapsuleRecipe): name = 'obsolete' version = '1.0' clearBuildReqs() def setup(r): r.addCapsule('obsolete-1.0-1.i386.rpm') """ pkgName = 'obsolete' rpmName = 'obsolete-1.0-1.i386.rpm' r1 = self._cookPkgs(recipestr, rpmName, pkgName, 'obsolete') trvCs = [ x for x in r1[2].iterNewTroveList() if x.getName() == 'obsolete:rpm' ][0] archivePath = resources.get_archive() trv = trove.Trove(trvCs) f = open(archivePath + '/' + rpmName, "r") h = rpmhelper.readHeader(f) obs = [x[1] for x in trv.troveInfo.capsule.rpm.obsoletes.iterAll()] obl = [(x.name(), x.flags(), x.version()) for x in obs] obl.sort() reference = [('bar', 2L, '1.0'), ('baz', 4L, '2.0'), ('foo', 0L, '')] self.assertEqual(obl, reference)
def testRPMSHA1SigTag(self): """make sure that SHA1HEADER/SIG_SHA1 is represented in troveinfo""" recipestr = """ class TestRPMSHA1(CapsuleRecipe): name = 'simple' version = '1.0' clearBuildReqs() def setup(r): r.addCapsule('simple-1.0-1.i386.rpm') """ pkgName = "simple" rpmName = "simple-1.0-1.i386.rpm" r = self._cookPkgs(recipestr, rpmName, pkgName, "simple") trvCs = [x for x in r[2].iterNewTroveList() if x.getName() == "simple:rpm"][0] archivePath = resources.get_archive() trv = trove.Trove(trvCs) f = open(archivePath + "/" + rpmName, "r") h = rpmhelper.readHeader(f) sha1header = trv.troveInfo.capsule.rpm.sha1header() self.assertEqual(h.get(rpmhelper.SIG_SHA1), sha1helper.sha1ToString(sha1header))
def testRPMObsoletes(self): """make sure that obsoletes is represented in troveinfo""" recipestr = """ class TestRPMObsoletes(CapsuleRecipe): name = 'obsolete' version = '1.0' clearBuildReqs() def setup(r): r.addCapsule('obsolete-1.0-1.i386.rpm') """ pkgName = "obsolete" rpmName = "obsolete-1.0-1.i386.rpm" r1 = self._cookPkgs(recipestr, rpmName, pkgName, "obsolete") trvCs = [x for x in r1[2].iterNewTroveList() if x.getName() == "obsolete:rpm"][0] archivePath = resources.get_archive() trv = trove.Trove(trvCs) f = open(archivePath + "/" + rpmName, "r") h = rpmhelper.readHeader(f) obs = [x[1] for x in trv.troveInfo.capsule.rpm.obsoletes.iterAll()] obl = [(x.name(), x.flags(), x.version()) for x in obs] obl.sort() reference = [("bar", 2L, "1.0"), ("baz", 4L, "2.0"), ("foo", 0L, "")] self.assertEqual(obl, reference)
def testDebHeader(self): fobj = file(os.path.join(resources.get_archive(), "bash.deb")) fields = [debhelper.NAME, debhelper.VERSION, debhelper.RELEASE, debhelper.SUMMARY, debhelper.DESCRIPTION] expected = dict([ (debhelper.NAME, 'bash'), (debhelper.VERSION, '3.1'), (debhelper.RELEASE, '2ubuntu10'), (debhelper.SUMMARY, 'The GNU Bourne Again SHell'), (debhelper.DESCRIPTION, '''\ Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates useful features from the Korn and C shells (ksh and csh). Bash is ultimately intended to be a conformant implementation of the IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2). Included in the bash package is the Programmable Completion Code, by Ian Macdonald.'''), ]) h = debhelper.DebianPackageHeader(fobj) ret = dict((k, h[k]) for k in fields) self.assertEqual(ret, expected)
def testGetDeps(self): f = open(resources.get_archive() + '/gnome-main-menu-0.9.10-26.x86_64.rpm') h = rpmhelper.readHeader(f) req, prov = h.getDeps(enableRPMVersionDeps=False) self.assertEqual( req.freeze(), '3#/bin/sh|3#/sbin/ldconfig|3#/usr/bin/gconftool-2|16#coreutils|16#dbus-1-glib|16#eel|16#gnome-main-menu-lang|16#gnome-panel|16#hal|16#libICE.so.6[64bit]|16#libORBit-2.so.0[64bit]|16#libORBitCosNaming-2.so.0[64bit]|16#libSM.so.6[64bit]|16#libX11.so.6[64bit]|16#libXau.so.6[64bit]|16#libXrender.so.1[64bit]|16#libart_lgpl_2.so.2[64bit]|16#libasound.so.2[64bit]|16#libatk-1.0.so.0[64bit]|16#libaudiofile.so.0[64bit]|16#libavahi-client.so.3[64bit]|16#libavahi-common.so.3[64bit]|16#libavahi-glib.so.1[64bit]|16#libbonobo-2.so.0[64bit]|16#libbonobo-activation.so.4[64bit]|16#libbonoboui-2.so.0[64bit]|16#libc.so.6[64bit]:GLIBC_2.2.5:GLIBC_2.3.4:GLIBC_2.4|16#libcairo.so.2[64bit]|16#libcrypto.so.0.9.8[64bit]|16#libdbus-1.so.3[64bit]|16#libdbus-glib-1.so.2[64bit]|16#libdl.so.2[64bit]|16#libeel-2.so.2[64bit]|16#libesd.so.0[64bit]|16#libexpat.so.1[64bit]|16#libfontconfig.so.1[64bit]|16#libfreetype.so.6[64bit]|16#libgailutil.so.18[64bit]|16#libgconf-2.so.4[64bit]|16#libgdk-x11-2.0.so.0[64bit]|16#libgdk_pixbuf-2.0.so.0[64bit]|16#libgio-2.0.so.0[64bit]|16#libglade-2.0.so.0[64bit]|16#libglib-2.0.so.0[64bit]|16#libglitz.so.1[64bit]|16#libgmodule-2.0.so.0[64bit]|16#libgnome-2.so.0[64bit]|16#libgnome-desktop-2.so.2[64bit]|16#libgnome-keyring.so.0[64bit]|16#libgnome-menu.so.2[64bit]|16#libgnomecanvas-2.so.0[64bit]|16#libgnomeui-2.so.0[64bit]|16#libgnomevfs-2.so.0[64bit]|16#libgobject-2.0.so.0[64bit]|16#libgthread-2.0.so.0[64bit]|16#libgtk-x11-2.0.so.0[64bit]|16#libgtop-2.0.so.7[64bit]|16#libhal-storage.so.1[64bit]|16#libhal.so.1[64bit]|16#libiw.so.29[64bit]|16#libjpeg.so.62[64bit]|16#libm.so.6[64bit]|16#libnm-util.so.0[64bit]|16#libnm_glib.so.0[64bit]|16#libnsl.so.1[64bit]|16#libnspr4.so[64bit]|16#libnss3.so[64bit]|16#libnssutil3.so[64bit]|16#libpanel-applet-2.so.0[64bit]|16#libpango-1.0.so.0[64bit]|16#libpangocairo-1.0.so.0[64bit]|16#libpangoft2-1.0.so.0[64bit]|16#libpcre.so.0[64bit]|16#libplc4.so[64bit]|16#libplds4.so[64bit]|16#libpng12.so.0[64bit]|16#libpopt.so.0[64bit]|16#libpthread.so.0[64bit]:GLIBC_2.2.5|16#libresolv.so.2[64bit]|16#librsvg-2.so.2[64bit]|16#librt.so.1[64bit]|16#libslab.so.0[64bit]|16#libsmime3.so[64bit]|16#libssl.so.0.9.8[64bit]|16#libssl3.so[64bit]|16#libssui|16#libstartup-notification-1.so.0[64bit]|16#libutil.so.1[64bit]|16#libuuid.so.1[64bit]|16#libxcb-render-util.so.0[64bit]|16#libxcb-render.so.0[64bit]|16#libxcb-xlib.so.0[64bit]|16#libxcb.so.1[64bit]|16#libxml2.so.2[64bit]|16#libz.so.1[64bit]|16#tango-icon-theme|16#wireless-tools|17#CompressedFileNames|17#PayloadFilesHavePrefix|17#PayloadIsLzma' ) self.assertEqual(prov.freeze(), '16#gnome-main-menu|16#libslab.so.0[64bit]') f = open(resources.get_archive() + '/popt-1.5-4x.i386.rpm') h = rpmhelper.readHeader(f) req, prov = h.getDeps() self.assertEqual(req.freeze(), '') self.assertEqual(prov.freeze(), '16#libpopt.so.0')
def testRpmMagic(self): packages = [ ( "rpm-with-bzip-5.0.29-1.i386.rpm", ("rpm-with-bzip", None, "5.0.29", "1", "i386", False, "RPM with a bzip payload", "junk", "GPL"), ), ( "rpm-with-bzip-5.0.29-1.src.rpm", ("rpm-with-bzip", None, "5.0.29", "1", "i386", True, "RPM with a bzip payload", "junk", "GPL"), ), ("fileless-0.1-1.noarch.rpm", ("fileless", None, "0.1", "1", "noarch", False, "Foo", "Foo", "GPL")), ("fileless-0.1-1.src.rpm", ("fileless", None, "0.1", "1", "noarch", True, "Foo", "Foo", "GPL")), ( "tags-1.2-3.noarch.rpm", ("tags", 4, "1.2", "3", "noarch", False, "Some Summary", "Some Description", "Some License"), ), ( "tags-1.2-3.src.rpm", ("tags", 4, "1.2", "3", "noarch", True, "Some Summary", "Some Description", "Some License"), ), ] for (pkg, data) in packages: pn, pe, pv, pr, pa, isSource, summary, description, license = data fpath = os.path.join(resources.get_archive(), pkg) m = magic.magic(fpath) self.assertEqual(m.contents["name"], pn) self.assertEqual(m.contents["version"], pv) self.assertEqual(m.contents["release"], pr) self.assertEqual(m.contents["arch"], pa) self.assertEqual(m.contents["epoch"], pe) self.assertEqual(m.contents["isSource"], isSource) self.assertEqual(m.contents["summary"], summary) self.assertEqual(m.contents["description"], description) self.assertEqual(m.contents["license"], license)
def testSeekToData(self): f = open(resources.get_archive() + "/basesystem-8.0-2.src.rpm") rpmhelper.seekToData(f) gz = gzip.GzipFile(fileobj=f) assert (gz.read(4) == "0707") gz.close() f = open("/bin/ls") self.assertRaises(IOError, rpmhelper.seekToData, f)
def testSeekToData(self): f = open(resources.get_archive() + "/basesystem-8.0-2.src.rpm") rpmhelper.seekToData(f) gz = gzip.GzipFile(fileobj=f) assert gz.read(4) == "0707" gz.close() f = open("/bin/ls") self.assertRaises(IOError, rpmhelper.seekToData, f)
def _testSSLCertCheck(self, keyPair=None): httpServer = rephelp.HTTPServerController(RequestHandler200, ssl=keyPair) try: caPath = os.path.join(resources.get_archive(), 'ssl-cert-authority.pem') opener = transport.URLOpener(caCerts=[caPath]) opener.open("https://localhost:%s/someurl" % httpServer.port) finally: httpServer.kill()
def testVersion3Migration(self): dbfile = os.path.join(resources.get_archive(), 'conarydbs', 'conarydb-version-3') fd, fn = tempfile.mkstemp() os.close(fd) shutil.copyfile(dbfile, fn) db, str = self.captureOutput(sqldb.Database, fn) cu = db.db.cursor() db.close() os.unlink(fn)
def testFetchFreshmeat(self): """Tests metadata.fetchFreshmeat""" filename = os.path.join(resources.get_archive(), 'tora.xml') f = open(filename) try: m = metadata_mod.fetchFreshmeat('tora', xmlDocStream=f) except socket.gaierror: raise testhelp.SkipTestException('requires network access') self.assertEqual(m.getShortDesc(), "A tool for administrating or developing for Oracle databases.")
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 testMirror(self): sourceRepos, targetRepos = self.createRepositories() mirrorFile = self.createConfigurationFile() # this is really ugly, but needed to ensure test consistency db = self.servers.getServer(0).reposDB.connect() cu = db.cursor() # test simple trove mirroring self.createTroves(sourceRepos, 1, 2, "1.0") self.createTroves(sourceRepos, 1, 2, "2.0") self.sleep(1.2) self.createTroves(sourceRepos, 1, 2, "3.0") # the following is just to get the trigger to fire cu.execute("update Instances set changed=1") db.commit() self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos) # simulate multiple trove versions with the same mark self.createTroves(sourceRepos, 10, 2, "1.0", "~foo") self.createTroves(sourceRepos, 10, 2, "1.0", "~!foo") self.createTroves(sourceRepos, 10, 2, "1.1") # the following is just to get the trigger to fire cu.execute("update Instances set changed=1") db.commit() self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos) # test mirroring of ascii keys sourceRepos.addNewAsciiPGPKey(self.cfg.buildLabel, 'test', sigtest.unexpiredKey) self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos) # test mirroring of new trove signatures self.createTroves(sourceRepos, 20, 2) self.cfg.signatureKey = '7CCD34B5C5D9CD1F637F6743D4F8F127C267B79D' signtrove.signTroves(self.cfg, ["test10:runtime", "test20:runtime"]) self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos) fprint = 'F7440D78FE813C882212C2BF8AC2828190B1E477' keyCache = openpgpkey.getKeyCache() keyCache.getPrivateKey(fprint, '111111') self.cfg.signatureKey = fprint keyRing = open(resources.get_archive() + '/pubring.gpg') keyData = openpgpfile.exportKey(fprint, keyRing) keyData.seek(0) keyData = keyData.read() sourceRepos.addNewPGPKey(self.cfg.buildLabel, 'test', keyData) signtrove.signTroves(self.cfg, ["test11:runtime", "test21:runtime"]) self.createTroves(sourceRepos, 30, 2) self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos)
def testMirror(self): sourceRepos, targetRepos = self.createRepositories() mirrorFile = self.createConfigurationFile() # this is really ugly, but needed to ensure test consistency db = self.servers.getServer(0).reposDB.connect() cu = db.cursor() # test simple trove mirroring self.createTroves(sourceRepos, 1, 2, "1.0") self.createTroves(sourceRepos, 1, 2, "2.0") self.sleep(1.2) self.createTroves(sourceRepos, 1, 2, "3.0") # the following is just to get the trigger to fire cu.execute("update Instances set changed=1") db.commit() self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos) # simulate multiple trove versions with the same mark self.createTroves(sourceRepos, 10, 2, "1.0", "~foo") self.createTroves(sourceRepos, 10, 2, "1.0", "~!foo") self.createTroves(sourceRepos, 10, 2, "1.1") # the following is just to get the trigger to fire cu.execute("update Instances set changed=1") db.commit() self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos) # test mirroring of ascii keys sourceRepos.addNewAsciiPGPKey(self.cfg.buildLabel, 'test', sigtest.unexpiredKey) self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos) # test mirroring of new trove signatures self.createTroves(sourceRepos, 20, 2) self.cfg.signatureKey = '7CCD34B5C5D9CD1F637F6743D4F8F127C267B79D' signtrove.signTroves(self.cfg, [ "test10:runtime", "test20:runtime" ]) self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos) fprint='F7440D78FE813C882212C2BF8AC2828190B1E477' keyCache = openpgpkey.getKeyCache() keyCache.getPrivateKey(fprint, '111111') self.cfg.signatureKey = fprint keyRing = open(resources.get_archive() + '/pubring.gpg') keyData = openpgpfile.exportKey(fprint, keyRing) keyData.seek(0) keyData = keyData.read() sourceRepos.addNewPGPKey(self.cfg.buildLabel, 'test', keyData) signtrove.signTroves(self.cfg, [ "test11:runtime", "test21:runtime" ]) self.createTroves(sourceRepos, 30, 2) self.runMirror(mirrorFile) self.compareRepositories(sourceRepos, targetRepos)
def testFetchFreshmeat(self): """Tests metadata.fetchFreshmeat""" filename = os.path.join(resources.get_archive(), 'tora.xml') f = open(filename) try: m = metadata_mod.fetchFreshmeat('tora', xmlDocStream=f) except socket.gaierror: raise testhelp.SkipTestException('requires network access') self.assertEqual( m.getShortDesc(), "A tool for administrating or developing for Oracle databases.")
def testVersion2Migration(self): dbfile = os.path.join(resources.get_archive(), 'conarydbs', 'conarydb-version-2') fd, fn = tempfile.mkstemp() os.close(fd) shutil.copyfile(dbfile, fn) db, str = self.captureOutput(sqldb.Database, fn) cu = db.db.cursor() # make sure that the -*none*- entry has been added cu.execute('select count(*) from provides join dependencies on provides.depid=dependencies.depid and name="sqlite:lib" and flag="-*none*-"') assert(cu.next() == (1,)) db.close() os.unlink(fn)
def testVersion20DeAnalyze(self): dbfile = os.path.join(resources.get_archive(), 'conarydbs', 'conarydb-version-20-with-analyze') fd, fn = tempfile.mkstemp() os.close(fd) shutil.copyfile(dbfile, fn) db = sqldb.Database(fn) cu = db.db.cursor() cu.execute('select count(*) from sqlite_stat1') count = cu.fetchall()[0][0] self.assertEqual(count, 0) db.close() os.unlink(fn)
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 checkMtimes(trvCs, rpmPath): archivePath = resources.get_archive() trv = trove.Trove(trvCs) f = open(archivePath + '/' + rpmPath, "r") h = rpmhelper.readHeader(f) rpmMtimes = dict((path, mtime) for path, mtime in itertools.izip( h[rpmhelper.OLDFILENAMES], h[rpmhelper.FILEMTIMES])) conaryMtimes = dict( (path, mtime) for ((pathId, path, fileId, version), mtime) in itertools.izip( sorted(trv.iterFileList()), trv.troveInfo.mtimes)) self.assertEquals(rpmMtimes, conaryMtimes)
def go(root): ts = rpm.TransactionSet(root) ts.setVSFlags(~(rpm.RPMVSF_NORSA | rpm.RPMVSF_NODSA)) ts.initDB() rpmloc = resources.get_archive() + "/epoch-1.0-1.i386.rpm" fdno = os.open(rpmloc, os.O_RDONLY) hdr = ts.hdrFromFdno(fdno) os.close(fdno) ts.addInstall(hdr, (hdr, rpmloc), "u") ts.check() ts.order() cb = simpleCallback() ts.run(cb.callback, "") ts.closeDB()
def testMigrationReadOnly(self): dbfile = os.path.join(resources.get_archive(), 'conarydbs', 'conarydb-version-2') fd, fn = tempfile.mkstemp() os.close(fd) shutil.copyfile(dbfile, fn) os.chmod(fn, 0444) try: db = sqldb.Database(fn) except sqldb.OldDatabaseSchema: pass else: raise os.unlink(fn)
def go(root): ts = rpm.TransactionSet(root) ts.setVSFlags(~(rpm.RPMVSF_NORSA | rpm.RPMVSF_NODSA)) ts.initDB() rpmloc = resources.get_archive() + '/epoch-1.0-1.i386.rpm' fdno = os.open(rpmloc, os.O_RDONLY) hdr = ts.hdrFromFdno(fdno) os.close(fdno) ts.addInstall(hdr, (hdr, rpmloc), 'u') ts.check() ts.order() cb = simpleCallback() ts.run(cb.callback, '') ts.closeDB()
def __init__( self, reposDir, sslCertAndKey=None, withCache=True, singleWorker=False, configValues=(), ): self.reposDir = os.path.abspath(reposDir) self.reposLog = os.path.join(self.reposDir, 'repos.log') self.traceLog = os.path.join(self.reposDir, 'trace.log') self.configPath = os.path.join(self.reposDir, 'repository.cnr') self.contents = ContentStore(os.path.join(self.reposDir, 'contents')) if withCache: self.cache = ContentStore(os.path.join(self.reposDir, 'cscache')) self.cache.reset() self.sslCertAndKey = sslCertAndKey if sslCertAndKey is True: self.sslCertAndKey = (resources.get_archive('ssl-cert.crt'), resources.get_archive('ssl-cert.key')) name = os.environ.get('CONARY_APP_SERVER', 'gunicorn') appServerClass = self.appServerClasses[name] self.appServer = appServerClass( serverDir=os.path.join(self.reposDir, 'appserver'), workers=(1 if singleWorker else 2), application='conary.server.wsgi_hooks', environ={ 'CONARY_SERVER_CONFIG': self.configPath, }, ) self.rpServer = NginxServer( serverDir=os.path.join(self.reposDir, 'revproxy'), proxyTo=self.appServer.getProxyTo(), sslCertAndKey=self.sslCertAndKey, ) self.configValues = configValues self.needsReset = True
def testVersion2Migration(self): dbfile = os.path.join(resources.get_archive(), 'conarydbs', 'conarydb-version-2') fd, fn = tempfile.mkstemp() os.close(fd) shutil.copyfile(dbfile, fn) db, str = self.captureOutput(sqldb.Database, fn) cu = db.db.cursor() # make sure that the -*none*- entry has been added cu.execute( 'select count(*) from provides join dependencies on provides.depid=dependencies.depid and name="sqlite:lib" and flag="-*none*-"' ) assert (cu.next() == (1, )) db.close() os.unlink(fn)
def testFilelessRpm(self): # Test that reading the paths for an rpm that has no files still works f = open(resources.get_archive() + "/fileless-0.1-1.noarch.rpm") h = rpmhelper.readHeader(f) self.assertEqual(list(h.paths()), []) tags = [ rpmhelper.DIRINDEXES, rpmhelper.BASENAMES, rpmhelper.DIRNAMES, rpmhelper.FILEUSERNAME, rpmhelper.FILEGROUPNAME, rpmhelper.OLDFILENAMES, ] for t in tags: self.assertEqual(h[t], [])
def __init__(self, reposDir, sslCertAndKey=None, withCache=True, singleWorker=False, configValues=(), ): self.reposDir = os.path.abspath(reposDir) self.reposLog = os.path.join(self.reposDir, 'repos.log') self.traceLog = os.path.join(self.reposDir, 'trace.log') self.configPath = os.path.join(self.reposDir, 'repository.cnr') self.contents = ContentStore(os.path.join(self.reposDir, 'contents')) if withCache: self.cache = ContentStore(os.path.join(self.reposDir, 'cscache')) self.cache.reset() self.sslCertAndKey = sslCertAndKey if sslCertAndKey is True: self.sslCertAndKey = ( resources.get_archive('ssl-cert.crt'), resources.get_archive('ssl-cert.key')) name = os.environ.get('CONARY_APP_SERVER', 'gunicorn') appServerClass = self.appServerClasses[name] self.appServer = appServerClass( serverDir=os.path.join(self.reposDir, 'appserver'), workers=(1 if singleWorker else 2), application='conary.server.wsgi_hooks', environ={ 'CONARY_SERVER_CONFIG': self.configPath, }, ) self.rpServer = NginxServer( serverDir=os.path.join(self.reposDir, 'revproxy'), proxyTo=self.appServer.getProxyTo(), sslCertAndKey=self.sslCertAndKey, ) self.configValues = configValues self.needsReset = True
def testBz2File(self): fobj = file(os.path.join(resources.get_archive(), 'distcc-2.9.tar.bz2')) b = util.BZ2File(fobj) s = 'distcc-2.9' out = b.read(len(s)) self.assertEqual(out,s) out = b.read(100000) self.assertEqual(len(out),100000) out = b.read(10000000) self.assertEqual(len(out),1169750) out = b.read(1) self.assertEqual(out,None)
def testCorruptedRpm(self): # test enforcement of size and sha1 fields from rpm signature block f = open(resources.get_archive() + "/basesystem-8.0-2.src.rpm") rpmhelper.readHeader(f) f.seek(0) # change the size tmp = tempfile.TemporaryFile() util.copyfileobj(f, tmp) f.seek(0) tmp.write(" ") tmp.seek(0) try: rpmhelper.readHeader(tmp) except IOError, e: assert str(e) == "file size does not match size specified by " "header"
def _cookPkgs(self, recipestr, filename, pkgname, builtpkgnames=None, macros={}, updatePackage=False): repos = self.openRepository() recipename = pkgname + '.recipe' ccsname = pkgname + '.ccs' if builtpkgnames is None: builtpkgnames = [pkgname] origDir = os.getcwd() try: os.chdir(self.workDir) if updatePackage: self.checkout(pkgname) else: self.newpkg(pkgname) os.chdir(pkgname) self.writeFile(recipename, recipestr) if not updatePackage: self.addfile(recipename) if isinstance(filename, types.StringType): filenames = [filename] else: filenames = filename for filename in filenames: shutil.copyfile(resources.get_archive() + '/' + filename, filename) self.addfile(filename) self.commit() built, out = self.cookItem(repos, self.cfg, pkgname, macros=macros) self.changeset(repos, builtpkgnames, ccsname) cs = changeset.ChangeSetFromFile(ccsname) finally: os.chdir(origDir) return (sorted([x.getName() for x in cs.iterNewTroveList()]), built, cs)
def testCorruptedRpm(self): # test enforcement of size and sha1 fields from rpm signature block f = open(resources.get_archive() + "/basesystem-8.0-2.src.rpm") rpmhelper.readHeader(f) f.seek(0) # change the size tmp = tempfile.TemporaryFile() util.copyfileobj(f, tmp) f.seek(0) tmp.write(' ') tmp.seek(0) try: rpmhelper.readHeader(tmp) except IOError, e: assert (str(e) == 'file size does not match size specified by ' 'header')
def checkMtimes(trvCs, rpmPath): archivePath = resources.get_archive() trv = trove.Trove(trvCs) f = open(archivePath + "/" + rpmPath, "r") h = rpmhelper.readHeader(f) rpmMtimes = dict( (path, mtime) for path, mtime in itertools.izip(h[rpmhelper.OLDFILENAMES], h[rpmhelper.FILEMTIMES]) ) conaryMtimes = dict( (path, mtime) for ((pathId, path, fileId, version), mtime) in itertools.izip( sorted(trv.iterFileList()), trv.troveInfo.mtimes ) ) self.assertEquals(rpmMtimes, conaryMtimes)
def testCompressDecompressStream(self): # Test that compressing and uncompressing streams produces the same # data fd, tempf = tempfile.mkstemp() os.unlink(tempf) sio = os.fdopen(fd, "w+") # Some data we will compress for fn in ['distcache-1.4.5-2.src.rpm', 'distcc-2.9.tar.bz2', 'initscripts-10-11.src.rpm', 'jcd.iso']: util.copyStream(file(os.path.join(resources.get_archive(), fn)), sio) sio.seek(0) cstr = util.compressStream(sio) cstr.seek(0) dstr = util.decompressStream(cstr) dstr.seek(0) sio.seek(0) self.assertEqual(sio.read(), dstr.read())
def testGetDynSym(self): # Get the path to our lib directory libPath = os.path.dirname(elf.__file__) for soPrefix in ['elf', 'ext/streams', 'ext/file_utils']: fname = os.path.join(libPath, soPrefix + '.so') syms = elf.getDynSym(fname) initfunc = 'init' + os.path.basename(soPrefix) self.assertTrue(initfunc in syms, "%s not in %s" % (initfunc, syms)) # Not a python module fname = os.path.join(libPath, 'filename_wrapper.so') if os.path.exists(fname): syms = elf.getDynSym(fname) self.assertTrue('chdir' in syms) # Grab a random, non-.so file, expect an error fname = os.path.join(resources.get_archive(), 'basesystem-8.0-2.src.rpm') self.assertRaises(elf.error, elf.getDynSym, fname)
def testRpmToCpioXz(self): # ensure that we are testing the /usr/bin/xz path here realExists = os.path.exists def access_xz(*args): if args[0].endswith('/unlzma'): return False return realExists(*args) mock.mock(os.path, 'exists', access_xz) f = os.popen( "%s %s/gnome-main-menu-0.9.10-26.x86_64.rpm | cpio -t --quiet" % (self.rpm2cpio, resources.get_archive())) l = f.readlines() assert (len(l) > 0) self.assertEqual(l[0], './etc/gconf/schemas/application-browser.schemas\n') mock.unmockAll()
def testRPMCapsuleKernelDeps(self): '''make sure that rpm kernel deps include symbol set hashes''' fPath = os.path.join(resources.get_archive(), 'tmpwatch-2.9.1-1.i386.rpm') def mockGet(self, item, default): if item == rpmhelper.PROVIDENAME or item == rpmhelper.REQUIRENAME: return [ 'kernel(goodVer)', 'ksym(goodVer2)', 'kernel(badver)', 'ksym(badver2)' ] if item == rpmhelper.PROVIDEVERSION or \ item == rpmhelper.REQUIREVERSION: return [ '0123456789ABCDEF', 'FEDCBA9876543210', '3.2.1', 'ABCDE' ] self.mock(rpmhelper._RpmHeader, 'get', mockGet) h = rpmhelper.readHeader(file(fPath)) (req, prov), output = self.captureOutput(h.getDeps) expected = '\n'.join(( "rpm: kernel[badver]", "rpm: kernel[goodVer:0123456789ABCDEF]", "rpm: ksym[badver2]", "rpm: ksym[goodVer2:FEDCBA9876543210]", )) self.assertEqual(str(req), expected) self.assertEqual(str(prov), expected) # assert that the two bad versions were each seen twice; once # in provides and once in requires self.assertEqual(len(output.strip().split('\n')), 4) (req, prov), output = self.captureOutput(h.getDeps, mergeKmodSymbols=True) expected = '\n'.join(( "rpm: kernel(badver goodVer:0123456789ABCDEF)", "rpm: ksym(badver2 goodVer2:FEDCBA9876543210)", )) self.assertEqual(str(req), expected) self.assertEqual(str(prov), expected) self.assertEqual(len(output.strip().split('\n')), 4)
def testRPMCapsuleKernelDeps(self): '''make sure that rpm kernel deps include symbol set hashes''' fPath = os.path.join(resources.get_archive(), 'tmpwatch-2.9.1-1.i386.rpm') def mockGet(self, item, default): if item == rpmhelper.PROVIDENAME or item == rpmhelper.REQUIRENAME: return ['kernel(goodVer)', 'ksym(goodVer2)', 'kernel(badver)', 'ksym(badver2)'] if item == rpmhelper.PROVIDEVERSION or \ item == rpmhelper.REQUIREVERSION: return ['0123456789ABCDEF', 'FEDCBA9876543210', '3.2.1', 'ABCDE'] self.mock(rpmhelper._RpmHeader, 'get', mockGet) h = rpmhelper.readHeader(file(fPath)) (req, prov), output = self.captureOutput(h.getDeps) expected = '\n'.join(( "rpm: kernel[badver]", "rpm: kernel[goodVer:0123456789ABCDEF]", "rpm: ksym[badver2]", "rpm: ksym[goodVer2:FEDCBA9876543210]", )) self.assertEqual(str(req), expected) self.assertEqual(str(prov), expected) # assert that the two bad versions were each seen twice; once # in provides and once in requires self.assertEqual(len(output.strip().split('\n')), 4) (req, prov), output = self.captureOutput(h.getDeps, mergeKmodSymbols=True) expected = '\n'.join(( "rpm: kernel(badver goodVer:0123456789ABCDEF)", "rpm: ksym(badver2 goodVer2:FEDCBA9876543210)", )) self.assertEqual(str(req), expected) self.assertEqual(str(prov), expected) self.assertEqual(len(output.strip().split('\n')), 4)
def _cookPkgs(self, recipestr, filename, pkgname, builtpkgnames=None, macros={}, updatePackage=False): repos = self.openRepository() recipename = pkgname + '.recipe' ccsname = pkgname + '.ccs' if builtpkgnames is None: builtpkgnames = [pkgname] origDir = os.getcwd() try: os.chdir(self.workDir) if updatePackage: self.checkout(pkgname) else: self.newpkg(pkgname) os.chdir(pkgname) self.writeFile(recipename, recipestr) if not updatePackage: self.addfile(recipename) if isinstance(filename, types.StringType): filenames = [filename] else: filenames = filename for filename in filenames: shutil.copyfile( resources.get_archive() + '/' + filename, filename) self.addfile(filename) self.commit() built, out = self.cookItem(repos, self.cfg, pkgname, macros=macros) self.changeset(repos, builtpkgnames, ccsname) cs = changeset.ChangeSetFromFile(ccsname) finally: os.chdir(origDir) return (sorted([x.getName() for x in cs.iterNewTroveList()]), built, cs)