summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorStefano Lattarini <stefano.lattarini@gmail.com>2011-06-18 17:57:53 +0200
committerJim Meyering <meyering@redhat.com>2011-06-19 21:57:43 +0200
commit2f60384d6abc787f5c4dfb5e9bffa328265b3028 (patch)
treef3875507368572d2c2a38be2530bca1fe68545bd /tests
parenta51c6e0356e5c66fd9c2539f220c6cd2ad2de1e7 (diff)
downloadcoreutils-2f60384d6abc787f5c4dfb5e9bffa328265b3028.tar.xz
tests: avoid extra forks in the testsuite
* tests/shell-or-perl: Prefer the `read' builtin over `grep' to look at the shebang line of test scripts. Since `read' is a special builtin, it might abort the whole program upon failures, so add extra sanity checks, verifying that the test script exists and is readable, before trying to read from it.
Diffstat (limited to 'tests')
-rw-r--r--tests/shell-or-perl16
1 files changed, 12 insertions, 4 deletions
diff --git a/tests/shell-or-perl b/tests/shell-or-perl
index 08604eb5d..accb37a85 100644
--- a/tests/shell-or-perl
+++ b/tests/shell-or-perl
@@ -84,12 +84,19 @@ test -z "$test_name" && test_name=$test_script
# Run the test script #
# --------------------- #
-if grep '^#!/usr/bin/perl' "$test_script" >/dev/null; then
+test -f "$test_script" && test -r "$test_script" \
+ || error_ "test script '$test_script' does not exist, or isn't readable"
+
+read shebang_line < "$test_script" \
+ || error_ "cannot read from the test script '$test_script'"
+
+case $shebang_line in
+'#!/usr/bin/perl'*)
# 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_=
+ case $shebang_line in *\ -T*) T_=T;; *) T_=;; esac
# Now run it.
exec $cu_PERL -w$T_ -I"$srcdir" -MCoreutils -MCuSkip \
-M"CuTmpdir qw($test_name)" \
@@ -99,10 +106,11 @@ if grep '^#!/usr/bin/perl' "$test_script" >/dev/null; then
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
+esac
# ------------- #
# Not reached #