summaryrefslogtreecommitdiffstats
path: root/test/pacman/pmtest.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/pacman/pmtest.py')
-rwxr-xr-xtest/pacman/pmtest.py130
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: