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 137check_var_migration () { 138 old_name=$1 new_name=$2 139 eval "old_isset=\${${old_name}:+isset}" 140 eval "new_isset=\${${new_name}:+isset}" 141 case "$old_isset,$new_isset" in 142 isset,) 143 echo >&2 "warning: $old_name is now $new_name" 144 echo >&2 "hint: set $new_name too during the transition period" 145 eval "$new_name=\$$old_name" 146 ;; 147 isset,isset) 148 # do this later 149 # echo >&2 "warning: $old_name is now $new_name" 150 # echo >&2 "hint: remove $old_name" 151 ;; 152 esac 153} 154 155check_var_migration GIT_FSMONITOR_TEST GIT_TEST_FSMONITOR 156check_var_migration TEST_GIT_INDEX_VERSION GIT_TEST_INDEX_VERSION 157 158# Use specific version of the index file format 159if test -n "${GIT_TEST_INDEX_VERSION:+isset}" 160then 161 GIT_INDEX_VERSION="$GIT_TEST_INDEX_VERSION" 162 export GIT_INDEX_VERSION 163fi 164 165# Add libc MALLOC and MALLOC_PERTURB test 166# only if we are not executing the test with valgrind 167if expr " $GIT_TEST_OPTS " : ".* --valgrind " >/dev/null || 168 test -n "$TEST_NO_MALLOC_CHECK" 169then 170 setup_malloc_check () { 171 : nothing 172 } 173 teardown_malloc_check () { 174 : nothing 175 } 176else 177 setup_malloc_check () { 178 MALLOC_CHECK_=3 MALLOC_PERTURB_=165 179 export MALLOC_CHECK_ MALLOC_PERTURB_ 180 } 181 teardown_malloc_check () { 182 unset MALLOC_CHECK_ MALLOC_PERTURB_ 183 } 184fi 185 186# Protect ourselves from common misconfiguration to export 187# CDPATH into the environment 188unset CDPATH 189 190unset GREP_OPTIONS 191unset UNZIP 192 193case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in 1941|2|true) 195 GIT_TRACE=4 196 ;; 197esac 198 199# Convenience 200# 201# A regexp to match 5, 35 and 40 hexdigits 202_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' 203_x35="$_x05$_x05$_x05$_x05$_x05$_x05$_x05" 204_x40="$_x35$_x05" 205 206# Zero SHA-1 207_z40=0000000000000000000000000000000000000000 208 209OID_REGEX="$_x40" 210ZERO_OID=$_z40 211EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904 212EMPTY_BLOB=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 213 214# Line feed 215LF=' 216' 217 218# UTF-8 ZERO WIDTH NON-JOINER, which HFS+ ignores 219# when case-folding filenames 220u200c=$(printf '\342\200\214') 221 222export _x05 _x35 _x40 _z40 LF u200c EMPTY_TREE EMPTY_BLOB ZERO_OID OID_REGEX 223 224# Each test should start with something like this, after copyright notices: 225# 226# test_description='Description of this test... 227# This test checks if command xyzzy does the right thing... 228# ' 229# . ./test-lib.sh 230test "x$TERM" != "xdumb" && ( 231 test -t 1 && 232 tput bold >/dev/null 2>&1 && 233 tput setaf 1 >/dev/null 2>&1 && 234 tput sgr0 >/dev/null 2>&1 235 ) && 236 color=t 237 238while test "$#" -ne 0 239do 240 case "$1" in 241 -d|--d|--de|--deb|--debu|--debug) 242 debug=t; shift ;; 243 -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 244 immediate=t; shift ;; 245 -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests) 246 GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;; 247 -r) 248 shift; test "$#" -ne 0 || { 249 echo 'error: -r requires an argument' >&2; 250 exit 1; 251 } 252 run_list=$1; shift ;; 253 --run=*) 254 run_list=${1#--*=}; shift ;; 255 -h|--h|--he|--hel|--help) 256 help=t; shift ;; 257 -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 258 verbose=t; shift ;; 259 --verbose-only=*) 260 verbose_only=${1#--*=} 261 shift ;; 262 -q|--q|--qu|--qui|--quie|--quiet) 263 # Ignore --quiet under a TAP::Harness. Saying how many tests 264 # passed without the ok/not ok details is always an error. 265 test -z "$HARNESS_ACTIVE" && quiet=t; shift ;; 266 --with-dashes) 267 with_dashes=t; shift ;; 268 --no-color) 269 color=; shift ;; 270 --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind) 271 valgrind=memcheck 272 shift ;; 273 --valgrind=*) 274 valgrind=${1#--*=} 275 shift ;; 276 --valgrind-only=*) 277 valgrind_only=${1#--*=} 278 shift ;; 279 --tee) 280 shift ;; # was handled already 281 --root=*) 282 root=${1#--*=} 283 shift ;; 284 --chain-lint) 285 GIT_TEST_CHAIN_LINT=1 286 shift ;; 287 --no-chain-lint) 288 GIT_TEST_CHAIN_LINT=0 289 shift ;; 290 -x) 291 # Some test scripts can't be reliably traced with '-x', 292 # unless the test is run with a Bash version supporting 293 # BASH_XTRACEFD (introduced in Bash v4.1). Check whether 294 # this test is marked as such, and ignore '-x' if it 295 # isn't executed with a suitable Bash version. 296 if test -z "$test_untraceable" || { 297 test -n "$BASH_VERSION" && { 298 test ${BASH_VERSINFO[0]} -gt 4 || { 299 test ${BASH_VERSINFO[0]} -eq 4 && 300 test ${BASH_VERSINFO[1]} -ge 1 301 } 302 } 303 } 304 then 305 trace=t 306 else 307 echo >&2 "warning: ignoring -x; '$0' is untraceable without BASH_XTRACEFD" 308 fi 309 shift ;; 310 --verbose-log) 311 verbose_log=t 312 shift ;; 313 *) 314 echo "error: unknown test option '$1'" >&2; exit 1 ;; 315 esac 316done 317 318if test -n "$valgrind_only" 319then 320 test -z "$valgrind" && valgrind=memcheck 321 test -z "$verbose" && verbose_only="$valgrind_only" 322elif test -n "$valgrind" 323then 324 test -z "$verbose_log" && verbose=t 325fi 326 327if test -n "$trace" && test -z "$verbose_log" 328then 329 verbose=t 330fi 331 332if test -n "$color" 333then 334 # Save the color control sequences now rather than run tput 335 # each time say_color() is called. This is done for two 336 # reasons: 337 # * TERM will be changed to dumb 338 # * HOME will be changed to a temporary directory and tput 339 # might need to read ~/.terminfo from the original HOME 340 # directory to get the control sequences 341 # Note: This approach assumes the control sequences don't end 342 # in a newline for any terminal of interest (command 343 # substitutions strip trailing newlines). Given that most 344 # (all?) terminals in common use are related to ECMA-48, this 345 # shouldn't be a problem. 346 say_color_error=$(tput bold; tput setaf 1) # bold red 347 say_color_skip=$(tput setaf 4) # blue 348 say_color_warn=$(tput setaf 3) # brown/yellow 349 say_color_pass=$(tput setaf 2) # green 350 say_color_info=$(tput setaf 6) # cyan 351 say_color_reset=$(tput sgr0) 352 say_color_="" # no formatting for normal text 353 say_color () { 354 test -z "$1" && test -n "$quiet" && return 355 eval "say_color_color=\$say_color_$1" 356 shift 357 printf "%s\\n" "$say_color_color$*$say_color_reset" 358 } 359else 360 say_color() { 361 test -z "$1" && test -n "$quiet" && return 362 shift 363 printf "%s\n" "$*" 364 } 365fi 366 367TERM=dumb 368export TERM 369 370error () { 371 say_color error "error: $*" 372 GIT_EXIT_OK=t 373 exit 1 374} 375 376say () { 377 say_color info "$*" 378} 379 380if test -n "$HARNESS_ACTIVE" 381then 382 if test "$verbose" = t || test -n "$verbose_only" 383 then 384 printf 'Bail out! %s\n' \ 385 'verbose mode forbidden under TAP harness; try --verbose-log' 386 exit 1 387 fi 388fi 389 390test "${test_description}" != "" || 391error "Test script did not set test_description." 392 393if test "$help" = "t" 394then 395 printf '%s\n' "$test_description" 396 exit 0 397fi 398 399exec 5>&1 400exec 6<&0 401exec 7>&2 402if test "$verbose_log" = "t" 403then 404 exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3 405elif test "$verbose" = "t" 406then 407 exec 4>&2 3>&1 408else 409 exec 4>/dev/null 3>/dev/null 410fi 411 412# Send any "-x" output directly to stderr to avoid polluting tests 413# which capture stderr. We can do this unconditionally since it 414# has no effect if tracing isn't turned on. 415# 416# Note that this sets up the trace fd as soon as we assign the variable, so it 417# must come after the creation of descriptor 4 above. Likewise, we must never 418# unset this, as it has the side effect of closing descriptor 4, which we 419# use to show verbose tests to the user. 420# 421# Note also that we don't need or want to export it. The tracing is local to 422# this shell, and we would not want to influence any shells we exec. 423BASH_XTRACEFD=4 424 425test_failure=0 426test_count=0 427test_fixed=0 428test_broken=0 429test_success=0 430 431test_external_has_tap=0 432 433die () { 434 code=$? 435 if test -n "$GIT_EXIT_OK" 436 then 437 exit $code 438 else 439 echo >&5 "FATAL: Unexpected exit with code $code" 440 exit 1 441 fi 442} 443 444GIT_EXIT_OK= 445trap 'die' EXIT 446trap 'exit $?' INT 447 448# The user-facing functions are loaded from a separate file so that 449# test_perf subshells can have them too 450. "$TEST_DIRECTORY/test-lib-functions.sh" 451 452# You are not expected to call test_ok_ and test_failure_ directly, use 453# the test_expect_* functions instead. 454 455test_ok_ () { 456 test_success=$(($test_success + 1)) 457 say_color "" "ok $test_count - $@" 458} 459 460test_failure_ () { 461 test_failure=$(($test_failure + 1)) 462 say_color error "not ok $test_count - $1" 463 shift 464 printf '%s\n' "$*" | sed -e 's/^/# /' 465 test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; } 466} 467 468test_known_broken_ok_ () { 469 test_fixed=$(($test_fixed+1)) 470 say_color error "ok $test_count - $@ # TODO known breakage vanished" 471} 472 473test_known_broken_failure_ () { 474 test_broken=$(($test_broken+1)) 475 say_color warn "not ok $test_count - $@ # TODO known breakage" 476} 477 478test_debug () { 479 test "$debug" = "" || eval "$1" 480} 481 482match_pattern_list () { 483 arg="$1" 484 shift 485 test -z "$*" && return 1 486 for pattern_ 487 do 488 case "$arg" in 489 $pattern_) 490 return 0 491 esac 492 done 493 return 1 494} 495 496match_test_selector_list () { 497 title="$1" 498 shift 499 arg="$1" 500 shift 501 test -z "$1" && return 0 502 503 # Both commas and whitespace are accepted as separators. 504 OLDIFS=$IFS 505 IFS=' ,' 506 set -- $1 507 IFS=$OLDIFS 508 509 # If the first selector is negative we include by default. 510 include= 511 case "$1" in 512 !*) include=t ;; 513 esac 514 515 for selector 516 do 517 orig_selector=$selector 518 519 positive=t 520 case "$selector" in 521 !*) 522 positive= 523 selector=${selector##?} 524 ;; 525 esac 526 527 test -z "$selector" && continue 528 529 case "$selector" in 530 *-*) 531 if expr "z${selector%%-*}" : "z[0-9]*[^0-9]" >/dev/null 532 then 533 echo "error: $title: invalid non-numeric in range" \ 534 "start: '$orig_selector'" >&2 535 exit 1 536 fi 537 if expr "z${selector#*-}" : "z[0-9]*[^0-9]" >/dev/null 538 then 539 echo "error: $title: invalid non-numeric in range" \ 540 "end: '$orig_selector'" >&2 541 exit 1 542 fi 543 ;; 544 *) 545 if expr "z$selector" : "z[0-9]*[^0-9]" >/dev/null 546 then 547 echo "error: $title: invalid non-numeric in test" \ 548 "selector: '$orig_selector'" >&2 549 exit 1 550 fi 551 esac 552 553 # Short cut for "obvious" cases 554 test -z "$include" && test -z "$positive" && continue 555 test -n "$include" && test -n "$positive" && continue 556 557 case "$selector" in 558 -*) 559 if test $arg -le ${selector#-} 560 then 561 include=$positive 562 fi 563 ;; 564 *-) 565 if test $arg -ge ${selector%-} 566 then 567 include=$positive 568 fi 569 ;; 570 *-*) 571 if test ${selector%%-*} -le $arg \ 572 && test $arg -le ${selector#*-} 573 then 574 include=$positive 575 fi 576 ;; 577 *) 578 if test $arg -eq $selector 579 then 580 include=$positive 581 fi 582 ;; 583 esac 584 done 585 586 test -n "$include" 587} 588 589maybe_teardown_verbose () { 590 test -z "$verbose_only" && return 591 exec 4>/dev/null 3>/dev/null 592 verbose= 593} 594 595last_verbose=t 596maybe_setup_verbose () { 597 test -z "$verbose_only" && return 598 if match_pattern_list $test_count $verbose_only 599 then 600 exec 4>&2 3>&1 601 # Emit a delimiting blank line when going from 602 # non-verbose to verbose. Within verbose mode the 603 # delimiter is printed by test_expect_*. The choice 604 # of the initial $last_verbose is such that before 605 # test 1, we do not print it. 606 test -z "$last_verbose" && echo >&3 "" 607 verbose=t 608 else 609 exec 4>/dev/null 3>/dev/null 610 verbose= 611 fi 612 last_verbose=$verbose 613} 614 615maybe_teardown_valgrind () { 616 test -z "$GIT_VALGRIND" && return 617 GIT_VALGRIND_ENABLED= 618} 619 620maybe_setup_valgrind () { 621 test -z "$GIT_VALGRIND" && return 622 if test -z "$valgrind_only" 623 then 624 GIT_VALGRIND_ENABLED=t 625 return 626 fi 627 GIT_VALGRIND_ENABLED= 628 if match_pattern_list $test_count $valgrind_only 629 then 630 GIT_VALGRIND_ENABLED=t 631 fi 632} 633 634want_trace () { 635 test "$trace" = t && { 636 test "$verbose" = t || test "$verbose_log" = t 637 } 638} 639 640# This is a separate function because some tests use 641# "return" to end a test_expect_success block early 642# (and we want to make sure we run any cleanup like 643# "set +x"). 644test_eval_inner_ () { 645 # Do not add anything extra (including LF) after '$*' 646 eval " 647 want_trace && set -x 648 $*" 649} 650 651test_eval_ () { 652 # If "-x" tracing is in effect, then we want to avoid polluting stderr 653 # with non-test commands. But once in "set -x" mode, we cannot prevent 654 # the shell from printing the "set +x" to turn it off (nor the saving 655 # of $? before that). But we can make sure that the output goes to 656 # /dev/null. 657 # 658 # There are a few subtleties here: 659 # 660 # - we have to redirect descriptor 4 in addition to 2, to cover 661 # BASH_XTRACEFD 662 # 663 # - the actual eval has to come before the redirection block (since 664 # it needs to see descriptor 4 to set up its stderr) 665 # 666 # - likewise, any error message we print must be outside the block to 667 # access descriptor 4 668 # 669 # - checking $? has to come immediately after the eval, but it must 670 # be _inside_ the block to avoid polluting the "set -x" output 671 # 672 673 test_eval_inner_ "$@" </dev/null >&3 2>&4 674 { 675 test_eval_ret_=$? 676 if want_trace 677 then 678 set +x 679 fi 680 } 2>/dev/null 4>&2 681 682 if test "$test_eval_ret_" != 0 && want_trace 683 then 684 say_color error >&4 "error: last command exited with \$?=$test_eval_ret_" 685 fi 686 return $test_eval_ret_ 687} 688 689test_run_ () { 690 test_cleanup=: 691 expecting_failure=$2 692 693 if test "${GIT_TEST_CHAIN_LINT:-1}" != 0; then 694 # turn off tracing for this test-eval, as it simply creates 695 # confusing noise in the "-x" output 696 trace_tmp=$trace 697 trace= 698 # 117 is magic because it is unlikely to match the exit 699 # code of other programs 700 if $(printf '%s\n' "$1" | sed -f "$GIT_BUILD_DIR/t/chainlint.sed" | grep -q '?![A-Z][A-Z]*?!') || 701 test "OK-117" != "$(test_eval_ "(exit 117) && $1${LF}${LF}echo OK-\$?" 3>&1)" 702 then 703 error "bug in the test script: broken &&-chain or run-away HERE-DOC: $1" 704 fi 705 trace=$trace_tmp 706 fi 707 708 setup_malloc_check 709 test_eval_ "$1" 710 eval_ret=$? 711 teardown_malloc_check 712 713 if test -z "$immediate" || test $eval_ret = 0 || 714 test -n "$expecting_failure" && test "$test_cleanup" != ":" 715 then 716 setup_malloc_check 717 test_eval_ "$test_cleanup" 718 teardown_malloc_check 719 fi 720 if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE" 721 then 722 echo "" 723 fi 724 return "$eval_ret" 725} 726 727test_start_ () { 728 test_count=$(($test_count+1)) 729 maybe_setup_verbose 730 maybe_setup_valgrind 731} 732 733test_finish_ () { 734 echo >&3 "" 735 maybe_teardown_valgrind 736 maybe_teardown_verbose 737} 738 739test_skip () { 740 to_skip= 741 skipped_reason= 742 if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS 743 then 744 to_skip=t 745 skipped_reason="GIT_SKIP_TESTS" 746 fi 747 if test -z "$to_skip" && test -n "$test_prereq" && 748 ! test_have_prereq "$test_prereq" 749 then 750 to_skip=t 751 752 of_prereq= 753 if test "$missing_prereq" != "$test_prereq" 754 then 755 of_prereq=" of $test_prereq" 756 fi 757 skipped_reason="missing $missing_prereq${of_prereq}" 758 fi 759 if test -z "$to_skip" && test -n "$run_list" && 760 ! match_test_selector_list '--run' $test_count "$run_list" 761 then 762 to_skip=t 763 skipped_reason="--run" 764 fi 765 766 case "$to_skip" in 767 t) 768 say_color skip >&3 "skipping test: $@" 769 say_color skip "ok $test_count # skip $1 ($skipped_reason)" 770 : true 771 ;; 772 *) 773 false 774 ;; 775 esac 776} 777 778# stub; perf-lib overrides it 779test_at_end_hook_ () { 780 : 781} 782 783test_done () { 784 GIT_EXIT_OK=t 785 786 if test -z "$HARNESS_ACTIVE" 787 then 788 test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" 789 mkdir -p "$test_results_dir" 790 base=${0##*/} 791 test_results_path="$test_results_dir/${base%.sh}.counts" 792 793 cat >"$test_results_path" <<-EOF 794 total $test_count 795 success $test_success 796 fixed $test_fixed 797 broken $test_broken 798 failed $test_failure 799 800 EOF 801 fi 802 803 if test "$test_fixed" != 0 804 then 805 say_color error "# $test_fixed known breakage(s) vanished; please update test(s)" 806 fi 807 if test "$test_broken" != 0 808 then 809 say_color warn "# still have $test_broken known breakage(s)" 810 fi 811 if test "$test_broken" != 0 || test "$test_fixed" != 0 812 then 813 test_remaining=$(( $test_count - $test_broken - $test_fixed )) 814 msg="remaining $test_remaining test(s)" 815 else 816 test_remaining=$test_count 817 msg="$test_count test(s)" 818 fi 819 case "$test_failure" in 820 0) 821 if test $test_external_has_tap -eq 0 822 then 823 if test $test_remaining -gt 0 824 then 825 say_color pass "# passed all $msg" 826 fi 827 828 # Maybe print SKIP message 829 test -z "$skip_all" || skip_all="# SKIP $skip_all" 830 case "$test_count" in 831 0) 832 say "1..$test_count${skip_all:+ $skip_all}" 833 ;; 834 *) 835 test -z "$skip_all" || 836 say_color warn "$skip_all" 837 say "1..$test_count" 838 ;; 839 esac 840 fi 841 842 if test -z "$debug" 843 then 844 test -d "$TRASH_DIRECTORY" || 845 error "Tests passed but trash directory already removed before test cleanup; aborting" 846 847 cd "$TRASH_DIRECTORY/.." && 848 rm -fr "$TRASH_DIRECTORY" || 849 error "Tests passed but test cleanup failed; aborting" 850 fi 851 test_at_end_hook_ 852 853 exit 0 ;; 854 855 *) 856 if test $test_external_has_tap -eq 0 857 then 858 say_color error "# failed $test_failure among $msg" 859 say "1..$test_count" 860 fi 861 862 exit 1 ;; 863 864 esac 865} 866 867if test -n "$valgrind" 868then 869 make_symlink () { 870 test -h "$2" && 871 test "$1" = "$(readlink "$2")" || { 872 # be super paranoid 873 if mkdir "$2".lock 874 then 875 rm -f "$2" && 876 ln -s "$1" "$2" && 877 rm -r "$2".lock 878 else 879 while test -d "$2".lock 880 do 881 say "Waiting for lock on $2." 882 sleep 1 883 done 884 fi 885 } 886 } 887 888 make_valgrind_symlink () { 889 # handle only executables, unless they are shell libraries that 890 # need to be in the exec-path. 891 test -x "$1" || 892 test "# " = "$(test_copy_bytes 2 <"$1")" || 893 return; 894 895 base=$(basename "$1") 896 case "$base" in 897 test-*) 898 symlink_target="$GIT_BUILD_DIR/t/helper/$base" 899 ;; 900 *) 901 symlink_target="$GIT_BUILD_DIR/$base" 902 ;; 903 esac 904 # do not override scripts 905 if test -x "$symlink_target" && 906 test ! -d "$symlink_target" && 907 test "#!" != "$(test_copy_bytes 2 <"$symlink_target")" 908 then 909 symlink_target=../valgrind.sh 910 fi 911 case "$base" in 912 *.sh|*.perl) 913 symlink_target=../unprocessed-script 914 esac 915 # create the link, or replace it if it is out of date 916 make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit 917 } 918 919 # override all git executables in TEST_DIRECTORY/.. 920 GIT_VALGRIND=$TEST_DIRECTORY/valgrind 921 mkdir -p "$GIT_VALGRIND"/bin 922 for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/t/helper/test-* 923 do 924 make_valgrind_symlink $file 925 done 926 # special-case the mergetools loadables 927 make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools" 928 OLDIFS=$IFS 929 IFS=: 930 for path in $PATH 931 do 932 ls "$path"/git-* 2> /dev/null | 933 while read file 934 do 935 make_valgrind_symlink "$file" 936 done 937 done 938 IFS=$OLDIFS 939 PATH=$GIT_VALGRIND/bin:$PATH 940 GIT_EXEC_PATH=$GIT_VALGRIND/bin 941 export GIT_VALGRIND 942 GIT_VALGRIND_MODE="$valgrind" 943 export GIT_VALGRIND_MODE 944 GIT_VALGRIND_ENABLED=t 945 test -n "$valgrind_only" && GIT_VALGRIND_ENABLED= 946 export GIT_VALGRIND_ENABLED 947elif test -n "$GIT_TEST_INSTALLED" 948then 949 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) || 950 error "Cannot run git from $GIT_TEST_INSTALLED." 951 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH 952 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} 953else # normal case, use ../bin-wrappers only unless $with_dashes: 954 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers" 955 if ! test -x "$git_bin_dir/git" 956 then 957 if test -z "$with_dashes" 958 then 959 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" 960 fi 961 with_dashes=t 962 fi 963 PATH="$git_bin_dir:$PATH" 964 GIT_EXEC_PATH=$GIT_BUILD_DIR 965 if test -n "$with_dashes" 966 then 967 PATH="$GIT_BUILD_DIR:$PATH" 968 fi 969fi 970GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt 971GIT_CONFIG_NOSYSTEM=1 972GIT_ATTR_NOSYSTEM=1 973export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM 974 975if test -z "$GIT_TEST_CMP" 976then 977 if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT" 978 then 979 GIT_TEST_CMP="$DIFF -c" 980 else 981 GIT_TEST_CMP="$DIFF -u" 982 fi 983fi 984 985GITPERLLIB="$GIT_BUILD_DIR"/perl/build/lib 986export GITPERLLIB 987test -d "$GIT_BUILD_DIR"/templates/blt || { 988 error "You haven't built things yet, have you?" 989} 990 991if ! test -x "$GIT_BUILD_DIR"/t/helper/test-tool 992then 993 echo >&2 'You need to build test-tool:' 994 echo >&2 'Run "make t/helper/test-tool" in the source (toplevel) directory' 995 exit 1 996fi 997 998# Test repository 999TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)"1000test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"1001case "$TRASH_DIRECTORY" in1002/*) ;; # absolute path is good1003 *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;;1004esac1005rm -fr "$TRASH_DIRECTORY" || {1006 GIT_EXIT_OK=t1007 echo >&5 "FATAL: Cannot prepare test area"1008 exit 11009}10101011HOME="$TRASH_DIRECTORY"1012GNUPGHOME="$HOME/gnupg-home-not-used"1013export HOME GNUPGHOME10141015if test -z "$TEST_NO_CREATE_REPO"1016then1017 test_create_repo "$TRASH_DIRECTORY"1018else1019 mkdir -p "$TRASH_DIRECTORY"1020fi1021# Use -P to resolve symlinks in our working directory so that the cwd1022# in subprocesses like git equals our $PWD (for pathname comparisons).1023cd -P "$TRASH_DIRECTORY" || exit 110241025this_test=${0##*/}1026this_test=${this_test%%-*}1027if match_pattern_list "$this_test" $GIT_SKIP_TESTS1028then1029 say_color info >&3 "skipping test $this_test altogether"1030 skip_all="skip all tests in $this_test"1031 test_done1032fi10331034# Provide an implementation of the 'yes' utility1035yes () {1036 if test $# = 01037 then1038 y=y1039 else1040 y="$*"1041 fi10421043 i=01044 while test $i -lt 991045 do1046 echo "$y"1047 i=$(($i+1))1048 done1049}10501051# Fix some commands on Windows1052uname_s=$(uname -s)1053case $uname_s in1054*MINGW*)1055 # Windows has its own (incompatible) sort and find1056 sort () {1057 /usr/bin/sort "$@"1058 }1059 find () {1060 /usr/bin/find "$@"1061 }1062 # git sees Windows-style pwd1063 pwd () {1064 builtin pwd -W1065 }1066 # no POSIX permissions1067 # backslashes in pathspec are converted to '/'1068 # exec does not inherit the PID1069 test_set_prereq MINGW1070 test_set_prereq NATIVE_CRLF1071 test_set_prereq SED_STRIPS_CR1072 test_set_prereq GREP_STRIPS_CR1073 GIT_TEST_CMP=mingw_test_cmp1074 ;;1075*CYGWIN*)1076 test_set_prereq POSIXPERM1077 test_set_prereq EXECKEEPSPID1078 test_set_prereq CYGWIN1079 test_set_prereq SED_STRIPS_CR1080 test_set_prereq GREP_STRIPS_CR1081 ;;1082*)1083 test_set_prereq POSIXPERM1084 test_set_prereq BSLASHPSPEC1085 test_set_prereq EXECKEEPSPID1086 ;;1087esac10881089( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_11090test -z "$NO_PERL" && test_set_prereq PERL1091test -z "$NO_PTHREADS" && test_set_prereq PTHREADS1092test -z "$NO_PYTHON" && test_set_prereq PYTHON1093test -n "$USE_LIBPCRE1$USE_LIBPCRE2" && test_set_prereq PCRE1094test -n "$USE_LIBPCRE1" && test_set_prereq LIBPCRE11095test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE21096test -z "$NO_GETTEXT" && test_set_prereq GETTEXT10971098# Can we rely on git's output in the C locale?1099if test -n "$GETTEXT_POISON"1100then1101 GIT_GETTEXT_POISON=YesPlease1102 export GIT_GETTEXT_POISON1103 test_set_prereq GETTEXT_POISON1104else1105 test_set_prereq C_LOCALE_OUTPUT1106fi11071108test_lazy_prereq PIPE '1109 # test whether the filesystem supports FIFOs1110 test_have_prereq !MINGW,!CYGWIN &&1111 rm -f testfifo && mkfifo testfifo1112'11131114test_lazy_prereq SYMLINKS '1115 # test whether the filesystem supports symbolic links1116 ln -s x y && test -h y1117'11181119test_lazy_prereq FILEMODE '1120 test "$(git config --bool core.filemode)" = true1121'11221123test_lazy_prereq CASE_INSENSITIVE_FS '1124 echo good >CamelCase &&1125 echo bad >camelcase &&1126 test "$(cat CamelCase)" != good1127'11281129test_lazy_prereq FUNNYNAMES '1130 test_have_prereq !MINGW &&1131 touch -- \1132 "FUNNYNAMES tab embedded" \1133 "FUNNYNAMES \"quote embedded\"" \1134 "FUNNYNAMES newline1135embedded" 2>/dev/null &&1136 rm -- \1137 "FUNNYNAMES tab embedded" \1138 "FUNNYNAMES \"quote embedded\"" \1139 "FUNNYNAMES newline1140embedded" 2>/dev/null1141'11421143test_lazy_prereq UTF8_NFD_TO_NFC '1144 # check whether FS converts nfd unicode to nfc1145 auml=$(printf "\303\244")1146 aumlcdiar=$(printf "\141\314\210")1147 >"$auml" &&1148 test -f "$aumlcdiar"1149'11501151test_lazy_prereq AUTOIDENT '1152 sane_unset GIT_AUTHOR_NAME &&1153 sane_unset GIT_AUTHOR_EMAIL &&1154 git var GIT_AUTHOR_IDENT1155'11561157test_lazy_prereq EXPENSIVE '1158 test -n "$GIT_TEST_LONG"1159'11601161test_lazy_prereq EXPENSIVE_ON_WINDOWS '1162 test_have_prereq EXPENSIVE || test_have_prereq !MINGW,!CYGWIN1163'11641165test_lazy_prereq USR_BIN_TIME '1166 test -x /usr/bin/time1167'11681169test_lazy_prereq NOT_ROOT '1170 uid=$(id -u) &&1171 test "$uid" != 01172'11731174test_lazy_prereq JGIT '1175 type jgit1176'11771178# SANITY is about "can you correctly predict what the filesystem would1179# do by only looking at the permission bits of the files and1180# directories?" A typical example of !SANITY is running the test1181# suite as root, where a test may expect "chmod -r file && cat file"1182# to fail because file is supposed to be unreadable after a successful1183# chmod. In an environment (i.e. combination of what filesystem is1184# being used and who is running the tests) that lacks SANITY, you may1185# be able to delete or create a file when the containing directory1186# doesn't have write permissions, or access a file even if the1187# containing directory doesn't have read or execute permissions.11881189test_lazy_prereq SANITY '1190 mkdir SANETESTD.1 SANETESTD.2 &&11911192 chmod +w SANETESTD.1 SANETESTD.2 &&1193 >SANETESTD.1/x 2>SANETESTD.2/x &&1194 chmod -w SANETESTD.1 &&1195 chmod -r SANETESTD.1/x &&1196 chmod -rx SANETESTD.2 ||1197 error "bug in test sript: cannot prepare SANETESTD"11981199 ! test -r SANETESTD.1/x &&1200 ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x1201 status=$?12021203 chmod +rwx SANETESTD.1 SANETESTD.2 &&1204 rm -rf SANETESTD.1 SANETESTD.2 ||1205 error "bug in test sript: cannot clean SANETESTD"1206 return $status1207'12081209test FreeBSD != $uname_s || GIT_UNZIP=${GIT_UNZIP:-/usr/local/bin/unzip}1210GIT_UNZIP=${GIT_UNZIP:-unzip}1211test_lazy_prereq UNZIP '1212 "$GIT_UNZIP" -v1213 test $? -ne 1271214'12151216run_with_limited_cmdline () {1217 (ulimit -s 128 && "$@")1218}12191220test_lazy_prereq CMDLINE_LIMIT '1221 test_have_prereq !MINGW,!CYGWIN &&1222 run_with_limited_cmdline true1223'12241225run_with_limited_stack () {1226 (ulimit -s 128 && "$@")1227}12281229test_lazy_prereq ULIMIT_STACK_SIZE '1230 test_have_prereq !MINGW,!CYGWIN &&1231 run_with_limited_stack true1232'12331234build_option () {1235 git version --build-options |1236 sed -ne "s/^$1: //p"1237}12381239test_lazy_prereq LONG_IS_64BIT '1240 test 8 -le "$(build_option sizeof-long)"1241'12421243test_lazy_prereq TIME_IS_64BIT 'test-tool date is64bit'1244test_lazy_prereq TIME_T_IS_64BIT 'test-tool date time_t-is64bit'12451246test_lazy_prereq CURL '1247 curl --version1248'12491250# SHA1 is a test if the hash algorithm in use is SHA-1. This is both for tests1251# which will not work with other hash algorithms and tests that work but don't1252# test anything meaningful (e.g. special values which cause short collisions).1253test_lazy_prereq SHA1 '1254 test $(git hash-object /dev/null) = e69de29bb2d1d6434b8b29ae775ad8c2e48c53911255'