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. 20iftest -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)||exit1 30fi 31iftest -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 55iftest $? !=1 56then 57echo>&2'error: you do not seem to have built git yet.' 58exit1 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 '*) 71mkdir-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 77export 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; 84echo $? >"$BASE.exit") |tee-a"$GIT_TEST_TEE_OUTPUT_FILE" 85test"$(cat "$BASE.exit")"=0 86exit 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 137iftest -n"${TEST_GIT_INDEX_VERSION:+isset}" 138then 139 GIT_INDEX_VERSION="$TEST_GIT_INDEX_VERSION" 140export GIT_INDEX_VERSION 141fi 142 143# Add libc MALLOC and MALLOC_PERTURB test 144# only if we are not executing the test with valgrind 145ifexpr"$GIT_TEST_OPTS":".* --valgrind ">/dev/null || 146test -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 157export MALLOC_CHECK_ MALLOC_PERTURB_ 158} 159 teardown_malloc_check () { 160unset 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"&& ( 207test -t1&& 208tput bold >/dev/null 2>&1&& 209tput setaf 1>/dev/null 2>&1&& 210tput sgr0 >/dev/null 2>&1 211) && 212 color=t 213 214whiletest"$#"-ne0 215do 216case"$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) 224shift;test"$#"-ne0|| { 225echo'error: -r requires an argument'>&2; 226exit1; 227} 228 run_list=$1;shift;; 229--run=*) 230 run_list=${1#--*=};shift;; 231-h|--h|--he|--hel|--help) 232help=t;shift;; 233-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 234 verbose=t;shift;; 235--verbose-only=*) 236 verbose_only=${1#--*=} 237shift;; 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. 241test -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 248shift;; 249--valgrind=*) 250 valgrind=${1#--*=} 251shift;; 252--valgrind-only=*) 253 valgrind_only=${1#--*=} 254shift;; 255--tee) 256shift;;# was handled already 257--root=*) 258 root=${1#--*=} 259shift;; 260--chain-lint) 261 GIT_TEST_CHAIN_LINT=1 262shift;; 263--no-chain-lint) 264 GIT_TEST_CHAIN_LINT=0 265shift;; 266-x) 267 trace=t 268shift;; 269--verbose-log) 270 verbose_log=t 271shift;; 272*) 273echo"error: unknown test option '$1'">&2;exit1;; 274esac 275done 276 277iftest -n"$valgrind_only" 278then 279test -z"$valgrind"&& valgrind=memcheck 280test -z"$verbose"&& verbose_only="$valgrind_only" 281eliftest -n"$valgrind" 282then 283test -z"$verbose_log"&& verbose=t 284fi 285 286iftest -n"$trace"&&test -z"$verbose_log" 287then 288 verbose=t 289fi 290 291iftest -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 () { 313test -z"$1"&&test -n"$quiet"&&return 314eval"say_color_color=\$say_color_$1" 315shift 316printf"%s\\n""$say_color_color$*$say_color_reset" 317} 318else 319 say_color() { 320test -z"$1"&&test -n"$quiet"&&return 321shift 322printf"%s\n""$*" 323} 324fi 325 326TERM=dumb 327export TERM 328 329error () { 330 say_color error "error: $*" 331 GIT_EXIT_OK=t 332exit1 333} 334 335say () { 336 say_color info "$*" 337} 338 339iftest -n"$HARNESS_ACTIVE" 340then 341iftest"$verbose"= t ||test -n"$verbose_only" 342then 343printf'Bail out! %s\n' \ 344'verbose mode forbidden under TAP harness; try --verbose-log' 345exit1 346fi 347fi 348 349test"${test_description}"!=""|| 350error "Test script did not set test_description." 351 352iftest"$help"="t" 353then 354printf'%s\n'"$test_description" 355exit0 356fi 357 358exec5>&1 359exec6<&0 360exec7>&2 361iftest"$verbose_log"="t" 362then 363exec3>>"$GIT_TEST_TEE_OUTPUT_FILE"4>&3 364eliftest"$verbose"="t" 365then 366exec4>&2 3>&1 367else 368exec4>/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=$? 394iftest -n"$GIT_EXIT_OK" 395then 396exit$code 397else 398echo>&5"FATAL: Unexpected exit with code$code" 399exit1 400fi 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" 422shift 423printf'%s\n'"$*"|sed-e's/^/# /' 424test"$immediate"=""|| { GIT_EXIT_OK=t;exit1; } 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 () { 438test"$debug"=""||eval"$1" 439} 440 441match_pattern_list () { 442 arg="$1" 443shift 444test -z"$*"&&return1 445for pattern_ 446do 447case"$arg"in 448$pattern_) 449return0 450esac 451done 452return1 453} 454 455match_test_selector_list () { 456 title="$1" 457shift 458 arg="$1" 459shift 460test -z"$1"&&return0 461 462# Both commas and whitespace are accepted as separators. 463 OLDIFS=$IFS 464 IFS=' ,' 465set --$1 466 IFS=$OLDIFS 467 468# If the first selector is negative we include by default. 469 include= 470case"$1"in 471!*) include=t ;; 472esac 473 474for selector 475do 476 orig_selector=$selector 477 478 positive=t 479case"$selector"in 480!*) 481 positive= 482 selector=${selector##?} 483;; 484esac 485 486test -z"$selector"&&continue 487 488case"$selector"in 489*-*) 490ifexpr"z${selector%%-*}":"z[0-9]*[^0-9]">/dev/null 491then 492echo"error:$title: invalid non-numeric in range" \ 493"start: '$orig_selector'">&2 494exit1 495fi 496ifexpr"z${selector#*-}":"z[0-9]*[^0-9]">/dev/null 497then 498echo"error:$title: invalid non-numeric in range" \ 499"end: '$orig_selector'">&2 500exit1 501fi 502;; 503*) 504ifexpr"z$selector":"z[0-9]*[^0-9]">/dev/null 505then 506echo"error:$title: invalid non-numeric in test" \ 507"selector: '$orig_selector'">&2 508exit1 509fi 510esac 511 512# Short cut for "obvious" cases 513test -z"$include"&&test -z"$positive"&&continue 514test -n"$include"&&test -n"$positive"&&continue 515 516case"$selector"in 517-*) 518iftest$arg-le${selector#-} 519then 520 include=$positive 521fi 522;; 523*-) 524iftest$arg-ge${selector%-} 525then 526 include=$positive 527fi 528;; 529*-*) 530iftest${selector%%-*}-le$arg \ 531&&test$arg-le${selector#*-} 532then 533 include=$positive 534fi 535;; 536*) 537iftest$arg-eq$selector 538then 539 include=$positive 540fi 541;; 542esac 543done 544 545test -n"$include" 546} 547 548maybe_teardown_verbose () { 549test -z"$verbose_only"&&return 550exec4>/dev/null 3>/dev/null 551 verbose= 552} 553 554last_verbose=t 555maybe_setup_verbose () { 556test -z"$verbose_only"&&return 557if match_pattern_list $test_count $verbose_only 558then 559exec4>&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. 565test -z"$last_verbose"&&echo>&3"" 566 verbose=t 567else 568exec4>/dev/null 3>/dev/null 569 verbose= 570fi 571 last_verbose=$verbose 572} 573 574maybe_teardown_valgrind () { 575test -z"$GIT_VALGRIND"&&return 576 GIT_VALGRIND_ENABLED= 577} 578 579maybe_setup_valgrind () { 580test -z"$GIT_VALGRIND"&&return 581iftest -z"$valgrind_only" 582then 583 GIT_VALGRIND_ENABLED=t 584return 585fi 586 GIT_VALGRIND_ENABLED= 587if match_pattern_list $test_count $valgrind_only 588then 589 GIT_VALGRIND_ENABLED=t 590fi 591} 592 593want_trace () { 594test"$trace"= t && { 595test"$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 '$*' 605eval" 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_=$? 635if want_trace 636then 637set+x 638fi 639}2>/dev/null 4>&2 640 641iftest"$test_eval_ret_"!=0&& want_trace 642then 643 say_color error >&4"error: last command exited with \$?=$test_eval_ret_" 644fi 645return$test_eval_ret_ 646} 647 648test_run_ () { 649 test_cleanup=: 650 expecting_failure=$2 651 652iftest"${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 659iftest"OK-117"!="$(test_eval_ "(exit 117)&&$1${LF}${LF}echo OK-\$?"3>&1)" 660 then 661 error "bug in the testscript: 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;; 733esac 734} 735 736# stub; perf-lib overrides it 737test_at_end_hook_ () { 738: 739} 740 741test_done () { 742 GIT_EXIT_OK=t 743 744iftest -z"$HARNESS_ACTIVE" 745then 746 test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" 747mkdir-p"$test_results_dir" 748 base=${0##*/} 749 test_results_path="$test_results_dir/${base%.sh}.counts" 750 751cat>"$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 759fi 760 761iftest"$test_fixed"!=0 762then 763 say_color error "#$test_fixedknown breakage(s) vanished; please update test(s)" 764fi 765iftest"$test_broken"!=0 766then 767 say_color warn "# still have$test_brokenknown breakage(s)" 768fi 769iftest"$test_broken"!=0||test"$test_fixed"!=0 770then 771 test_remaining=$(( $test_count - $test_broken - $test_fixed )) 772 msg="remaining$test_remainingtest(s)" 773else 774 test_remaining=$test_count 775 msg="$test_counttest(s)" 776fi 777case"$test_failure"in 7780) 779iftest$test_external_has_tap-eq0 780then 781iftest$test_remaining-gt0 782then 783 say_color pass "# passed all$msg" 784fi 785 786# Maybe print SKIP message 787test -z"$skip_all"|| skip_all="# SKIP$skip_all" 788case"$test_count"in 7890) 790 say "1..$test_count${skip_all:+ $skip_all}" 791;; 792*) 793test -z"$skip_all"|| 794 say_color warn "$skip_all" 795 say "1..$test_count" 796;; 797esac 798fi 799 800iftest -z"$debug" 801then 802test -d"$TRASH_DIRECTORY"|| 803 error "Tests passed but trash directory already removed before test cleanup; aborting" 804 805cd"$TRASH_DIRECTORY/.."&& 806rm-fr"$TRASH_DIRECTORY"|| 807 error "Tests passed but test cleanup failed; aborting" 808fi 809 test_at_end_hook_ 810 811exit0;; 812 813*) 814iftest$test_external_has_tap-eq0 815then 816 say_color error "# failed$test_failureamong$msg" 817 say "1..$test_count" 818fi 819 820exit1;; 821 822esac 823} 824 825iftest -n"$valgrind" 826then 827 make_symlink () { 828test -h"$2"&& 829test"$1"="$(readlink "$2")"|| { 830# be super paranoid 831ifmkdir"$2".lock 832then 833rm-f"$2"&& 834ln-s"$1""$2"&& 835rm-r"$2".lock 836else 837whiletest -d"$2".lock 838do 839 say "Waiting for lock on$2." 840sleep1 841done 842fi 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. 849test -x"$1"|| 850test"# "="$(head -c 2 <"$1")"|| 851return; 852 853 base=$(basename "$1") 854case"$base"in 855test-*) 856 symlink_target="$GIT_BUILD_DIR/t/helper/$base" 857;; 858*) 859 symlink_target="$GIT_BUILD_DIR/$base" 860;; 861esac 862# do not override scripts 863iftest -x"$symlink_target"&& 864test!-d"$symlink_target"&& 865test"#!"!="$(head -c 2 < "$symlink_target")" 866then 867 symlink_target=../valgrind.sh 868fi 869case"$base"in 870*.sh|*.perl) 871 symlink_target=../unprocessed-script 872esac 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 879mkdir-p"$GIT_VALGRIND"/bin 880forfilein$GIT_BUILD_DIR/git*$GIT_BUILD_DIR/t/helper/test-* 881do 882 make_valgrind_symlink $file 883done 884# special-case the mergetools loadables 885 make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools" 886 OLDIFS=$IFS 887 IFS=: 888for path in$PATH 889do 890ls"$path"/git-*2> /dev/null | 891whilereadfile 892do 893 make_valgrind_symlink "$file" 894done 895done 896 IFS=$OLDIFS 897 PATH=$GIT_VALGRIND/bin:$PATH 898 GIT_EXEC_PATH=$GIT_VALGRIND/bin 899export GIT_VALGRIND 900 GIT_VALGRIND_MODE="$valgrind" 901export GIT_VALGRIND_MODE 902 GIT_VALGRIND_ENABLED=t 903test -n"$valgrind_only"&& GIT_VALGRIND_ENABLED= 904export GIT_VALGRIND_ENABLED 905eliftest -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" 913if!test -x"$git_bin_dir/git" 914then 915iftest -z"$with_dashes" 916then 917 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" 918fi 919 with_dashes=t 920fi 921 PATH="$git_bin_dir:$PATH" 922 GIT_EXEC_PATH=$GIT_BUILD_DIR 923iftest -n"$with_dashes" 924then 925 PATH="$GIT_BUILD_DIR:$PATH" 926fi 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 933iftest -z"$GIT_TEST_CMP" 934then 935iftest -n"$GIT_TEST_CMP_USE_COPIED_CONTEXT" 936then 937 GIT_TEST_CMP="$DIFF-c" 938else 939 GIT_TEST_CMP="$DIFF-u" 940fi 941fi 942 943GITPERLLIB="$GIT_BUILD_DIR"/perl/build/lib 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 951echo>&2'You need to build test-chmtime:' 952echo>&2'Run "make t/helper/test-chmtime" in the source (toplevel) directory' 953exit1 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 965echo>&5"FATAL: Cannot prepare test area" 966exit1 967} 968 969HOME="$TRASH_DIRECTORY" 970GNUPGHOME="$HOME/gnupg-home-not-used" 971export HOME GNUPGHOME 972 973iftest -z"$TEST_NO_CREATE_REPO" 974then 975 test_create_repo "$TRASH_DIRECTORY" 976else 977mkdir-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"||exit1 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_testaltogether" 988 skip_all="skip all tests in$this_test" 989 test_done 990fi 991 992# Provide an implementation of the 'yes' utility 993yes() { 994iftest$#=0 995then 996 y=y 997else 998 y="$*" 999fi10001001 i=01002whiletest$i-lt991003do1004echo"$y"1005 i=$(($i+1))1006done1007}10081009# Fix some commands on Windows1010uname_s=$(uname -s)1011case$uname_sin1012*MINGW*)1013# Windows has its own (incompatible) sort and find1014sort() {1015/usr/bin/sort"$@"1016}1017find() {1018/usr/bin/find"$@"1019}1020# git sees Windows-style pwd1021pwd() {1022builtin 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?1057iftest -n"$GETTEXT_POISON"1058then1059 GIT_GETTEXT_POISON=YesPlease1060export 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 EXPENSIVE_ON_WINDOWS '1111 test_have_prereq EXPENSIVE || test_have_prereq !MINGW,!CYGWIN1112'11131114test_lazy_prereq USR_BIN_TIME '1115 test -x /usr/bin/time1116'11171118test_lazy_prereq NOT_ROOT '1119 uid=$(id -u)&&1120 test "$uid" != 01121'11221123test_lazy_prereq JGIT '1124 type jgit1125'11261127# SANITY is about "can you correctly predict what the filesystem would1128# do by only looking at the permission bits of the files and1129# directories?" A typical example of !SANITY is running the test1130# suite as root, where a test may expect "chmod -r file && cat file"1131# to fail because file is supposed to be unreadable after a successful1132# chmod. In an environment (i.e. combination of what filesystem is1133# being used and who is running the tests) that lacks SANITY, you may1134# be able to delete or create a file when the containing directory1135# doesn't have write permissions, or access a file even if the1136# containing directory doesn't have read or execute permissions.11371138test_lazy_prereq SANITY '1139 mkdir SANETESTD.1 SANETESTD.2 &&11401141 chmod +w SANETESTD.1 SANETESTD.2 &&1142 >SANETESTD.1/x 2>SANETESTD.2/x &&1143 chmod -w SANETESTD.1 &&1144 chmod -r SANETESTD.1/x &&1145 chmod -rx SANETESTD.2 ||1146 error "bug in test sript: cannot prepare SANETESTD"11471148 ! test -r SANETESTD.1/x &&1149 ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x1150 status=$?11511152 chmod +rwx SANETESTD.1 SANETESTD.2 &&1153 rm -rf SANETESTD.1 SANETESTD.2 ||1154 error "bug in test sript: cannot clean SANETESTD"1155 return$status1156'11571158test FreeBSD !=$uname_s|| GIT_UNZIP=${GIT_UNZIP:-/usr/local/bin/unzip}1159GIT_UNZIP=${GIT_UNZIP:-unzip}1160test_lazy_prereq UNZIP '1161 "$GIT_UNZIP" -v1162 test $? -ne 1271163'11641165run_with_limited_cmdline () {1166(ulimit -s128&&"$@")1167}11681169test_lazy_prereq CMDLINE_LIMIT '1170 test_have_prereq !MINGW,!CYGWIN &&1171 run_with_limited_cmdline true1172'11731174run_with_limited_stack () {1175(ulimit -s128&&"$@")1176}11771178test_lazy_prereq ULIMIT_STACK_SIZE '1179 test_have_prereq !MINGW,!CYGWIN &&1180 run_with_limited_stack true1181'11821183build_option () {1184 git version --build-options|1185sed-ne"s/^$1: //p"1186}11871188test_lazy_prereq LONG_IS_64BIT '1189 test 8 -le "$(build_option sizeof-long)"1190'11911192test_lazy_prereq TIME_IS_64BIT 'test-date is64bit'1193test_lazy_prereq TIME_T_IS_64BIT 'test-date time_t-is64bit'