This patch is not ready for accepting into the repository. It does not work for VPATH builds (because the paths to all the .py tests are seen as relative to $(builddir)). Dave is working on a fix for this VPATH issue, so a real version of this patch must wait to incorporate his commit. This patch works fine for in-$(srcdir) builds. The purpose of posting it is to follow up Saturday's conversation. I think it implements all of Allan's suggestions (if I understood correctly). The real commit message would be something like: SCRIPTLET_SHELL and LDCONFIG can be set via args to configure, and up 'till now those options were passed to pactest by Makefile.am as command-line args. That works fine for 'make check', but required repeated specification when running pactest manually. This patch makes pactest a configured file so it has direct access to those options and they no longer need to be specified (by Makefile.am nor by hand). Also the default for the pactest '-p' arg is changed to be the pacman that the make builds. The '-p' arg is still available, but it should now be very rare to have to use it when calling pactest manually. --- Makefile.am | 4 -- configure.ac | 1 + test/pacman/.gitignore | 1 + test/pacman/pactest.py | 125 -------------------------------------------- test/pacman/pactest.py.in | 128 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 130 insertions(+), 129 deletions(-) delete mode 100755 test/pacman/pactest.py create mode 100644 test/pacman/pactest.py.in diff --git a/Makefile.am b/Makefile.am index 4d5adae..9689992 100644 --- a/Makefile.am +++ b/Makefile.am @@ -41,10 +41,6 @@ LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \ PY_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \ $(top_srcdir)/build-aux/tap-driver.sh PY_LOG_COMPILER = $(top_srcdir)/test/pacman/pactest.py -AM_PY_LOG_FLAGS = \ - --scriptlet-shell $(SCRIPTLET_SHELL) \ - --ldconfig $(LDCONFIG) \ - -p $(top_builddir)/src/pacman/pacman # create the pacman DB and cache directories upon install install-data-local: diff --git a/configure.ac b/configure.ac index cfcc8d1..292260a 100644 --- a/configure.ac +++ b/configure.ac @@ -507,6 +507,7 @@ test/util/Makefile contrib/Makefile Makefile ]) +AC_CONFIG_FILES([test/pacman/pactest.py],[chmod +x test/pacman/pactest.py]) AC_OUTPUT echo " diff --git a/test/pacman/.gitignore b/test/pacman/.gitignore index 0d20b64..39fa72b 100644 --- a/test/pacman/.gitignore +++ b/test/pacman/.gitignore @@ -1 +1,2 @@ *.pyc +pactest.py diff --git a/test/pacman/pactest.py b/test/pacman/pactest.py deleted file mode 100755 index e21cde7..0000000 --- a/test/pacman/pactest.py +++ /dev/null @@ -1,125 +0,0 @@ -#! /usr/bin/python2 -# -# pactest : run automated testing on the pacman binary -# -# Copyright (c) 2006 by Aurelien Foret <orelien@chez.com> -# Copyright (c) 2006-2013 Pacman Development Team <pacman-dev@archlinux.org> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -import glob -from optparse import OptionParser -import os -import shutil -import sys -import tempfile - -import pmenv -import tap -import util - -__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 " \ - "described using an easy python syntax, and several can be " \ - "ran at once." - parser = OptionParser(usage = usage, description = description) - - parser.add_option("-v", "--verbose", action = "count", - dest = "verbose", default = 0, - help = "print verbose output") - 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 = "pacman", - help = "specify location of the pacman binary") - parser.add_option("--keep-root", action = "store_true", - dest = "keeproot", default = False, - help = "don't remove the generated pacman root filesystem") - parser.add_option("--nolog", action = "store_true", - dest = "nolog", default = False, - help = "do not log pacman messages") - parser.add_option("--gdb", action = "store_true", - dest = "gdb", default = False, - help = "use gdb while calling pacman") - parser.add_option("--valgrind", action = "store_true", - dest = "valgrind", default = False, - help = "use valgrind while calling pacman") - parser.add_option("--manual-confirm", action = "store_true", - dest = "manualconfirm", default = False, - help = "do not use --noconfirm for pacman calls") - parser.add_option("--scriptlet-shell", type = "string", - dest = "scriptletshell", default = "/bin/sh", - help = "specify path to shell used for install scriptlets") - parser.add_option("--ldconfig", type = "string", - dest = "ldconfig", default = "/sbin/ldconfig", - help = "specify path to ldconfig") - return parser - - -if __name__ == "__main__": - - if sys.hexversion < 0x02070000: - # bailing now with clear message better than mid-run with unhelpful one - tap.bail("Python versions before 2.7 are not supported.") - sys.exit(1) - - # instantiate env and parser objects - root_path = tempfile.mkdtemp() - env = pmenv.pmenv(root=root_path) - opt_parser = create_parser() - (opts, args) = opt_parser.parse_args() - - # add parsed options to env object - util.verbose = opts.verbose - env.pacman["debug"] = opts.debug - env.pacman["bin"] = opts.bin - env.pacman["nolog"] = opts.nolog - env.pacman["gdb"] = opts.gdb - env.pacman["valgrind"] = opts.valgrind - env.pacman["manual-confirm"] = opts.manualconfirm - env.pacman["scriptlet-shell"] = opts.scriptletshell - env.pacman["ldconfig"] = opts.ldconfig - - opts.testcases = [] - for path in args: - opts.testcases += glob.glob(path) - if opts.testcases is None or len(opts.testcases) == 0: - tap.bail("no tests defined, nothing to do") - os.rmdir(root_path) - sys.exit(2) - - for i in opts.testcases: - env.addtest(i) - - # run tests - env.run() - - if not opts.keeproot: - shutil.rmtree(root_path) - else: - tap.diag("pacman testing root saved: %s" % root_path) - - if env.failed > 0: - sys.exit(1) - -# vim: set ts=4 sw=4 et: diff --git a/test/pacman/pactest.py.in b/test/pacman/pactest.py.in new file mode 100644 index 0000000..0d9e1f7 --- /dev/null +++ b/test/pacman/pactest.py.in @@ -0,0 +1,128 @@ +#! /usr/bin/python2 +# +# @configure_input@ +# +# pactest : run automated testing on the pacman binary +# +# Copyright (c) 2006 by Aurelien Foret <orelien@chez.com> +# Copyright (c) 2006-2013 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import glob +from optparse import OptionParser +import os +import shutil +import sys +import tempfile + +BUILDDIR = os.path.dirname(os.path.realpath(__file__)) +SRCDIR = os.path.realpath(os.path.join(BUILDDIR, "@srcdir@")) +if BUILDDIR != SRCDIR: sys.path.insert(0, SRCDIR) +TOP_BUILDDIR = os.path.realpath(os.path.join(BUILDDIR, "@top_builddir@")) +BUILT_EXE = os.path.realpath(os.path.join(TOP_BUILDDIR, "src/pacman/pacman")) + +import pmenv +import tap +import util + +__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 " \ + "described using an easy python syntax, and several can be " \ + "ran at once." + parser = OptionParser(usage = usage, description = description) + + parser.add_option("-v", "--verbose", action = "count", + dest = "verbose", default = 0, + help = "print verbose output") + 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 = BUILT_EXE, + help = "specify location of the pacman binary") + parser.add_option("--keep-root", action = "store_true", + dest = "keeproot", default = False, + help = "don't remove the generated pacman root filesystem") + parser.add_option("--nolog", action = "store_true", + dest = "nolog", default = False, + help = "do not log pacman messages") + parser.add_option("--gdb", action = "store_true", + dest = "gdb", default = False, + help = "use gdb while calling pacman") + parser.add_option("--valgrind", action = "store_true", + dest = "valgrind", default = False, + help = "use valgrind while calling pacman") + parser.add_option("--manual-confirm", action = "store_true", + dest = "manualconfirm", default = False, + help = "do not use --noconfirm for pacman calls") + return parser + + +if __name__ == "__main__": + + if sys.hexversion < 0x02070000: + # bailing now with clear message better than mid-run with unhelpful one + tap.bail("Python versions before 2.7 are not supported.") + sys.exit(1) + + # instantiate env and parser objects + root_path = tempfile.mkdtemp() + env = pmenv.pmenv(root=root_path) + opt_parser = create_parser() + (opts, args) = opt_parser.parse_args() + + # add parsed options to env object + util.verbose = opts.verbose + env.pacman["debug"] = opts.debug + env.pacman["bin"] = opts.bin + env.pacman["nolog"] = opts.nolog + env.pacman["gdb"] = opts.gdb + env.pacman["valgrind"] = opts.valgrind + env.pacman["manual-confirm"] = opts.manualconfirm + # and add configured options + env.pacman["scriptlet-shell"] = "@SCRIPTLET_SHELL@" + env.pacman["ldconfig"] = "@LDCONFIG@" + + opts.testcases = [] + for path in args: + opts.testcases += glob.glob(path) + if opts.testcases is None or len(opts.testcases) == 0: + tap.bail("no tests defined, nothing to do") + os.rmdir(root_path) + sys.exit(2) + + for i in opts.testcases: + env.addtest(i) + + # run tests + env.run() + + if not opts.keeproot: + shutil.rmtree(root_path) + else: + tap.diag("pacman testing root saved: %s" % root_path) + + if env.failed > 0: + sys.exit(1) + +# vim: set ts=4 sw=4 et: -- 1.8.5.2