summaryrefslogtreecommitdiff
path: root/t/instspc.tap
diff options
context:
space:
mode:
Diffstat (limited to 't/instspc.tap')
-rwxr-xr-xt/instspc.tap335
1 files changed, 335 insertions, 0 deletions
diff --git a/t/instspc.tap b/t/instspc.tap
new file mode 100755
index 000000000..cbe0fdfdd
--- /dev/null
+++ b/t/instspc.tap
@@ -0,0 +1,335 @@
+#! /bin/sh
+# Copyright (C) 2010-2012 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 2, 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/>.
+
+# Check that building from, or installing to, directories with shell
+# metacharacters succeed.
+# Original report from James Amundson about file names with spaces.
+# Other characters added by Paul Eggert.
+
+. ./defs || Exit 99
+
+# Usage: is_in_list ITEM [LIST...]
+is_in_list ()
+{
+ item=$1; shift;
+ case " $* " in
+ *[\ \ ]"$item"[\ \ ]*) return 0;;
+ *) return 1;;
+ esac
+}
+
+# Helper subroutine for test data definition.
+# Usage: define_problematic_string NAME STRING
+define_problematic_string ()
+{
+ tst=$1; shift
+ eval "instspc__$tst=\$1" \
+ || fatal_ "define_problematic_string: bad argument: '$tst'"
+ shift
+ all_test_names_list="$all_test_names_list $tst"
+ # Some of the "problematic" characters cannot be used in the name of
+ # a build or install directory on a POSIX host. These lists should
+ # be empty, but are not due to limitations in Autoconf, Automake, Make,
+ # M4, or the shell.
+ if is_in_list fail-builddir "$@"; then
+ builddir_xfails="$builddir_xfails $tst"
+ fi
+ if is_in_list fail-destdir "$@"; then
+ destdir_xfails="$destdir_xfails $tst"
+ fi
+}
+
+# Be sure to avoid interferences from the environment.
+all_test_names_list=''
+builddir_xfails=''
+destdir_xfails=''
+
+expected_to_fail ()
+{
+ case $1 in
+ build) is_in_list "$2" $builddir_xfails;;
+ dest) is_in_list "$2" $destdir_xfails;;
+ *) fatal_ "incorrect 'expected_to_fail' usage";;
+ esac
+}
+
+# Helper subroutines for creation of input data files.
+create_input_data ()
+{
+ mkdir sub
+
+ unindent >> configure.ac << 'EOF'
+ AC_PROG_CC
+ AM_PROG_AR
+ AC_PROG_RANLIB
+ AC_OUTPUT
+EOF
+
+ : > sub/base.h
+ : > sub/nobase.h
+ : > sub/base.dat
+ : > sub/nobase.dat
+ : > sub/base.sh
+ : > sub/nobase.sh
+
+ unindent > source.c << 'EOF'
+ int
+ main (int argc, char **argv)
+ {
+ return 0;
+ }
+EOF
+
+ unindent > Makefile.am << 'EOF'
+ foodir = $(prefix)/foo
+ fooexecdir = $(prefix)/foo
+
+ foo_HEADERS = sub/base.h
+ nobase_foo_HEADERS = sub/nobase.h
+
+ dist_foo_DATA = sub/base.dat
+ nobase_dist_foo_DATA = sub/nobase.dat
+
+ dist_fooexec_SCRIPTS = sub/base.sh
+ nobase_dist_fooexec_SCRIPTS = sub/nobase.sh
+
+ fooexec_PROGRAMS = sub/base
+ nobase_fooexec_PROGRAMS = sub/nobase
+ sub_base_SOURCES = source.c
+ sub_nobase_SOURCES = source.c
+
+ fooexec_LIBRARIES = sub/libbase.a
+ nobase_fooexec_LIBRARIES = sub/libnobase.a
+ sub_libbase_a_SOURCES = source.c
+ sub_libnobase_a_SOURCES = source.c
+
+ .PHONY: test-inst
+ test-inst: install
+ test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase.h'
+ test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase.h'
+ test -f '$(DESTDIR)/$(file)-prefix/foo/base.h'
+ test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase.dat'
+ test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase.dat'
+ test -f '$(DESTDIR)/$(file)-prefix/foo/base.dat'
+ test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase.sh'
+ test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase.sh'
+ test -f '$(DESTDIR)/$(file)-prefix/foo/base.sh'
+ test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase$(EXEEXT)'
+ test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase$(EXEEXT)'
+ test -f '$(DESTDIR)/$(file)-prefix/foo/base$(EXEEXT)'
+ test -f '$(DESTDIR)/$(file)-prefix/foo/sub/libnobase.a'
+ test ! -f '$(DESTDIR)/$(file)-prefix/foo/libnobase.a'
+ test -f '$(DESTDIR)/$(file)-prefix/foo/libbase.a'
+EOF
+
+ $ACLOCAL || framework_failure_ "aclocal failed"
+ $AUTOCONF || framework_failure_ "autoconf failed"
+ $AUTOMAKE -a || framework_failure_ "automake failed"
+}
+
+# ================= #
+# Test data begin #
+# ----------------- #
+
+# Some control characters that are white space.
+bs='' # back space
+cr=' ' # carriage return
+ff=' ' # form feed
+ht=' ' # horizontal tab
+lf='
+' # line feed (aka newline)
+
+# Hack to save typing and make code visually clearer.
+def=define_problematic_string
+
+$def squote \' fail-builddir fail-destdir
+$def dquote '"' fail-builddir fail-destdir
+$def bquote '`' fail-builddir fail-destdir
+$def sharp '#' fail-builddir fail-destdir
+$def dollar '$' fail-builddir fail-destdir
+$def bang '!'
+$def bslash '\' fail-builddir
+$def ampersand '&' fail-builddir
+$def percent '%'
+$def leftpar '('
+$def rightpar ')'
+$def pipe '|'
+$def caret '^'
+$def tilde '~'
+$def qmark '?'
+$def star '*'
+$def plus '+'
+$def minus '-'
+$def comma ','
+$def colon ':'
+$def semicol ';'
+$def equal '='
+$def less '<'
+$def more '>'
+$def at '@'
+$def lqbrack '['
+$def rqbrack ']'
+$def lcbrack '{'
+$def rcbrack '}'
+$def space ' '
+$def tab "$ht"
+$def linefeed "$lf" fail-builddir fail-destdir
+$def backspace "$bs"
+$def formfeed "$ff"
+$def carriageret "$cr"
+$def quadrigraph0 '@&t@' fail-builddir
+$def quadrigraph1 '@<:@'
+$def quadrigraph2 '@:>@'
+$def quadrigraph3 '@S|@'
+$def quadrigraph4 '@%:@'
+$def a_b 'a b'
+$def a__b 'a b'
+$def a_lf_b "a${lf}b" fail-builddir fail-destdir
+$def dotdotdot '...'
+$def dosdrive 'a:'
+$def miscglob1 '?[a-z]*'
+$def miscglob2 '.*?[0-9]'
+
+unset def
+
+# --------------- #
+# Test data end #
+# =============== #
+
+# Allow the user to select a subset of the tests.
+if test $# -gt 0; then
+ test_names_list=$*
+ for test_name in $test_names_list; do
+ case " $all_test_names_list " in
+ *" $test_name "*);;
+ *) fatal_ "invalid user-specified test_name '$test_name'"
+ esac
+ done
+ # We need to determine the TAP plan adaptively.
+ n=`for t in $test_names_list; do echo $t; done | wc -l`
+ plan_ `expr $n '*' 2` # Two tests per "problematic string".
+ unset n
+else
+ test_names_list=$all_test_names_list
+ # Prefer static TAP plan if possible, it minimizes the chance of errors.
+ plan_ 94
+fi
+
+ocwd=`pwd` || fatal_ "cannot get current working directory"
+
+create_input_data
+
+for test_name in $test_names_list; do
+
+ eval "test_string=\${instspc__$test_name}" \
+ || fatal_ "invalid test name: '$test_name'"
+
+ if test x"$test_string" = x; then
+ if test x"$test_name" != xcarriageret; then
+ fatal_ "invalid test name: '$test_name'"
+ else
+ # MSYS version 1.0.17 still mishandles carriage returns; see
+ # automake bug#7849.
+ skip_ -r "carriage-return treated as null char" "$test_name in builddir"
+ skip_ -r "carriage-return treated as null char" "$test_name in destdir"
+ continue
+ fi
+ fi
+
+ # Skip the next checks if this system doesn't support the required
+ # characters in file names.
+
+ mkdir "./$test_string" || {
+ skip_ -r "mkdir failed" "$test_name in builddir"
+ skip_ -r "mkdir failed" "$test_name in destdir"
+ continue
+ }
+
+ case $test_string in
+ *:*)
+ # On MSYS 1.0.17, "mkdir ./a:" creates ./a, and "cd ./a:" takes you
+ # to a strange directory with pwd equal to "a". But only for
+ # interactive shells. Or something? In this script, "cd ./a:" fails
+ # on MSYS. Marvelous.
+ ( cd "./$test_string" ) || {
+ rmdir "./$test_string" || fatal_ "removing directory"
+ skip_ -r "cd failed" "$test_name in builddir"
+ skip_ -r "cd failed" "$test_name in destdir"
+ continue
+ }
+ ;;
+ esac
+
+ # Where are the "weird" characters going to be used, in $(builddir)
+ # or in $(DESTDIR)? They are always going to be used in $(prefix)
+ # though; should we maybe separate this into a dedicated check?
+ for where in build dest; do
+
+ case $where in
+ build)
+ build=./$test_string
+ dest=$ocwd/dest-$test_name
+ ;;
+ dest)
+ build=build-$test_name
+ dest=$ocwd/$test_string
+ mkdir "$build" || fatal_ "cannot create '$build'"
+ ;;
+ *)
+ fatal_ "invalid where '$where'"
+ ;;
+ esac
+
+ cd "$build" || fatal_ "cannot chdir into '$build'"
+
+ # Some make implementations eliminate leading and trailing whitespace
+ # from macros passed on the command line, and some eliminate leading
+ # whitespace from macros set from environment variables, so prepend
+ # './' and use the latter here.
+ r=ok
+ ../configure --prefix "/$test_string-prefix" \
+ && $MAKE all \
+ && DESTDIR="$dest" file="./$test_string" $MAKE -e test-inst \
+ || r='not ok'
+
+ description="$test_name in ${where}dir"
+ if expected_to_fail "$where" "$test_name"; then
+ directive=TODO
+ reason="long-standing limitation"
+ else
+ directive=
+ reason=
+ fi
+ # Test case outcome is here.
+ result_ "$r" -D "$directive" -r "$reason" -- "$description"
+
+ cd "$ocwd" || fatal_ "cannot chdir back to test directory"
+
+ # Remove subdirectories for tests that have passed, to avoid ending up
+ # with a too big test directory. This is especially important since
+ # some tests in this tests are expected to fail, and this will cause
+ # the test directory not to be removed when the script terminates.
+ if not am_keeping_testdirs && test "$r" = ok; then
+ rm_rf_ "$build" "$dest" || fatal_ "removing temporary subdirectory"
+ else
+ : For lesser shells with broken 'set -e'.
+ fi
+
+ done # $instspc_action
+
+done # $test_name
+
+: