#! /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 if test x"$sh_errexit_works" != x"yes"; then skip_all_ "$me: no working exit trap with 'set -e'" fi plan_ 42 # We still need a little hack to make ./defs work outside automake's # tree `tests' subdirectory. Not a big deal. sed "s|^testbuilddir=.*|testbuilddir='`pwd`'|" ../defs-static >defs-static diff ../defs-static defs-static && fatal_ "failed to edit defs-static" cp ../defs . AM_TESTS_REEXEC=no; export AM_TESTS_REEXEC 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. dir=dummy.dir # Don't let a failure poison all subsequent tests. do_clean () { test -d $dir || return 0 find $dir -type d -exec chmod u+rwx '{}' ';' || : rm -rf $dir } # Check that pre-test cleanup works also with directories with # "null" permissions, and containing broken symlinks. 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 000 $dir/sub $dir command_ok_ "pre-cleanup can deal with null-perms testdir" \ $SHELL -c '. ./defs' dummy.test command_ok_ "pre-cleanup removed null-perms testdir" \ eval 'test ! -f $dir && test ! -d $dir && test ! -r $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 null-perms testdir" \ $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 000 dir/sub dir : ' dummy.test command_ok_ "post-cleanup removed null-perms testdir" \ eval 'test ! -f $dir && test ! -d $dir && test ! -r $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 $dir cd $dir ln -s ../dir ../file . cd .. command_ok_ "pre-cleanup with testdir with zero-perms symlinks" \ $SHELL -c '. ./defs' dummy.test 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" \ $SHELL -c ' ocwd=`pwd` || exit 1 stderr_fileno_=2 . ./defs || Exit 1 ln -s "$ocwd/dir" "$ocwd/file" . ' dummy.test 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"' 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 $SHELL -c " stderr_fileno_=2 . ./defs : > foo Exit $st " dummy.test command_ok_ "testdir not removed if exiting with status $st" \ test -f 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 $SHELL -c " stderr_fileno_=2 . ./defs : > foo kill -$sig \$\$ " dummy.test command_ok_ "testdir not removed if getting signal $sig" \ test -f dummy.dir/foo do_clean done :