]> asedeno.scripts.mit.edu Git - git.git/commitdiff
Merge branch 'ab/tap'
authorJunio C Hamano <gitster@pobox.com>
Wed, 7 Jul 2010 18:18:44 +0000 (11:18 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 7 Jul 2010 18:18:44 +0000 (11:18 -0700)
* ab/tap:
  t/README: document more test helpers
  t/README: proposed rewording...
  t/README: Document the do's and don'ts of tests
  t/README: Add a section about skipping tests
  t/README: Document test_expect_code
  t/README: Document test_external*
  t/README: Document the prereq functions, and 3-arg test_*
  t/README: Typo: paralell -> parallel
  t/README: The trash is in 't/trash directory.$name'
  t/t9700/test.pl: don't access private object members, use public access methods
  t9700: Use Test::More->builder, not $Test::Builder::Test
  tests: Say "pass" rather than "ok" on empty lines for TAP
  tests: Skip tests in a way that makes sense under TAP
  test-lib: output a newline before "ok" under a TAP harness
  test-lib: Make the test_external_* functions TAP-aware
  test-lib: Adjust output to be valid TAP format

46 files changed:
t/README
t/lib-git-svn.sh
t/lib-httpd.sh
t/t1020-subdirectory.sh
t/t1304-default-acl.sh
t/t1509-root-worktree.sh
t/t2007-checkout-symlink.sh
t/t2102-update-index-symlinks.sh
t/t3300-funny-names.sh
t/t3302-notes-index-expensive.sh
t/t3600-rm.sh
t/t3700-add.sh
t/t3701-add-interactive.sh
t/t3902-quoted.sh
t/t4004-diff-rename-symlink.sh
t/t4011-diff-symlink.sh
t/t4016-diff-quote.sh
t/t4023-diff-rename-typechange.sh
t/t4114-apply-typechange.sh
t/t4115-apply-symlink.sh
t/t4122-apply-symlink-inside.sh
t/t5302-pack-index.sh
t/t5503-tagfollow.sh
t/t5522-pull-symlink.sh
t/t5540-http-push.sh
t/t5541-http-push.sh
t/t5550-http-fetch.sh
t/t5551-http-fetch.sh
t/t5561-http-backend.sh
t/t5705-clone-2gb.sh
t/t6035-merge-dir-to-symlink.sh
t/t7004-tag.sh
t/t7006-pager.sh
t/t7800-difftool.sh
t/t9001-send-email.sh
t/t9100-git-svn-basic.sh
t/t9119-git-svn-info.sh
t/t9129-git-svn-i18n-commitencoding.sh
t/t9143-git-svn-gc.sh
t/t9200-git-cvsexportcommit.sh
t/t9400-git-cvsserver-server.sh
t/t9401-git-cvsserver-crlf.sh
t/t9600-cvsimport.sh
t/t9700-perl-git.sh
t/t9700/test.pl
t/test-lib.sh

index 0e4e8d8862c96383a6f6f22a1b6bb01044925620..b906ceb4766a283ae6b22bd037f9e1619feb12d1 100644 (file)
--- a/t/README
+++ b/t/README
@@ -18,25 +18,48 @@ The easiest way to run tests is to say "make".  This runs all
 the tests.
 
     *** t0000-basic.sh ***
-    *   ok 1: .git/objects should be empty after git-init in an empty repo.
-    *   ok 2: .git/objects should have 256 subdirectories.
-    *   ok 3: git-update-index without --add should fail adding.
+    ok 1 - .git/objects should be empty after git init in an empty repo.
+    ok 2 - .git/objects should have 3 subdirectories.
+    ok 3 - success is reported like this
     ...
-    *   ok 23: no diff after checkout and git-update-index --refresh.
-    * passed all 23 test(s)
-    *** t0100-environment-names.sh ***
-    *   ok 1: using old names should issue warnings.
-    *   ok 2: using old names but having new names should not issue warnings.
-    ...
-
-Or you can run each test individually from command line, like
-this:
-
-    $ sh ./t3001-ls-files-killed.sh
-    *   ok 1: git-update-index --add to add various paths.
-    *   ok 2: git-ls-files -k to show killed files.
-    *   ok 3: validate git-ls-files -k output.
-    * passed all 3 test(s)
+    ok 43 - very long name in the index handled sanely
+    # fixed 1 known breakage(s)
+    # still have 1 known breakage(s)
+    # passed all remaining 42 test(s)
+    1..43
+    *** t0001-init.sh ***
+    ok 1 - plain
+    ok 2 - plain with GIT_WORK_TREE
+    ok 3 - plain bare
+
+Since the tests all output TAP (see http://testanything.org) they can
+be run with any TAP harness. Here's an example of parallel testing
+powered by a recent version of prove(1):
+
+    $ prove --timer --jobs 15 ./t[0-9]*.sh
+    [19:17:33] ./t0005-signals.sh ................................... ok       36 ms
+    [19:17:33] ./t0022-crlf-rename.sh ............................... ok       69 ms
+    [19:17:33] ./t0024-crlf-archive.sh .............................. ok      154 ms
+    [19:17:33] ./t0004-unwritable.sh ................................ ok      289 ms
+    [19:17:33] ./t0002-gitfile.sh ................................... ok      480 ms
+    ===(     102;0  25/?  6/?  5/?  16/?  1/?  4/?  2/?  1/?  3/?  1... )===
+
+prove and other harnesses come with a lot of useful options. The
+--state option in particular is very useful:
+
+    # Repeat until no more failures
+    $ prove -j 15 --state=failed,save ./t[0-9]*.sh
+
+You can also run each test individually from command line, like this:
+
+    $ sh ./t3010-ls-files-killed-modified.sh
+    ok 1 - git update-index --add to add various paths.
+    ok 2 - git ls-files -k to show killed files.
+    ok 3 - validate git ls-files -k output.
+    ok 4 - git ls-files -m to show modified files.
+    ok 5 - validate git ls-files -m output.
+    # passed all 5 test(s)
+    1..5
 
 You can pass --verbose (or -v), --debug (or -d), and --immediate
 (or -i) command line argument to the test, or by setting GIT_TEST_OPTS
@@ -198,15 +221,101 @@ This test harness library does the following things:
  - If the script is invoked with command line argument --help
    (or -h), it shows the test_description and exits.
 
- - Creates an empty test directory with an empty .git/objects
-   database and chdir(2) into it.  This directory is 't/trash directory'
-   if you must know, but I do not think you care.
+ - Creates an empty test directory with an empty .git/objects database
+   and chdir(2) into it.  This directory is 't/trash
+   directory.$test_name_without_dotsh', with t/ subject to change by
+   the --root option documented above.
 
  - Defines standard test helper functions for your scripts to
    use.  These functions are designed to make all scripts behave
    consistently when command line arguments --verbose (or -v),
    --debug (or -d), and --immediate (or -i) is given.
 
+Do's, don'ts & things to keep in mind
+-------------------------------------
+
+Here are a few examples of things you probably should and shouldn't do
+when writing tests.
+
+Do:
+
+ - Put all code inside test_expect_success and other assertions.
+
+   Even code that isn't a test per se, but merely some setup code
+   should be inside a test assertion.
+
+ - Chain your test assertions
+
+   Write test code like this:
+
+       git merge foo &&
+       git push bar &&
+       test ...
+
+   Instead of:
+
+       git merge hla
+       git push gh
+       test ...
+
+   That way all of the commands in your tests will succeed or fail. If
+   you must ignore the return value of something (e.g. the return
+   value of export is unportable) it's best to indicate so explicitly
+   with a semicolon:
+
+       export HLAGH;
+       git merge hla &&
+       git push gh &&
+       test ...
+
+Don't:
+
+ - exit() within a <script> part.
+
+   The harness will catch this as a programming error of the test.
+   Use test_done instead if you need to stop the tests early (see
+   "Skipping tests" below).
+
+ - Break the TAP output
+
+   The raw output from your test may be interpreted by a TAP harness. TAP
+   harnesses will ignore everything they don't know about, but don't step
+   on their toes in these areas:
+
+   - Don't print lines like "$x..$y" where $x and $y are integers.
+
+   - Don't print lines that begin with "ok" or "not ok".
+
+   TAP harnesses expect a line that begins with either "ok" and "not
+   ok" to signal a test passed or failed (and our harness already
+   produces such lines), so your script shouldn't emit such lines to
+   their output.
+
+   You can glean some further possible issues from the TAP grammar
+   (see http://search.cpan.org/perldoc?TAP::Parser::Grammar#TAP_Grammar)
+   but the best indication is to just run the tests with prove(1),
+   it'll complain if anything is amiss.
+
+Keep in mind:
+
+ - Inside <script> part, the standard output and standard error
+   streams are discarded, and the test harness only reports "ok" or
+   "not ok" to the end user running the tests. Under --verbose, they
+   are shown to help debugging the tests.
+
+
+Skipping tests
+--------------
+
+If you need to skip all the remaining tests you should set skip_all
+and immediately call test_done. The string you give to skip_all will
+be used as an explanation for why the test was skipped. for instance:
+
+       if ! test_have_prereq PERL
+       then
+           skip_all='skipping perl interface tests, perl not available'
+           test_done
+       fi
 
 End with test_done
 ------------------
@@ -222,9 +331,9 @@ Test harness library
 There are a handful helper functions defined in the test harness
 library for your script to use.
 
- - test_expect_success <message> <script>
+ - test_expect_success [<prereq>] <message> <script>
 
-   This takes two strings as parameter, and evaluates the
+   Usually takes two strings as parameter, and evaluates the
    <script>.  If it yields success, test is considered
    successful.  <message> should state what it is testing.
 
@@ -234,7 +343,14 @@ library for your script to use.
            'git-write-tree should be able to write an empty tree.' \
            'tree=$(git-write-tree)'
 
- - test_expect_failure <message> <script>
+   If you supply three parameters the first will be taken to be a
+   prerequisite, see the test_set_prereq and test_have_prereq
+   documentation below:
+
+       test_expect_success TTY 'git --paginate rev-list uses a pager' \
+           ' ... '
+
+ - test_expect_failure [<prereq>] <message> <script>
 
    This is NOT the opposite of test_expect_success, but is used
    to mark a test that demonstrates a known breakage.  Unlike
@@ -243,6 +359,16 @@ library for your script to use.
    success and "still broken" on failure.  Failures from these
    tests won't cause -i (immediate) to stop.
 
+   Like test_expect_success this function can optionally use a three
+   argument invocation with a prerequisite as the first argument.
+
+ - test_expect_code [<prereq>] <code> <message> <script>
+
+   Analogous to test_expect_success, but pass the test if it exits
+   with a given exit <code>
+
+ test_expect_code 1 'Merge with d/f conflicts' 'git merge "merge msg" B master'
+
  - test_debug <script>
 
    This takes a single argument, <script>, and evaluates it only
@@ -275,6 +401,85 @@ library for your script to use.
    Merges the given rev using the given message.  Like test_commit,
    creates a tag and calls test_tick before committing.
 
+ - test_set_prereq SOME_PREREQ
+
+   Set a test prerequisite to be used later with test_have_prereq. The
+   test-lib will set some prerequisites for you, e.g. PERL and PYTHON
+   which are derived from ./GIT-BUILD-OPTIONS (grep test_set_prereq
+   test-lib.sh for more). Others you can set yourself and use later
+   with either test_have_prereq directly, or the three argument
+   invocation of test_expect_success and test_expect_failure.
+
+ - test_have_prereq SOME PREREQ
+
+   Check if we have a prerequisite previously set with
+   test_set_prereq. The most common use of this directly is to skip
+   all the tests if we don't have some essential prerequisite:
+
+       if ! test_have_prereq PERL
+       then
+           skip_all='skipping perl interface tests, perl not available'
+           test_done
+       fi
+
+ - test_external [<prereq>] <message> <external> <script>
+
+   Execute a <script> with an <external> interpreter (like perl). This
+   was added for tests like t9700-perl-git.sh which do most of their
+   work in an external test script.
+
+       test_external \
+           'GitwebCache::*FileCache*' \
+           "$PERL_PATH" "$TEST_DIRECTORY"/t9503/test_cache_interface.pl
+
+   If the test is outputting its own TAP you should set the
+   test_external_has_tap variable somewhere before calling the first
+   test_external* function. See t9700-perl-git.sh for an example.
+
+       # The external test will outputs its own plan
+       test_external_has_tap=1
+
+ - test_external_without_stderr [<prereq>] <message> <external> <script>
+
+   Like test_external but fail if there's any output on stderr,
+   instead of checking the exit code.
+
+       test_external_without_stderr \
+           'Perl API' \
+           "$PERL_PATH" "$TEST_DIRECTORY"/t9700/test.pl
+
+ - test_must_fail <git-command>
+
+   Run a git command and ensure it fails in a controlled way.  Use
+   this instead of "! <git-command>" to fail when git commands
+   segfault.
+
+ - test_might_fail <git-command>
+
+   Similar to test_must_fail, but tolerate success, too.  Use this
+   instead of "<git-command> || :" to catch failures due to segv.
+
+ - test_cmp <expected> <actual>
+
+   Check whether the content of the <actual> file matches the
+   <expected> file.  This behaves like "cmp" but produces more
+   helpful output when the test is run with "-v" option.
+
+ - test_when_finished <script>
+
+   Prepend <script> to a list of commands to run to clean up
+   at the end of the current test.  If some clean-up command
+   fails, the test will not pass.
+
+   Example:
+
+       test_expect_success 'branch pointing to non-commit' '
+               git rev-parse HEAD^{tree} >.git/refs/heads/invalid &&
+               test_when_finished "git update-ref -d refs/heads/invalid" &&
+               ...
+       '
+
+
 Tips for Writing Tests
 ----------------------
 
index 0f7f35ccc9e1315d3ac8e5d37df51c106847d920..344785dd7da05d68a4c268b2bf3a8eeb425912d0 100644 (file)
@@ -5,11 +5,11 @@ git_svn_id=git""-svn-id
 
 if test -n "$NO_SVN_TESTS"
 then
-       say 'skipping git svn tests, NO_SVN_TESTS defined'
+       skip_all='skipping git svn tests, NO_SVN_TESTS defined'
        test_done
 fi
 if ! test_have_prereq PERL; then
-       say 'skipping git svn tests, perl not available'
+       skip_all='skipping git svn tests, perl not available'
        test_done
 fi
 
index da4b8d5a6fbf18adac103a5a6dd26ea3498c178f..a0944d662c7c6bc2ea331c8f7ce2a2b8b43bd530 100644 (file)
@@ -5,8 +5,7 @@
 
 if test -z "$GIT_TEST_HTTPD"
 then
-       say "skipping test, network testing disabled by default"
-       say "(define GIT_TEST_HTTPD to enable)"
+       skip_all="Network testing disabled (define GIT_TEST_HTTPD to enable)"
        test_done
 fi
 
index 210e594f6f3c83cc1b0c423a0f692380ff57176b..56874996a6df278202c0bc476abec4bca3ce99c5 100755 (executable)
@@ -24,18 +24,18 @@ test_expect_success 'update-index and ls-files' '
        cd "$HERE" &&
        git update-index --add one &&
        case "`git ls-files`" in
-       one) echo ok one ;;
+       one) echo pass one ;;
        *) echo bad one; exit 1 ;;
        esac &&
        cd dir &&
        git update-index --add two &&
        case "`git ls-files`" in
-       two) echo ok two ;;
+       two) echo pass two ;;
        *) echo bad two; exit 1 ;;
        esac &&
        cd .. &&
        case "`git ls-files`" in
-       dir/two"$LF"one) echo ok both ;;
+       dir/two"$LF"one) echo pass both ;;
        *) echo bad; exit 1 ;;
        esac
 '
@@ -58,17 +58,17 @@ test_expect_success 'diff-files' '
        echo a >>one &&
        echo d >>dir/two &&
        case "`git diff-files --name-only`" in
-       dir/two"$LF"one) echo ok top ;;
+       dir/two"$LF"one) echo pass top ;;
        *) echo bad top; exit 1 ;;
        esac &&
        # diff should not omit leading paths
        cd dir &&
        case "`git diff-files --name-only`" in
-       dir/two"$LF"one) echo ok subdir ;;
+       dir/two"$LF"one) echo pass subdir ;;
        *) echo bad subdir; exit 1 ;;
        esac &&
        case "`git diff-files --name-only .`" in
-       dir/two) echo ok subdir limited ;;
+       dir/two) echo pass subdir limited ;;
        *) echo bad subdir limited; exit 1 ;;
        esac
 '
index 055ad00f778eda1de02a418bbc602e580acdaca1..97ab02aceb8d9448ca5d4b13b94a8e3d7221375a 100755 (executable)
@@ -15,9 +15,12 @@ umask 077
 # is a good candidate: exists on all unices, and it has permission
 # anyway, so we don't create a security hole running the testsuite.
 
-if ! setfacl -m u:root:rwx .; then
-    say "Skipping ACL tests: unable to use setfacl"
-    test_done
+setfacl_out="$(setfacl -m u:root:rwx . 2>&1)"
+setfacl_ret=$?
+
+if [ $setfacl_ret != 0 ]; then
+       skip_all="Skipping ACL tests: unable to use setfacl (output: '$setfacl_out'; return code: '$setfacl_ret')"
+       test_done
 fi
 
 check_perms_and_acl () {
index 5322a3bf9703fab9f6b199dcd3f861b8e27c3ed3..7f60fd0b2e8904ec231975df3d65e66c9363ff45 100755 (executable)
@@ -99,17 +99,17 @@ test_foobar_foobar() {
 }
 
 if ! test_have_prereq POSIXPERM || ! [ -w / ]; then
-       say "Dangerous test skipped. Read this test if you want to execute it"
+       skip_all="Dangerous test skipped. Read this test if you want to execute it"
        test_done
 fi
 
 if [ "$IKNOWWHATIAMDOING" != "YES" ]; then
-       say "You must set env var IKNOWWHATIAMDOING=YES in order to run this test"
+       skip_all="You must set env var IKNOWWHATIAMDOING=YES in order to run this test"
        test_done
 fi
 
 if [ "$UID" = 0 ]; then
-       say "No you can't run this with root"
+       skip_all="No you can't run this with root"
        test_done
 fi
 
index 27e2127afeeb0dd462a686254e60be74e9dd9c28..05cc8fdd0168d33d0fe6f2ca54aa4162a0c6cdd0 100755 (executable)
@@ -8,7 +8,7 @@ test_description='git checkout to switch between branches with symlink<->dir'
 
 if ! test_have_prereq SYMLINKS
 then
-       say "symbolic links not supported - skipping tests"
+       skip_all="symbolic links not supported - skipping tests"
        test_done
 fi
 
index 1ed44ee503f9ecfb5222a9bce3f42ff2aa8127bc..4d0d0a35156ee1a7604f0ea719e93d3f765a2f91 100755 (executable)
@@ -24,7 +24,7 @@ git update-index symlink'
 test_expect_success \
 'the index entry must still be a symbolic link' '
 case "`git ls-files --stage --cached symlink`" in
-120000" "*symlink) echo ok;;
+120000" "*symlink) echo pass;;
 *) echo fail; git ls-files --stage --cached symlink; (exit 1);;
 esac'
 
index db46d53e8271c0410a0dbf53a3560a8b635e2853..a99e4d8b923cd0d85e5f7e875af4182d2238c9fb 100755 (executable)
@@ -26,7 +26,7 @@ echo 'Foo Bar Baz' >"$p2"
 
 test -f "$p1" && cmp "$p0" "$p1" || {
        # since FAT/NTFS does not allow tabs in filenames, skip this test
-       say 'Your filesystem does not allow tabs in filenames, test skipped.'
+       skip_all='Your filesystem does not allow tabs in filenames, test skipped.'
        test_done
 }
 
index ee84fc4884676ef683e6b3d2b6ad718dc2817445..361a10aeb17108049bf0e47b71153800727edd87 100755 (executable)
@@ -8,7 +8,7 @@ test_description='Test commit notes index (expensive!)'
 . ./test-lib.sh
 
 test -z "$GIT_NOTES_TIMING_TESTS" && {
-       say Skipping timing tests
+       skip_all="Skipping timing tests"
        test_done
        exit
 }
index 0aaf0ad84b05e1ee17e9789811ea06f2d2798556..b514cbb60665fef9d5cd67b8f7bcd8e8a3c2d0a5 100755 (executable)
@@ -39,7 +39,7 @@ if test -f test-file
 then
        test_set_prereq RO_DIR
 else
-       say 'skipping removal failure test (perhaps running as root?)'
+       skip_all='skipping removal failure test (perhaps running as root?)'
 fi
 chmod 775 .
 rm -f test-file
index 525c9a8fdfb4953612e6946994c8e555f676bfd2..6f031af9f35e4d6350e8e6dd4619d55c66214aa6 100755 (executable)
@@ -26,7 +26,7 @@ test_expect_success \
         chmod 755 xfoo1 &&
         git add xfoo1 &&
         case "`git ls-files --stage xfoo1`" in
-        100644" "*xfoo1) echo ok;;
+        100644" "*xfoo1) echo pass;;
         *) echo fail; git ls-files --stage xfoo1; (exit 1);;
         esac'
 
@@ -35,7 +35,7 @@ test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by sym
        ln -s foo xfoo1 &&
        git add xfoo1 &&
        case "`git ls-files --stage xfoo1`" in
-       120000" "*xfoo1) echo ok;;
+       120000" "*xfoo1) echo pass;;
        *) echo fail; git ls-files --stage xfoo1; (exit 1);;
        esac
 '
@@ -47,7 +47,7 @@ test_expect_success \
         chmod 755 xfoo2 &&
         git update-index --add xfoo2 &&
         case "`git ls-files --stage xfoo2`" in
-        100644" "*xfoo2) echo ok;;
+        100644" "*xfoo2) echo pass;;
         *) echo fail; git ls-files --stage xfoo2; (exit 1);;
         esac'
 
@@ -56,7 +56,7 @@ test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by sym
        ln -s foo xfoo2 &&
        git update-index --add xfoo2 &&
        case "`git ls-files --stage xfoo2`" in
-       120000" "*xfoo2) echo ok;;
+       120000" "*xfoo2) echo pass;;
        *) echo fail; git ls-files --stage xfoo2; (exit 1);;
        esac
 '
@@ -67,7 +67,7 @@ test_expect_success SYMLINKS \
         ln -s xfoo2 xfoo3 &&
         git update-index --add xfoo3 &&
         case "`git ls-files --stage xfoo3`" in
-        120000" "*xfoo3) echo ok;;
+        120000" "*xfoo3) echo pass;;
         *) echo fail; git ls-files --stage xfoo3; (exit 1);;
         esac'
 
@@ -172,7 +172,7 @@ test_expect_success 'git add --refresh' '
        test -z "`git diff-index HEAD -- foo`" &&
        git read-tree HEAD &&
        case "`git diff-index HEAD -- foo`" in
-       :100644" "*"M   foo") echo ok;;
+       :100644" "*"M   foo") echo pass;;
        *) echo fail; (exit 1);;
        esac &&
        git add --refresh -- foo &&
index b6eba6a83904a00724b7b550a9bc3b1b35825bee..7ad8465f8f89656bf0ce57feb45e12bc9cea5d65 100755 (executable)
@@ -4,7 +4,7 @@ test_description='add -i basic tests'
 . ./test-lib.sh
 
 if ! test_have_prereq PERL; then
-       say 'skipping git add -i tests, perl not available'
+       skip_all='skipping git add -i tests, perl not available'
        test_done
 fi
 
@@ -154,7 +154,7 @@ rm -f .gitignore
 
 if test "$(git config --bool core.filemode)" = false
 then
-       say 'skipping filemode tests (filesystem does not properly support modes)'
+       say 'skipping filemode tests (filesystem does not properly support modes)'
 else
        test_set_prereq FILEMODE
 fi
index 29103f65dc60a81d071b9dd5600f416b3a31860f..147e634cd65b616ea6c8059897f191b761996c6f 100755 (executable)
@@ -17,7 +17,7 @@ DQ='"'
 echo foo 2>/dev/null > "Name and an${HT}HT"
 test -f "Name and an${HT}HT" || {
        # since FAT/NTFS does not allow tabs in filenames, skip this test
-       say 'Your filesystem does not allow tabs in filenames, test skipped.'
+       skip_all='Your filesystem does not allow tabs in filenames, test skipped.'
        test_done
 }
 
index a4da1196a93a00502c8945a14e3aafd628efda53..1a09e8db403adc9c65859b0a369ce9d06e00e6f4 100755 (executable)
@@ -14,7 +14,7 @@ by an edit for them.
 
 if ! test_have_prereq SYMLINKS
 then
-       say 'Symbolic links not supported, skipping tests.'
+       skip_all='Symbolic links not supported, skipping tests.'
        test_done
 fi
 
index e12fbea1b5df970f22a1526c4d9ba8fc32a027ba..918a21a2f41caf2e8ed6bb6120631ff0e4ccb0fc 100755 (executable)
@@ -11,7 +11,7 @@ test_description='Test diff of symlinks.
 
 if ! test_have_prereq SYMLINKS
 then
-       say 'Symbolic links not supported, skipping tests.'
+       skip_all='Symbolic links not supported, skipping tests.'
        test_done
 fi
 
index 55eb5f83f17c0ebfb537d390fd3913b7c89d65f4..34e5144eed8958a3f3341574ff8ecbcc6a4157a9 100755 (executable)
@@ -14,7 +14,7 @@ P2='pathname with SP'
 P3='pathname
 with LF'
 : 2>/dev/null >"$P1" && test -f "$P1" && rm -f "$P1" || {
-       say 'Your filesystem does not allow tabs in filenames, test skipped.'
+       skip_all='Your filesystem does not allow tabs in filenames, test skipped.'
        test_done
 }
 
index 9bdf6596d82878f709a375084095697124a97609..40a95a149e4e84924d961d43f03115f466a9acc1 100755 (executable)
@@ -6,7 +6,7 @@ test_description='typechange rename detection'
 
 if ! test_have_prereq SYMLINKS
 then
-       say 'Symbolic links not supported, skipping tests.'
+       skip_all='Symbolic links not supported, skipping tests.'
        test_done
 fi
 
index 99ec13dd531c71299681acc3eb678b490ff68707..164d58c222088bd42becf07c044f51bf23eda8b6 100755 (executable)
@@ -11,7 +11,7 @@ test_description='git apply should not get confused with type changes.
 
 if ! test_have_prereq SYMLINKS
 then
-       say 'Symbolic links not supported, skipping tests.'
+       skip_all='Symbolic links not supported, skipping tests.'
        test_done
 fi
 
index b852e5898009bca0205c231033f8f72f48962b81..aff4348034b21644818fb8f938ef006001b0b099 100755 (executable)
@@ -11,7 +11,7 @@ test_description='git apply symlinks and partial files
 
 if ! test_have_prereq SYMLINKS
 then
-       say 'Symbolic links not supported, skipping tests.'
+       skip_all='Symbolic links not supported, skipping tests.'
        test_done
 fi
 
index 0d3c1d5dd5c0f35f9cc44eab4fcba5ba2e36ddd7..923fcab7f96a76ee7038bfcb20b1270565bc2230 100755 (executable)
@@ -5,7 +5,7 @@ test_description='apply to deeper directory without getting fooled with symlink'
 
 if ! test_have_prereq SYMLINKS
 then
-       say 'Symbolic links not supported, skipping tests.'
+       skip_all='Symbolic links not supported, skipping tests.'
        test_done
 fi
 
index 4360e77d317bfdaf7b40795859b4a023a5b89c13..fb3a270822c9a4ac2e4f79bfa71c784291859d4f 100755 (executable)
@@ -74,7 +74,7 @@ if msg=$(git verify-pack -v "test-3-${pack3}.pack" 2>&1) ||
 then
        test_set_prereq OFF64_T
 else
-       say "skipping tests concerning 64-bit offsets"
+       say "skipping tests concerning 64-bit offsets"
 fi
 
 test_expect_success OFF64_T \
index d5db75d826c8584e1d7f0f5ef298021fecd6f055..bab1a536f562c63db67035712588d3e9a5222649 100755 (executable)
@@ -6,7 +6,7 @@ test_description='test automatic tag following'
 
 case $(uname -s) in
 *MINGW*)
-       say "GIT_DEBUG_SEND_PACK not supported - skipping tests"
+       skip_all="GIT_DEBUG_SEND_PACK not supported - skipping tests"
        test_done
 esac
 
index 7206817ca1c7a450b47f9a1d7d8a3af53452dac6..298200fa4cafc61b5f16f9337314a2b887593a36 100755 (executable)
@@ -6,7 +6,7 @@ test_description='pulling from symlinked subdir'
 
 if ! test_have_prereq SYMLINKS
 then
-       say 'Symbolic links not supported, skipping tests.'
+       skip_all='Symbolic links not supported, skipping tests.'
        test_done
 fi
 
index 37fe87541127887742530a8f8859f1dd369d3f34..a266ca56361347fe751495e1531b5a26e4733493 100755 (executable)
@@ -11,7 +11,7 @@ This test runs various sanity checks on http-push.'
 
 if git http-push > /dev/null 2>&1 || [ $? -eq 128 ]
 then
-       say "skipping test, USE_CURL_MULTI is not defined"
+       skip_all="skipping test, USE_CURL_MULTI is not defined"
        test_done
 fi
 
index 17e1bdc5a81ce4802f5074ddb9c1996c68fc97be..504884b9f8fab3bfa34e3dc97d3dc7aad297e626 100755 (executable)
@@ -7,7 +7,7 @@ test_description='test smart pushing over http via http-backend'
 . ./test-lib.sh
 
 if test -n "$NO_CURL"; then
-       say 'skipping test, git built without http support'
+       skip_all='skipping test, git built without http support'
        test_done
 fi
 
index fc675b50adfa945724cd7d17dbb6034df53426d3..2fb48d09edb47129d9cea8b9686e46a6d8f35615 100755 (executable)
@@ -4,7 +4,7 @@ test_description='test dumb fetching over http via static file'
 . ./test-lib.sh
 
 if test -n "$NO_CURL"; then
-       say 'skipping test, git built without http support'
+       skip_all='skipping test, git built without http support'
        test_done
 fi
 
index 7faa31a299f263b0628d4a23e4500d3e43e0fdda..fd19121372aecc0806e17e62d639855f391045d3 100755 (executable)
@@ -4,7 +4,7 @@ test_description='test smart fetching over http via http-backend'
 . ./test-lib.sh
 
 if test -n "$NO_CURL"; then
-       say 'skipping test, git built without http support'
+       skip_all='skipping test, git built without http support'
        test_done
 fi
 
index 8c6d0b2f20c803574af273b9d7c4ffd41870adcc..b5d7fbc3815aed53ec50bdf7f5dbf2c796fed1fe 100755 (executable)
@@ -4,7 +4,7 @@ test_description='test git-http-backend'
 . ./test-lib.sh
 
 if test -n "$NO_CURL"; then
-       say 'skipping test, git built without http support'
+       skip_all='skipping test, git built without http support'
        test_done
 fi
 
index 8afbdd4de2146be763f7454af66a15986490fe60..e4d1b6a0fa39d82d048f4dde62155a059173c5b4 100755 (executable)
@@ -4,7 +4,7 @@ test_description='Test cloning a repository larger than 2 gigabyte'
 . ./test-lib.sh
 
 test -z "$GIT_TEST_CLONE_2GB" &&
-say "Skipping expensive 2GB clone test; enable it with GIT_TEST_CLONE_2GB=t" &&
+skip_all="Skipping expensive 2GB clone test; enable it with GIT_TEST_CLONE_2GB=t" &&
 test_done &&
 exit
 
index 3202e1de6d01bf3c36e82351c7f8426cc2bb44ab..cd3190c4a61f0404491b41a1b22f5143b63f4992 100755 (executable)
@@ -5,7 +5,7 @@ test_description='merging when a directory was replaced with a symlink'
 
 if ! test_have_prereq SYMLINKS
 then
-       say 'Symbolic links not supported, skipping tests.'
+       skip_all='Symbolic links not supported, skipping tests.'
        test_done
 fi
 
index 73dbc4360b58c95ae135577031fb8e60b3f395f7..ac943f5eeecd17dd1edc5834265df9e16e5032f2 100755 (executable)
@@ -583,7 +583,7 @@ test_expect_success \
 # subsequent tests require gpg; check if it is available
 gpg --version >/dev/null 2>/dev/null
 if [ $? -eq 127 ]; then
-       say "gpg not found - skipping tag signing and verification tests"
+       say "gpg not found - skipping tag signing and verification tests"
 else
        # As said here: http://www.gnupg.org/documentation/faqs.html#q6.19
        # the gpg version 1.0.6 didn't parse trust packets correctly, so for
index c2a3c8e2e7351ba5c49fa363a1856ec82904d444..eb9651da895f8f520c82aeab7a5406bcf9c09478 100755 (executable)
@@ -37,7 +37,7 @@ then
        }
        test_set_prereq TTY
 else
-       say no usable terminal, so skipping some tests
+       say "# no usable terminal, so skipping some tests"
 fi
 
 test_expect_success 'setup' '
index 1de83ef98fdcbfd63469e66ba4886c2477b983ff..196827e7eacf0584379630f528fb7a4400f2b865 100755 (executable)
@@ -11,7 +11,7 @@ Testing basic diff tool invocation
 . ./test-lib.sh
 
 if ! test_have_prereq PERL; then
-       say 'skipping difftool tests, perl not available'
+       skip_all='skipping difftool tests, perl not available'
        test_done
 fi
 
index 382ab6c98a932925db838b29d452b36cfea0dba5..23597cc40751addd1473acd2edf7563e0a517c9e 100755 (executable)
@@ -4,7 +4,7 @@ test_description='git send-email'
 . ./test-lib.sh
 
 if ! test_have_prereq PERL; then
-       say 'skipping git send-email tests, perl not available'
+       skip_all='skipping git send-email tests, perl not available'
        test_done
 fi
 
@@ -58,7 +58,7 @@ test_no_confirm () {
 # Exit immediately to prevent hang if a no-confirm test fails
 check_no_confirm () {
        test -f no_confirm_okay || {
-               say 'No confirm test failed; skipping remaining tests to prevent hanging'
+               skip_all='confirm test failed; skipping remaining tests to prevent hanging'
                test_done
        }
 }
index 570e0359e4739e178b1836887c53ddd78e3c8ec0..13766ab160e48d2b2ecb6e95079077e4a0704c2c 100755 (executable)
@@ -15,7 +15,7 @@ case "$GIT_SVN_LC_ALL" in
        test_set_prereq UTF8
        ;;
 *)
-       say "UTF-8 locale not set, some tests skipped ($GIT_SVN_LC_ALL)"
+       say "UTF-8 locale not set, some tests skipped ($GIT_SVN_LC_ALL)"
        ;;
 esac
 
index a9a558d292231bd4b372552df0364c63ece25299..5fb94fb3d61c2e26dcd448ac5106ec0f9a3a2283 100755 (executable)
@@ -13,7 +13,7 @@ case $v in
 1.[456].*)
        ;;
 *)
-       say "skipping svn-info test (SVN version: $v not supported)"
+       skip_all="skipping svn-info test (SVN version: $v not supported)"
        test_done
        ;;
 esac
index 1e9a2eb12bee55474f9bc10a7e31f5c01d6403f8..8cfdfe790f1e0bb7cd0ddb72a72a55073368ec60 100755 (executable)
@@ -23,7 +23,7 @@ if test -n "$a_utf8_locale"
 then
        test_set_prereq UTF8
 else
-       say "UTF-8 locale not available, some tests are skipped"
+       say "UTF-8 locale not available, some tests are skipped"
 fi
 
 compare_svn_head_with () {
index 99f69c6a0b8c7d3eea5211db333d0be41f9f5fa4..337ea59711ac7aca78a27afb92693f88e98aed9d 100755 (executable)
@@ -43,7 +43,7 @@ then
                 gunzip .git/svn/refs/remotes/git-svn/unhandled.log.gz
                '
 else
-       say "Perl Compress::Zlib unavailable, skipping gunzip test"
+       say "Perl Compress::Zlib unavailable, skipping gunzip test"
 fi
 
 test_expect_success 'git svn gc does not change unhandled.log files' '
index 61bcb8fc86bc8b771a4843197a40fa38f350a1ff..ee39b36d78a9d5602be5d48ae34b1e5ce4927c79 100755 (executable)
@@ -7,14 +7,14 @@ test_description='Test export of commits to CVS'
 . ./test-lib.sh
 
 if ! test_have_prereq PERL; then
-       say 'skipping git cvsexportcommit tests, perl not available'
+       skip_all='skipping git cvsexportcommit tests, perl not available'
        test_done
 fi
 
 cvs >/dev/null 2>&1
 if test $? -ne 1
 then
-    say 'skipping git cvsexportcommit tests, cvs not found'
+    skip_all='skipping git cvsexportcommit tests, cvs not found'
     test_done
 fi
 
index 86395065cfb8827ba5a999aa97cd5552a72322e3..36c457e7f2312774223f853aab0e3b055659e916 100755 (executable)
@@ -11,17 +11,17 @@ cvs CLI client via git-cvsserver server'
 . ./test-lib.sh
 
 if ! test_have_prereq PERL; then
-       say 'skipping git cvsserver tests, perl not available'
+       skip_all='skipping git cvsserver tests, perl not available'
        test_done
 fi
 cvs >/dev/null 2>&1
 if test $? -ne 1
 then
-    say 'skipping git-cvsserver tests, cvs not found'
+    skip_all='skipping git-cvsserver tests, cvs not found'
     test_done
 fi
 "$PERL_PATH" -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || {
-    say 'skipping git-cvsserver tests, Perl SQLite interface unavailable'
+    skip_all='skipping git-cvsserver tests, Perl SQLite interface unavailable'
     test_done
 }
 
index ed7b513f3e82706f6455bb32f4f19a5161bb0415..925bd0fbedf9865cef834460969c0a9fd2262437 100755 (executable)
@@ -41,16 +41,16 @@ not_present() {
 cvs >/dev/null 2>&1
 if test $? -ne 1
 then
-    say 'skipping git-cvsserver tests, cvs not found'
+    skip_all='skipping git-cvsserver tests, cvs not found'
     test_done
 fi
 if ! test_have_prereq PERL
 then
-    say 'skipping git-cvsserver tests, perl not available'
+    skip_all='skipping git-cvsserver tests, perl not available'
     test_done
 fi
 "$PERL_PATH" -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || {
-    say 'skipping git-cvsserver tests, Perl SQLite interface unavailable'
+    skip_all='skipping git-cvsserver tests, Perl SQLite interface unavailable'
     test_done
 }
 
index b572ce3ab7f55e1258aa92b37e10a0d067c9d01d..2eff9cd68ce2f51618159df402bfb46382d44434 100755 (executable)
@@ -4,7 +4,7 @@ test_description='git cvsimport basic tests'
 . ./lib-cvs.sh
 
 if ! test_have_prereq PERL; then
-       say 'skipping git cvsimport tests, perl not available'
+       skip_all='skipping git cvsimport tests, perl not available'
        test_done
 fi
 
index 8686086dde9dba742bd805c31f3e28c658b03a9b..3787186703f51f75103824f562c3849483ceaae1 100755 (executable)
@@ -7,12 +7,12 @@ test_description='perl interface (Git.pm)'
 . ./test-lib.sh
 
 if ! test_have_prereq PERL; then
-       say 'skipping perl interface tests, perl not available'
+       skip_all='skipping perl interface tests, perl not available'
        test_done
 fi
 
 "$PERL_PATH" -MTest::More -e 0 2>/dev/null || {
-       say "Perl Test::More unavailable, skipping test"
+       skip_all="Perl Test::More unavailable, skipping test"
        test_done
 }
 
@@ -46,6 +46,9 @@ test_expect_success \
      git config --add test.int 2k
      '
 
+# The external test will outputs its own plan
+test_external_has_tap=1
+
 test_external_without_stderr \
     'Perl API' \
     "$PERL_PATH" "$TEST_DIRECTORY"/t9700/test.pl
index 666722d9bf1050522a687f4af95792a8e0ec5d64..671f38db2bb78c076b281602ca5b87f10fdf4d00 100755 (executable)
@@ -7,6 +7,13 @@ use strict;
 
 use Test::More qw(no_plan);
 
+BEGIN {
+       # t9700-perl-git.sh kicks off our testing, so we have to go from
+       # there.
+       Test::More->builder->current_test(1);
+       Test::More->builder->no_ending(1);
+}
+
 use Cwd;
 use File::Basename;
 
@@ -105,3 +112,8 @@ my $last_commit = $r2->command_oneline(qw(rev-parse --verify HEAD));
 like($last_commit, qr/^[0-9a-fA-F]{40}$/, 'rev-parse returned hash');
 my $dir_commit = $r2->command_oneline('log', '-n1', '--pretty=format:%H', '.');
 isnt($last_commit, $dir_commit, 'log . does not show last commit');
+
+printf "1..%d\n", Test::More->builder->current_test;
+
+my $is_passing = eval { Test::More->is_passing };
+exit($is_passing ? 0 : 1) unless $@ =~ /Can't locate object method/;
index 367f0537cd87c29bfdca15b4744f1aef3ddd8d7e..ac496aa479090a4cda1b6e854ed7845484fdfa06 100644 (file)
@@ -160,7 +160,7 @@ if test -n "$color"; then
                        *) test -n "$quiet" && return;;
                esac
                shift
-               printf "%s" "$*"
+               printf "%s" "$*"
                tput sgr0
                echo
                )
