Merge branch 'lw/perlish'
authorJunio C Hamano <gitster@pobox.com>
Wed, 25 Jun 2008 20:18:46 +0000 (13:18 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Jun 2008 20:18:46 +0000 (13:18 -0700)
* lw/perlish:
Git.pm: add test suite
t/test-lib.sh: add test_external and test_external_without_stderr

1  2 
t/test-lib.sh
diff --combined t/test-lib.sh
index e331cadcff479a8d9de59590c44b0502653653f9,4be466edb79fb7b509888ef5adac5f09c076bb33..f4f35ed4337a5cf2091b14f770988a7dd70f4361
@@@ -80,8 -80,6 +80,8 @@@ d
                debug=t; shift ;;
        -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
                immediate=t; shift ;;
 +      -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
 +              export GIT_TEST_LONG=t; shift ;;
        -h|--h|--he|--hel|--help)
                help=t; shift ;;
        -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
@@@ -304,6 -302,64 +304,64 @@@ test_expect_code () 
        echo >&3 ""
  }
  
+ # test_external runs external test scripts that provide continuous
+ # test output about their progress, and succeeds/fails on
+ # zero/non-zero exit code.  It outputs the test output on stdout even
+ # in non-verbose mode, and announces the external script with "* run
+ # <n>: ..." before running it.  When providing relative paths, keep in
+ # mind that all scripts run in "trash directory".
+ # Usage: test_external description command arguments...
+ # Example: test_external 'Perl API' perl ../path/to/test.pl
+ test_external () {
+       test "$#" -eq 3 ||
+       error >&5 "bug in the test script: not 3 parameters to test_external"
+       descr="$1"
+       shift
+       if ! test_skip "$descr" "$@"
+       then
+               # Announce the script to reduce confusion about the
+               # test output that follows.
+               say_color "" " run $(expr "$test_count" + 1): $descr ($*)"
+               # Run command; redirect its stderr to &4 as in
+               # test_run_, but keep its stdout on our stdout even in
+               # non-verbose mode.
+               "$@" 2>&4
+               if [ "$?" = 0 ]
+               then
+                       test_ok_ "$descr"
+               else
+                       test_failure_ "$descr" "$@"
+               fi
+       fi
+ }
+ # Like test_external, but in addition tests that the command generated
+ # no output on stderr.
+ test_external_without_stderr () {
+       # The temporary file has no (and must have no) security
+       # implications.
+       tmp="$TMPDIR"; if [ -z "$tmp" ]; then tmp=/tmp; fi
+       stderr="$tmp/git-external-stderr.$$.tmp"
+       test_external "$@" 4> "$stderr"
+       [ -f "$stderr" ] || error "Internal error: $stderr disappeared."
+       descr="no stderr: $1"
+       shift
+       say >&3 "expecting no stderr from previous command"
+       if [ ! -s "$stderr" ]; then
+               rm "$stderr"
+               test_ok_ "$descr"
+       else
+               if [ "$verbose" = t ]; then
+                       output=`echo; echo Stderr is:; cat "$stderr"`
+               else
+                       output=
+               fi
+               # rm first in case test_failure exits.
+               rm "$stderr"
+               test_failure_ "$descr" "$@" "$output"
+       fi
+ }
  # This is not among top-level (test_expect_success | test_expect_failure)
  # but is a prefix that can be used in the test script, like:
  #