URI: 
       tsharness - tomb - the crypto undertaker
  HTML git clone git://parazyd.org/tomb.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tsharness (22676B)
       ---
            1 #!/bin/sh
            2 #
            3 # Copyright (c) 2011-2012 Mathias Lafeldt
            4 # Copyright (c) 2005-2012 Git project
            5 # Copyright (c) 2005-2012 Junio C Hamano
            6 #
            7 # This program is free software: you can redistribute it and/or modify
            8 # it under the terms of the GNU General Public License as published by
            9 # the Free Software Foundation, either version 2 of the License, or
           10 # (at your option) any later version.
           11 #
           12 # This program is distributed in the hope that it will be useful,
           13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
           14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
           15 # GNU General Public License for more details.
           16 #
           17 # You should have received a copy of the GNU General Public License
           18 # along with this program.  If not, see http://www.gnu.org/licenses/ .
           19 
           20 # Public: Current version of Sharness.
           21 SHARNESS_VERSION="1.0.0"
           22 export SHARNESS_VERSION
           23 
           24 # Public: The file extension for tests.  By default, it is set to "t".
           25 : ${SHARNESS_TEST_EXTENSION:=t}
           26 export SHARNESS_TEST_EXTENSION
           27 
           28 #  Reset TERM to original terminal if found, otherwise save orignal TERM
           29 [ "x" = "x$SHARNESS_ORIG_TERM" ] &&
           30                 SHARNESS_ORIG_TERM="$TERM" ||
           31                 TERM="$SHARNESS_ORIG_TERM"
           32 # Public: The unsanitized TERM under which sharness is originally run
           33 export SHARNESS_ORIG_TERM
           34 
           35 # Export SHELL_PATH
           36 : ${SHELL_PATH:=$SHELL}
           37 export SHELL_PATH
           38 
           39 # For repeatability, reset the environment to a known state.
           40 # TERM is sanitized below, after saving color control sequences.
           41 LANG=C
           42 LC_ALL=C
           43 PAGER=cat
           44 TZ=UTC
           45 EDITOR=:
           46 export LANG LC_ALL PAGER TZ EDITOR
           47 unset VISUAL CDPATH GREP_OPTIONS
           48 
           49 # Line feed
           50 LF='
           51 '
           52 
           53 [ "x$TERM" != "xdumb" ] && (
           54                 [ -t 1 ] &&
           55                 tput bold >/dev/null 2>&1 &&
           56                 tput setaf 1 >/dev/null 2>&1 &&
           57                 tput sgr0 >/dev/null 2>&1
           58         ) &&
           59         color=t
           60 
           61 while test "$#" -ne 0; do
           62         case "$1" in
           63         -d|--d|--de|--deb|--debu|--debug)
           64                 debug=t; shift ;;
           65         -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
           66                 immediate=t; shift ;;
           67         -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
           68                 TEST_LONG=t; export TEST_LONG; shift ;;
           69         --in|--int|--inte|--inter|--intera|--interac|--interact|--interacti|--interactiv|--interactive|--interactive-|--interactive-t|--interactive-te|--interactive-tes|--interactive-test|--interactive-tests):
           70                 TEST_INTERACTIVE=t; export TEST_INTERACTIVE; verbose=t; shift ;;
           71         -h|--h|--he|--hel|--help)
           72                 help=t; shift ;;
           73         -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
           74                 verbose=t; shift ;;
           75         -q|--q|--qu|--qui|--quie|--quiet)
           76                 # Ignore --quiet under a TAP::Harness. Saying how many tests
           77                 # passed without the ok/not ok details is always an error.
           78                 test -z "$HARNESS_ACTIVE" && quiet=t; shift ;;
           79         --chain-lint)
           80                 chain_lint=t; shift ;;
           81         --no-chain-lint)
           82                 chain_lint=; shift ;;
           83         --no-color)
           84                 color=; shift ;;
           85         --root=*)
           86                 root=$(expr "z$1" : 'z[^=]*=\(.*\)')
           87                 shift ;;
           88         *)
           89                 echo "error: unknown test option '$1'" >&2; exit 1 ;;
           90         esac
           91 done
           92 
           93 if test -n "$color"; then
           94         # Save the color control sequences now rather than run tput
           95         # each time say_color() is called.  This is done for two
           96         # reasons:
           97         #   * TERM will be changed to dumb
           98         #   * HOME will be changed to a temporary directory and tput
           99         #     might need to read ~/.terminfo from the original HOME
          100         #     directory to get the control sequences
          101         # Note:  This approach assumes the control sequences don't end
          102         # in a newline for any terminal of interest (command
          103         # substitutions strip trailing newlines).  Given that most
          104         # (all?) terminals in common use are related to ECMA-48, this
          105         # shouldn't be a problem.
          106         say_color_error=$(tput bold; tput setaf 1) # bold red
          107         say_color_skip=$(tput setaf 4) # blue
          108         say_color_warn=$(tput setaf 3) # brown/yellow
          109         say_color_pass=$(tput setaf 2) # green
          110         say_color_info=$(tput setaf 6) # cyan
          111         say_color_reset=$(tput sgr0)
          112         say_color_="" # no formatting for normal text
          113         say_color() {
          114                 test -z "$1" && test -n "$quiet" && return
          115                 eval "say_color_color=\$say_color_$1"
          116                 shift
          117                 printf "%s\\n" "$say_color_color$*$say_color_reset"
          118         }
          119 else
          120         say_color() {
          121                 test -z "$1" && test -n "$quiet" && return
          122                 shift
          123                 printf "%s\n" "$*"
          124         }
          125 fi
          126 
          127 TERM=dumb
          128 export TERM
          129 
          130 error() {
          131         say_color error "error: $*"
          132         EXIT_OK=t
          133         exit 1
          134 }
          135 
          136 say() {
          137         say_color info "$*"
          138 }
          139 
          140 test -n "$test_description" || error "Test script did not set test_description."
          141 
          142 if test "$help" = "t"; then
          143         echo "$test_description"
          144         exit 0
          145 fi
          146 
          147 exec 5>&1
          148 exec 6<&0
          149 if test "$verbose" = "t"; then
          150         exec 4>&2 3>&1
          151 else
          152         exec 4>/dev/null 3>/dev/null
          153 fi
          154 
          155 test_failure=0
          156 test_count=0
          157 test_fixed=0
          158 test_broken=0
          159 test_success=0
          160 
          161 die() {
          162         code=$?
          163         if test -n "$EXIT_OK"; then
          164                 exit $code
          165         else
          166                 echo >&5 "FATAL: Unexpected exit with code $code"
          167                 exit 1
          168         fi
          169 }
          170 
          171 EXIT_OK=
          172 trap 'die' EXIT
          173 
          174 # Public: Define that a test prerequisite is available.
          175 #
          176 # The prerequisite can later be checked explicitly using test_have_prereq or
          177 # implicitly by specifying the prerequisite name in calls to test_expect_success
          178 # or test_expect_failure.
          179 #
          180 # $1 - Name of prerequiste (a simple word, in all capital letters by convention)
          181 #
          182 # Examples
          183 #
          184 #   # Set PYTHON prerequisite if interpreter is available.
          185 #   command -v python >/dev/null && test_set_prereq PYTHON
          186 #
          187 #   # Set prerequisite depending on some variable.
          188 #   test -z "$NO_GETTEXT" && test_set_prereq GETTEXT
          189 #
          190 # Returns nothing.
          191 test_set_prereq() {
          192         satisfied_prereq="$satisfied_prereq$1 "
          193 }
          194 satisfied_prereq=" "
          195 
          196 # Public: Check if one or more test prerequisites are defined.
          197 #
          198 # The prerequisites must have previously been set with test_set_prereq.
          199 # The most common use of this is to skip all the tests if some essential
          200 # prerequisite is missing.
          201 #
          202 # $1 - Comma-separated list of test prerequisites.
          203 #
          204 # Examples
          205 #
          206 #   # Skip all remaining tests if prerequisite is not set.
          207 #   if ! test_have_prereq PERL; then
          208 #       skip_all='skipping perl interface tests, perl not available'
          209 #       test_done
          210 #   fi
          211 #
          212 # Returns 0 if all prerequisites are defined or 1 otherwise.
          213 test_have_prereq() {
          214         # prerequisites can be concatenated with ','
          215         save_IFS=$IFS
          216         IFS=,
          217         set -- $*
          218         IFS=$save_IFS
          219 
          220         total_prereq=0
          221         ok_prereq=0
          222         missing_prereq=
          223 
          224         for prerequisite; do
          225                 case "$prerequisite" in
          226                 !*)
          227                         negative_prereq=t
          228                         prerequisite=${prerequisite#!}
          229                         ;;
          230                 *)
          231                         negative_prereq=
          232                 esac
          233 
          234                 total_prereq=$(($total_prereq + 1))
          235                 case "$satisfied_prereq" in
          236                 *" $prerequisite "*)
          237                         satisfied_this_prereq=t
          238                         ;;
          239                 *)
          240                         satisfied_this_prereq=
          241                 esac
          242 
          243                 case "$satisfied_this_prereq,$negative_prereq" in
          244                 t,|,t)
          245                         ok_prereq=$(($ok_prereq + 1))
          246                         ;;
          247                 *)
          248                         # Keep a list of missing prerequisites; restore
          249                         # the negative marker if necessary.
          250                         prerequisite=${negative_prereq:+!}$prerequisite
          251                         if test -z "$missing_prereq"; then
          252                                 missing_prereq=$prerequisite
          253                         else
          254                                 missing_prereq="$prerequisite,$missing_prereq"
          255                         fi
          256                 esac
          257         done
          258 
          259         test $total_prereq = $ok_prereq
          260 }
          261 
          262 # You are not expected to call test_ok_ and test_failure_ directly, use
          263 # the text_expect_* functions instead.
          264 
          265 test_ok_() {
          266         test_success=$(($test_success + 1))
          267         say_color "" "ok $test_count - $@"
          268 }
          269 
          270 test_failure_() {
          271         test_failure=$(($test_failure + 1))
          272         say_color error "not ok $test_count - $1"
          273         shift
          274         echo "$@" | sed -e 's/^/#        /'
          275         test "$immediate" = "" || { EXIT_OK=t; exit 1; }
          276 }
          277 
          278 test_known_broken_ok_() {
          279         test_fixed=$(($test_fixed + 1))
          280         say_color error "ok $test_count - $@ # TODO known breakage vanished"
          281 }
          282 
          283 test_known_broken_failure_() {
          284         test_broken=$(($test_broken + 1))
          285         say_color warn "not ok $test_count - $@ # TODO known breakage"
          286 }
          287 
          288 # Public: Execute commands in debug mode.
          289 #
          290 # Takes a single argument and evaluates it only when the test script is started
          291 # with --debug. This is primarily meant for use during the development of test
          292 # scripts.
          293 #
          294 # $1 - Commands to be executed.
          295 #
          296 # Examples
          297 #
          298 #   test_debug "cat some_log_file"
          299 #
          300 # Returns the exit code of the last command executed in debug mode or 0
          301 #   otherwise.
          302 test_debug() {
          303         test "$debug" = "" || eval "$1"
          304 }
          305 
          306 # Public: Stop execution and start a shell.
          307 #
          308 # This is useful for debugging tests and only makes sense together with "-v".
          309 # Be sure to remove all invocations of this command before submitting.
          310 test_pause() {
          311         if test "$verbose" = t; then
          312                 "$SHELL_PATH" <&6 >&3 2>&4
          313         else
          314                 error >&5 "test_pause requires --verbose"
          315         fi
          316 }
          317 
          318 test_eval_() {
          319         # This is a separate function because some tests use
          320         # "return" to end a test_expect_success block early.
          321         case ",$test_prereq," in
          322         *,INTERACTIVE,*)
          323                 eval "$*"
          324                 ;;
          325         *)
          326                 eval </dev/null >&3 2>&4 "$*"
          327                 ;;
          328         esac
          329 }
          330 
          331 test_run_() {
          332         test_cleanup=:
          333         expecting_failure=$2
          334         test_eval_ "$1"
          335         eval_ret=$?
          336 
          337         if test "$chain_lint" = "t"; then
          338                 test_eval_ "(exit 117) && $1"
          339                 if test "$?" != 117; then
          340                         error "bug in the test script: broken &&-chain: $1"
          341                 fi
          342         fi
          343 
          344         if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"; then
          345                 test_eval_ "$test_cleanup"
          346         fi
          347         if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then
          348                 echo ""
          349         fi
          350         return "$eval_ret"
          351 }
          352 
          353 test_skip_() {
          354         test_count=$(($test_count + 1))
          355         to_skip=
          356         for skp in $SKIP_TESTS; do
          357                 case $this_test.$test_count in
          358                 $skp)
          359                         to_skip=t
          360                         break
          361                 esac
          362         done
          363         if test -z "$to_skip" && test -n "$test_prereq" && ! test_have_prereq "$test_prereq"; then
          364                 to_skip=t
          365         fi
          366         case "$to_skip" in
          367         t)
          368                 of_prereq=
          369                 if test "$missing_prereq" != "$test_prereq"; then
          370                         of_prereq=" of $test_prereq"
          371                 fi
          372 
          373                 say_color skip >&3 "skipping test: $@"
          374                 say_color skip "ok $test_count # skip $1 (missing $missing_prereq${of_prereq})"
          375                 : true
          376                 ;;
          377         *)
          378                 false
          379                 ;;
          380         esac
          381 }
          382 
          383 # Public: Run test commands and expect them to succeed.
          384 #
          385 # When the test passed, an "ok" message is printed and the number of successful
          386 # tests is incremented. When it failed, a "not ok" message is printed and the
          387 # number of failed tests is incremented.
          388 #
          389 # With --immediate, exit test immediately upon the first failed test.
          390 #
          391 # Usually takes two arguments:
          392 # $1 - Test description
          393 # $2 - Commands to be executed.
          394 #
          395 # With three arguments, the first will be taken to be a prerequisite:
          396 # $1 - Comma-separated list of test prerequisites. The test will be skipped if
          397 #      not all of the given prerequisites are set. To negate a prerequisite,
          398 #      put a "!" in front of it.
          399 # $2 - Test description
          400 # $3 - Commands to be executed.
          401 #
          402 # Examples
          403 #
          404 #   test_expect_success \
          405 #       'git-write-tree should be able to write an empty tree.' \
          406 #       'tree=$(git-write-tree)'
          407 #
          408 #   # Test depending on one prerequisite.
          409 #   test_expect_success TTY 'git --paginate rev-list uses a pager' \
          410 #       ' ... '
          411 #
          412 #   # Multiple prerequisites are separated by a comma.
          413 #   test_expect_success PERL,PYTHON 'yo dawg' \
          414 #       ' test $(perl -E 'print eval "1 +" . qx[python -c "print 2"]') == "4" '
          415 #
          416 # Returns nothing.
          417 test_expect_success() {
          418         test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
          419         test "$#" = 2 || error "bug in the test script: not 2 or 3 parameters to test_expect_success"
          420         export test_prereq
          421         if ! test_skip_ "$@"; then
          422                 say >&3 "expecting success: $2"
          423                 if test_run_ "$2"; then
          424                         test_ok_ "$1"
          425                 else
          426                         test_failure_ "$@"
          427                 fi
          428         fi
          429         echo >&3 ""
          430 }
          431 
          432 # Public: Run test commands and expect them to fail. Used to demonstrate a known
          433 # breakage.
          434 #
          435 # This is NOT the opposite of test_expect_success, but rather used to mark a
          436 # test that demonstrates a known breakage.
          437 #
          438 # When the test passed, an "ok" message is printed and the number of fixed tests
          439 # is incremented. When it failed, a "not ok" message is printed and the number
          440 # of tests still broken is incremented.
          441 #
          442 # Failures from these tests won't cause --immediate to stop.
          443 #
          444 # Usually takes two arguments:
          445 # $1 - Test description
          446 # $2 - Commands to be executed.
          447 #
          448 # With three arguments, the first will be taken to be a prerequisite:
          449 # $1 - Comma-separated list of test prerequisites. The test will be skipped if
          450 #      not all of the given prerequisites are set. To negate a prerequisite,
          451 #      put a "!" in front of it.
          452 # $2 - Test description
          453 # $3 - Commands to be executed.
          454 #
          455 # Returns nothing.
          456 test_expect_failure() {
          457         test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
          458         test "$#" = 2 || error "bug in the test script: not 2 or 3 parameters to test_expect_failure"
          459         export test_prereq
          460         if ! test_skip_ "$@"; then
          461                 say >&3 "checking known breakage: $2"
          462                 if test_run_ "$2" expecting_failure; then
          463                         test_known_broken_ok_ "$1"
          464                 else
          465                         test_known_broken_failure_ "$1"
          466                 fi
          467         fi
          468         echo >&3 ""
          469 }
          470 
          471 # Public: Run command and ensure that it fails in a controlled way.
          472 #
          473 # Use it instead of "! <command>". For example, when <command> dies due to a
          474 # segfault, test_must_fail diagnoses it as an error, while "! <command>" would
          475 # mistakenly be treated as just another expected failure.
          476 #
          477 # This is one of the prefix functions to be used inside test_expect_success or
          478 # test_expect_failure.
          479 #
          480 # $1.. - Command to be executed.
          481 #
          482 # Examples
          483 #
          484 #   test_expect_success 'complain and die' '
          485 #       do something &&
          486 #       do something else &&
          487 #       test_must_fail git checkout ../outerspace
          488 #   '
          489 #
          490 # Returns 1 if the command succeeded (exit code 0).
          491 # Returns 1 if the command died by signal (exit codes 130-192)
          492 # Returns 1 if the command could not be found (exit code 127).
          493 # Returns 0 otherwise.
          494 test_must_fail() {
          495         "$@"
          496         exit_code=$?
          497         if test $exit_code = 0; then
          498                 echo >&2 "test_must_fail: command succeeded: $*"
          499                 return 1
          500         elif test $exit_code -gt 129 -a $exit_code -le 192; then
          501                 echo >&2 "test_must_fail: died by signal: $*"
          502                 return 1
          503         elif test $exit_code = 127; then
          504                 echo >&2 "test_must_fail: command not found: $*"
          505                 return 1
          506         fi
          507         return 0
          508 }
          509 
          510 # Public: Run command and ensure that it succeeds or fails in a controlled way.
          511 #
          512 # Similar to test_must_fail, but tolerates success too. Use it instead of
          513 # "<command> || :" to catch failures caused by a segfault, for instance.
          514 #
          515 # This is one of the prefix functions to be used inside test_expect_success or
          516 # test_expect_failure.
          517 #
          518 # $1.. - Command to be executed.
          519 #
          520 # Examples
          521 #
          522 #   test_expect_success 'some command works without configuration' '
          523 #       test_might_fail git config --unset all.configuration &&
          524 #       do something
          525 #   '
          526 #
          527 # Returns 1 if the command died by signal (exit codes 130-192)
          528 # Returns 1 if the command could not be found (exit code 127).
          529 # Returns 0 otherwise.
          530 test_might_fail() {
          531         "$@"
          532         exit_code=$?
          533         if test $exit_code -gt 129 -a $exit_code -le 192; then
          534                 echo >&2 "test_might_fail: died by signal: $*"
          535                 return 1
          536         elif test $exit_code = 127; then
          537                 echo >&2 "test_might_fail: command not found: $*"
          538                 return 1
          539         fi
          540         return 0
          541 }
          542 
          543 # Public: Run command and ensure it exits with a given exit code.
          544 #
          545 # This is one of the prefix functions to be used inside test_expect_success or
          546 # test_expect_failure.
          547 #
          548 # $1   - Expected exit code.
          549 # $2.. - Command to be executed.
          550 #
          551 # Examples
          552 #
          553 #   test_expect_success 'Merge with d/f conflicts' '
          554 #       test_expect_code 1 git merge "merge msg" B master
          555 #   '
          556 #
          557 # Returns 0 if the expected exit code is returned or 1 otherwise.
          558 test_expect_code() {
          559         want_code=$1
          560         shift
          561         "$@"
          562         exit_code=$?
          563         if test $exit_code = $want_code; then
          564                 return 0
          565         fi
          566 
          567         echo >&2 "test_expect_code: command exited with $exit_code, we wanted $want_code $*"
          568         return 1
          569 }
          570 
          571 # Public: Compare two files to see if expected output matches actual output.
          572 #
          573 # The TEST_CMP variable defines the command used for the comparision; it
          574 # defaults to "diff -u". Only when the test script was started with --verbose,
          575 # will the command's output, the diff, be printed to the standard output.
          576 #
          577 # This is one of the prefix functions to be used inside test_expect_success or
          578 # test_expect_failure.
          579 #
          580 # $1 - Path to file with expected output.
          581 # $2 - Path to file with actual output.
          582 #
          583 # Examples
          584 #
          585 #   test_expect_success 'foo works' '
          586 #       echo expected >expected &&
          587 #       foo >actual &&
          588 #       test_cmp expected actual
          589 #   '
          590 #
          591 # Returns the exit code of the command set by TEST_CMP.
          592 test_cmp() {
          593         ${TEST_CMP:-diff -u} "$@"
          594 }
          595 
          596 # Public: portably print a sequence of numbers.
          597 #
          598 # seq is not in POSIX and GNU seq might not be available everywhere,
          599 # so it is nice to have a seq implementation, even a very simple one.
          600 #
          601 # $1 - Starting number.
          602 # $2 - Ending number.
          603 #
          604 # Examples
          605 #
          606 #   test_expect_success 'foo works 10 times' '
          607 #       for i in $(test_seq 1 10)
          608 #       do
          609 #           foo || return
          610 #       done
          611 #   '
          612 #
          613 # Returns 0 if all the specified numbers can be displayed.
          614 test_seq() {
          615         i="$1"
          616         j="$2"
          617         while test "$i" -le "$j"
          618         do
          619                 echo "$i" || return
          620                 i=$(expr "$i" + 1)
          621         done
          622 }
          623 
          624 # Public: Check if the file expected to be empty is indeed empty, and barfs
          625 # otherwise.
          626 #
          627 # $1 - File to check for emptyness.
          628 #
          629 # Returns 0 if file is empty, 1 otherwise.
          630 test_must_be_empty() {
          631         if test -s "$1"
          632         then
          633                 echo "'$1' is not empty, it contains:"
          634                 cat "$1"
          635                 return 1
          636         fi
          637 }
          638 
          639 # Public: Schedule cleanup commands to be run unconditionally at the end of a
          640 # test.
          641 #
          642 # If some cleanup command fails, the test will not pass. With --immediate, no
          643 # cleanup is done to help diagnose what went wrong.
          644 #
          645 # This is one of the prefix functions to be used inside test_expect_success or
          646 # test_expect_failure.
          647 #
          648 # $1.. - Commands to prepend to the list of cleanup commands.
          649 #
          650 # Examples
          651 #
          652 #   test_expect_success 'test core.capslock' '
          653 #       git config core.capslock true &&
          654 #       test_when_finished "git config --unset core.capslock" &&
          655 #       do_something
          656 #   '
          657 #
          658 # Returns the exit code of the last cleanup command executed.
          659 test_when_finished() {
          660         test_cleanup="{ $*
          661                 } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup"
          662 }
          663 
          664 # Public: Schedule cleanup commands to be run unconditionally when all tests
          665 # have run.
          666 #
          667 # This can be used to clean up things like test databases. It is not needed to
          668 # clean up temporary files, as test_done already does that.
          669 #
          670 # Examples:
          671 #
          672 #   cleanup mysql -e "DROP DATABASE mytest"
          673 #
          674 # Returns the exit code of the last cleanup command executed.
          675 final_cleanup=
          676 cleanup() {
          677         final_cleanup="{ $*
          678                 } && (exit \"\$eval_ret\"); eval_ret=\$?; $final_cleanup"
          679 }
          680 
          681 # Public: Summarize test results and exit with an appropriate error code.
          682 #
          683 # Must be called at the end of each test script.
          684 #
          685 # Can also be used to stop tests early and skip all remaining tests. For this,
          686 # set skip_all to a string explaining why the tests were skipped before calling
          687 # test_done.
          688 #
          689 # Examples
          690 #
          691 #   # Each test script must call test_done at the end.
          692 #   test_done
          693 #
          694 #   # Skip all remaining tests if prerequisite is not set.
          695 #   if ! test_have_prereq PERL; then
          696 #       skip_all='skipping perl interface tests, perl not available'
          697 #       test_done
          698 #   fi
          699 #
          700 # Returns 0 if all tests passed or 1 if there was a failure.
          701 test_done() {
          702         EXIT_OK=t
          703 
          704         if test -z "$HARNESS_ACTIVE"; then
          705                 test_results_dir="$SHARNESS_TEST_DIRECTORY/test-results"
          706                 mkdir -p "$test_results_dir"
          707                 test_results_path="$test_results_dir/$this_test.$$.counts"
          708 
          709                 cat >>"$test_results_path" <<-EOF
          710                 total $test_count
          711                 success $test_success
          712                 fixed $test_fixed
          713                 broken $test_broken
          714                 failed $test_failure
          715 
          716                 EOF
          717         fi
          718 
          719         if test "$test_fixed" != 0; then
          720                 say_color error "# $test_fixed known breakage(s) vanished; please update test(s)"
          721         fi
          722         if test "$test_broken" != 0; then
          723                 say_color warn "# still have $test_broken known breakage(s)"
          724         fi
          725         if test "$test_broken" != 0 || test "$test_fixed" != 0; then
          726                 test_remaining=$(( $test_count - $test_broken - $test_fixed ))
          727                 msg="remaining $test_remaining test(s)"
          728         else
          729                 test_remaining=$test_count
          730                 msg="$test_count test(s)"
          731         fi
          732 
          733         case "$test_failure" in
          734         0)
          735                 # Maybe print SKIP message
          736                 if test -n "$skip_all" && test $test_count -gt 0; then
          737                         error "Can't use skip_all after running some tests"
          738                 fi
          739                 [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all"
          740 
          741                 if test $test_remaining -gt 0; then
          742                         say_color pass "# passed all $msg"
          743                 fi
          744                 say "1..$test_count$skip_all"
          745 
          746                 test_eval_ "$final_cleanup"
          747 
          748                 test -d "$remove_trash" &&
          749                 cd "$(dirname "$remove_trash")" &&
          750                 rm -rf "$(basename "$remove_trash")"
          751 
          752                 exit 0 ;;
          753 
          754         *)
          755                 say_color error "# failed $test_failure among $msg"
          756                 say "1..$test_count"
          757 
          758                 exit 1 ;;
          759 
          760         esac
          761 }
          762 
          763 # Public: Root directory containing tests. Tests can override this variable,
          764 # e.g. for testing Sharness itself.
          765 : ${SHARNESS_TEST_DIRECTORY:=$(pwd)}
          766 export SHARNESS_TEST_DIRECTORY
          767 
          768 # Public: Source directory of test code and sharness library.
          769 # This directory may be different from the directory in which tests are
          770 # being run.
          771 : ${SHARNESS_TEST_SRCDIR:=$(cd $(dirname $0) && pwd)}
          772 export SHARNESS_TEST_SRCDIR
          773 
          774 # Public: Build directory that will be added to PATH. By default, it is set to
          775 # the parent directory of SHARNESS_TEST_DIRECTORY.
          776 : ${SHARNESS_BUILD_DIRECTORY:="$SHARNESS_TEST_DIRECTORY/.."}
          777 PATH="$SHARNESS_BUILD_DIRECTORY:$PATH"
          778 export PATH SHARNESS_BUILD_DIRECTORY
          779 
          780 # Public: Path to test script currently executed.
          781 SHARNESS_TEST_FILE="$0"
          782 export SHARNESS_TEST_FILE
          783 
          784 # Prepare test area.
          785 SHARNESS_TRASH_DIRECTORY="trash directory.$(basename "$SHARNESS_TEST_FILE" ".$SHARNESS_TEST_EXTENSION")"
          786 test -n "$root" && SHARNESS_TRASH_DIRECTORY="$root/$SHARNESS_TRASH_DIRECTORY"
          787 case "$SHARNESS_TRASH_DIRECTORY" in
          788 /*) ;; # absolute path is good
          789  *) SHARNESS_TRASH_DIRECTORY="$SHARNESS_TEST_DIRECTORY/$SHARNESS_TRASH_DIRECTORY" ;;
          790 esac
          791 test "$debug" = "t" || remove_trash="$SHARNESS_TRASH_DIRECTORY"
          792 rm -rf "$SHARNESS_TRASH_DIRECTORY" || {
          793         EXIT_OK=t
          794         echo >&5 "FATAL: Cannot prepare test area"
          795         exit 1
          796 }
          797 
          798 
          799 #
          800 #  Load any extensions in $srcdir/sharness.d/*.sh
          801 #
          802 if test -d "${SHARNESS_TEST_SRCDIR}/sharness.d"
          803 then
          804         for file in "${SHARNESS_TEST_SRCDIR}"/sharness.d/*.sh
          805         do
          806                 # Ensure glob was not an empty match:
          807                 test -e "${file}" || break
          808 
          809                 if test -n "$debug"
          810                 then
          811                         echo >&5 "sharness: loading extensions from ${file}"
          812                 fi
          813                 . "${file}"
          814                 if test $? != 0
          815                 then
          816                         echo >&5 "sharness: Error loading ${file}. Aborting."
          817                         exit 1
          818                 fi
          819         done
          820 fi
          821 
          822 # Public: Empty trash directory, the test area, provided for each test. The HOME
          823 # variable is set to that directory too.
          824 export SHARNESS_TRASH_DIRECTORY
          825 
          826 HOME="$SHARNESS_TRASH_DIRECTORY"
          827 export HOME
          828 
          829 mkdir -p "$SHARNESS_TRASH_DIRECTORY" || exit 1
          830 # Use -P to resolve symlinks in our working directory so that the cwd
          831 # in subprocesses like git equals our $PWD (for pathname comparisons).
          832 cd -P "$SHARNESS_TRASH_DIRECTORY" || exit 1
          833 
          834 this_test=${SHARNESS_TEST_FILE##*/}
          835 this_test=${this_test%.$SHARNESS_TEST_EXTENSION}
          836 for skp in $SKIP_TESTS; do
          837         case "$this_test" in
          838         $skp)
          839                 say_color info >&3 "skipping test $this_test altogether"
          840                 skip_all="skip all tests in $this_test"
          841                 test_done
          842         esac
          843 done
          844 
          845 test -n "$TEST_LONG" && test_set_prereq EXPENSIVE
          846 test -n "$TEST_INTERACTIVE" && test_set_prereq INTERACTIVE
          847 
          848 # Make sure this script ends with code 0
          849 :
          850 
          851 # vi: set ts=4 sw=4 noet :