@@ -169,7 +169,7 @@ else
        say_color() {
                test -z "$1" && test -n "$quiet" && return
                shift
-               echo "$*"
+               echo "$*"
        }
 fi
 
@@ -206,6 +206,8 @@ test_fixed=0
 test_broken=0
 test_success=0
 
+test_external_has_tap=0
+
 die () {
        code=$?
        if test -n "$GIT_EXIT_OK"
@@ -339,25 +341,25 @@ test_have_prereq () {
 
 test_ok_ () {
        test_success=$(($test_success + 1))
-       say_color "" "  ok $test_count: $@"
+       say_color "" "ok $test_count - $@"
 }
 
 test_failure_ () {
        test_failure=$(($test_failure + 1))
-       say_color error "FAIL $test_count: $1"
+       say_color error "not ok - $test_count $1"
        shift
-       echo "$@" | sed -e 's/^/        /'
+       echo "$@" | sed -e 's/^/#       /'
        test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
 }
 
 test_known_broken_ok_ () {
        test_fixed=$(($test_fixed+1))
-       say_color "" "  FIXED $test_count: $@"
+       say_color "" "ok $test_count - $@ # TODO known breakage"
 }
 
 test_known_broken_failure_ () {
        test_broken=$(($test_broken+1))
-       say_color skip "  still broken $test_count: $@"
+       say_color skip "not ok $test_count - $@ # TODO known breakage"
 }
 
 test_debug () {
@@ -369,6 +371,9 @@ test_run_ () {
        eval >&3 2>&4 "$1"
        eval_ret=$?
        eval >&3 2>&4 "$test_cleanup"
+       if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then
+               echo ""
+       fi
        return 0
 }
 
@@ -390,7 +395,7 @@ test_skip () {
        case "$to_skip" in
        t)
                say_color skip >&3 "skipping test: $@"
-               say_color skip "skip $test_count: $1"
+               say_color skip "ok $test_count: # skip $1"
                : true
                ;;
        *)
@@ -456,7 +461,7 @@ test_expect_code () {
 # 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
+# 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...
@@ -471,7 +476,7 @@ test_external () {
        then
                # Announce the script to reduce confusion about the
                # test output that follows.
-               say_color "" " run $test_count: $descr ($*)"
+               say_color "" "# run $test_count: $descr ($*)"
                # Export TEST_DIRECTORY, TRASH_DIRECTORY and GIT_TEST_LONG
                # to be able to use them in script
                export TEST_DIRECTORY TRASH_DIRECTORY GIT_TEST_LONG
@@ -481,9 +486,19 @@ test_external () {
                "$@" 2>&4
                if [ "$?" = 0 ]
                then
-                       test_ok_ "$descr"
+                       if test $test_external_has_tap -eq 0; then
+                               test_ok_ "$descr"
+                       else
+                               say_color "" "# test_external test $descr was ok"
+                               test_success=$(($test_success + 1))
+                       fi
                else
-                       test_failure_ "$descr" "$@"
+                       if test $test_external_has_tap -eq 0; then
+                               test_failure_ "$descr" "$@"
+                       else
+                               say_color error "# test_external test $descr failed: $@"
+                               test_failure=$(($test_failure + 1))
+                       fi
                fi
        fi
 }
@@ -499,19 +514,30 @@ test_external_without_stderr () {
        [ -f "$stderr" ] || error "Internal error: $stderr disappeared."
        descr="no stderr: $1"
        shift
-       say >&3 "expecting no stderr from previous command"
+       say >&3 "expecting no stderr from previous command"
        if [ ! -s "$stderr" ]; then
                rm "$stderr"
-               test_ok_ "$descr"
+
+               if test $test_external_has_tap -eq 0; then
+                       test_ok_ "$descr"
+               else
+                       say_color "" "# test_external_without_stderr test $descr was ok"
+                       test_success=$(($test_success + 1))
+               fi
        else
                if [ "$verbose" = t ]; then
-                       output=`echo; echo Stderr is:; cat "$stderr"`
+                       output=`echo; echo "# Stderr is:"; cat "$stderr"`
                else
                        output=
                fi
                # rm first in case test_failure exits.
                rm "$stderr"
-               test_failure_ "$descr" "$@" "$output"
+               if test $test_external_has_tap -eq 0; then
+                       test_failure_ "$descr" "$@" "$output"
+               else
+                       say_color error "# test_external_without_stderr test $descr failed: $@: $output"
+                       test_failure=$(($test_failure + 1))
+               fi
        fi
 }
 
@@ -620,18 +646,24 @@ test_done () {
 
        if test "$test_fixed" != 0
        then
-               say_color pass "fixed $test_fixed known breakage(s)"
+               say_color pass "fixed $test_fixed known breakage(s)"
        fi
        if test "$test_broken" != 0
        then
-               say_color error "still have $test_broken known breakage(s)"
+               say_color error "still have $test_broken known breakage(s)"
                msg="remaining $(($test_count-$test_broken)) test(s)"
        else
                msg="$test_count test(s)"
        fi
        case "$test_failure" in
        0)
-               say_color pass "passed all $msg"
+               # Maybe print SKIP message
+               [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all"
+
+               if test $test_external_has_tap -eq 0; then
+                       say_color pass "# passed all $msg"
+                       say "1..$test_count$skip_all"
+               fi
 
                test -d "$remove_trash" &&
                cd "$(dirname "$remove_trash")" &&
@@ -640,7 +672,11 @@ test_done () {
                exit 0 ;;
 
        *)
-               say_color error "failed $test_failure among $msg"
+               if test $test_external_has_tap -eq 0; then
+                       say_color error "# failed $test_failure among $msg"
+                       say "1..$test_count"
+               fi
+
                exit 1 ;;
 
        esac