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 187ZERO_OID=$_z40 188EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904 189EMPTY_BLOB=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 190 191# Line feed 192LF=' 193' 194 195# UTF-8 ZERO WIDTH NON-JOINER, which HFS+ ignores 196# when case-folding filenames 197u200c=$(printf '\342\200\214') 198 199export _x05 _x35 _x40 _z40 LF u200c EMPTY_TREE EMPTY_BLOB ZERO_OID 200 201# Each test should start with something like this, after copyright notices: 202# 203# test_description='Description of this test... 204# This test checks if command xyzzy does the right thing... 205# ' 206# . ./test-lib.sh 207test "x$TERM" != "xdumb" && ( 208 test -t 1 && 209 tput bold >/dev/null 2>&1 && 210 tput setaf 1 >/dev/null 2>&1 && 211 tput sgr0 >/dev/null 2>&1 212 ) && 213 color=t 214 215while test "$#" -ne 0 216do 217 case "$1" in 218 -d|--d|--de|--deb|--debu|--debug) 219 debug=t; shift ;; 220 -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 221 immediate=t; shift ;; 222 -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests) 223 GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;; 224 -r) 225 shift; test "$#" -ne 0 || { 226 echo 'error: -r requires an argument' >&2; 227 exit 1; 228 } 229 run_list=$1; shift ;; 230 --run=*) 231 run_list=${1#--*=}; shift ;; 232 -h|--h|--he|--hel|--help) 233 help=t; shift ;; 234 -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 235 verbose=t; shift ;; 236 --verbose-only=*) 237 verbose_only=${1#--*=} 238 shift ;; 239 -q|--q|--qu|--qui|--quie|--quiet) 240 # Ignore --quiet under a TAP::Harness. Saying how many tests 241 # passed without the ok/not ok details is always an error. 242 test -z "$HARNESS_ACTIVE" && quiet=t; shift ;; 243 --with-dashes) 244 with_dashes=t; shift ;; 245 --no-color) 246 color=; shift ;; 247 --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind) 248 valgrind=memcheck 249 shift ;; 250 --valgrind=*) 251 valgrind=${1#--*=} 252 shift ;; 253 --valgrind-only=*) 254 valgrind_only=${1#--*=} 255 shift ;; 256 --tee) 257 shift ;; # was handled already 258 --root=*) 259 root=${1#--*=} 260 shift ;; 261 --chain-lint) 262 GIT_TEST_CHAIN_LINT=1 263 shift ;; 264 --no-chain-lint) 265 GIT_TEST_CHAIN_LINT=0 266 shift ;; 267 -x) 268 # Some test scripts can't be reliably traced with '-x', 269 # unless the test is run with a Bash version supporting 270 # BASH_XTRACEFD (introduced in Bash v4.1). Check whether 271 # this test is marked as such, and ignore '-x' if it 272 # isn't executed with a suitable Bash version. 273 if test -z "$test_untraceable" || { 274 test -n "$BASH_VERSION" && { 275 test ${BASH_VERSINFO[0]} -gt 4 || { 276 test ${BASH_VERSINFO[0]} -eq 4 && 277 test ${BASH_VERSINFO[1]} -ge 1 278 } 279 } 280 } 281 then 282 trace=t 283 else 284 echo >&2 "warning: ignoring -x; '$0' is untraceable without BASH_XTRACEFD" 285 fi 286 shift ;; 287 --verbose-log) 288 verbose_log=t 289 shift ;; 290 *) 291 echo "error: unknown test option '$1'" >&2; exit 1 ;; 292 esac 293done 294 295if test -n "$valgrind_only" 296then 297 test -z "$valgrind" && valgrind=memcheck 298 test -z "$verbose" && verbose_only="$valgrind_only" 299elif test -n "$valgrind" 300then 301 test -z "$verbose_log" && verbose=t 302fi 303 304if test -n "$trace" && test -z "$verbose_log" 305then 306 verbose=t 307fi 308 309if test -n "$color" 310then 311 # Save the color control sequences now rather than run tput 312 # each time say_color() is called. This is done for two 313 # reasons: 314 # * TERM will be changed to dumb 315 # * HOME will be changed to a temporary directory and tput 316 # might need to read ~/.terminfo from the original HOME 317 # directory to get the control sequences 318 # Note: This approach assumes the control sequences don't end 319 # in a newline for any terminal of interest (command 320 # substitutions strip trailing newlines). Given that most 321 # (all?) terminals in common use are related to ECMA-48, this 322 # shouldn't be a problem. 323 say_color_error=$(tput bold; tput setaf 1) # bold red 324 say_color_skip=$(tput setaf 4) # blue 325 say_color_warn=$(tput setaf 3) # brown/yellow 326 say_color_pass=$(tput setaf 2) # green 327 say_color_info=$(tput setaf 6) # cyan 328 say_color_reset=$(tput sgr0) 329 say_color_="" # no formatting for normal text 330 say_color () { 331 test -z "$1" && test -n "$quiet" && return 332 eval "say_color_color=\$say_color_$1" 333 shift 334 printf "%s\\n" "$say_color_color$*$say_color_reset" 335 } 336else 337 say_color() { 338 test -z "$1" && test -n "$quiet" && return 339 shift 340 printf "%s\n" "$*" 341 } 342fi 343 344TERM=dumb 345export TERM 346 347error () { 348 say_color error "error: $*" 349 GIT_EXIT_OK=t 350 exit 1 351} 352 353say () { 354 say_color info "$*" 355} 356 357if test -n "$HARNESS_ACTIVE" 358then 359 if test "$verbose" = t || test -n "$verbose_only" 360 then 361 printf 'Bail out! %s\n' \ 362 'verbose mode forbidden under TAP harness; try --verbose-log' 363 exit 1 364 fi 365fi 366 367test "${test_description}" != "" || 368error "Test script did not set test_description." 369 370if test "$help" = "t" 371then 372 printf '%s\n' "$test_description" 373 exit 0 374fi 375 376exec 5>&1 377exec 6<&0 378exec 7>&2 379if test "$verbose_log" = "t" 380then 381 exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3 382elif test "$verbose" = "t" 383then 384 exec 4>&2 3>&1 385else 386 exec 4>/dev/null 3>/dev/null 387fi 388 389# Send any "-x" output directly to stderr to avoid polluting tests 390# which capture stderr. We can do this unconditionally since it 391# has no effect if tracing isn't turned on. 392# 393# Note that this sets up the trace fd as soon as we assign the variable, so it 394# must come after the creation of descriptor 4 above. Likewise, we must never 395# unset this, as it has the side effect of closing descriptor 4, which we 396# use to show verbose tests to the user. 397# 398# Note also that we don't need or want to export it. The tracing is local to 399# this shell, and we would not want to influence any shells we exec. 400BASH_XTRACEFD=4 401 402test_failure=0 403test_count=0 404test_fixed=0 405test_broken=0 406test_success=0 407 408test_external_has_tap=0 409 410die () { 411 code=$? 412 if test -n "$GIT_EXIT_OK" 413 then 414 exit $code 415 else 416 echo >&5 "FATAL: Unexpected exit with code $code" 417 exit 1 418 fi 419} 420 421GIT_EXIT_OK= 422trap 'die' EXIT 423trap 'exit $?' INT 424 425# The user-facing functions are loaded from a separate file so that 426# test_perf subshells can have them too 427. "$TEST_DIRECTORY/test-lib-functions.sh" 428 429# You are not expected to call test_ok_ and test_failure_ directly, use 430# the test_expect_* functions instead. 431 432test_ok_ () { 433 test_success=$(($test_success + 1)) 434 say_color "" "ok $test_count - $@" 435} 436 437test_failure_ () { 438 test_failure=$(($test_failure + 1)) 439 say_color error "not ok $test_count - $1" 440 shift 441 printf '%s\n' "$*" | sed -e 's/^/# /' 442 test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; } 443} 444 445test_known_broken_ok_ () { 446 test_fixed=$(($test_fixed+1)) 447 say_color error "ok $test_count - $@ # TODO known breakage vanished" 448} 449 450test_known_broken_failure_ () { 451 test_broken=$(($test_broken+1)) 452 say_color warn "not ok $test_count - $@ # TODO known breakage" 453} 454 455test_debug () { 456 test "$debug" = "" || eval "$1" 457} 458 459match_pattern_list () { 460 arg="$1" 461 shift 462 test -z "$*" && return 1 463 for pattern_ 464 do 465 case "$arg" in 466 $pattern_) 467 return 0 468 esac 469 done 470 return 1 471} 472 473match_test_selector_list () { 474 title="$1" 475 shift 476 arg="$1" 477 shift 478 test -z "$1" && return 0 479 480 # Both commas and whitespace are accepted as separators. 481 OLDIFS=$IFS 482 IFS=' ,' 483 set -- $1 484 IFS=$OLDIFS 485 486 # If the first selector is negative we include by default. 487 include= 488 case "$1" in 489 !*) include=t ;; 490 esac 491 492 for selector 493 do 494 orig_selector=$selector 495 496 positive=t 497 case "$selector" in 498 !*) 499 positive= 500 selector=${selector##?} 501 ;; 502 esac 503 504 test -z "$selector" && continue 505 506 case "$selector" in 507 *-*) 508 if expr "z${selector%%-*}" : "z[0-9]*[^0-9]" >/dev/null 509 then 510 echo "error: $title: invalid non-numeric in range" \ 511 "start: '$orig_selector'" >&2 512 exit 1 513 fi 514 if expr "z${selector#*-}" : "z[0-9]*[^0-9]" >/dev/null 515 then 516 echo "error: $title: invalid non-numeric in range" \ 517 "end: '$orig_selector'" >&2 518 exit 1 519 fi 520 ;; 521 *) 522 if expr "z$selector" : "z[0-9]*[^0-9]" >/dev/null 523 then 524 echo "error: $title: invalid non-numeric in test" \ 525 "selector: '$orig_selector'" >&2 526 exit 1 527 fi 528 esac 529 530 # Short cut for "obvious" cases 531 test -z "$include" && test -z "$positive" && continue 532 test -n "$include" && test -n "$positive" && continue 533 534 case "$selector" in 535 -*) 536 if test $arg -le ${selector#-} 537 then 538 include=$positive 539 fi 540 ;; 541 *-) 542 if test $arg -ge ${selector%-} 543 then 544 include=$positive 545 fi 546 ;; 547 *-*) 548 if test ${selector%%-*} -le $arg \ 549 && test $arg -le ${selector#*-} 550 then 551 include=$positive 552 fi 553 ;; 554 *) 555 if test $arg -eq $selector 556 then 557 include=$positive 558 fi 559 ;; 560 esac 561 done 562 563 test -n "$include" 564} 565 566maybe_teardown_verbose () { 567 test -z "$verbose_only" && return 568 exec 4>/dev/null 3>/dev/null 569 verbose= 570} 571 572last_verbose=t 573maybe_setup_verbose () { 574 test -z "$verbose_only" && return 575 if match_pattern_list $test_count $verbose_only 576 then 577 exec 4>&2 3>&1 578 # Emit a delimiting blank line when going from 579 # non-verbose to verbose. Within verbose mode the 580 # delimiter is printed by test_expect_*. The choice 581 # of the initial $last_verbose is such that before 582 # test 1, we do not print it. 583 test -z "$last_verbose" && echo >&3 "" 584 verbose=t 585 else 586 exec 4>/dev/null 3>/dev/null 587 verbose= 588 fi 589 last_verbose=$verbose 590} 591 592maybe_teardown_valgrind () { 593 test -z "$GIT_VALGRIND" && return 594 GIT_VALGRIND_ENABLED= 595} 596 597maybe_setup_valgrind () { 598 test -z "$GIT_VALGRIND" && return 599 if test -z "$valgrind_only" 600 then 601 GIT_VALGRIND_ENABLED=t 602 return 603 fi 604 GIT_VALGRIND_ENABLED= 605 if match_pattern_list $test_count $valgrind_only 606 then 607 GIT_VALGRIND_ENABLED=t 608 fi 609} 610 611want_trace () { 612 test "$trace" = t && { 613 test "$verbose" = t || test "$verbose_log" = t 614 } 615} 616 617# This is a separate function because some tests use 618# "return" to end a test_expect_success block early 619# (and we want to make sure we run any cleanup like 620# "set +x"). 621test_eval_inner_ () { 622 # Do not add anything extra (including LF) after '$*' 623 eval " 624 want_trace && set -x 625 $*" 626} 627 628test_eval_ () { 629 # If "-x" tracing is in effect, then we want to avoid polluting stderr 630 # with non-test commands. But once in "set -x" mode, we cannot prevent 631 # the shell from printing the "set +x" to turn it off (nor the saving 632 # of $? before that). But we can make sure that the output goes to 633 # /dev/null. 634 # 635 # There are a few subtleties here: 636 # 637 # - we have to redirect descriptor 4 in addition to 2, to cover 638 # BASH_XTRACEFD 639 # 640 # - the actual eval has to come before the redirection block (since 641 # it needs to see descriptor 4 to set up its stderr) 642 # 643 # - likewise, any error message we print must be outside the block to 644 # access descriptor 4 645 # 646 # - checking $? has to come immediately after the eval, but it must 647 # be _inside_ the block to avoid polluting the "set -x" output 648 # 649 650 test_eval_inner_ "$@" </dev/null >&3 2>&4 651 { 652 test_eval_ret_=$? 653 if want_trace 654 then 655 set +x 656 fi 657 } 2>/dev/null 4>&2 658 659 if test "$test_eval_ret_" != 0 && want_trace 660 then 661 say_color error >&4 "error: last command exited with \$?=$test_eval_ret_" 662 fi 663 return $test_eval_ret_ 664} 665 666test_run_ () { 667 test_cleanup=: 668 expecting_failure=$2 669 670 if test "${GIT_TEST_CHAIN_LINT:-1}" != 0; then 671 # turn off tracing for this test-eval, as it simply creates 672 # confusing noise in the "-x" output 673 trace_tmp=$trace 674 trace= 675 # 117 is magic because it is unlikely to match the exit 676 # code of other programs 677 if test "OK-117" != "$(test_eval_ "(exit 117) && $1${LF}${LF}echo OK-\$?" 3>&1)" 678 then 679 error "bug in the test script: broken &&-chain or run-away HERE-DOC: $1" 680 fi 681 trace=$trace_tmp 682 fi 683 684 setup_malloc_check 685 test_eval_ "$1" 686 eval_ret=$? 687 teardown_malloc_check 688 689 if test -z "$immediate" || test $eval_ret = 0 || 690 test -n "$expecting_failure" && test "$test_cleanup" != ":" 691 then 692 setup_malloc_check 693 test_eval_ "$test_cleanup" 694 teardown_malloc_check 695 fi 696 if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE" 697 then 698 echo "" 699 fi 700 return "$eval_ret" 701} 702 703test_start_ () { 704 test_count=$(($test_count+1)) 705 maybe_setup_verbose 706 maybe_setup_valgrind 707} 708 709test_finish_ () { 710 echo >&3 "" 711 maybe_teardown_valgrind 712 maybe_teardown_verbose 713} 714 715test_skip () { 716 to_skip= 717 skipped_reason= 718 if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS 719 then 720 to_skip=t 721 skipped_reason="GIT_SKIP_TESTS" 722 fi 723 if test -z "$to_skip" && test -n "$test_prereq" && 724 ! test_have_prereq "$test_prereq" 725 then 726 to_skip=t 727 728 of_prereq= 729 if test "$missing_prereq" != "$test_prereq" 730 then 731 of_prereq=" of $test_prereq" 732 fi 733 skipped_reason="missing $missing_prereq${of_prereq}" 734 fi 735 if test -z "$to_skip" && test -n "$run_list" && 736 ! match_test_selector_list '--run' $test_count "$run_list" 737 then 738 to_skip=t 739 skipped_reason="--run" 740 fi 741 742 case "$to_skip" in 743 t) 744 say_color skip >&3 "skipping test: $@" 745 say_color skip "ok $test_count # skip $1 ($skipped_reason)" 746 : true 747 ;; 748 *) 749 false 750 ;; 751 esac 752} 753 754# stub; perf-lib overrides it 755test_at_end_hook_ () { 756 : 757} 758 759test_done () { 760 GIT_EXIT_OK=t 761 762 if test -z "$HARNESS_ACTIVE" 763 then 764 test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" 765 mkdir -p "$test_results_dir" 766 base=${0##*/} 767 test_results_path="$test_results_dir/${base%.sh}.counts" 768 769 cat >"$test_results_path" <<-EOF 770 total $test_count 771 success $test_success 772 fixed $test_fixed 773 broken $test_broken 774 failed $test_failure 775 776 EOF 777 fi 778 779 if test "$test_fixed" != 0 780 then 781 say_color error "# $test_fixed known breakage(s) vanished; please update test(s)" 782 fi 783 if test "$test_broken" != 0 784 then 785 say_color warn "# still have $test_broken known breakage(s)" 786 fi 787 if test "$test_broken" != 0 || test "$test_fixed" != 0 788 then 789 test_remaining=$(( $test_count - $test_broken - $test_fixed )) 790 msg="remaining $test_remaining test(s)" 791 else 792 test_remaining=$test_count 793 msg="$test_count test(s)" 794 fi 795 case "$test_failure" in 796 0) 797 if test $test_external_has_tap -eq 0 798 then 799 if test $test_remaining -gt 0 800 then 801 say_color pass "# passed all $msg" 802 fi 803 804 # Maybe print SKIP message 805 test -z "$skip_all" || skip_all="# SKIP $skip_all" 806 case "$test_count" in 807 0) 808 say "1..$test_count${skip_all:+ $skip_all}" 809 ;; 810 *) 811 test -z "$skip_all" || 812 say_color warn "$skip_all" 813 say "1..$test_count" 814 ;; 815 esac 816 fi 817 818 if test -z "$debug" 819 then 820 test -d "$TRASH_DIRECTORY" || 821 error "Tests passed but trash directory already removed before test cleanup; aborting" 822 823 cd "$TRASH_DIRECTORY/.." && 824 rm -fr "$TRASH_DIRECTORY" || 825 error "Tests passed but test cleanup failed; aborting" 826 fi 827 test_at_end_hook_ 828 829 exit 0 ;; 830 831 *) 832 if test $test_external_has_tap -eq 0 833 then 834 say_color error "# failed $test_failure among $msg" 835 say "1..$test_count" 836 fi 837 838 exit 1 ;; 839 840 esac 841} 842 843if test -n "$valgrind" 844then 845 make_symlink () { 846 test -h "$2" && 847 test "$1" = "$(readlink "$2")" || { 848 # be super paranoid 849 if mkdir "$2".lock 850 then 851 rm -f "$2" && 852 ln -s "$1" "$2" && 853 rm -r "$2".lock 854 else 855 while test -d "$2".lock 856 do 857 say "Waiting for lock on $2." 858 sleep 1 859 done 860 fi 861 } 862 } 863 864 make_valgrind_symlink () { 865 # handle only executables, unless they are shell libraries that 866 # need to be in the exec-path. 867 test -x "$1" || 868 test "# " = "$(head -c 2 <"$1")" || 869 return; 870 871 base=$(basename "$1") 872 case "$base" in 873 test-*) 874 symlink_target="$GIT_BUILD_DIR/t/helper/$base" 875 ;; 876 *) 877 symlink_target="$GIT_BUILD_DIR/$base" 878 ;; 879 esac 880 # do not override scripts 881 if test -x "$symlink_target" && 882 test ! -d "$symlink_target" && 883 test "#!" != "$(head -c 2 < "$symlink_target")" 884 then 885 symlink_target=../valgrind.sh 886 fi 887 case "$base" in 888 *.sh|*.perl) 889 symlink_target=../unprocessed-script 890 esac 891 # create the link, or replace it if it is out of date 892 make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit 893 } 894 895 # override all git executables in TEST_DIRECTORY/.. 896 GIT_VALGRIND=$TEST_DIRECTORY/valgrind 897 mkdir -p "$GIT_VALGRIND"/bin 898 for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/t/helper/test-* 899 do 900 make_valgrind_symlink $file 901 done 902 # special-case the mergetools loadables 903 make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools" 904 OLDIFS=$IFS 905 IFS=: 906 for path in $PATH 907 do 908 ls "$path"/git-* 2> /dev/null | 909 while read file 910 do 911 make_valgrind_symlink "$file" 912 done 913 done 914 IFS=$OLDIFS 915 PATH=$GIT_VALGRIND/bin:$PATH 916 GIT_EXEC_PATH=$GIT_VALGRIND/bin 917 export GIT_VALGRIND 918 GIT_VALGRIND_MODE="$valgrind" 919 export GIT_VALGRIND_MODE 920 GIT_VALGRIND_ENABLED=t 921 test -n "$valgrind_only" && GIT_VALGRIND_ENABLED= 922 export GIT_VALGRIND_ENABLED 923elif test -n "$GIT_TEST_INSTALLED" 924then 925 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) || 926 error "Cannot run git from $GIT_TEST_INSTALLED." 927 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH 928 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} 929else # normal case, use ../bin-wrappers only unless $with_dashes: 930 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers" 931 if ! test -x "$git_bin_dir/git" 932 then 933 if test -z "$with_dashes" 934 then 935 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" 936 fi 937 with_dashes=t 938 fi 939 PATH="$git_bin_dir:$PATH" 940 GIT_EXEC_PATH=$GIT_BUILD_DIR 941 if test -n "$with_dashes" 942 then 943 PATH="$GIT_BUILD_DIR:$PATH" 944 fi 945fi 946GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt 947GIT_CONFIG_NOSYSTEM=1 948GIT_ATTR_NOSYSTEM=1 949export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM 950 951if test -z "$GIT_TEST_CMP" 952then 953 if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT" 954 then 955 GIT_TEST_CMP="$DIFF -c" 956 else 957 GIT_TEST_CMP="$DIFF -u" 958 fi 959fi 960 961GITPERLLIB="$GIT_BUILD_DIR"/perl/build/lib 962export GITPERLLIB 963test -d "$GIT_BUILD_DIR"/templates/blt || { 964 error "You haven't built things yet, have you?" 965} 966 967if ! test -x "$GIT_BUILD_DIR"/t/helper/test-tool 968then 969 echo >&2 'You need to build test-tool:' 970 echo >&2 'Run "make t/helper/test-tool" in the source (toplevel) directory' 971 exit 1 972fi 973 974# Test repository 975TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)" 976test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY" 977case "$TRASH_DIRECTORY" in 978/*) ;; # absolute path is good 979 *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;; 980esac 981rm -fr "$TRASH_DIRECTORY" || { 982 GIT_EXIT_OK=t 983 echo >&5 "FATAL: Cannot prepare test area" 984 exit 1 985} 986 987HOME="$TRASH_DIRECTORY" 988GNUPGHOME="$HOME/gnupg-home-not-used" 989export HOME GNUPGHOME 990 991if test -z "$TEST_NO_CREATE_REPO" 992then 993 test_create_repo "$TRASH_DIRECTORY" 994else 995 mkdir -p "$TRASH_DIRECTORY" 996fi 997# Use -P to resolve symlinks in our working directory so that the cwd 998# in subprocesses like git equals our $PWD (for pathname comparisons). 999cd -P "$TRASH_DIRECTORY" || exit 110001001this_test=${0##*/}1002this_test=${this_test%%-*}1003if match_pattern_list "$this_test" $GIT_SKIP_TESTS1004then1005 say_color info >&3 "skipping test $this_test altogether"1006 skip_all="skip all tests in $this_test"1007 test_done1008fi10091010# Provide an implementation of the 'yes' utility1011yes () {1012 if test $# = 01013 then1014 y=y1015 else1016 y="$*"1017 fi10181019 i=01020 while test $i -lt 991021 do1022 echo "$y"1023 i=$(($i+1))1024 done1025}10261027# Fix some commands on Windows1028uname_s=$(uname -s)1029case $uname_s in1030*MINGW*)1031 # Windows has its own (incompatible) sort and find1032 sort () {1033 /usr/bin/sort "$@"1034 }1035 find () {1036 /usr/bin/find "$@"1037 }1038 # git sees Windows-style pwd1039 pwd () {1040 builtin pwd -W1041 }1042 # no POSIX permissions1043 # backslashes in pathspec are converted to '/'1044 # exec does not inherit the PID1045 test_set_prereq MINGW1046 test_set_prereq NATIVE_CRLF1047 test_set_prereq SED_STRIPS_CR1048 test_set_prereq GREP_STRIPS_CR1049 GIT_TEST_CMP=mingw_test_cmp1050 ;;1051*CYGWIN*)1052 test_set_prereq POSIXPERM1053 test_set_prereq EXECKEEPSPID1054 test_set_prereq CYGWIN1055 test_set_prereq SED_STRIPS_CR1056 test_set_prereq GREP_STRIPS_CR1057 ;;1058*)1059 test_set_prereq POSIXPERM1060 test_set_prereq BSLASHPSPEC1061 test_set_prereq EXECKEEPSPID1062 ;;1063esac10641065( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_11066test -z "$NO_PERL" && test_set_prereq PERL1067test -z "$NO_PTHREADS" && test_set_prereq PTHREADS1068test -z "$NO_PYTHON" && test_set_prereq PYTHON1069test -n "$USE_LIBPCRE1$USE_LIBPCRE2" && test_set_prereq PCRE1070test -n "$USE_LIBPCRE1" && test_set_prereq LIBPCRE11071test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE21072test -z "$NO_GETTEXT" && test_set_prereq GETTEXT10731074# Can we rely on git's output in the C locale?1075if test -n "$GETTEXT_POISON"1076then1077 GIT_GETTEXT_POISON=YesPlease1078 export GIT_GETTEXT_POISON1079 test_set_prereq GETTEXT_POISON1080else1081 test_set_prereq C_LOCALE_OUTPUT1082fi10831084test_lazy_prereq PIPE '1085 # test whether the filesystem supports FIFOs1086 test_have_prereq !MINGW,!CYGWIN &&1087 rm -f testfifo && mkfifo testfifo1088'10891090test_lazy_prereq SYMLINKS '1091 # test whether the filesystem supports symbolic links1092 ln -s x y && test -h y1093'10941095test_lazy_prereq FILEMODE '1096 test "$(git config --bool core.filemode)" = true1097'10981099test_lazy_prereq CASE_INSENSITIVE_FS '1100 echo good >CamelCase &&1101 echo bad >camelcase &&1102 test "$(cat CamelCase)" != good1103'11041105test_lazy_prereq UTF8_NFD_TO_NFC '1106 # check whether FS converts nfd unicode to nfc1107 auml=$(printf "\303\244")1108 aumlcdiar=$(printf "\141\314\210")1109 >"$auml" &&1110 case "$(echo *)" in1111 "$aumlcdiar")1112 true ;;1113 *)1114 false ;;1115 esac1116'11171118test_lazy_prereq AUTOIDENT '1119 sane_unset GIT_AUTHOR_NAME &&1120 sane_unset GIT_AUTHOR_EMAIL &&1121 git var GIT_AUTHOR_IDENT1122'11231124test_lazy_prereq EXPENSIVE '1125 test -n "$GIT_TEST_LONG"1126'11271128test_lazy_prereq EXPENSIVE_ON_WINDOWS '1129 test_have_prereq EXPENSIVE || test_have_prereq !MINGW,!CYGWIN1130'11311132test_lazy_prereq USR_BIN_TIME '1133 test -x /usr/bin/time1134'11351136test_lazy_prereq NOT_ROOT '1137 uid=$(id -u) &&1138 test "$uid" != 01139'11401141test_lazy_prereq JGIT '1142 type jgit1143'11441145# SANITY is about "can you correctly predict what the filesystem would1146# do by only looking at the permission bits of the files and1147# directories?" A typical example of !SANITY is running the test1148# suite as root, where a test may expect "chmod -r file && cat file"1149# to fail because file is supposed to be unreadable after a successful1150# chmod. In an environment (i.e. combination of what filesystem is1151# being used and who is running the tests) that lacks SANITY, you may1152# be able to delete or create a file when the containing directory1153# doesn't have write permissions, or access a file even if the1154# containing directory doesn't have read or execute permissions.11551156test_lazy_prereq SANITY '1157 mkdir SANETESTD.1 SANETESTD.2 &&11581159 chmod +w SANETESTD.1 SANETESTD.2 &&1160 >SANETESTD.1/x 2>SANETESTD.2/x &&1161 chmod -w SANETESTD.1 &&1162 chmod -r SANETESTD.1/x &&1163 chmod -rx SANETESTD.2 ||1164 error "bug in test sript: cannot prepare SANETESTD"11651166 ! test -r SANETESTD.1/x &&1167 ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x1168 status=$?11691170 chmod +rwx SANETESTD.1 SANETESTD.2 &&1171 rm -rf SANETESTD.1 SANETESTD.2 ||1172 error "bug in test sript: cannot clean SANETESTD"1173 return $status1174'11751176test FreeBSD != $uname_s || GIT_UNZIP=${GIT_UNZIP:-/usr/local/bin/unzip}1177GIT_UNZIP=${GIT_UNZIP:-unzip}1178test_lazy_prereq UNZIP '1179 "$GIT_UNZIP" -v1180 test $? -ne 1271181'11821183run_with_limited_cmdline () {1184 (ulimit -s 128 && "$@")1185}11861187test_lazy_prereq CMDLINE_LIMIT '1188 test_have_prereq !MINGW,!CYGWIN &&1189 run_with_limited_cmdline true1190'11911192run_with_limited_stack () {1193 (ulimit -s 128 && "$@")1194}11951196test_lazy_prereq ULIMIT_STACK_SIZE '1197 test_have_prereq !MINGW,!CYGWIN &&1198 run_with_limited_stack true1199'12001201build_option () {1202 git version --build-options |1203 sed -ne "s/^$1: //p"1204}12051206test_lazy_prereq LONG_IS_64BIT '1207 test 8 -le "$(build_option sizeof-long)"1208'12091210test_lazy_prereq TIME_IS_64BIT 'test-tool date is64bit'1211test_lazy_prereq TIME_T_IS_64BIT 'test-tool date time_t-is64bit'12121213test_lazy_prereq CURL '1214 curl --version1215'12161217# SHA1 is a test if the hash algorithm in use is SHA-1. This is both for tests1218# which will not work with other hash algorithms and tests that work but don't1219# test anything meaningful (e.g. special values which cause short collisions).1220test_lazy_prereq SHA1 '1221 test $(git hash-object /dev/null) = e69de29bb2d1d6434b8b29ae775ad8c2e48c53911222'