diff options
Diffstat (limited to 'test/pacman/pmtest.py')
-rwxr-xr-x | test/pacman/pmtest.py | 130 |
1 files changed, 78 insertions, 52 deletions
diff --git a/test/pacman/pmtest.py b/test/pacman/pmtest.py index f3026f29..82dfda6d 100755 --- a/test/pacman/pmtest.py +++ b/test/pacman/pmtest.py @@ -19,16 +19,16 @@ import os import os.path import shutil +import stat import time import pmrule import pmdb import pmfile -from pmpkg import pmpkg -from util import * +import util +from util import vprint - -class pmtest: +class pmtest(object): """Test object """ @@ -47,7 +47,7 @@ class pmtest: """ """ if not treename in self.db: - self.db[treename] = pmdb.pmdb(treename, os.path.join(self.root, PM_DBPATH)) + self.db[treename] = pmdb.pmdb(treename, self.root) self.db[treename].pkgs.append(pkg) def addpkg(self, pkg): @@ -55,6 +55,22 @@ class pmtest: """ self.localpkgs.append(pkg) + def findpkg(self, name, version, allow_local=False): + """Find a package object matching the name and version specified in + either sync databases or the local package collection. The local database + is allowed to match if allow_local is True.""" + for db in self.db.itervalues(): + if db.treename == "local" and not allow_local: + continue + pkg = db.getpkg(name) + if pkg and pkg.version == version: + return pkg + for pkg in self.localpkgs: + if pkg.name == name and pkg.version == version: + return pkg + + return None + def addrule(self, rulename): """ """ @@ -73,9 +89,10 @@ class pmtest: self.args = "" self.retcode = 0 self.db = { - "local": pmdb.pmdb("local", os.path.join(self.root, PM_DBPATH)) + "local": pmdb.pmdb("local", self.root) } self.localpkgs = [] + self.createlocalpkgs = False self.filesystem = [] self.description = "" @@ -87,9 +104,11 @@ class pmtest: self.expectfailure = False if os.path.isfile(self.name): + # all tests expect this to be available + from pmpkg import pmpkg execfile(self.name) else: - raise IOerror("file %s does not exist!" % self.name) + raise IOError("file %s does not exist!" % self.name) def generate(self): """ @@ -104,39 +123,40 @@ class pmtest: # Create directory structure vprint(" Creating directory structure:") - dbdir = os.path.join(self.root, PM_DBPATH) - cachedir = os.path.join(self.root, PM_CACHEDIR) - syncdir = os.path.join(self.root, SYNCREPO) - tmpdir = os.path.join(self.root, TMPDIR) - logdir = os.path.join(self.root, os.path.dirname(LOGFILE)) - etcdir = os.path.join(self.root, os.path.dirname(PACCONF)) + dbdir = os.path.join(self.root, util.PM_DBPATH) + cachedir = os.path.join(self.root, util.PM_CACHEDIR) + syncdir = os.path.join(self.root, util.SYNCREPO) + tmpdir = os.path.join(self.root, util.TMPDIR) + logdir = os.path.join(self.root, os.path.dirname(util.LOGFILE)) + etcdir = os.path.join(self.root, os.path.dirname(util.PACCONF)) bindir = os.path.join(self.root, "bin") - for dir in [dbdir, cachedir, syncdir, tmpdir, logdir, etcdir, bindir]: - if not os.path.isdir(dir): - vprint("\t%s" % dir[len(self.root)+1:]) - os.makedirs(dir, 0755) + sys_dirs = [dbdir, cachedir, syncdir, tmpdir, logdir, etcdir, bindir] + for sys_dir in sys_dirs: + if not os.path.isdir(sys_dir): + vprint("\t%s" % sys_dir[len(self.root)+1:]) + os.makedirs(sys_dir, 0755) # Only the dynamically linked binary is needed for fakechroot shutil.copy("/bin/sh", bindir) # Configuration file vprint(" Creating configuration file") - vprint("\t%s" % PACCONF) - mkcfgfile(PACCONF, self.root, self.option, self.db) + util.mkcfgfile(util.PACCONF, self.root, self.option, self.db) # Creating packages vprint(" Creating package archives") for pkg in self.localpkgs: - vprint("\t%s" % os.path.join(TMPDIR, pkg.filename())) + vprint("\t%s" % os.path.join(util.TMPDIR, pkg.filename())) pkg.makepkg(tmpdir) for key, value in self.db.iteritems(): - if key == "local": continue + if key == "local" and not self.createlocalpkgs: + continue for pkg in value.pkgs: - vprint("\t%s" % os.path.join(PM_CACHEDIR, pkg.filename())) + vprint("\t%s" % os.path.join(util.PM_CACHEDIR, pkg.filename())) if self.cachepkgs: pkg.makepkg(cachedir) else: pkg.makepkg(os.path.join(syncdir, value.treename)) - pkg.md5sum = getmd5sum(pkg.path) + pkg.md5sum = util.getmd5sum(pkg.path) pkg.csize = os.stat(pkg.path)[stat.ST_SIZE] # Populating databases @@ -151,19 +171,30 @@ class pmtest: # Creating sync database archives vprint(" Creating sync database archives") for key, value in self.db.iteritems(): - if key == "local": continue - archive = value.treename + PM_EXT_DB - vprint("\t" + os.path.join(SYNCREPO, archive)) - value.gensync(os.path.join(syncdir, value.treename)) + if key == "local": + continue + vprint("\t" + value.treename) + value.gensync() + serverpath = os.path.join(syncdir, value.treename) + util.mkdir(serverpath) + shutil.copy(value.dbfile, serverpath) # Filesystem vprint(" Populating file system") for pkg in self.db["local"].pkgs: vprint("\tinstalling %s" % pkg.fullname()) - pkg.install_files(self.root) + for f in pkg.files: + vprint("\t%s" % f) + path = os.path.join(self.root, f) + util.mkfile(path, f) + if os.path.isfile(path): + os.utime(path, (355, 355)) for f in self.filesystem: vprint("\t%s" % f) - mkfile(os.path.join(self.root, f), f) + path = os.path.join(self.root, f) + util.mkfile(path, f) + if os.path.isfile(path): + os.utime(path, (355, 355)) # Done. vprint(" Taking a snapshot of the file system") @@ -178,7 +209,7 @@ class pmtest: """ """ - if os.path.isfile(PM_LOCK): + if os.path.isfile(util.PM_LOCK): print "\tERROR: another pacman session is on-going -- skipping" return @@ -187,45 +218,45 @@ class pmtest: cmd = [""] if os.geteuid() != 0: - fakeroot = which("fakeroot") + fakeroot = util.which("fakeroot") if not fakeroot: print "WARNING: fakeroot not found!" else: cmd.append("fakeroot") - fakechroot = which("fakechroot") + fakechroot = util.which("fakechroot") if fakechroot: cmd.append("fakechroot") if pacman["gdb"]: cmd.append("libtool execute gdb --args") if pacman["valgrind"]: - cmd.append("valgrind -q --tool=memcheck --leak-check=full --show-reachable=yes") + cmd.append("valgrind -q --tool=memcheck --leak-check=full --show-reachable=yes --suppressions=%s/valgrind.supp" % os.getcwd()) cmd.append("\"%s\" --config=\"%s\" --root=\"%s\" --dbpath=\"%s\" --cachedir=\"%s\"" \ % (pacman["bin"], - os.path.join(self.root, PACCONF), + os.path.join(self.root, util.PACCONF), self.root, - os.path.join(self.root, PM_DBPATH), - os.path.join(self.root, PM_CACHEDIR))) + os.path.join(self.root, util.PM_DBPATH), + os.path.join(self.root, util.PM_CACHEDIR))) if not pacman["manual-confirm"]: cmd.append("--noconfirm") if pacman["debug"]: cmd.append("--debug=%s" % pacman["debug"]) cmd.append("%s" % self.args) if not pacman["gdb"] and not pacman["valgrind"] and not pacman["nolog"]: - cmd.append(">\"%s\" 2>&1" % os.path.join(self.root, LOGFILE)) + cmd.append(">\"%s\" 2>&1" % os.path.join(self.root, util.LOGFILE)) vprint("\trunning: %s" % " ".join(cmd)) # Change to the tmp dir before running pacman, so that local package # archives are made available more easily. curdir = os.getcwd() - tmpdir = os.path.join(self.root, TMPDIR) + tmpdir = os.path.join(self.root, util.TMPDIR) os.chdir(tmpdir) - t0 = time.time() + time_start = time.time() self.retcode = os.system(" ".join(cmd)) - t1 = time.time() - vprint("\ttime elapsed: %ds" % (t1-t0)) + time_end = time.time() + vprint("\ttime elapsed: %ds" % (time_end - time_start)) if self.retcode == None: self.retcode = 0 @@ -235,11 +266,11 @@ class pmtest: os.chdir(curdir) # Check if the lock is still there - if os.path.isfile(PM_LOCK): - print "\tERROR: %s not removed" % PM_LOCK - os.unlink(PM_LOCK) + if os.path.isfile(util.PM_LOCK): + print "\tERROR: %s not removed" % util.PM_LOCK + os.unlink(util.PM_LOCK) # Look for a core file - if os.path.isfile(os.path.join(self.root, TMPDIR, "core")): + if os.path.isfile(os.path.join(self.root, util.TMPDIR, "core")): print "\tERROR: pacman dumped a core file" def check(self): @@ -249,7 +280,7 @@ class pmtest: print "==> Checking rules" for i in self.rules: - success = i.check(self.root, self.retcode, self.db["local"], self.files) + success = i.check(self) if success == 1: msg = " OK " self.result["success"] += 1 @@ -258,11 +289,6 @@ class pmtest: self.result["fail"] += 1 else: msg = "SKIP" - print "\t[%s] %s" % (msg, i.rule) - i.result = success - - -if __name__ == "__main__": - pass + print "\t[%s] %s" % (msg, i) # vim: set ts=4 sw=4 et: |