[pacman-dev] [PATCH 5/6] pmtest: allow tests to specify test binary

Andrew Gregory andrew.gregory.8 at gmail.com
Wed Oct 8 06:39:06 UTC 2014


Adds a cmd property to tests (defaults to pacman) which is resolved
using directories specified with --bindir (defaults to PATH).  The
ability to manually specify a particular binary is preserved in order to
allow running individual tests with differently named binaries such as
lt-pacman.

Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
 Makefile.am            |  3 ++-
 test/pacman/pactest.py | 16 ++++++----------
 test/pacman/pmenv.py   |  3 ++-
 test/pacman/pmtest.py  | 23 ++++++++++++++++++-----
 test/pacman/util.py    |  5 +++--
 5 files changed, 31 insertions(+), 19 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 4c6f656..44a2341 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -45,7 +45,8 @@ PY_LOG_COMPILER = $(PYTHON) $(top_srcdir)/test/pacman/pactest.py
 AM_PY_LOG_FLAGS = \
 		--scriptlet-shell $(SCRIPTLET_SHELL) \
 		--ldconfig $(LDCONFIG) \
-		-p $(top_builddir)/src/pacman/pacman
+		--bindir $(top_builddir)/src/pacman \
+		--bindir $(top_builddir)/scripts
 
 # create the pacman DB and cache directories upon install
 install-data-local:
diff --git a/test/pacman/pactest.py b/test/pacman/pactest.py
index 58c14f6..8e87c28 100755
--- a/test/pacman/pactest.py
+++ b/test/pacman/pactest.py
@@ -31,9 +31,6 @@
 __author__ = "Aurelien FORET"
 __version__ = "0.4"
 
-def resolve_binary_path(option, opt_str, value, parser):
-    setattr(parser.values, option.dest, os.path.abspath(value))
-
 def create_parser():
     usage = "usage: %prog [options] <path/to/testfile.py>..."
     description = "Runs automated tests on the pacman binary. Tests are " \
@@ -47,10 +44,12 @@ def create_parser():
     parser.add_option("-d", "--debug", type = "int",
                       dest = "debug", default = 0,
                       help = "set debug level for pacman")
-    parser.add_option("-p", "--pacman", action = "callback",
-                      callback = resolve_binary_path, type = "string",
-                      dest = "bin", default = util.which("pacman"),
+    parser.add_option("-p", "--pacman", type = "string",
+                      dest = "bin", default = None,
                       help = "specify location of the pacman binary")
+    parser.add_option("--bindir", type = "string",
+                      dest = "bindir", action = "append",
+                      help = "specify location of binaries")
     parser.add_option("--keep-root", action = "store_true",
                       dest = "keeproot", default = False,
                       help = "don't remove the generated pacman root filesystem")
@@ -86,10 +85,6 @@ def create_parser():
     opt_parser = create_parser()
     (opts, args) = opt_parser.parse_args()
 
-    if opts.bin is None or not os.access(opts.bin, os.X_OK):
-        tap.bail("cannot locate pacman binary")
-        sys.exit(2)
-
     if args is None or len(args) == 0:
         tap.bail("no tests defined, nothing to do")
         sys.exit(2)
@@ -102,6 +97,7 @@ def create_parser():
     util.verbose = opts.verbose
     env.pacman["debug"] = opts.debug
     env.pacman["bin"] = opts.bin
+    env.pacman["bindir"] = opts.bindir
     env.pacman["nolog"] = opts.nolog
     env.pacman["gdb"] = opts.gdb
     env.pacman["valgrind"] = opts.valgrind
diff --git a/test/pacman/pmenv.py b/test/pacman/pmenv.py
index 2d887b0..27f44c9 100644
--- a/test/pacman/pmenv.py
+++ b/test/pacman/pmenv.py
@@ -34,7 +34,8 @@ class pmenv(object):
     def __init__(self, root = "root"):
         self.root = os.path.abspath(root)
         self.pacman = {
-            "bin": "pacman",
+            "bin": None,
+            "bindir": ["/usr/bin/"],
             "debug": 0,
             "gdb": 0,
             "valgrind": 0,
diff --git a/test/pacman/pmtest.py b/test/pacman/pmtest.py
index 3682963..5a79919 100644
--- a/test/pacman/pmtest.py
+++ b/test/pacman/pmtest.py
@@ -39,6 +39,11 @@ def __init__(self, name, root):
         self.root = root
         self.dbver = 9
         self.cachepkgs = True
+        self.cmd = ["pacman", "--noconfirm",
+                "--config", os.path.join(self.root, util.PACCONF),
+                "--root", self.root,
+                "--dbpath", os.path.join(self.root, util.PM_DBPATH),
+                "--cachedir", os.path.join(self.root, util.PM_CACHEDIR)]
 
     def __str__(self):
         return "name = %s\n" \
@@ -234,16 +239,24 @@ def run(self, pacman):
                 "--log-file=%s" % os.path.join(self.root, "var/log/valgrind"),
                 "--suppressions=%s" % suppfile])
             self.addrule("FILE_EMPTY=var/log/valgrind")
-        cmd.extend([pacman["bin"], "--noconfirm",
-            "--config", os.path.join(self.root, util.PACCONF),
-            "--root", self.root,
-            "--dbpath", os.path.join(self.root, util.PM_DBPATH),
-            "--cachedir", os.path.join(self.root, util.PM_CACHEDIR)])
+
+        # replace program name with absolute path
+        prog = pacman["bin"]
+        if not prog:
+            prog = util.which(self.cmd[0], pacman["bindir"])
+        if not prog or not os.access(prog, os.X_OK):
+            if not prog:
+                tap.bail("could not locate '%s' binary" % (self.cmd[0]))
+                return
+
+        cmd.append(os.path.abspath(prog))
+        cmd.extend(self.cmd[1:])
         if pacman["manual-confirm"]:
             cmd.append("--confirm")
         if pacman["debug"]:
             cmd.append("--debug=%s" % pacman["debug"])
         cmd.extend(shlex.split(self.args))
+
         if not (pacman["gdb"] or pacman["nolog"]):
             output = open(os.path.join(self.root, util.LOGFILE), 'w')
         else:
diff --git a/test/pacman/util.py b/test/pacman/util.py
index 57471fe..ae96a3b 100644
--- a/test/pacman/util.py
+++ b/test/pacman/util.py
@@ -157,8 +157,9 @@ def mkmd5sum(data):
 # Miscellaneous
 #
 
-def which(filename):
-    path = os.environ["PATH"].split(':')
+def which(filename, path=None):
+    if not path:
+        path = os.environ["PATH"].split(os.pathsep)
     for p in path:
         f = os.path.join(p, filename)
         if os.access(f, os.F_OK):
-- 
2.1.2


More information about the pacman-dev mailing list