1# Test framework for git. See t/README for usage. 2# 3# Copyright (c) 2005 Junio C Hamano 4# 5# This program is free software: you can redistribute it and/or modify 6# it under the terms of the GNU General Public License as published by 7# the Free Software Foundation, either version 2 of the License, or 8# (at your option) any later version. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program. If not, see http://www.gnu.org/licenses/ . 17 18# Test the binaries we have just built. The tests are kept in 19# t/ subdirectory and are run in 'trash directory' subdirectory. 20if test -z "$TEST_DIRECTORY" 21then 22 # We allow tests to override this, in case they want to run tests 23 # outside of t/, e.g. for running tests on the test library 24 # itself. 25 TEST_DIRECTORY=$(pwd) 26else 27 # ensure that TEST_DIRECTORY is an absolute path so that it 28 # is valid even if the current working directory is changed 29 TEST_DIRECTORY=$(cd "$TEST_DIRECTORY" && pwd) || exit 1 30fi 31if test -z "$TEST_OUTPUT_DIRECTORY" 32then 33 # Similarly, override this to store the test-results subdir 34 # elsewhere 35 TEST_OUTPUT_DIRECTORY=$TEST_DIRECTORY 36fi 37GIT_BUILD_DIR="$TEST_DIRECTORY"/.. 38 39# If we were built with ASAN, it may complain about leaks 40# of program-lifetime variables. Disable it by default to lower 41# the noise level. This needs to happen at the start of the script, 42# before we even do our "did we build git yet" check (since we don't 43# want that one to complain to stderr). 44: ${ASAN_OPTIONS=detect_leaks=0:abort_on_error=1} 45export ASAN_OPTIONS 46 47# If LSAN is in effect we _do_ want leak checking, but we still 48# want to abort so that we notice the problems. 49: ${LSAN_OPTIONS=abort_on_error=1} 50export LSAN_OPTIONS 51 52################################################################ 53# It appears that people try to run tests without building... 54"$GIT_BUILD_DIR/git" >/dev/null 55if test $? != 1 56then 57 echo >&2 'error: you do not seem to have built git yet.' 58 exit 1 59fi 60 61. "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS 62export PERL_PATH SHELL_PATH 63 64# if --tee was passed, write the output not only to the terminal, but 65# additionally to the file test-results/$BASENAME.out, too. 66case "$GIT_TEST_TEE_STARTED, $* " in 67done,*) 68 # do not redirect again 69 ;; 70*' --tee '*|*' --va'*|*' --verbose-log '*) 71 mkdir -p "$TEST_OUTPUT_DIRECTORY/test-results" 72 BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)" 73 74 # Make this filename available to the sub-process in case it is using 75 # --verbose-log. 76 GIT_TEST_TEE_OUTPUT_FILE=$BASE.out 77 export GIT_TEST_TEE_OUTPUT_FILE 78 79 # Truncate before calling "tee -a" to get rid of the results 80 # from any previous runs. 81 >"$GIT_TEST_TEE_OUTPUT_FILE" 82 83 (GIT_TEST_TEE_STARTED=done ${TEST_SHELL_PATH} "$0" "$@" 2>&1; 84 echo $? >"$BASE.exit") | tee -a "$GIT_TEST_TEE_OUTPUT_FILE" 85 test "$(cat "$BASE.exit")" = 0 86 exit 87 ;; 88esac 89 90# For repeatability, reset the environment to known value. 91# TERM is sanitized below, after saving color control sequences. 92LANG=C 93LC_ALL=C 94PAGER=cat 95TZ=UTC 96export LANG LC_ALL PAGER TZ 97EDITOR=: 98# A call to "unset" with no arguments causes at least Solaris 10 99# /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets 100# deriving from the command substitution clustered with the other 101# ones. 102unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH" -e ' 103 my @env = keys %ENV; 104 my $ok = join("|", qw( 105 TRACE 106 DEBUG 107 TEST 108 .*_TEST 109 PROVE 110 VALGRIND 111 UNZIP 112 PERF_ 113 CURL_VERBOSE 114 TRACE_CURL 115 )); 116 my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env); 117 print join("\n", @vars); 118') 119unset XDG_CACHE_HOME 120unset XDG_CONFIG_HOME 121unset GITPERLLIB 122GIT_AUTHOR_EMAIL=author@example.com 123GIT_AUTHOR_NAME='A U Thor' 124GIT_COMMITTER_EMAIL=committer@example.com 125GIT_COMMITTER_NAME='C O Mitter' 126GIT_MERGE_VERBOSITY=5 127GIT_MERGE_AUTOEDIT=no 128export GIT_MERGE_VERBOSITY GIT_MERGE_AUTOEDIT 129export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME 130export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME 131export EDITOR 132 133# Tests using GIT_TRACE typically don't want <timestamp> <file>:<line> output 134GIT_TRACE_BARE=1 135export GIT_TRACE_BARE 136 137if test -n "${TEST_GIT_INDEX_VERSION:+isset}" 138then 139 GIT_INDEX_VERSION="$TEST_GIT_INDEX_VERSION" 140 export GIT_INDEX_VERSION 141fi 142 143# Add libc MALLOC and MALLOC_PERTURB test 144# only if we are not executing the test with valgrind 145if expr " $GIT_TEST_OPTS " : ".* --valgrind " >/dev/null || 146 test -n "$TEST_NO_MALLOC_CHECK" 147then 148 setup_malloc_check () { 149 : nothing 150 } 151 teardown_malloc_check () { 152 : nothing 153 } 154else 155 setup_malloc_check () { 156 MALLOC_CHECK_=3 MALLOC_PERTURB_=165 157 export MALLOC_CHECK_ MALLOC_PERTURB_ 158 } 159 teardown_malloc_check () { 160 unset MALLOC_CHECK_ MALLOC_PERTURB_ 161 } 162fi 163 164# Protect ourselves from common misconfiguration to export 165# CDPATH into the environment 166unset CDPATH 167 168unset GREP_OPTIONS 169unset UNZIP 170 171case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in 1721|2|true) 173 GIT_TRACE=4 174 ;; 175esac 176 177# Convenience 178# 179# A regexp to match 5, 35 and 40 hexdigits 180_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' 181_x35="$_x05$_x05$_x05$_x05$_x05$_x05$_x05" 182_x40="$_x35$_x05" 183 184# Zero SHA-1 185_z40=0000000000000000000000000000000000000000 186 187EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904 188EMPTY_BLOB=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 189 190# Line feed 191LF=' 192' 193 194# UTF-8 ZERO WIDTH NON-JOINER, which HFS+ ignores 195# when case-folding filenames 196u200c=$(printf '\342\200\214') 197 198export _x05 _x35 _x40 _z40 LF u200c EMPTY_TREE EMPTY_BLOB 199 200# Each test should start with something like this, after copyright notices: 201# 202# test_description='Description of this test... 203# This test checks if command xyzzy does the right thing... 204# ' 205# . ./test-lib.sh 206test "x$TERM" != "xdumb" && ( 207 test -t 1 && 208 tput bold >/dev/null 2>&1 && 209 tput setaf 1 >/dev/null 2>&1 && 210 tput sgr0 >/dev/null 2>&1 211 ) && 212 color=t 213 214while test "$#" -ne 0 215do 216 case "$1" in 217 -d|--d|--de|--deb|--debu|--debug) 218 debug=t; shift ;; 219 -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 220 immediate=t; shift ;; 221 -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests) 222 GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;; 223 -r) 224 shift; test "$#" -ne 0 || { 225 echo 'error: -r requires an argument' >&2; 226 exit 1; 227 } 228 run_list=$1; shift ;; 229 --run=*) 230 run_list=${1#--*=}; shift ;; 231 -h|--h|--he|--hel|--help) 232 help=t; shift ;; 233 -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 234 verbose=t; shift ;; 235 --verbose-only=*) 236 verbose_only=${1#--*=} 237 shift ;; 238 -q|--q|--qu|--qui|--quie|--quiet) 239 # Ignore --quiet under a TAP::Harness. Saying how many tests 240 # passed without the ok/not ok details is always an error. 241 test -z "$HARNESS_ACTIVE" && quiet=t; shift ;; 242 --with-dashes) 243 with_dashes=t; shift ;; 244 --no-color) 245 color=; shift ;; 246 --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind) 247 valgrind=memcheck 248 shift ;; 249 --valgrind=*) 250 valgrind=${1#--*=} 251 shift ;; 252 --valgrind-only=*) 253 valgrind_only=${1#--*=} 254 shift ;; 255 --tee) 256 shift ;; # was handled already 257 --root=*) 258 root=${1#--*=} 259 shift ;; 260 --chain-lint) 261 GIT_TEST_CHAIN_LINT=1 262 shift ;; 263 --no-chain-lint) 264 GIT_TEST_CHAIN_LINT=0 265 shift ;; 266 -x) 267 trace=t 268 shift ;; 269 --verbose-log) 270 verbose_log=t 271 shift ;; 272 *) 273 echo "error: unknown test option '$1'" >&2; exit 1 ;; 274 esac 275done 276 277if test -n "$valgrind_only" 278then 279 test -z "$valgrind" && valgrind=memcheck 280 test -z "$verbose" && verbose_only="$valgrind_only" 281elif test -n "$valgrind" 282then 283 test -z "$verbose_log" && verbose=t 284fi 285 286if test -n "$trace" && test -z "$verbose_log" 287then 288 verbose=t 289fi 290 291if test -n "$color" 292then 293 # Save the color control sequences now rather than run tput 294 # each time say_color() is called. This is done for two 295 # reasons: 296 # * TERM will be changed to dumb 297 # * HOME will be changed to a temporary directory and tput 298 # might need to read ~/.terminfo from the original HOME 299 # directory to get the control sequences 300 # Note: This approach assumes the control sequences don't end 301 # in a newline for any terminal of interest (command 302 # substitutions strip trailing newlines). Given that most 303 # (all?) terminals in common use are related to ECMA-48, this 304 # shouldn't be a problem. 305 say_color_error=$(tput bold; tput setaf 1) # bold red 306 say_color_skip=$(tput setaf 4) # blue 307 say_color_warn=$(tput setaf 3) # brown/yellow 308 say_color_pass=$(tput setaf 2) # green 309 say_color_info=$(tput setaf 6) # cyan 310 say_color_reset=$(tput sgr0) 311 say_color_="" # no formatting for normal text 312 say_color () { 313 test -z "$1" && test -n "$quiet" && return 314 eval "say_color_color=\$say_color_$1" 315 shift 316 printf "%s\\n" "$say_color_color$*$say_color_reset" 317 } 318else 319 say_color() { 320 test -z "$1" && test -n "$quiet" && return 321 shift 322 printf "%s\n" "$*" 323 } 324fi 325 326TERM=dumb 327export TERM 328 329error () { 330 say_color error "error: $*" 331 GIT_EXIT_OK=t 332 exit 1 333} 334 335say () { 336 say_color info "$*" 337} 338 339if test -n "$HARNESS_ACTIVE" 340then 341 if test "$verbose" = t || test -n "$verbose_only" 342 then 343 printf 'Bail out! %s\n' \ 344 'verbose mode forbidden under TAP harness; try --verbose-log' 345 exit 1 346 fi 347fi 348 349test "${test_description}" != "" || 350error "Test script did not set test_description." 351 352if test "$help" = "t" 353then 354 printf '%s\n' "$test_description" 355 exit 0 356fi 357 358exec 5>&1 359exec 6<&0 360exec 7>&2 361if test "$verbose_log" = "t" 362then 363 exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3 364elif test "$verbose" = "t" 365then 366 exec 4>&2 3>&1 367else 368 exec 4>/dev/null 3>/dev/null 369fi 370 371# Send any "-x" output directly to stderr to avoid polluting tests 372# which capture stderr. We can do this unconditionally since it 373# has no effect if tracing isn't turned on. 374# 375# Note that this sets up the trace fd as soon as we assign the variable, so it 376# must come after the creation of descriptor 4 above. Likewise, we must never 377# unset this, as it has the side effect of closing descriptor 4, which we 378# use to show verbose tests to the user. 379# 380# Note also that we don't need or want to export it. The tracing is local to 381# this shell, and we would not want to influence any shells we exec. 382BASH_XTRACEFD=4 383 384test_failure=0 385test_count=0 386test_fixed=0 387test_broken=0 388test_success=0 389 390test_external_has_tap=0 391 392die () { 393 code=$? 394 if test -n "$GIT_EXIT_OK" 395 then 396 exit $code 397 else 398 echo >&5 "FATAL: Unexpected exit with code $code" 399 exit 1 400 fi 401} 402 403GIT_EXIT_OK= 404trap 'die' EXIT 405trap 'exit $?' INT 406 407# The user-facing functions are loaded from a separate file so that 408# test_perf subshells can have them too 409. "$TEST_DIRECTORY/test-lib-functions.sh" 410 411# You are not expected to call test_ok_ and test_failure_ directly, use 412# the test_expect_* functions instead. 413 414test_ok_ () { 415 test_success=$(($test_success + 1)) 416 say_color "" "ok $test_count - $@" 417} 418 419test_failure_ () { 420 test_failure=$(($test_failure + 1)) 421 say_color error "not ok $test_count - $1" 422 shift 423 printf '%s\n' "$*" | sed -e 's/^/# /' 424 test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; } 425} 426 427test_known_broken_ok_ () { 428 test_fixed=$(($test_fixed+1)) 429 say_color error "ok $test_count - $@ # TODO known breakage vanished" 430} 431 432test_known_broken_failure_ () { 433 test_broken=$(($test_broken+1)) 434 say_color warn "not ok $test_count - $@ # TODO known breakage" 435} 436 437test_debug () { 438 test "$debug" = "" || eval "$1" 439} 440 441match_pattern_list () { 442 arg="$1" 443 shift 444 test -z "$*" && return 1 445 for pattern_ 446 do 447 case "$arg" in 448 $pattern_) 449 return 0 450 esac 451 done 452 return 1 453} 454 455match_test_selector_list () { 456 title="$1" 457 shift 458 arg="$1" 459 shift 460 test -z "$1" && return 0 461 462 # Both commas and whitespace are accepted as separators. 463 OLDIFS=$IFS 464 IFS=' ,' 465 set -- $1 466 IFS=$OLDIFS 467 468 # If the first selector is negative we include by default. 469 include= 470 case "$1" in 471 !*) include=t ;; 472 esac 473 474 for selector 475 do 476 orig_selector=$selector 477 478 positive=t 479 case "$selector" in 480 !*) 481 positive= 482 selector=${selector##?} 483 ;; 484 esac 485 486 test -z "$selector" && continue 487 488 case "$selector" in 489 *-*) 490 if expr "z${selector%%-*}" : "z[0-9]*[^0-9]" >/dev/null 491 then 492 echo "error: $title: invalid non-numeric in range" \ 493 "start: '$orig_selector'" >&2 494 exit 1 495 fi 496 if expr "z${selector#*-}" : "z[0-9]*[^0-9]" >/dev/null 497 then 498 echo "error: $title: invalid non-numeric in range" \ 499 "end: '$orig_selector'" >&2 500 exit 1 501 fi 502 ;; 503 *) 504 if expr "z$selector" : "z[0-9]*[^0-9]" >/dev/null 505 then 506 echo "error: $title: invalid non-numeric in test" \ 507 "selector: '$orig_selector'" >&2 508 exit 1 509 fi 510 esac 511 512 # Short cut for "obvious" cases 513 test -z "$include" && test -z "$positive" && continue 514 test -n "$include" && test -n "$positive" && continue 515 516 case "$selector" in 517 -*) 518 if test $arg -le ${selector#-} 519 then 520 include=$positive 521 fi 522 ;; 523 *-) 524 if test $arg -ge ${selector%-} 525 then 526 include=$positive 527 fi 528 ;; 529 *-*) 530 if test ${selector%%-*} -le $arg \ 531 && test $arg -le ${selector#*-} 532 then 533 include=$positive 534 fi 535 ;; 536 *) 537 if test $arg -eq $selector 538 then 539 include=$positive 540 fi 541 ;; 542 esac 543 done 544 545 test -n "$include" 546} 547 548maybe_teardown_verbose () { 549 test -z "$verbose_only" && return 550 exec 4>/dev/null 3>/dev/null 551 verbose= 552} 553 554last_verbose=t 555maybe_setup_verbose () { 556 test -z "$verbose_only" && return 557 if match_pattern_list $test_count $verbose_only 558 then 559 exec 4>&2 3>&1 560 # Emit a delimiting blank line when going from 561 # non-verbose to verbose. Within verbose mode the 562 # delimiter is printed by test_expect_*. The choice 563 # of the initial $last_verbose is such that before 564 # test 1, we do not print it. 565 test -z "$last_verbose" && echo >&3 "" 566 verbose=t 567 else 568 exec 4>/dev/null 3>/dev/null 569 verbose= 570 fi 571 last_verbose=$verbose 572} 573 574maybe_teardown_valgrind () { 575 test -z "$GIT_VALGRIND" && return 576 GIT_VALGRIND_ENABLED= 577} 578 579maybe_setup_valgrind () { 580 test -z "$GIT_VALGRIND" && return 581 if test -z "$valgrind_only" 582 then 583 GIT_VALGRIND_ENABLED=t 584 return 585 fi 586 GIT_VALGRIND_ENABLED= 587 if match_pattern_list $test_count $valgrind_only 588 then 589 GIT_VALGRIND_ENABLED=t 590 fi 591} 592 593want_trace () { 594 test "$trace" = t && { 595 test "$verbose" = t || test "$verbose_log" = t 596 } 597} 598 599# This is a separate function because some tests use 600# "return" to end a test_expect_success block early 601# (and we want to make sure we run any cleanup like 602# "set +x"). 603test_eval_inner_ () { 604 # Do not add anything extra (including LF) after '$*' 605 eval " 606 want_trace && set -x 607 $*" 608} 609 610test_eval_ () { 611 # If "-x" tracing is in effect, then we want to avoid polluting stderr 612 # with non-test commands. But once in "set -x" mode, we cannot prevent 613 # the shell from printing the "set +x" to turn it off (nor the saving 614 # of $? before that). But we can make sure that the output goes to 615 # /dev/null. 616 # 617 # There are a few subtleties here: 618 # 619 # - we have to redirect descriptor 4 in addition to 2, to cover 620 # BASH_XTRACEFD 621 # 622 # - the actual eval has to come before the redirection block (since 623 # it needs to see descriptor 4 to set up its stderr) 624 # 625 # - likewise, any error message we print must be outside the block to 626 # access descriptor 4 627 # 628 # - checking $? has to come immediately after the eval, but it must 629 # be _inside_ the block to avoid polluting the "set -x" output 630 # 631 632 test_eval_inner_ "$@" </dev/null >&3 2>&4 633 { 634 test_eval_ret_=$? 635 if want_trace 636 then 637 set +x 638 fi 639 } 2>/dev/null 4>&2 640 641 if test "$test_eval_ret_" != 0 && want_trace 642 then 643 say_color error >&4 "error: last command exited with \$?=$test_eval_ret_" 644 fi 645 return $test_eval_ret_ 646} 647 648test_run_ () { 649 test_cleanup=: 650 expecting_failure=$2 651 652 if test "${GIT_TEST_CHAIN_LINT:-1}" != 0; then 653 # turn off tracing for this test-eval, as it simply creates 654 # confusing noise in the "-x" output 655 trace_tmp=$trace 656 trace= 657 # 117 is magic because it is unlikely to match the exit 658 # code of other programs 659 if test "OK-117" != "$(test_eval_ "(exit 117) && $1${LF}${LF}echo OK-\$?" 3>&1)" 660 then 661 error "bug in the test script: broken &&-chain or run-away HERE-DOC: $1" 662 fi 663 trace=$trace_tmp 664 fi 665 666 setup_malloc_check 667 test_eval_ "$1" 668 eval_ret=$? 669 teardown_malloc_check 670 671 if test -z "$immediate" || test $eval_ret = 0 || 672 test -n "$expecting_failure" && test "$test_cleanup" != ":" 673 then 674 setup_malloc_check 675 test_eval_ "$test_cleanup" 676 teardown_malloc_check 677 fi 678 if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE" 679 then 680 echo "" 681 fi 682 return "$eval_ret" 683} 684 685test_start_ () { 686 test_count=$(($test_count+1)) 687 maybe_setup_verbose 688 maybe_setup_valgrind 689} 690 691test_finish_ () { 692 echo >&3 "" 693 maybe_teardown_valgrind 694 maybe_teardown_verbose 695} 696 697test_skip () { 698 to_skip= 699 skipped_reason= 700 if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS 701 then 702 to_skip=t 703 skipped_reason="GIT_SKIP_TESTS" 704 fi 705 if test -z "$to_skip" && test -n "$test_prereq" && 706 ! test_have_prereq "$test_prereq" 707 then 708 to_skip=t 709 710 of_prereq= 711 if test "$missing_prereq" != "$test_prereq" 712 then 713 of_prereq=" of $test_prereq" 714 fi 715 skipped_reason="missing $missing_prereq${of_prereq}" 716 fi 717 if test -z "$to_skip" && test -n "$run_list" && 718 ! match_test_selector_list '--run' $test_count "$run_list" 719 then 720 to_skip=t 721 skipped_reason="--run" 722 fi 723 724 case "$to_skip" in 725 t) 726 say_color skip >&3 "skipping test: $@" 727 say_color skip "ok $test_count # skip $1 ($skipped_reason)" 728 : true 729 ;; 730 *) 731 false 732 ;; 733 esac 734} 735 736# stub; perf-lib overrides it 737test_at_end_hook_ () { 738 : 739} 740 741test_done () { 742 GIT_EXIT_OK=t 743 744 if test -z "$HARNESS_ACTIVE" 745 then 746 test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" 747 mkdir -p "$test_results_dir" 748 base=${0##*/} 749 test_results_path="$test_results_dir/${base%.sh}.counts" 750 751 cat >"$test_results_path" <<-EOF 752 total $test_count 753 success $test_success 754 fixed $test_fixed 755 broken $test_broken 756 failed $test_failure 757 758 EOF 759 fi 760 761 if test "$test_fixed" != 0 762 then 763 say_color error "# $test_fixed known breakage(s) vanished; please update test(s)" 764 fi 765 if test "$test_broken" != 0 766 then 767 say_color warn "# still have $test_broken known breakage(s)" 768 fi 769 if test "$test_broken" != 0 || test "$test_fixed" != 0 770 then 771 test_remaining=$(( $test_count - $test_broken - $test_fixed )) 772 msg="remaining $test_remaining test(s)" 773 else 774 test_remaining=$test_count 775 msg="$test_count test(s)" 776 fi 777 case "$test_failure" in 778 0) 779 if test $test_external_has_tap -eq 0 780 then 781 if test $test_remaining -gt 0 782 then 783 say_color pass "# passed all $msg" 784 fi 785 786 # Maybe print SKIP message 787 test -z "$skip_all" || skip_all="# SKIP $skip_all" 788 case "$test_count" in 789 0) 790 say "1..$test_count${skip_all:+ $skip_all}" 791 ;; 792 *) 793 test -z "$skip_all" || 794 say_color warn "$skip_all" 795 say "1..$test_count" 796 ;; 797 esac 798 fi 799 800 if test -z "$debug" 801 then 802 test -d "$TRASH_DIRECTORY" || 803 error "Tests passed but trash directory already removed before test cleanup; aborting" 804 805 cd "$TRASH_DIRECTORY/.." && 806 rm -fr "$TRASH_DIRECTORY" || 807 error "Tests passed but test cleanup failed; aborting" 808 fi 809 test_at_end_hook_ 810 811 exit 0 ;; 812 813 *) 814 if test $test_external_has_tap -eq 0 815 then 816 say_color error "# failed $test_failure among $msg" 817 say "1..$test_count" 818 fi 819 820 exit 1 ;; 821 822 esac 823} 824 825if test -n "$valgrind" 826then 827 make_symlink () { 828 test -h "$2" && 829 test "$1" = "$(readlink "$2")" || { 830 # be super paranoid 831 if mkdir "$2".lock 832 then 833 rm -f "$2" && 834 ln -s "$1" "$2" && 835 rm -r "$2".lock 836 else 837 while test -d "$2".lock 838 do 839 say "Waiting for lock on $2." 840 sleep 1 841 done 842 fi 843 } 844 } 845 846 make_valgrind_symlink () { 847 # handle only executables, unless they are shell libraries that 848 # need to be in the exec-path. 849 test -x "$1" || 850 test "# " = "$(head -c 2 <"$1")" || 851 return; 852 853 base=$(basename "$1") 854 case "$base" in 855 test-*) 856 symlink_target="$GIT_BUILD_DIR/t/helper/$base" 857 ;; 858 *) 859 symlink_target="$GIT_BUILD_DIR/$base" 860 ;; 861 esac 862 # do not override scripts 863 if test -x "$symlink_target" && 864 test ! -d "$symlink_target" && 865 test "#!" != "$(head -c 2 < "$symlink_target")" 866 then 867 symlink_target=../valgrind.sh 868 fi 869 case "$base" in 870 *.sh|*.perl) 871 symlink_target=../unprocessed-script 872 esac 873 # create the link, or replace it if it is out of date 874 make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit 875 } 876 877 # override all git executables in TEST_DIRECTORY/.. 878 GIT_VALGRIND=$TEST_DIRECTORY/valgrind 879 mkdir -p "$GIT_VALGRIND"/bin 880 for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/t/helper/test-* 881 do 882 make_valgrind_symlink $file 883 done 884 # special-case the mergetools loadables 885 make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools" 886 OLDIFS=$IFS 887 IFS=: 888 for path in $PATH 889 do 890 ls "$path"/git-* 2> /dev/null | 891 while read file 892 do 893 make_valgrind_symlink "$file" 894 done 895 done 896 IFS=$OLDIFS 897 PATH=$GIT_VALGRIND/bin:$PATH 898 GIT_EXEC_PATH=$GIT_VALGRIND/bin 899 export GIT_VALGRIND 900 GIT_VALGRIND_MODE="$valgrind" 901 export GIT_VALGRIND_MODE 902 GIT_VALGRIND_ENABLED=t 903 test -n "$valgrind_only" && GIT_VALGRIND_ENABLED= 904 export GIT_VALGRIND_ENABLED 905elif test -n "$GIT_TEST_INSTALLED" 906then 907 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) || 908 error "Cannot run git from $GIT_TEST_INSTALLED." 909 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH 910 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} 911else # normal case, use ../bin-wrappers only unless $with_dashes: 912 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers" 913 if ! test -x "$git_bin_dir/git" 914 then 915 if test -z "$with_dashes" 916 then 917 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" 918 fi 919 with_dashes=t 920 fi 921 PATH="$git_bin_dir:$PATH" 922 GIT_EXEC_PATH=$GIT_BUILD_DIR 923 if test -n "$with_dashes" 924 then 925 PATH="$GIT_BUILD_DIR:$PATH" 926 fi 927fi 928GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt 929GIT_CONFIG_NOSYSTEM=1 930GIT_ATTR_NOSYSTEM=1 931export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM 932 933if test -z "$GIT_TEST_CMP" 934then 935 if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT" 936 then 937 GIT_TEST_CMP="$DIFF -c" 938 else 939 GIT_TEST_CMP="$DIFF -u" 940 fi 941fi 942 943GITPERLLIB="$GIT_BUILD_DIR"/perl/blib/lib:"$GIT_BUILD_DIR"/perl/blib/arch/auto/Git 944export GITPERLLIB 945test -d "$GIT_BUILD_DIR"/templates/blt || { 946 error "You haven't built things yet, have you?" 947} 948 949if ! test -x "$GIT_BUILD_DIR"/t/helper/test-chmtime 950then 951 echo >&2 'You need to build test-chmtime:' 952 echo >&2 'Run "make t/helper/test-chmtime" in the source (toplevel) directory' 953 exit 1 954fi 955 956# Test repository 957TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)" 958test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY" 959case "$TRASH_DIRECTORY" in 960/*) ;; # absolute path is good 961 *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;; 962esac 963rm -fr "$TRASH_DIRECTORY" || { 964 GIT_EXIT_OK=t 965 echo >&5 "FATAL: Cannot prepare test area" 966 exit 1 967} 968 969HOME="$TRASH_DIRECTORY" 970GNUPGHOME="$HOME/gnupg-home-not-used" 971export HOME GNUPGHOME 972 973if test -z "$TEST_NO_CREATE_REPO" 974then 975 test_create_repo "$TRASH_DIRECTORY" 976else 977 mkdir -p "$TRASH_DIRECTORY" 978fi 979# Use -P to resolve symlinks in our working directory so that the cwd 980# in subprocesses like git equals our $PWD (for pathname comparisons). 981cd -P "$TRASH_DIRECTORY" || exit 1 982 983this_test=${0##*/} 984this_test=${this_test%%-*} 985if match_pattern_list "$this_test" $GIT_SKIP_TESTS 986then 987 say_color info >&3 "skipping test $this_test altogether" 988 skip_all="skip all tests in $this_test" 989 test_done 990fi 991 992# Provide an implementation of the 'yes' utility 993yes () { 994 if test $# = 0 995 then 996 y=y 997 else 998 y="$*" 999 fi10001001 i=01002 while test $i -lt 991003 do1004 echo "$y"1005 i=$(($i+1))1006 done1007}10081009# Fix some commands on Windows1010uname_s=$(uname -s)1011case $uname_s in1012*MINGW*)1013 # Windows has its own (incompatible) sort and find1014 sort () {1015 /usr/bin/sort "$@"1016 }1017 find () {1018 /usr/bin/find "$@"1019 }1020 # git sees Windows-style pwd1021 pwd () {1022 builtin pwd -W1023 }1024 # no POSIX permissions1025 # backslashes in pathspec are converted to '/'1026 # exec does not inherit the PID1027 test_set_prereq MINGW1028 test_set_prereq NATIVE_CRLF1029 test_set_prereq SED_STRIPS_CR1030 test_set_prereq GREP_STRIPS_CR1031 GIT_TEST_CMP=mingw_test_cmp1032 ;;1033*CYGWIN*)1034 test_set_prereq POSIXPERM1035 test_set_prereq EXECKEEPSPID1036 test_set_prereq CYGWIN1037 test_set_prereq SED_STRIPS_CR1038 test_set_prereq GREP_STRIPS_CR1039 ;;1040*)1041 test_set_prereq POSIXPERM1042 test_set_prereq BSLASHPSPEC1043 test_set_prereq EXECKEEPSPID1044 ;;1045esac10461047( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_11048test -z "$NO_PERL" && test_set_prereq PERL1049test -z "$NO_PTHREADS" && test_set_prereq PTHREADS1050test -z "$NO_PYTHON" && test_set_prereq PYTHON1051test -n "$USE_LIBPCRE1$USE_LIBPCRE2" && test_set_prereq PCRE1052test -n "$USE_LIBPCRE1" && test_set_prereq LIBPCRE11053test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE21054test -z "$NO_GETTEXT" && test_set_prereq GETTEXT10551056# Can we rely on git's output in the C locale?1057if test -n "$GETTEXT_POISON"1058then1059 GIT_GETTEXT_POISON=YesPlease1060 export GIT_GETTEXT_POISON1061 test_set_prereq GETTEXT_POISON1062else1063 test_set_prereq C_LOCALE_OUTPUT1064fi10651066test_lazy_prereq PIPE '1067 # test whether the filesystem supports FIFOs1068 test_have_prereq !MINGW,!CYGWIN &&1069 rm -f testfifo && mkfifo testfifo1070'10711072test_lazy_prereq SYMLINKS '1073 # test whether the filesystem supports symbolic links1074 ln -s x y && test -h y1075'10761077test_lazy_prereq FILEMODE '1078 test "$(git config --bool core.filemode)" = true1079'10801081test_lazy_prereq CASE_INSENSITIVE_FS '1082 echo good >CamelCase &&1083 echo bad >camelcase &&1084 test "$(cat CamelCase)" != good1085'10861087test_lazy_prereq UTF8_NFD_TO_NFC '1088 # check whether FS converts nfd unicode to nfc1089 auml=$(printf "\303\244")1090 aumlcdiar=$(printf "\141\314\210")1091 >"$auml" &&1092 case "$(echo *)" in1093 "$aumlcdiar")1094 true ;;1095 *)1096 false ;;1097 esac1098'10991100test_lazy_prereq AUTOIDENT '1101 sane_unset GIT_AUTHOR_NAME &&1102 sane_unset GIT_AUTHOR_EMAIL &&1103 git var GIT_AUTHOR_IDENT1104'11051106test_lazy_prereq EXPENSIVE '1107 test -n "$GIT_TEST_LONG"1108'11091110test_lazy_prereq USR_BIN_TIME '1111 test -x /usr/bin/time1112'11131114test_lazy_prereq NOT_ROOT '1115 uid=$(id -u) &&1116 test "$uid" != 01117'11181119test_lazy_prereq JGIT '1120 type jgit1121'11221123# SANITY is about "can you correctly predict what the filesystem would1124# do by only looking at the permission bits of the files and1125# directories?" A typical example of !SANITY is running the test1126# suite as root, where a test may expect "chmod -r file && cat file"1127# to fail because file is supposed to be unreadable after a successful1128# chmod. In an environment (i.e. combination of what filesystem is1129# being used and who is running the tests) that lacks SANITY, you may1130# be able to delete or create a file when the containing directory1131# doesn't have write permissions, or access a file even if the1132# containing directory doesn't have read or execute permissions.11331134test_lazy_prereq SANITY '1135 mkdir SANETESTD.1 SANETESTD.2 &&11361137 chmod +w SANETESTD.1 SANETESTD.2 &&1138 >SANETESTD.1/x 2>SANETESTD.2/x &&1139 chmod -w SANETESTD.1 &&1140 chmod -r SANETESTD.1/x &&1141 chmod -rx SANETESTD.2 ||1142 error "bug in test sript: cannot prepare SANETESTD"11431144 ! test -r SANETESTD.1/x &&1145 ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x1146 status=$?11471148 chmod +rwx SANETESTD.1 SANETESTD.2 &&1149 rm -rf SANETESTD.1 SANETESTD.2 ||1150 error "bug in test sript: cannot clean SANETESTD"1151 return $status1152'11531154test FreeBSD != $uname_s || GIT_UNZIP=${GIT_UNZIP:-/usr/local/bin/unzip}1155GIT_UNZIP=${GIT_UNZIP:-unzip}1156test_lazy_prereq UNZIP '1157 "$GIT_UNZIP" -v1158 test $? -ne 1271159'11601161run_with_limited_cmdline () {1162 (ulimit -s 128 && "$@")1163}11641165test_lazy_prereq CMDLINE_LIMIT '1166 test_have_prereq !MINGW,!CYGWIN &&1167 run_with_limited_cmdline true1168'11691170run_with_limited_stack () {1171 (ulimit -s 128 && "$@")1172}11731174test_lazy_prereq ULIMIT_STACK_SIZE '1175 test_have_prereq !MINGW,!CYGWIN &&1176 run_with_limited_stack true1177'11781179build_option () {1180 git version --build-options |1181 sed -ne "s/^$1: //p"1182}11831184test_lazy_prereq LONG_IS_64BIT '1185 test 8 -le "$(build_option sizeof-long)"1186'11871188test_lazy_prereq TIME_IS_64BIT 'test-date is64bit'1189test_lazy_prereq TIME_T_IS_64BIT 'test-date time_t-is64bit'