[pacman-dev] [PATCH 2] Added tests for -Q --check (but not yet for mtree checks).

Jeremy Heiner scalaprotractor at gmail.com
Sun Sep 29 20:14:28 EDT 2013


Two new "hooks" were made available in pmtest: genhook is called after
everything is generated just before the snapshot is taken, and
snaphook is called just after. A hook is a list of strings. Calling a
hook is "exec"ing each string in the list.

Several helper functions were added to pmtest: pacmanrun, unlink,
rmtree and warnmissing. These can be used in a hook to install a
package and then intentionally mess it up, which then allows the
pmtest to verify the results of "-Qk".

An mtree attribute was added to pmtest, and a parameter added to
pmpkg.makepkg, in anticipation of testing "-Qkk". TODO: figure out how
to create an mtree in makepkg.

Signed-off-by: Jeremy Heiner <ScalaProtractor at gmail>
---
 test/pacman/pmpkg.py               |  2 +-
 test/pacman/pmtest.py              | 75 ++++++++++++++++++++++++++++----------
 test/pacman/tests/querycheck001.py | 18 +++++++++
 test/pacman/tests/querycheck002.py | 24 ++++++++++++
 test/pacman/tests/querycheck003.py | 24 ++++++++++++
 test/pacman/tests/querycheck004.py | 25 +++++++++++++
 test/pacman/tests/querycheck005.py | 31 ++++++++++++++++
 test/pacman/tests/querycheck006.py | 19 ++++++++++
 test/pacman/util.py                |  1 +
 9 files changed, 199 insertions(+), 20 deletions(-)
 create mode 100644 test/pacman/tests/querycheck001.py
 create mode 100644 test/pacman/tests/querycheck002.py
 create mode 100644 test/pacman/tests/querycheck003.py
 create mode 100644 test/pacman/tests/querycheck004.py
 create mode 100644 test/pacman/tests/querycheck005.py
 create mode 100644 test/pacman/tests/querycheck006.py

diff --git a/test/pacman/pmpkg.py b/test/pacman/pmpkg.py
index 9b3147a..1397229 100644
--- a/test/pacman/pmpkg.py
+++ b/test/pacman/pmpkg.py
@@ -104,7 +104,7 @@ def parse_filename(name):
             filename, extra = filename.split("|")
         return filename

-    def makepkg(self, path):
+    def makepkg(self, mtree, path):
         """Creates an Arch Linux package archive.

         A package archive is generated in the location 'path', based
on the data
diff --git a/test/pacman/pmtest.py b/test/pacman/pmtest.py
index 63d25e8..739c445 100644
--- a/test/pacman/pmtest.py
+++ b/test/pacman/pmtest.py
@@ -18,6 +18,7 @@


 import os
+import re
 import shlex
 import shutil
 import stat
@@ -92,6 +93,10 @@ def load(self):
         self.description = ""
         self.option = {}

+        self.mtree = False
+        self.genhook = []
+        self.snaphook = []
+
         # Test rules
         self.rules = []
         self.files = []
@@ -152,7 +157,7 @@ def generate(self):
         for pkg in self.localpkgs:
             vprint("\t%s" % os.path.join(util.TMPDIR, pkg.filename()))
             pkg.finalize()
-            pkg.makepkg(tmpdir)
+            pkg.makepkg(self.mtree, tmpdir)
         for key, value in self.db.iteritems():
             for pkg in value.pkgs:
                 pkg.finalize()
@@ -161,9 +166,9 @@ def generate(self):
             for pkg in value.pkgs:
                 vprint("\t%s" % os.path.join(util.PM_CACHEDIR, pkg.filename()))
                 if self.cachepkgs:
-                    pkg.makepkg(cachedir)
+                    pkg.makepkg(self.mtree, cachedir)
                 else:
-                    pkg.makepkg(os.path.join(syncdir, value.treename))
+                    pkg.makepkg(self.mtree, os.path.join(syncdir,
value.treename))
                 pkg.md5sum = util.getmd5sum(pkg.path)
                 pkg.csize = os.stat(pkg.path)[stat.ST_SIZE]

@@ -187,12 +192,58 @@ def generate(self):

         # Done.
         vprint("    Taking a snapshot of the file system")
+        for cmd in self.genhook:
+            exec cmd
         for roots, dirs, files in os.walk(root):
             for i in files:
                 filename = os.path.join(roots, i)
                 f = pmfile.PacmanFile(root, filename.replace(root + "/", ""))
                 self.files.append(f)
                 vprint("\t%s" % f.name)
+        for cmd in self.snaphook:
+            exec cmd
+
+    def pacmanbin(self):
+        root = self.env.root
+        return([self.env.pacman["bin"],
+            "--config", os.path.join(root, util.PACCONF),
+            "--root", root,
+            "--dbpath", os.path.join(root, util.PM_DBPATH),
+            "--cachedir", os.path.join(root, util.PM_CACHEDIR)])
+
+    def pacmansub(self, cmd, output):
+        vprint("\trunning: %s" % " ".join(cmd))
+        # Change to the tmp dir before running pacman, so that local package
+        # archives are made available more easily.
+        time_start = time.time()
+        retcode = subprocess.call(cmd, stdout=output, stderr=output,
+                cwd=os.path.join(self.env.root, util.TMPDIR),
+                env={'LC_ALL': 'C'})
+        time_end = time.time()
+        vprint("\ttime elapsed: %.2fs" % (time_end - time_start))
+        vprint("\tretcode = %s" % retcode)
+        return retcode
+
+    def pacmanrun(self, args):
+        cmd = self.env.cmdroot()
+        cmd.extend(self.pacmanbin())
+        cmd.append("--noconfirm")
+        cmd.extend(shlex.split(args))
+        output = open(os.path.join(self.env.root, util.GENFILE), 'a')
+        self.pacmansub(cmd, output)
+        output.close()
+
+    def unlink(self, path):
+        path = os.path.join(self.env.root, path)
+        os.unlink(path)
+    def rmtree(self, path):
+        path = os.path.join(self.env.root, path)
+        shutil.rmtree(path)
+    def warnmissing(self, pkg, path):
+        return "PACMAN_OUTPUT=^" + re.escape(
+            "warning: %s: %s (No such file or directory)"
+            % (pkg.name, os.path.join(self.env.root, path))
+            ) + "$"

     def run(self):
         if os.path.isfile(util.PM_LOCK):
@@ -215,11 +266,7 @@ def run(self):
                 "--tool=memcheck", "--leak-check=full",
                 "--show-reachable=yes",
                 "--suppressions=%s" % suppfile])
-        cmd.extend([pacman["bin"],
-            "--config", os.path.join(root, util.PACCONF),
-            "--root", root,
-            "--dbpath", os.path.join(root, util.PM_DBPATH),
-            "--cachedir", os.path.join(root, util.PM_CACHEDIR)])
+        cmd.extend(self.pacmanbin())
         if not pacman["manual-confirm"]:
             cmd.append("--noconfirm")
         if pacman["debug"]:
@@ -229,21 +276,11 @@ def run(self):
             output = open(os.path.join(root, util.LOGFILE), 'w')
         else:
             output = None
-        vprint("\trunning: %s" % " ".join(cmd))
-
-        # Change to the tmp dir before running pacman, so that local package
-        # archives are made available more easily.
-        time_start = time.time()
-        self.retcode = subprocess.call(cmd, stdout=output, stderr=output,
-                cwd=os.path.join(root, util.TMPDIR), env={'LC_ALL': 'C'})
-        time_end = time.time()
-        vprint("\ttime elapsed: %.2fs" % (time_end - time_start))

+        self.retcode = self.pacmansub(cmd, output)
         if output:
             output.close()

-        vprint("\tretcode = %s" % self.retcode)
-
         # Check if the lock is still there
         if os.path.isfile(util.PM_LOCK):
             tap.diag("\tERROR: %s not removed" % util.PM_LOCK)
diff --git a/test/pacman/tests/querycheck001.py
b/test/pacman/tests/querycheck001.py
new file mode 100644
index 0000000..8587b50
--- /dev/null
+++ b/test/pacman/tests/querycheck001.py
@@ -0,0 +1,18 @@
+self.description = "Query--check files, all there"
+
+pkg = pmpkg("dummy")
+pkg.files = [
+    "etc/dummy.conf",
+    "lib/libdummy.so.0",
+    "lib/libdummy.so -> ./libdummy.so.0",
+    "lib/dummy/",
+    "lib/dummy/stuff",
+    "bin/dummy"]
+
+self.addpkg(pkg)
+self.genhook.extend([
+    "self.pacmanrun('-U %s')" % pkg.filename()])
+
+self.args = "-Qk"
+
+self.addrule("PACMAN_RETCODE=0")
diff --git a/test/pacman/tests/querycheck002.py
b/test/pacman/tests/querycheck002.py
new file mode 100644
index 0000000..0bc3ff4
--- /dev/null
+++ b/test/pacman/tests/querycheck002.py
@@ -0,0 +1,24 @@
+self.description = "Query--check files, missing a file"
+
+pkg = pmpkg("dummy")
+pkg.files = [
+    "etc/dummy.conf",
+    "lib/libdummy.so.0",
+    "lib/libdummy.so -> ./libdummy.so.0",
+    "lib/dummy/",
+    "lib/dummy/stuff",
+    "bin/dummy"]
+
+self.addpkg(pkg)
+
+zap = pkg.files[1]
+
+self.genhook.extend([
+    "self.pacmanrun('-U %s')" % pkg.filename(),
+    "self.unlink('%s')" % zap])
+
+self.args = "-Qk"
+
+self.addrule("PACMAN_RETCODE=1")
+self.addrule(self.warnmissing(pkg, zap))
+self.addrule("PACMAN_OUTPUT= 1 missing file$")
diff --git a/test/pacman/tests/querycheck003.py
b/test/pacman/tests/querycheck003.py
new file mode 100644
index 0000000..bda095d
--- /dev/null
+++ b/test/pacman/tests/querycheck003.py
@@ -0,0 +1,24 @@
+self.description = "Query--check files, missing a link"
+
+pkg = pmpkg("dummy")
+pkg.files = [
+    "etc/dummy.conf",
+    "lib/libdummy.so.0",
+    "lib/libdummy.so -> ./libdummy.so.0",
+    "lib/dummy/",
+    "lib/dummy/stuff",
+    "bin/dummy"]
+
+self.addpkg(pkg)
+
+zap = pkg.files[2].split(' -> ')[0]
+
+self.genhook.extend([
+    "self.pacmanrun('-U %s')" % pkg.filename(),
+    "self.unlink('%s')" % zap])
+
+self.args = "-Qk"
+
+self.addrule("PACMAN_RETCODE=1")
+self.addrule(self.warnmissing(pkg, zap))
+self.addrule("PACMAN_OUTPUT= 1 missing file$")
diff --git a/test/pacman/tests/querycheck004.py
b/test/pacman/tests/querycheck004.py
new file mode 100644
index 0000000..be9c381
--- /dev/null
+++ b/test/pacman/tests/querycheck004.py
@@ -0,0 +1,25 @@
+self.description = "Query--check files, missing a dir"
+
+pkg = pmpkg("dummy")
+pkg.files = [
+    "etc/dummy.conf",
+    "lib/libdummy.so.0",
+    "lib/libdummy.so -> ./libdummy.so.0",
+    "lib/dummy/",
+    "lib/dummy/stuff",
+    "bin/dummy"]
+
+self.addpkg(pkg)
+
+zap = pkg.files[3]
+
+self.genhook.extend([
+    "self.pacmanrun('-U %s')" % pkg.filename(),
+    "self.rmtree('%s')" % zap])
+
+self.args = "-Qk"
+
+self.addrule("PACMAN_RETCODE=1")
+self.addrule(self.warnmissing(pkg, zap))
+self.addrule(self.warnmissing(pkg, pkg.files[4]))
+self.addrule("PACMAN_OUTPUT= 2 missing files$")
diff --git a/test/pacman/tests/querycheck005.py
b/test/pacman/tests/querycheck005.py
new file mode 100644
index 0000000..416e17f
--- /dev/null
+++ b/test/pacman/tests/querycheck005.py
@@ -0,0 +1,31 @@
+self.description = "Query--check files, missing several"
+
+pkg = pmpkg("dummy")
+pkg.files = [
+    "etc/dummy.conf",
+    "lib/libdummy.so.0",
+    "lib/libdummy.so -> ./libdummy.so.0",
+    "lib/dummy/",
+    "lib/dummy/stuff",
+    "bin/dummy"]
+
+self.addpkg(pkg)
+
+zap1 = pkg.files[1]
+zap2 = pkg.files[2].split(' -> ')[0]
+zap3 = pkg.files[3]
+
+self.genhook.extend([
+    "self.pacmanrun('-U %s')" % pkg.filename(),
+    "self.unlink('%s')" % zap1,
+    "self.unlink('%s')" % zap2,
+    "self.rmtree('%s')" % zap3])
+
+self.args = "-Qk"
+
+self.addrule("PACMAN_RETCODE=1")
+self.addrule(self.warnmissing(pkg, zap1))
+self.addrule(self.warnmissing(pkg, zap2))
+self.addrule(self.warnmissing(pkg, zap3))
+self.addrule(self.warnmissing(pkg, pkg.files[4]))
+self.addrule("PACMAN_OUTPUT= 4 missing files$")
diff --git a/test/pacman/tests/querycheck006.py
b/test/pacman/tests/querycheck006.py
new file mode 100644
index 0000000..d710a5b
--- /dev/null
+++ b/test/pacman/tests/querycheck006.py
@@ -0,0 +1,19 @@
+self.description = "Query--check mtree, no mtree"
+
+pkg = pmpkg("dummy")
+pkg.files = [
+    "etc/dummy.conf",
+    "lib/libdummy.so.0",
+    "lib/libdummy.so -> ./libdummy.so.0",
+    "lib/dummy/",
+    "lib/dummy/stuff",
+    "bin/dummy"]
+
+self.addpkg(pkg)
+self.genhook.extend([
+    "self.pacmanrun('-U %s')" % pkg.filename()])
+
+self.args = "-Qkk"
+
+self.addrule("PACMAN_RETCODE=0")
+self.addrule("PACMAN_OUTPUT=dummy: no mtree file")
diff --git a/test/pacman/util.py b/test/pacman/util.py
index 14035d7..db8fef3 100644
--- a/test/pacman/util.py
+++ b/test/pacman/util.py
@@ -40,6 +40,7 @@
 TMPDIR      = "tmp"
 SYNCREPO    = "var/pub"
 LOGFILE     = "var/log/pactest.log"
+GENFILE     = "var/log/pacgen.log"

 verbose = 0

-- 
1.8.4


More information about the pacman-dev mailing list