automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] {master} tests: add testcases sanity-checking the testsuite


From: Ralf Wildenhues
Subject: Re: [PATCH] {master} tests: add testcases sanity-checking the testsuite
Date: Thu, 24 Feb 2011 21:26:34 +0100
User-agent: Mutt/1.5.20 (2010-08-04)

Hi Stefano,

* Stefano Lattarini wrote on Wed, Feb 23, 2011 at 10:20:03PM CET:
> Helper subroutines, variables and other pieces of code defined
> in the `tests/defs' and used by many testcases are non-obvious,
> and tricky to get to work portably; but until now, they weren't
> tested at all in a clear and self-contained way.
> This change should remedy to the situation.

This patch is fine with me, with some nits below.  I expect some
fallout on some systems.

Pretty nifty stuff in this patch by the way.

What does the S_ prefix stand for?  Sanity?  Well, we can keep
(or lose) our sanity over all kinds of things.  ;-)
How about 'defs-' as prefix, or maybe 'suite-'?

Thank you,
Ralf

> * tests/S_cleanup.test: New test, check removal of temporary
> test working directory by `./defs'.
> * tests/S_dir.test: New test, check that tests using `./defs'
> create a proper temporary directory, and run in it.
> * tests/S_exit.test: New test, check that, in case of failing
> commands, the correct exit status is passed to the exit trap
> installed by the `./defs' script.
> * tests/S_is_newest.test: New test, checking the `is_newest'
> subroutine.
> * tests/S_me.test: New test, checking that $me gets defined
> automatically by `tests/defs' if not set, and that it can be
> overridden from either the shell or the environment.
> * tests/S_sanity.test: New test, check that the sanity checks
> performed by the `tests/defs' script works correctly.
> * tests/S_unindent.test: New test, checking the `unindent'
> subroutine.
> * tests/Makefile.am (TESTS): Update.

> --- /dev/null
> +++ b/tests/S_cleanup.test

> +# Sanity check for the automake testsuite.
> +# Check creation/removal of temporary test working directory by `./defs'.
> +
> +. ./defs || Exit 1
> +
> +# 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
> +cp ../defs .
> +
> +have_simlinks=false

typo symlinks here and in some but not all places below

> +ln -s defs foo && test -h foo && have_simlinks=:

I'm not sure if this test works that way.
MSYS emulates ln -s with cp -p, might also emulate test -h.
You can find out for sure by something like this:
  echo foo > a
  ln -s a b
  echo bar > a
  grep bar b

But then again, I wonder, why you even care: on systems that emulate
symlinks, you can just go along with that.  So I guess all you'd need
to test here is whether ln -s apparently succeeds.

