allow tests for disabled features to be skipped

Previously, pacman's test suite would fail when compiled without
signature support.

Adds a require_capability method to pmtest objects.  Currently
recognized values are 'gpg', 'curl', and 'nls'; although only gpg is
used presently.  Missing features are indicated by running pactest with
one of the --without-<feature> options.

This modifies pmenv to run each case as independent tests.  Previously,
a single pmenv could run multiple tests, combining there output into
a single TAP stream but making it impossible to properly skip an entire
test case.  This change does not affect running pactest.py with a single
test (as both autotools and meson do), but will affect anybody manually
running pactest.py with multiple tests at once.

Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Andrew Gregory 2018-12-22 22:24:41 -08:00 committed by Allan McRae
parent ecac357c1a
commit 2d403709d9
6 changed files with 59 additions and 19 deletions

View file

@ -51,6 +51,12 @@ AM_PY_LOG_FLAGS = \
--ldconfig $(LDCONFIG) \ --ldconfig $(LDCONFIG) \
--bindir $(top_builddir)/src/pacman \ --bindir $(top_builddir)/src/pacman \
--bindir $(top_builddir)/scripts --bindir $(top_builddir)/scripts
if !HAVE_LIBGPGME
AM_PY_LOG_FLAGS += --without-gpg
endif
if !HAVE_LIBCURL
AM_PY_LOG_FLAGS += --without-curl
endif
# create the pacman DB, cache, makepkg-template and system hook directories upon install # create the pacman DB, cache, makepkg-template and system hook directories upon install
install-data-local: install-data-local:

View file

@ -342,19 +342,26 @@ foreach testobj : pacman_tests
input = testobj.get('name') input = testobj.get('name')
test_name = input.split('/')[1] test_name = input.split('/')[1]
should_fail = testobj.get('should_fail', false) should_fail = testobj.get('should_fail', false)
args = [
join_paths(meson.source_root(), 'build-aux/tap-driver.py'),
join_paths(meson.current_source_dir(), 'pactest.py'),
'--scriptlet-shell', get_option('scriptlet-shell'),
'--bindir', meson.build_root(),
'--ldconfig', LDCONFIG,
'--verbose',
join_paths(meson.current_source_dir(), input)
]
if not conf.get('HAVE_LIBCURL')
args += '--without-curl'
endif
if not conf.get('HAVE_LIBGPGME')
args += '--without-gpg'
endif
test( test(
test_name, test_name,
PYTHON, PYTHON,
args : [ args : args,
join_paths(meson.source_root(), 'build-aux/tap-driver.py'),
join_paths(meson.current_source_dir(), 'pactest.py'),
'--scriptlet-shell', get_option('scriptlet-shell'),
'--bindir', meson.build_root(),
'--ldconfig', LDCONFIG,
'--verbose',
join_paths(meson.current_source_dir(), input)
],
depends : [pacman_bin], depends : [pacman_bin],
should_fail : should_fail) should_fail : should_fail)
endforeach endforeach

View file

@ -77,6 +77,15 @@ def create_parser():
parser.add_option("--bindir", type = "string", parser.add_option("--bindir", type = "string",
dest = "bindir", action = "append", dest = "bindir", action = "append",
help = "specify location of binaries") help = "specify location of binaries")
parser.add_option("--without-gpg", action = "store_true",
dest = "missing_gpg", default = False,
help = "skip gpg-related tests")
parser.add_option("--without-curl", action = "store_true",
dest = "missing_curl", default = False,
help = "skip downloader-related tests")
parser.add_option("--without-nls", action = "store_true",
dest = "missing_nls", default = False,
help = "skip translation-related tests")
parser.add_option("--keep-root", action = "store_true", parser.add_option("--keep-root", action = "store_true",
dest = "keeproot", default = False, dest = "keeproot", default = False,
help = "don't remove the generated pacman root filesystem") help = "don't remove the generated pacman root filesystem")
@ -137,6 +146,9 @@ if __name__ == "__main__":
env.pacman["manual-confirm"] = opts.manualconfirm env.pacman["manual-confirm"] = opts.manualconfirm
env.pacman["scriptlet-shell"] = opts.scriptletshell env.pacman["scriptlet-shell"] = opts.scriptletshell
env.pacman["ldconfig"] = opts.ldconfig env.pacman["ldconfig"] = opts.ldconfig
env.config["gpg"] = not opts.missing_gpg
env.config["nls"] = not opts.missing_nls
env.config["curl"] = not opts.missing_curl
try: try:
for i in args: for i in args:

View file

@ -36,6 +36,11 @@ class pmenv(object):
"valgrind": 0, "valgrind": 0,
"nolog": 0 "nolog": 0
} }
self.config = {
"gpg": True,
"nls": True,
"curl": True
}
def __str__(self): def __str__(self):
return "root = %s\n" \ return "root = %s\n" \
@ -52,15 +57,18 @@ class pmenv(object):
def run(self): def run(self):
""" """
""" """
tap.plan(len(self.testcases))
for testcase in self.testcases: for testcase in self.testcases:
t = pmtest.pmtest(testcase, self.root) t = pmtest.pmtest(testcase, self.root, self.config)
tap.diag("Running '%s'" % t.testname)
t.load() t.load()
t.generate(self.pacman) if t.skipall:
t.run(self.pacman) tap.skip_all("skipping %s (%s)" % (t.description, t.skipall))
else:
tap.plan(1)
tap.diag("Running '%s'" % t.testname)
tap.diag("==> Checking rules") t.generate(self.pacman)
tap.todo = t.expectfailure t.run(self.pacman)
tap.subtest(lambda: t.check(), t.description)
tap.diag("==> Checking rules")
tap.todo = t.expectfailure
tap.subtest(lambda: t.check(), t.description)

View file

@ -33,12 +33,13 @@ class pmtest(object):
"""Test object """Test object
""" """
def __init__(self, name, root): def __init__(self, name, root, config):
self.name = name self.name = name
self.testname = os.path.basename(name).replace('.py', '') self.testname = os.path.basename(name).replace('.py', '')
self.root = root self.root = root
self.dbver = 9 self.dbver = 9
self.cachepkgs = True self.cachepkgs = True
self.config = config
self.cmd = ["pacman", "--noconfirm", self.cmd = ["pacman", "--noconfirm",
"--config", self.configfile(), "--config", self.configfile(),
"--root", self.rootdir(), "--root", self.rootdir(),
@ -101,6 +102,7 @@ class pmtest(object):
self.rules = [] self.rules = []
self.files = [] self.files = []
self.expectfailure = False self.expectfailure = False
self.skipall = False
if os.path.isfile(self.name): if os.path.isfile(self.name):
# all tests expect this to be available # all tests expect this to be available
@ -201,6 +203,10 @@ class pmtest(object):
self.files.append(f) self.files.append(f)
vprint("\t%s" % f.name) vprint("\t%s" % f.name)
def require_capability(self, cap):
if not self.config[cap]:
self.skipall = "missing capability " + cap
def add_hook(self, name, content): def add_hook(self, name, content):
if not name.endswith(".hook"): if not name.endswith(".hook"):
name = name + ".hook" name = name + ".hook"

View file

@ -1,4 +1,5 @@
self.description = "Add a bogus signature to a package DB" self.description = "Add a bogus signature to a package DB"
self.require_capability("gpg")
sp = pmpkg("pkg1") sp = pmpkg("pkg1")
sp.pgpsig = "asdfasdfsdfasdfsdafasdfsdfasd" sp.pgpsig = "asdfasdfsdfasdfsdafasdfsdfasd"