#! /bin/sh # Copyright (C) 2011-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 . # Sanity check for the automake testsuite. # Check creation/removal of temporary test working directory by './defs'. . ./defs || Exit 1 plan_ 43 # We still need a little hack to make ./defs work outside automake's # tree 'tests' subdirectory. Not a big deal. sed "s|^am_top_builddir=.*|am_top_builddir='`pwd`'|" \ "$am_top_builddir"/defs-static >defs-static diff "$am_top_builddir"/defs-static defs-static \ && fatal_ "failed to edit defs-static" cp "$am_top_builddir"/defs . AM_TESTS_REEXEC=no; export AM_TESTS_REEXEC keep_testdirs=; unset keep_testdirs if ln -s defs foo && test -h foo; then have_symlinks=yes else have_symlinks=no fi export have_symlinks # Is used also by spawned shells. # Don't let a failure poison all subsequent tests. do_clean () { # Don't try to be smart and use find here, that has caused issues # and extra ERROR results in the past. Be dumb and safe. for d in t t/* t/*/* t/*/*/*; do test ! -d $d || chmod u+rwx $d || : done rm -rf t } # Exporting 'keep_testdirs' to "yes" in the environment should cause # the cleanup code not to be run, so that the temporary directories # are left on disk. command_ok_ '"keep_testdirs=yes" causes testdir to be kept around' eval ' env keep_testdirs=yes \ $AM_TEST_RUNNER_SHELL -c ". ./defs && echo okok >foo" t/dummy.sh \ && test -f t/dummy.dir/foo \ && test okok = `cat t/dummy.dir/foo`' do_clean # Check that pre-test cleanup works also with directories with # "null" permissions, and containing broken symlinks. mkdir t t/dummy.dir t/dummy.dir/sub ( cd t/dummy.dir touch file sub/file if test $have_symlinks = yes; then ln -s file symlink ln -s none brokenlink fi ) chmod 000 t/dummy.dir/sub/* t/dummy.dir/file test $have_symlinks = yes && chmod 000 t/dummy.dir/symlink chmod 500 t/dummy.dir/sub t/dummy.dir command_ok_ "pre-cleanup can deal with low-perms testdir" \ $AM_TEST_RUNNER_SHELL -c '. ./defs' t/dummy.sh command_ok_ "pre-cleanup removed low-perms testdir" \ eval 'test ! -f t/dummy.dir \ && test ! -d t/dummy.dir \ && test ! -r t/dummy.dir' do_clean # Check that post-test cleanup works also with directories with # "null" permissions, and containing broken symlinks. command_ok_ "post-cleanup can deal with low-perms testdir" \ $AM_TEST_RUNNER_SHELL -c ' stderr_fileno_=2 . ./defs || Exit 1 set -e mkdir dir dir/sub cd dir touch file sub/file if test $have_symlinks = yes; then ln -s file symlink ln -s none brokenlink fi cd .. chmod 000 dir/sub/* dir/file test $have_symlinks = yes && chmod 000 dir/symlink chmod 500 dir/sub dir : ' t/dummy.sh command_ok_ "post-cleanup removed null-perms testdir" \ eval 'test ! -f t/dummy.dir \ && test ! -d t/dummy.dir \ && test ! -r t/dummy.dir' do_clean # Check that pre-test cleanup does not unduly change the permissions of # files to which symlinks in the temporary test directory point to. if test $have_symlinks = yes; then mkdir dir chmod 000 dir : > file chmod 000 file mkdir t t/dummy.dir (cd t/dummy.dir && ln -s ../../dir ../../file .) command_ok_ "pre-cleanup with testdir with zero-perms symlinks" \ $AM_TEST_RUNNER_SHELL -c '. ./defs' t/dummy.sh ls -l # For debugging. command_ok_ "pre-cleanup chmod doesn't follow symlinks to files" \ eval 'ls -l file | grep "^----------.*file"' command_ok_ "pre-cleanup chmod doesn't follow symlinks to dirs" \ eval 'ls -ld dir | grep "^d---------.*dir"' command_ok_ "post-cleanup with testdir with zero-perms symlinks" \ $AM_TEST_RUNNER_SHELL -c ' ocwd=`pwd` || exit 1 stderr_fileno_=2 . ./defs || Exit 1 ln -s "$ocwd/dir" "$ocwd/file" . ' t/dummy.sh ls -l # For debugging. command_ok_ "post-cleanup chmod doesn't follow symlinks to files" \ eval 'ls -l file | grep "^----------.*file"' command_ok_ "post-cleanup chmod doesn't follow symlinks to dirs" \ eval 'ls -ld dir | grep "^d---------.*dir"' chmod u+rwx dir file rmdir dir rm -f file else # $have_symlinks = no skip_row_ 6 "symlinks not supported" fi do_clean # Check that the cleanup trap does not remove the temporary # test directory in case of test failure, skip, hard-error, # or when receiving a signal. for st in 1 2 3 10 77 99 126 127 130 255; do command_ok_ "exit trap doesn't clobber exit status $st" \ not $AM_TEST_RUNNER_SHELL -c " stderr_fileno_=2 . ./defs : > foo Exit $st " t/dummy.sh command_ok_ "testdir not removed if exiting with status $st" \ test -f t/dummy.dir/foo do_clean done for sig in 1 2 3 9 13 15; do if is_blocked_signal $sig; then skip_row_ 2 -r "signal $sig seems blocked" continue fi command_ok_ "exit trap doesn't clobber signal $sig" \ not $AM_TEST_RUNNER_SHELL -c " stderr_fileno_=2 . ./defs : > foo kill -$sig \$\$ " t/dummy.sh command_ok_ "testdir not removed if getting signal $sig" \ test -f t/dummy.dir/foo do_clean done :