summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2009-11-28 19:31:46 +0100
committerJim Meyering <meyering@redhat.com>2009-12-31 17:29:55 +0100
commite0fc06c5ce4e7c370ae2366b35c5952023c537fe (patch)
treef988a24407d8753b6627852df8bd8123b2649251 /tests
parent37abff282fc5adb392653c7a11e56bb733a672e6 (diff)
downloaddiffutils-e0fc06c5ce4e7c370ae2366b35c5952023c537fe.tar.gz
tests: use gnulib's init.sh
* tests/Makefile.am (EXTRA_DIST): Add init.sh. Remove test-lib.sh. * tests/init.sh: New file. * tests/test-lib.sh: Remove file. * tests/help-version: Use init.sh, not test-lib.sh.
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am2
-rwxr-xr-xtests/help-version3
-rw-r--r--tests/init.sh255
-rw-r--r--tests/test-lib.sh408
4 files changed, 258 insertions, 410 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8374fba..88774a1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -2,7 +2,7 @@ TESTS = \
help-version
EXTRA_DIST = \
- $(TESTS) test-lib.sh t-local.sh
+ $(TESTS) init.sh t-local.sh
# Note that the first lines are statements. They ensure that environment
# variables that can perturb tests are unset or set to expected values.
diff --git a/tests/help-version b/tests/help-version
index 2ab0865..a4220eb 100755
--- a/tests/help-version
+++ b/tests/help-version
@@ -25,7 +25,8 @@ test "$VERBOSE" = yes && set -x
test "x$SHELL" = x && SHELL=/bin/sh
export SHELL
-. $srcdir/test-lib.sh
+: ${srcdir=.}
+. "$srcdir/init.sh"; path_prepend_ .
expected_failure_status_chroot=125
expected_failure_status_env=125
diff --git a/tests/init.sh b/tests/init.sh
new file mode 100644
index 0000000..cc02487
--- /dev/null
+++ b/tests/init.sh
@@ -0,0 +1,255 @@
+# source this file; set up for tests
+
+# Copyright (C) 2009 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/>.
+
+# Using this file in a test
+# =========================
+#
+# The typical skeleton of a test looks like this:
+#
+# #!/bin/sh
+# : ${srcdir=.}
+# . "$srcdir/init.sh"; path_prepend_ .
+# Execute some commands.
+# Note that these commands are executed in a subdirectory, therefore you
+# need to prepend "../" to relative filenames in the build directory.
+# Set the exit code 0 for success, 77 for skipped, or 1 or other for failure.
+# Use the skip_ and fail_ functions to print a diagnostic and then exit
+# with the corresponding exit code.
+# Exit $?
+
+# Executing a test that uses this file
+# ====================================
+#
+# Running a single test:
+# $ make check TESTS=test-foo.sh
+#
+# Running a single test, with verbose output:
+# $ make check TESTS=test-foo.sh VERBOSE=yes
+#
+# Running a single test, with single-stepping:
+# 1. Go into a sub-shell:
+# $ bash
+# 2. Set relevant environment variables from TESTS_ENVIRONMENT in the
+# Makefile:
+# $ export srcdir=../../tests # this is an example
+# 3. Execute the commands from the test, copy&pasting them one by one:
+# $ . "$srcdir/init.sh"; path_prepend_ .
+# ...
+# 4. Finally
+# $ exit
+
+# We use a trap below for cleanup. This requires us to go through
+# hoops to get the right exit status transported through the handler.
+# So use `Exit STATUS' instead of `exit STATUS' inside of the tests.
+# Turn off errexit here so that we don't trip the bug with OSF1/Tru64
+# sh inside this function.
+Exit () { set +e; (exit $1); exit $1; }
+
+fail_() { echo "$ME_: failed test: $@" 1>&2; Exit 1; }
+skip_() { echo "$ME_: skipped test: $@" 1>&2; Exit 77; }
+
+# This is a stub function that is run upon trap (upon regular exit and
+# interrupt). Override it with a per-test function, e.g., to unmount
+# a partition, or to undo any other global state changes.
+cleanup_() { :; }
+
+if ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
+ compare() { diff -u "$@"; }
+elif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
+ compare() { cmp -s "$@"; }
+else
+ compare() { cmp "$@"; }
+fi
+
+# An arbitrary prefix to help distinguish test directories.
+testdir_prefix_() { printf gt; }
+
+# Run the user-overridable cleanup_ function, remove the temporary
+# directory and exit with the incoming value of $?.
+remove_tmp_()
+{
+ __st=$?
+ cleanup_
+ # cd out of the directory we're about to remove
+ cd "$initial_cwd_" || cd / || cd /tmp
+ chmod -R u+rwx "$test_dir_"
+ # If removal fails and exit status was to be 0, then change it to 1.
+ rm -rf "$test_dir_" || { test $__st = 0 && __st=1; }
+ exit $__st
+}
+
+# Use this function to prepend to PATH an absolute name for each
+# specified, possibly-$initial_cwd_relative, directory.
+path_prepend_()
+{
+ while test $# != 0; do
+ path_dir_=$1
+ case $path_dir_ in
+ '') fail_ "invalid path dir: '$1'";;
+ /*) abs_path_dir_=$path_dir_;;
+ *) abs_path_dir_=`cd "$initial_cwd_/$path_dir_" && echo "$PWD"` \
+ || fail_ "invalid path dir: $path_dir_";;
+ esac
+ case $abs_path_dir_ in
+ *:*) fail_ "invalid path dir: '$abs_path_dir_'";;
+ esac
+ PATH="$abs_path_dir_:$PATH"
+ shift
+ done
+ export PATH
+}
+
+setup_()
+{
+ test "$VERBOSE" = yes && set -x
+
+ initial_cwd_=$PWD
+ ME_=`expr "./$0" : '.*/\(.*\)$'`
+
+ pfx_=`testdir_prefix_`
+ test_dir_=`mktempd_ "$initial_cwd_" "$pfx_-$ME_.XXXX"` \
+ || fail_ "failed to create temporary directory in $initial_cwd_"
+ cd "$test_dir_"
+
+ # This pair of trap statements ensures that the temporary directory,
+ # $test_dir_, is removed upon exit as well as upon catchable signal.
+ trap remove_tmp_ 0
+ trap 'Exit $?' 1 2 13 15
+}
+
+# Create a temporary directory, much like mktemp -d does.
+# Written by Jim Meyering.
+#
+# Usage: mktempd_ /tmp phoey.XXXXXXXXXX
+#
+# First, try to use the mktemp program.
+# Failing that, we'll roll our own mktemp-like function:
+# - try to get random bytes from /dev/urandom
+# - failing that, generate output from a combination of quickly-varying
+# sources and gzip. Ignore non-varying gzip header, and extract
+# "random" bits from there.
+# - given those bits, map to file-name bytes using tr, and try to create
+# the desired directory.
+# - make only $MAX_TRIES_ attempts
+
+# Helper function. Print $N pseudo-random bytes from a-zA-Z0-9.
+rand_bytes_()
+{
+ n_=$1
+
+ # Maybe try openssl rand -base64 $n_prime_|tr '+/=\012' abcd first?
+ # But if they have openssl, they probably have mktemp, too.
+
+ chars_=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
+ dev_rand_=/dev/urandom
+ if test -r "$dev_rand_"; then
+ # Note: 256-length($chars_) == 194; 3 copies of $chars_ is 186 + 8 = 194.
+ dd ibs=$n_ count=1 if=$dev_rand_ 2>/dev/null \
+ | tr -c $chars_ 01234567$chars_$chars_$chars_
+ return
+ fi
+
+ n_plus_50_=`expr $n_ + 50`
+ cmds_='date; date +%N; free; who -a; w; ps auxww; ps ef; netstat -n'
+ data_=` (eval "$cmds_") 2>&1 | gzip `
+
+ # Ensure that $data_ has length at least 50+$n_
+ while :; do
+ len_=`echo "$data_"|wc -c`
+ test $n_plus_50_ -le $len_ && break;
+ data_=` (echo "$data_"; eval "$cmds_") 2>&1 | gzip `
+ done
+
+ echo "$data_" \
+ | dd bs=1 skip=50 count=$n_ 2>/dev/null \
+ | tr -c $chars_ 01234567$chars_$chars_$chars_
+}
+
+mktempd_()
+{
+ case $# in
+ 2);;
+ *) fail_ "Usage: $ME DIR TEMPLATE";;
+ esac
+
+ destdir_=$1
+ template_=$2
+
+ MAX_TRIES_=4
+
+ # Disallow any trailing slash on specified destdir:
+ # it would subvert the post-mktemp "case"-based destdir test.
+ case $destdir_ in
+ /) ;;
+ */) fail_ "invalid destination dir: remove trailing slash(es)";;
+ esac
+
+ case $template_ in
+ *XXXX) ;;
+ *) fail_ "invalid template: $template_ (must have a suffix of at least 4 X's)";;
+ esac
+
+ fail=0
+
+ # First, try to use mktemp.
+ d=`env -u TMPDIR mktemp -d -t -p "$destdir_" "$template_" 2>/dev/null` \
+ || fail=1
+
+ # The resulting name must be in the specified directory.
+ case $d in "$destdir_"*);; *) fail=1;; esac
+
+ # It must have created the directory.
+ test -d "$d" || fail=1
+
+ # It must have 0700 permissions. Handle sticky "S" bits.
+ perms=`ls -dgo "$d" 2>/dev/null|tr S -` || fail=1
+ case $perms in drwx------*) ;; *) fail=1;; esac
+
+ test $fail = 0 && {
+ echo "$d"
+ return
+ }
+
+ # If we reach this point, we'll have to create a directory manually.
+
+ # Get a copy of the template without its suffix of X's.
+ base_template_=`echo "$template_"|sed 's/XX*$//'`
+
+ # Calculate how many X's we've just removed.
+ template_length_=`echo "$template_" | wc -c`
+ nx_=`echo "$base_template_" | wc -c`
+ nx_=`expr $template_length_ - $nx_`
+
+ err_=
+ i_=1
+ while :; do
+ X_=`rand_bytes_ $nx_`
+ candidate_dir_="$destdir_/$base_template_$X_"
+ err_=`mkdir -m 0700 "$candidate_dir_" 2>&1` \
+ && { echo "$candidate_dir_"; return; }
+ test $MAX_TRIES_ -le $i_ && break;
+ i_=`expr $i_ + 1`
+ done
+ fail_ "$err_"
+}
+
+# If you want to override the testdir_prefix_ function,
+# or to add more utility functions, use this file.
+test -f "$srcdir/init.cfg" \
+ && . "$srcdir/init.cfg"
+
+setup_ "$@"
diff --git a/tests/test-lib.sh b/tests/test-lib.sh
deleted file mode 100644
index b39d06c..0000000
--- a/tests/test-lib.sh
+++ /dev/null
@@ -1,408 +0,0 @@
-# source this file; set up for tests
-
-# Copyright (C) 2009 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/>.
-
-# Skip this test if the shell lacks support for functions.
-unset function_test
-eval 'function_test() { return 11; }; function_test'
-if test $? != 11; then
- echo "$0: /bin/sh lacks support for functions; skipping this test." 1>&2
- Exit 77
-fi
-
-skip_test_()
-{
- echo "$0: skipping test: $@" | head -1 1>&9
- echo "$0: skipping test: $@" 1>&2
- Exit 77
-}
-
-getlimits_()
-{
- eval $(getlimits)
- test "$INT_MAX" ||
- error_ "Error running getlimits"
-}
-
-require_acl_()
-{
- getfacl --version < /dev/null > /dev/null 2>&1 \
- && setfacl --version < /dev/null > /dev/null 2>&1 \
- || skip_test_ "This test requires getfacl and setfacl."
-
- id -u bin > /dev/null 2>&1 \
- || skip_test_ "This test requires a local user named bin."
-}
-
-# Skip this test if we're not in SELinux "enforcing" mode.
-require_selinux_enforcing_()
-{
- test "$(getenforce)" = Enforcing \
- || skip_test_ "This test is useful only with SELinux in Enforcing mode."
-}
-
-
-require_openat_support_()
-{
- # Skip this test if your system has neither the openat-style functions
- # nor /proc/self/fd support with which to emulate them.
- test -z "$CONFIG_HEADER" \
- && skip_test_ 'internal error: CONFIG_HEADER not defined'
-
- _skip=yes
- grep '^#define HAVE_OPENAT' "$CONFIG_HEADER" > /dev/null && _skip=no
- test -d /proc/self/fd && _skip=no
- if test $_skip = yes; then
- skip_test_ 'this system lacks openat support'
- fi
-}
-
-require_ulimit_()
-{
- ulimit_works=yes
- # Expect to be able to exec a program in 10MB of virtual memory,
- # but not in 20KB. I chose "date". It must not be a shell built-in
- # function, so you can't use echo, printf, true, etc.
- # Of course, in coreutils, I could use $top_builddir/src/true,
- # but this should be able to work for other projects, too.
- ( ulimit -v 10000; date ) > /dev/null 2>&1 || ulimit_works=no
- ( ulimit -v 20; date ) > /dev/null 2>&1 && ulimit_works=no
-
- test $ulimit_works = no \
- && skip_test_ "this shell lacks ulimit support"
-}
-
-require_readable_root_()
-{
- test -r / || skip_test_ "/ is not readable"
-}
-
-# Skip the current test if strace is not available or doesn't work
-# with the named syscall. Usage: require_strace_ unlink
-require_strace_()
-{
- test $# = 1 || framework_failure
-
- strace -V < /dev/null > /dev/null 2>&1 ||
- skip_test_ 'no strace program'
-
- strace -qe "$1" echo > /dev/null 2>&1 ||
- skip_test_ 'strace -qe "'"$1"'" does not work'
-}
-
-# Require a controlling input `terminal'.
-require_controlling_input_terminal_()
-{
- tty -s || have_input_tty=no
- test -t 0 || have_input_tty=no
- if test "$have_input_tty" = no; then
- skip_test_ 'requires controlling input terminal
-This test must have a controlling input "terminal", so it may not be
-run via "batch", "at", or "ssh". On some systems, it may not even be
-run in the background.'
- fi
-}
-
-require_built_()
-{
- skip_=no
- for i in "$@"; do
- case " $built_programs " in
- *" $i "*) ;;
- *) echo "$i: not built" 1>&2; skip_=yes ;;
- esac
- done
-
- test $skip_ = yes && skip_test_ "required program(s) not built"
-}
-
-uid_is_privileged_()
-{
- # Make sure id -u succeeds.
- my_uid=$(id -u) \
- || { echo "$0: cannot run \`id -u'" 1>&2; return 1; }
-
- # Make sure it gives valid output.
- case $my_uid in
- 0) ;;
- *[!0-9]*)
- echo "$0: invalid output (\`$my_uid') from \`id -u'" 1>&2
- return 1 ;;
- *) return 1 ;;
- esac
-}
-
-get_process_status_()
-{
- sed -n '/^State:[ ]*\([[:alpha:]]\).*/s//\1/p' /proc/$1/status
-}
-
-# Convert an ls-style permission string, like drwxr----x and -rw-r-x-wx
-# to the equivalent chmod --mode (-m) argument, (=,u=rwx,g=r,o=x and
-# =,u=rw,g=rx,o=wx). Ignore ACLs.
-rwx_to_mode_()
-{
- case $# in
- 1) rwx=$1;;
- *) echo "$0: wrong number of arguments" 1>&2
- echo "Usage: $0 ls-style-mode-string" 1>&2
- return;;
- esac
-
- case $rwx in
- [ld-][rwx-][rwx-][rwxsS-][rwx-][rwx-][rwxsS-][rwx-][rwx-][rwxtT-]) ;;
- [ld-][rwx-][rwx-][rwxsS-][rwx-][rwx-][rwxsS-][rwx-][rwx-][rwxtT-][+.]) ;;
- *) echo "$0: invalid mode string: $rwx" 1>&2; return;;
- esac
-
- # Perform these conversions:
- # S s
- # s xs
- # T t
- # t xt
- # The `T' and `t' ones are only valid for `other'.
- s='s/S/@/;s/s/x@/;s/@/s/'
- t='s/T/@/;s/t/x@/;s/@/t/'
-
- u=`echo $rwx|sed 's/^.\(...\).*/,u=\1/;s/-//g;s/^,u=$//;'$s`
- g=`echo $rwx|sed 's/^....\(...\).*/,g=\1/;s/-//g;s/^,g=$//;'$s`
- o=`echo $rwx|sed 's/^.......\(...\).*/,o=\1/;s/-//g;s/^,o=$//;'$s';'$t`
- echo "=$u$g$o"
-}
-
-skip_if_()
-{
- case $1 in
- root) skip_test_ must be run as root ;;
- non-root) skip_test_ must be run as non-root ;;
- *) ;; # FIXME?
- esac
-}
-
-require_selinux_()
-{
- case `ls -Zd .` in
- '? .'|'unlabeled .')
- skip_test_ "this system (or maybe just" \
- "the current file system) lacks SELinux support"
- ;;
- esac
-}
-
-very_expensive_()
-{
- if test "$RUN_VERY_EXPENSIVE_TESTS" != yes; then
- skip_test_ 'very expensive: disabled by default
-This test is very expensive, so it is disabled by default.
-To run it anyway, rerun make check with the RUN_VERY_EXPENSIVE_TESTS
-environment variable set to yes. E.g.,
-
- env RUN_VERY_EXPENSIVE_TESTS=yes make check
-'
- fi
-}
-
-expensive_()
-{
- if test "$RUN_EXPENSIVE_TESTS" != yes; then
- skip_test_ 'expensive: disabled by default
-This test is relatively expensive, so it is disabled by default.
-To run it anyway, rerun make check with the RUN_EXPENSIVE_TESTS
-environment variable set to yes. E.g.,
-
- env RUN_EXPENSIVE_TESTS=yes make check
-'
- fi
-}
-
-require_root_()
-{
- uid_is_privileged_ || skip_test_ "must be run as root"
- NON_ROOT_USERNAME=${NON_ROOT_USERNAME=nobody}
- NON_ROOT_GROUP=${NON_ROOT_GROUP=$(id -g $NON_ROOT_USERNAME)}
-}
-
-skip_if_root_() { uid_is_privileged_ && skip_test_ "must be run as non-root"; }
-error_() { echo "$0: $@" 1>&2; Exit 1; }
-framework_failure() { error_ 'failure in testing framework'; }
-
-# Set `groups' to a space-separated list of at least two groups
-# of which the user is a member.
-require_membership_in_two_groups_()
-{
- test $# = 0 || framework_failure
-
- groups=${COREUTILS_GROUPS-`(id -G || /usr/xpg4/bin/id -G) 2>/dev/null`}
- case "$groups" in
- *' '*) ;;
- *) skip_test_ 'requires membership in two groups
-this test requires that you be a member of more than one group,
-but running `id -G'\'' either failed or found just one. If you really
-are a member of at least two groups, then rerun this test with
-COREUTILS_GROUPS set in your environment to the space-separated list
-of group names or numbers. E.g.,
-
- env COREUTILS_GROUPS='users cdrom' make check
-
-'
- ;;
- esac
-}
-
-# Is /proc/$PID/status supported?
-require_proc_pid_status_()
-{
- sleep 2 &
- local pid=$!
- sleep .5
- grep '^State:[ ]*[S]' /proc/$pid/status > /dev/null 2>&1 ||
- skip_test_ "/proc/$pid/status: missing or 'different'"
- kill $pid
-}
-
-# Does the current (working-dir) file system support sparse files?
-require_sparse_support_()
-{
- test $# = 0 || framework_failure
- # Test whether we can create a sparse file.
- # For example, on Darwin6.5 with a file system of type hfs, it's not possible.
- # NTFS requires 128K before a hole appears in a sparse file.
- t=sparse.$$
- dd bs=1 seek=128K of=$t < /dev/null 2> /dev/null
- set x `du -sk $t`
- kb_size=$2
- rm -f $t
- if test $kb_size -ge 128; then
- skip_test_ 'this file system does not support sparse files'
- fi
-}
-
-mkfifo_or_skip_()
-{
- test $# = 1 || framework_failure
- if ! mkfifo "$1"; then
- # Make an exception of this case -- usually we interpret framework-creation
- # failure as a test failure. However, in this case, when running on a SunOS
- # system using a disk NFS mounted from OpenBSD, the above fails like this:
- # mkfifo: cannot make fifo `fifo-10558': Not owner
- skip_test_ 'NOTICE: unable to create test prerequisites'
- fi
-}
-
-# Disable the current test if the working directory seems to have
-# the setgid bit set.
-skip_if_setgid_()
-{
- setgid_tmpdir=setgid-$$
- (umask 77; mkdir $setgid_tmpdir)
- perms=$(stat --printf %A $setgid_tmpdir)
- rmdir $setgid_tmpdir
- case $perms in
- drwx------);;
- drwxr-xr-x);; # Windows98 + DJGPP 2.03
- *) skip_test_ 'this directory has the setgid bit set';;
- esac
-}
-
-skip_if_mcstransd_is_running_()
-{
- test $# = 0 || framework_failure
-
- # When mcstransd is running, you'll see only the 3-component
- # version of file-system context strings. Detect that,
- # and if it's running, skip this test.
- __ctx=$(stat --printf='%C\n' .) || framework_failure
- case $__ctx in
- *:*:*:*) ;; # four components is ok
- *) # anything else probably means mcstransd is running
- skip_test_ "unexpected context '$__ctx'; turn off mcstransd" ;;
- esac
-}
-
-# Skip the current test if umask doesn't work as usual.
-# This test should be run in the temporary directory that ends
-# up being removed via the trap commands.
-working_umask_or_skip_()
-{
- umask 022
- touch file1 file2
- chmod 644 file2
- perms=`ls -l file1 file2 | sed 's/ .*//' | uniq`
- rm -f file1 file2
-
- case $perms in
- *'
- '*) skip_test_ 'your build directory has unusual umask semantics'
- esac
-}
-
-# We use a trap below for cleanup. This requires us to go through
-# hoops to get the right exit status transported through the signal.
-# So use `Exit STATUS' instead of `exit STATUS' inside of the tests.
-# Turn off errexit here so that we don't trip the bug with OSF1/Tru64
-# sh inside this function.
-Exit ()
-{
- set +e
- (exit $1)
- exit $1
-}
-
-test_dir_=$(pwd)
-
-this_test_() { echo "./$0" | sed 's,.*/,,'; }
-this_test=$(this_test_)
-
-# This is a stub function that is run upon trap (upon regular exit and
-# interrupt). Override it with a per-test function, e.g., to unmount
-# a partition, or to undo any other global state changes.
-cleanup_() { :; }
-
-t_=$(mktemp -d --tmp="$test_dir_" di-$this_test.XXXXXXXXXX)\
- || error_ "failed to create temporary directory in $test_dir_"
-
-# Eval the following upon cleanup.
-# This is useful if you have more than than one cleanup function,
-# and for encapsulated cleanup functions; append any addition.
-cleanup_eval_=':'
-
-remove_tmp_()
-{
- __st=$?
- cleanup_
- test -n "$cleanup_eval_" && eval "$cleanup_eval_"
- cd "$test_dir_" && chmod -R u+rwx "$t_" && rm -rf "$t_" && exit $__st
-}
-
-. $srcdir/t-local.sh
-
-# Run each test from within a temporary sub-directory named after the
-# test itself, and arrange to remove it upon exception or normal exit.
-trap remove_tmp_ 0
-trap 'Exit $?' 1 2 13 15
-
-cd "$t_" || error_ "failed to cd to $t_"
-
-if ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
- compare() { diff -u "$@"; }
-elif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
- compare() { cmp -s "$@"; }
-else
- compare() { cmp "$@"; }
-fi
-
-# Initialize; all bourne shell scripts end with "Exit $fail".
-fail=0