> +export have_simlinks # Is used also by spawned shells.
> +
> +dir=dummy.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 $have_symlinks; then
> +  ln -s file symlink
> +  ln -s none brokenlink
> +fi
> +cd ..
> +chmod 000 $dir/sub/* $dir/file $dir/symlink
> +chmod 000 $dir/sub $dir
> +$SHELL -c  '. ./defs' dummy.test
> +test ! -f $dir
> +test ! -d $dir
> +test ! -r $dir
> +
> +# Check that post-test cleanup works also with directories with
> +# "null" permissions, and containing broken symlinks.
> +$SHELL -c '
> +  . ./defs || Exit 1
> +  set -e
> +  mkdir dir dir/sub
> +  cd dir
> +  touch file sub/file
> +  if $have_simlinks; then
> +    ln -s file symlink
> +    ln -s none brokenlink
> +  fi
> +  cd ..
> +  chmod 000 dir/sub/* dir/file dir/symlink
> +  chmod 000 dir/sub dir
> +' dummy.test
> +test ! -f $dir
> +test ! -d $dir
> +test ! -r $dir
> +
> +# Check that pre-test cleanup do not unduly change the permissions of

s/do/does/

> +# files to which symlinks in the temporary test directory point to.
> +if $have_simlinks; then
> +
> +  mkdir dir
> +  chmod 000 dir
> +  : > file
> +  chmod 000 file
> +
> +  mkdir $dir
> +  cd $dir
> +  ln -s ../dir ../file .
> +  cd ..
> +  $SHELL -c '. ./defs' dummy.test
> +  ls -l # For debugging.
> +  ls -l file | grep "^---------- .*file"
> +  ls -ld dir | grep "^d--------- .*dir"
> +
> +  $SHELL -c '
> +    ocwd=`pwd` || exit 1
> +    . ./defs || Exit 1
> +    ln -s "$ocwd/dir" "$ocwd/file" .
> +  ' dummy.test
> +  ls -l # For debugging.
> +  ls -l file | grep "^---------- .*file"
> +  ls -ld dir | grep "^d--------- .*dir"
> +
> +  rmdir dir
> +  rm -f file
> +
> +fi # $have_symlinks
> +
> +# Check that the cleanup trap does not remove the temporary
> +# test directory in case of test failure, skip, hard-error,
> +# or upon the receiving of a signal.

or when receiving a signal.

> +for bailout_command in \
> +  'Exit 1' \
> +  'Exit 2' \
> +  'Exit 10' \
> +  'Exit 77' \
> +  'Exit 99' \
> +  'Exit 126' \
> +  'Exit 127' \
> +  'Exit 255' \
> +  'kill -1 $$' \
> +  'kill -2 $$' \
> +  'kill -9 $$' \
> +  'kill -13 $$' \
> +  'kill -15 $$' \
> +; do
> +  $SHELL -c  ". ./defs; : > foo; $bailout_command" dummy.test && Exit 1
> +  test -f dummy.dir/foo
> +done

> --- /dev/null
> +++ b/tests/S_dir.test

> +# Sanity check for the automake testsuite.
> +# Check that tests using `./defs' create a proper temporary directory,
> +# and run in it.
> +
> +set -ex
> +
> +this=S_dir
> +outcome=:
> +pwd
> +
> +rm -f $this.tmp
> +
> +$SHELL -c "
> +  . ./defs || Exit 1
> +  : > $this.tmp
> +  case \`pwd\` in '`pwd`'/$this.dir);; *) Exit 1;; esac
> +" $this.test || outcome=false
> +
> +test -f $this.tmp && { rm -f $this.tmp; outcome=false; }
> +
> +$outcome

> --- /dev/null
> +++ b/tests/S_exit.test

> +# Sanity check for the automake testsuite.
> +# Check that. in case of failing commands, the correct exit status is
> +# passed to the exit trap installed by the `./defs' script.
> +# Also check that the `errexit' shell flag is active.
> +
> +for st in 1 2 3 4 5 77 99 126 127 128 129 130 255; do
> +
> +  echo "* Try: Exit $st"

ramping up output markup again?  ;->

> +  $SHELL -c  ". ./defs; Exit $st; :"
> +  rc=$?
> +  echo "* rc=$rc"
> +  echo
> +  test $rc -eq $st || exit 1
> +
> +  echo "* Try: sh -c 'exit $st'"
> +  $SHELL -c  ". ./defs; sh -c 'exit $st'; :"
> +  rc=$?
> +  echo "* rc=$rc"
> +  echo
> +  test $rc -eq $st || exit 1
> +
> +done
> +
> +echo "* Try: non-existent-program"
> +$SHELL -c  ". ./defs; non-existent-program; :"
> +rc=$?
> +echo "* rc=$rc"
> +echo
> +test $rc -eq 127 || exit 1
> +
> +for sig in 1 2 13 15; do
> +
> +  echo "* Try: kill -$sig \$\$"
> +  $SHELL -c  ". ./defs; kill -$sig \$\$; :"
> +  rc=$?
> +  echo "* rc=$rc"
> +  echo
> +  test $rc -eq 99 || exit 1
> +
> +done

> --- /dev/null
> +++ b/tests/S_is_newest.test

> +# Sanity check for the automake testsuite.
> +# Check the `is_newest' subroutine.
> +
> +. ./defs || Exit 1
> +
> +: > a
> +$sleep
> +: > b
> +: > c
> +
> +stat a b c || : # for debugging

stat is not portable.  You knew that already, I guess.

> +is_newest c a
> +is_newest b a
> +is_newest a b && Exit 1
> +is_newest c b
> +is_newest c c
> +is_newest c a b c
> +
> +touch -r c d || Exit 77

Why the || Exit 77 here?

> +stat c d || : # for debugging
> +
> +is_newest c d
> +is_newest d c

You cannot be sure about the latter one.  See 'info Autoconf --index
touch'.

> --- /dev/null
> +++ b/tests/S_me.test

> +# Sanity check for the automake testsuite.
> +# Make sure that $me gets automatically defined by `./defs'.
> +
> +set -ex
> +
> +: ${SHELL=/bin/sh}
> +
> +$SHELL -c '. ./defs && echo me=$me' foo-bar-.test | grep '^me=foo-bar-$'
> +$SHELL -c '. ./defs && echo me=$me' _foo__bar.test | grep '^me=_foo__bar$'
> +$SHELL -c '. ./defs && echo me=$me' 012.test | grep '^me=012$'
> +$SHELL -c '. ./defs && echo me=$me' foo.bar | grep '^me=foo\.bar$'

> --- /dev/null
> +++ b/tests/S_sanity.test

> +# Sanity check for the automake testsuite.
> +# Test the sanity checks performed by the `defs' script.  Also check that
> +# it can be used by duplicating some of infrastructure of the automake's
> +# tree `tests' subdirectory.

I have a hard time understanding this sentence.  How about

  Also check that we can use `defs' elsewhere, when we duplicate some
  of the infrastructure from the automake/tests subdirectory.

> +. ./defs || Exit 1
> +
> +# Avoid to confuse traces from children processed with our own traces.

Do not confuse traces from child processes ...

> +show_stderr()

space before paren

> +{
> +  sed 's/^/ | /' stderr >&2
> +}
> +
> +if $SHELL -c '. ../defs' dummy.test 2>stderr; then
> +  show_stderr
> +  Exit 1
> +else
> +  show_stderr
> +  grep 'defs-static: not found in current directory' stderr
> +fi
> +
> +sed 's|^testsrcdir=.*|testsrcdir=foo|' ../defs-static > defs-static
> +if $SHELL -c '. ../defs' dummy.test 2>stderr; then
> +  show_stderr
> +  Exit 1
> +else
> +  show_stderr
> +  grep 'foo/defs-static\.in not found.*check \$testsrcdir' stderr
> +fi
> +
> +sed 's|^testbuilddir=.*|testbuilddir=foo|' ../defs-static > defs-static
> +if $SHELL -c '. ../defs' dummy.test 2>stderr; then
> +  show_stderr
> +  Exit 1
> +else
> +  show_stderr
> +  grep 'foo/defs-static not found.*check \$testbuilddir' stderr
> +fi
> +
> +# 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
> +# Redefining *srcdir and *builddir variables in the environment shouldn't
> +# cause problems
> +env \
> +  builddir=bad-dir srcdir=bad-dir \
> +  top_builddir=bad-dir top_srcdir=bad-dir \
> +  abs_builddir=bad-dir abs_srcdir=bad-dir \
> +  abs_top_builddir=bad-dir abs_top_srcdir=bad-dir \
> +  $SHELL -c  '. ../defs && echo "!OK!" > ../foo' dummy.test
> +$FGREP '!OK!' foo
> +
> +:

> --- /dev/null
> +++ b/tests/S_unindent.test

> +# Sanity check for the automake testsuite.
> +# Check the `unindent' subroutine.
> +
> +. ./defs || Exit 1
> +
> +#------------------------------------------------------------------
> +
> +: Leading spaces
> +
> +cat > input <<END
> +  1
> +   2
> +3
> + 4
> +${tab}5
> +${tab}  6
> +  6${sp}
> +7${sp}
> +  8${sp}${sp}
> +9${sp}${sp}
> +  10${tab}
> +11${tab}
> +  12${sp}${tab}
> +13${sp}${tab}
> +  14 this${tab}with${tab}multiple fields${sp}
> +15 and   ${tab}${tab}this too${tab}
> + 16 and also this
> +${sp}${sp}
> +${sp}
> +${tab}
> +
> +last line
> +END
> +
> +cat > exp <<END
> +1
> + 2
> +3
> + 4
> +${tab}5
> +${tab}  6
> +6${sp}
> +7${sp}
> +8${sp}${sp}
> +9${sp}${sp}
> +10${tab}
> +11${tab}
> +12${sp}${tab}
> +13${sp}${tab}
> +14 this${tab}with${tab}multiple fields${sp}
> +15 and   ${tab}${tab}this too${tab}
> + 16 and also this
> +
> +${sp}
> +${tab}
> +
> +last line
> +END
> +
> +unindent input > got
> +
> +diff exp got
> +
> +#------------------------------------------------------------------
> +
> +: Leading tab
> +
> +cat > input <<END
> +${tab}1
> +${tab} 2
> +3
> + 4
> +  5
> +    6
> +        7
> + ${tab}8
> +${tab}${tab}9
> +${tab}10${tab}
> +${tab}11${sp}
> +12${tab}
> +13${sp}
> +${tab}14 this  with${tab}multiple fields${sp}
> +15 and   ${tab}${tab}this too${tab}
> + 16 and also this
> +${tab}
> +${sp}
> +${sp}${tab}
> +
> +last line
> +END
> +
> +cat > exp <<END
> +1
> + 2
> +3
> + 4
> +  5
> +    6
> +        7
> + ${tab}8
> +${tab}9
> +10${tab}
> +11${sp}
> +12${tab}
> +13${sp}
> +14 this  with${tab}multiple fields${sp}
> +15 and   ${tab}${tab}this too${tab}
> + 16 and also this
> +
> +${sp}
> +${sp}${tab}
> +
> +last line
> +END
> +
> +unindent input > got
> +
> +diff exp got
> +
> +#------------------------------------------------------------------
> +
> +: No leading whitespace
> +
> +cat > input <<END
> +1
> + 2
> +  3
> +        4
> +${tab}5
> +${tab} 6
> + ${tab}7
> +${tab}${tab}8
> +9${sp}
> + 10${tab}
> +${tab}10${sp}${sp}
> +14 this with${tab}multiple  fields${sp}
> + 15 and this too${tab}
> +${tab}16 and also this
> +${tab}
> +${sp}
> +
> +last line
> +END
> +
> +cp input exp
> +
> +unindent input > got
> +
> +diff exp got
> +
> +#------------------------------------------------------------------
> +
> +: Leading empty lines are ignored [1]
> +
> +cat > input <<END
> +
> +
> + foo
> + bar
> +   quux
> +END
> +
> +cat > exp <<END
> +
> +
> +foo
> +bar
> +  quux
> +END
> +
> +unindent input > got
> +
> +diff exp got
> +
> +#------------------------------------------------------------------
> +
> +: Leading empty lines are ignored [2]
> +
> +cat > input <<END
> +
> +
> +foo
> +bar
> +   quux
> +END
> +
> +cat > exp <<END
> +
> +
> +foo
> +bar
> +   quux
> +END
> +
> +unindent input > got
> +
> +diff exp got
> +
> +#------------------------------------------------------------------
> +
> +:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]