diff options
Diffstat (limited to 'tests/shell-or-perl')
-rw-r--r-- | tests/shell-or-perl | 111 |
1 files changed, 111 insertions, 0 deletions
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" |