diff options
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/check.mk | 27 | ||||
-rw-r--r-- | tests/shell-or-perl | 111 |
3 files changed, 123 insertions, 16 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index a324dc1eb..f8fbd38b8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -20,6 +20,7 @@ EXTRA_DIST = \ other-fs-tmpdir \ require-perl \ sample-test \ + shell-or-perl \ $(pr_data) root_tests = \ diff --git a/tests/check.mk b/tests/check.mk index 9db96af5a..d45c2885f 100644 --- a/tests/check.mk +++ b/tests/check.mk @@ -48,6 +48,16 @@ check-am: .built-programs && MAKEFLAGS= $(MAKE) -s built_programs.list) \ > $@-t && mv $@-t $@ +## `$f' is set by the Automake-generated test harness to the path of the +## current test script stripped of VPATH components, and is used by the +## shell-or-perl script to determine the name of the temporary files to be +## used. Note that $f is a shell variable, not a make macro, so the use of +## `$$f' below is correct, and not a typo. +LOG_COMPILER = \ + $(SHELL) $(srcdir)/shell-or-perl \ + --test-name "$$f" --srcdir '$(srcdir)' \ + --shell '$(SHELL)' --perl '$(PERL)' -- + # Note that the first lines are statements. They ensure that environment # variables that can perturb tests are unset or set to expected values. # The rest are envvar settings that propagate build-related Makefile @@ -58,21 +68,6 @@ TESTS_ENVIRONMENT = \ test -d "$$tmp__" && test -w "$$tmp__" || tmp__=.; \ . $(srcdir)/envvar-check; \ TMPDIR=$$tmp__; export TMPDIR; \ - shell_or_perl_() { \ - if grep '^\#!/usr/bin/perl' "$$1" > /dev/null; then \ - if $(PERL) -e 'use warnings' > /dev/null 2>&1; then \ - grep '^\#!/usr/bin/perl -T' "$$1" > /dev/null && T_=T || T_=; \ - $(PERL) -w$$T_ -I$(srcdir) -MCoreutils -MCuSkip \ - -M"CuTmpdir qw($$f)" -- "$$1"; \ - else \ - echo 1>&2 "$$tst: configure did not find a usable version of Perl," \ - "so skipping this test"; \ - (exit 77); \ - fi; \ - else \ - $(SHELL) "$$1"; \ - fi; \ - }; \ export \ VERSION='$(VERSION)' \ LOCALE_FR='$(LOCALE_FR)' \ @@ -99,6 +94,6 @@ TESTS_ENVIRONMENT = \ REPLACE_GETCWD=$(REPLACE_GETCWD) \ ; test -d /usr/xpg4/bin && PATH='/usr/xpg4/bin$(PATH_SEPARATOR)'"$$PATH"; \ PATH='$(abs_top_builddir)/src$(PATH_SEPARATOR)'"$$PATH" \ - ; shell_or_perl_ 9>&2 + ; 9>&2 VERBOSE = yes diff --git a/tests/shell-or-perl b/tests/shell-or-perl new file mode 100644 index 000000000..08604eb5d --- /dev/null +++ b/tests/shell-or-perl @@ -0,0 +1,111 @@ +#! /bin/sh +# Run a test script of the coreutils test scripts, picking up the right +# interpreter (i.e., perl or the shell) and the right flags for it (e.g., +# perl `-T' flag for perl scripts that must run in tainted mode). +# +# Copyright (C) 2011 Free Software Foundation, Inc. +# +# 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 3 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/>. +# + +# ---------------------------------- # +# Readonly variables and functions # +# ---------------------------------- # + +# Help to avoid typo-related bugs. +set -u + +me=shell-or-perl + +error_ () +{ + echo "$me: $*" >&2 + exit 99 +} + +print_help_ () +{ + cat <<EOH +Usage: $me [--help] [--srcdir DIR] [--shell SHELL-CMD] [--perl PERL-CMD] + [--test-name NAME-WITHOUT-VPATH] TEST-SCRIPT [ARGS..] +EOH +} + +# ---------------- # +# Option parsing # +# ---------------- # + +assign_optarg_to_var=' + test $# -gt 1 || error_ "option '\''$1'\'' requires an argument" + eval "$var=\$2" + shift' + +srcdir=${srcdir-.} +cu_PERL=${PERL-perl} +cu_SHELL=/bin/sh # Getting $SHELL from the environment is dangerous. +test_name= +while test $# -gt 0; do + var= + case $1 in + --help) print_help_; exit $?;; + --shell) var=cu_SHELL;; + --perl) var=cu_PERL;; + --srcdir) var=srcdir;; + --test-name) var=test_name;; + --) shift; break;; + -*) error_ "unknown option '$1'";; + *) break;; + esac + test -z "$var" || eval "$assign_optarg_to_var" + shift +done + +unset assign_optarg_to_var var + +case $# in + 0) error_ "missing argument";; + *) test_script=$1; shift;; +esac + +test -z "$test_name" && test_name=$test_script + +# --------------------- # +# Run the test script # +# --------------------- # + +if grep '^#!/usr/bin/perl' "$test_script" >/dev/null; then + # The test is a perl script. + if $cu_PERL -e 'use warnings' > /dev/null 2>&1; then + # Perl is available, see if we must run the test with taint + # mode on or not. + grep '^#!/usr/bin/perl -T' "$test_script" >/dev/null && T_=T || T_= + # Now run it. + exec $cu_PERL -w$T_ -I"$srcdir" -MCoreutils -MCuSkip \ + -M"CuTmpdir qw($test_name)" \ + -- "$test_script" ${1+"$@"} + else + # Perl is not available, skip the test. + echo "$test_name: skip: no usable version of Perl found" + exit 77 + fi +else + # Assume the test is a shell script. + exec $cu_SHELL "$test_script" ${1+"$@"} +fi + +# ------------- # +# Not reached # +# ------------- # + +error_ "dead code reached" |