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################################################################ 48# It appears that people try to run tests without building... 49"$GIT_BUILD_DIR/git">/dev/null 50iftest $? !=1 51then 52echo>&2'error: you do not seem to have built git yet.' 53exit1 54fi 55 56. "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS 57export PERL_PATH SHELL_PATH 58 59# if --tee was passed, write the output not only to the terminal, but 60# additionally to the file test-results/$BASENAME.out, too. 61case"$GIT_TEST_TEE_STARTED, $* "in 62done,*) 63# do not redirect again 64;; 65*' --tee '*|*' --va'*|*' --verbose-log '*) 66mkdir-p"$TEST_OUTPUT_DIRECTORY/test-results" 67 BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)" 68 69# Make this filename available to the sub-process in case it is using 70# --verbose-log. 71 GIT_TEST_TEE_OUTPUT_FILE=$BASE.out 72export GIT_TEST_TEE_OUTPUT_FILE 73 74# Truncate before calling "tee -a" to get rid of the results 75# from any previous runs. 76>"$GIT_TEST_TEE_OUTPUT_FILE" 77 78(GIT_TEST_TEE_STARTED=done${SHELL_PATH}"$0""$@"2>&1; 79echo $? >"$BASE.exit") |tee-a"$GIT_TEST_TEE_OUTPUT_FILE" 80test"$(cat "$BASE.exit")"=0 81exit 82;; 83esac 84 85# For repeatability, reset the environment to known value. 86# TERM is sanitized below, after saving color control sequences. 87LANG=C 88LC_ALL=C 89PAGER=cat 90TZ=UTC 91export LANG LC_ALL PAGER TZ 92EDITOR=: 93# A call to "unset" with no arguments causes at least Solaris 10 94# /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets 95# deriving from the command substitution clustered with the other 96# ones. 97unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH"-e' 98 my @env = keys %ENV; 99 my$ok= join("|", qw( 100 TRACE 101 DEBUG 102 USE_LOOKUP 103 TEST 104 .*_TEST 105 PROVE 106 VALGRIND 107 UNZIP 108 PERF_ 109 CURL_VERBOSE 110 TRACE_CURL 111 )); 112 my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env); 113 print join("\n", @vars); 114') 115unset XDG_CONFIG_HOME 116unset GITPERLLIB 117GIT_AUTHOR_EMAIL=author@example.com 118GIT_AUTHOR_NAME='A U Thor' 119GIT_COMMITTER_EMAIL=committer@example.com 120GIT_COMMITTER_NAME='C O Mitter' 121GIT_MERGE_VERBOSITY=5 122GIT_MERGE_AUTOEDIT=no 123export GIT_MERGE_VERBOSITY GIT_MERGE_AUTOEDIT 124export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME 125export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME 126export EDITOR 127 128# Tests using GIT_TRACE typically don't want <timestamp> <file>:<line> output 129GIT_TRACE_BARE=1 130export GIT_TRACE_BARE 131 132iftest -n"${TEST_GIT_INDEX_VERSION:+isset}" 133then 134 GIT_INDEX_VERSION="$TEST_GIT_INDEX_VERSION" 135export GIT_INDEX_VERSION 136fi 137 138# Add libc MALLOC and MALLOC_PERTURB test 139# only if we are not executing the test with valgrind 140ifexpr"$GIT_TEST_OPTS":".* --valgrind ">/dev/null || 141test -n"$TEST_NO_MALLOC_CHECK" 142then 143 setup_malloc_check () { 144: nothing 145} 146 teardown_malloc_check () { 147: nothing 148} 149else 150 setup_malloc_check () { 151 MALLOC_CHECK_=3 MALLOC_PERTURB_=165 152export MALLOC_CHECK_ MALLOC_PERTURB_ 153} 154 teardown_malloc_check () { 155unset MALLOC_CHECK_ MALLOC_PERTURB_ 156} 157fi 158 159# Protect ourselves from common misconfiguration to export 160# CDPATH into the environment 161unset CDPATH 162 163unset GREP_OPTIONS 164unset UNZIP 165 166case$(echo $GIT_TRACE |tr "[A-Z]" "[a-z]")in 1671|2|true) 168 GIT_TRACE=4 169;; 170esac 171 172# Convenience 173# 174# A regexp to match 5 and 40 hexdigits 175_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' 176_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05" 177 178# Zero SHA-1 179_z40=0000000000000000000000000000000000000000 180 181EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904 182EMPTY_BLOB=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 183 184# Line feed 185LF=' 186' 187 188# UTF-8 ZERO WIDTH NON-JOINER, which HFS+ ignores 189# when case-folding filenames 190u200c=$(printf '\342\200\214') 191 192export _x05 _x40 _z40 LF u200c EMPTY_TREE EMPTY_BLOB 193 194# Each test should start with something like this, after copyright notices: 195# 196# test_description='Description of this test... 197# This test checks if command xyzzy does the right thing... 198# ' 199# . ./test-lib.sh 200test"x$TERM"!="xdumb"&& ( 201test -t1&& 202tput bold >/dev/null 2>&1&& 203tput setaf 1>/dev/null 2>&1&& 204tput sgr0 >/dev/null 2>&1 205) && 206 color=t 207 208whiletest"$#"-ne0 209do 210case"$1"in 211-d|--d|--de|--deb|--debu|--debug) 212 debug=t;shift;; 213-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 214 immediate=t;shift;; 215-l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests) 216 GIT_TEST_LONG=t;export GIT_TEST_LONG;shift;; 217-r) 218shift;test"$#"-ne0|| { 219echo'error: -r requires an argument'>&2; 220exit1; 221} 222 run_list=$1;shift;; 223--run=*) 224 run_list=${1#--*=};shift;; 225-h|--h|--he|--hel|--help) 226help=t;shift;; 227-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 228 verbose=t;shift;; 229--verbose-only=*) 230 verbose_only=${1#--*=} 231shift;; 232-q|--q|--qu|--qui|--quie|--quiet) 233# Ignore --quiet under a TAP::Harness. Saying how many tests 234# passed without the ok/not ok details is always an error. 235test -z"$HARNESS_ACTIVE"&& quiet=t;shift;; 236--with-dashes) 237 with_dashes=t;shift;; 238--no-color) 239 color=;shift;; 240--va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind) 241 valgrind=memcheck 242shift;; 243--valgrind=*) 244 valgrind=${1#--*=} 245shift;; 246--valgrind-only=*) 247 valgrind_only=${1#--*=} 248shift;; 249--tee) 250shift;;# was handled already 251--root=*) 252 root=${1#--*=} 253shift;; 254--chain-lint) 255 GIT_TEST_CHAIN_LINT=1 256shift;; 257--no-chain-lint) 258 GIT_TEST_CHAIN_LINT=0 259shift;; 260-x) 261 trace=t 262 verbose=t 263shift;; 264--verbose-log) 265 verbose_log=t 266shift;; 267*) 268echo"error: unknown test option '$1'">&2;exit1;; 269esac 270done 271 272iftest -n"$valgrind_only" 273then 274test -z"$valgrind"&& valgrind=memcheck 275test -z"$verbose"&& verbose_only="$valgrind_only" 276eliftest -n"$valgrind" 277then 278 verbose=t 279fi 280 281iftest -n"$color" 282then 283# Save the color control sequences now rather than run tput 284# each time say_color() is called. This is done for two 285# reasons: 286# * TERM will be changed to dumb 287# * HOME will be changed to a temporary directory and tput 288# might need to read ~/.terminfo from the original HOME 289# directory to get the control sequences 290# Note: This approach assumes the control sequences don't end 291# in a newline for any terminal of interest (command 292# substitutions strip trailing newlines). Given that most 293# (all?) terminals in common use are related to ECMA-48, this 294# shouldn't be a problem. 295 say_color_error=$(tput bold; tput setaf 1)# bold red 296 say_color_skip=$(tput setaf 4)# blue 297 say_color_warn=$(tput setaf 3)# brown/yellow 298 say_color_pass=$(tput setaf 2)# green 299 say_color_info=$(tput setaf 6)# cyan 300 say_color_reset=$(tput sgr0) 301 say_color_=""# no formatting for normal text 302 say_color () { 303test -z"$1"&&test -n"$quiet"&&return 304eval"say_color_color=\$say_color_$1" 305shift 306printf"%s\\n""$say_color_color$*$say_color_reset" 307} 308else 309 say_color() { 310test -z"$1"&&test -n"$quiet"&&return 311shift 312printf"%s\n""$*" 313} 314fi 315 316TERM=dumb 317export TERM 318 319error () { 320 say_color error "error: $*" 321 GIT_EXIT_OK=t 322exit1 323} 324 325say () { 326 say_color info "$*" 327} 328 329iftest -n"$HARNESS_ACTIVE" 330then 331iftest"$verbose"= t ||test -n"$verbose_only" 332then 333printf'Bail out! %s\n' \ 334'verbose mode forbidden under TAP harness; try --verbose-log' 335exit1 336fi 337fi 338 339test"${test_description}"!=""|| 340error "Test script did not set test_description." 341 342iftest"$help"="t" 343then 344printf'%s\n'"$test_description" 345exit0 346fi 347 348exec5>&1 349exec6<&0 350exec7>&2 351iftest"$verbose_log"="t" 352then 353exec3>>"$GIT_TEST_TEE_OUTPUT_FILE"4>&3 354eliftest"$verbose"="t" 355then 356exec4>&2 3>&1 357else 358exec4>/dev/null 3>/dev/null 359fi 360 361# Send any "-x" output directly to stderr to avoid polluting tests 362# which capture stderr. We can do this unconditionally since it 363# has no effect if tracing isn't turned on. 364# 365# Note that this sets up the trace fd as soon as we assign the variable, so it 366# must come after the creation of descriptor 4 above. Likewise, we must never 367# unset this, as it has the side effect of closing descriptor 4, which we 368# use to show verbose tests to the user. 369# 370# Note also that we don't need or want to export it. The tracing is local to 371# this shell, and we would not want to influence any shells we exec. 372BASH_XTRACEFD=4 373 374test_failure=0 375test_count=0 376test_fixed=0 377test_broken=0 378test_success=0 379 380test_external_has_tap=0 381 382die () { 383 code=$? 384iftest -n"$GIT_EXIT_OK" 385then 386exit$code 387else 388echo>&5"FATAL: Unexpected exit with code$code" 389exit1 390fi 391} 392 393GIT_EXIT_OK= 394trap'die' EXIT 395trap'exit $?' INT 396 397# The user-facing functions are loaded from a separate file so that 398# test_perf subshells can have them too 399. "$TEST_DIRECTORY/test-lib-functions.sh" 400 401# You are not expected to call test_ok_ and test_failure_ directly, use 402# the test_expect_* functions instead. 403 404test_ok_ () { 405 test_success=$(($test_success + 1)) 406 say_color """ok$test_count- $@" 407} 408 409test_failure_ () { 410 test_failure=$(($test_failure + 1)) 411 say_color error "not ok$test_count-$1" 412shift 413printf'%s\n'"$*"|sed-e's/^/# /' 414test"$immediate"=""|| { GIT_EXIT_OK=t;exit1; } 415} 416 417test_known_broken_ok_ () { 418 test_fixed=$(($test_fixed+1)) 419 say_color error "ok$test_count- $@ # TODO known breakage vanished" 420} 421 422test_known_broken_failure_ () { 423 test_broken=$(($test_broken+1)) 424 say_color warn "not ok$test_count- $@ # TODO known breakage" 425} 426 427test_debug () { 428test"$debug"=""||eval"$1" 429} 430 431match_pattern_list () { 432 arg="$1" 433shift 434test -z"$*"&&return1 435for pattern_ 436do 437case"$arg"in 438$pattern_) 439return0 440esac 441done 442return1 443} 444 445match_test_selector_list () { 446 title="$1" 447shift 448 arg="$1" 449shift 450test -z"$1"&&return0 451 452# Both commas and whitespace are accepted as separators. 453 OLDIFS=$IFS 454 IFS=' ,' 455set --$1 456 IFS=$OLDIFS 457 458# If the first selector is negative we include by default. 459 include= 460case"$1"in 461!*) include=t ;; 462esac 463 464for selector 465do 466 orig_selector=$selector 467 468 positive=t 469case"$selector"in 470!*) 471 positive= 472 selector=${selector##?} 473;; 474esac 475 476test -z"$selector"&&continue 477 478case"$selector"in 479*-*) 480ifexpr"z${selector%%-*}":"z[0-9]*[^0-9]">/dev/null 481then 482echo"error:$title: invalid non-numeric in range" \ 483"start: '$orig_selector'">&2 484exit1 485fi 486ifexpr"z${selector#*-}":"z[0-9]*[^0-9]">/dev/null 487then 488echo"error:$title: invalid non-numeric in range" \ 489"end: '$orig_selector'">&2 490exit1 491fi 492;; 493*) 494ifexpr"z$selector":"z[0-9]*[^0-9]">/dev/null 495then 496echo"error:$title: invalid non-numeric in test" \ 497"selector: '$orig_selector'">&2 498exit1 499fi 500esac 501 502# Short cut for "obvious" cases 503test -z"$include"&&test -z"$positive"&&continue 504test -n"$include"&&test -n"$positive"&&continue 505 506case"$selector"in 507-*) 508iftest$arg-le${selector#-} 509then 510 include=$positive 511fi 512;; 513*-) 514iftest$arg-ge${selector%-} 515then 516 include=$positive 517fi 518;; 519*-*) 520iftest${selector%%-*}-le$arg \ 521&&test$arg-le${selector#*-} 522then 523 include=$positive 524fi 525;; 526*) 527iftest$arg-eq$selector 528then 529 include=$positive 530fi 531;; 532esac 533done 534 535test -n"$include" 536} 537 538maybe_teardown_verbose () { 539test -z"$verbose_only"&&return 540exec4>/dev/null 3>/dev/null 541 verbose= 542} 543 544last_verbose=t 545maybe_setup_verbose () { 546test -z"$verbose_only"&&return 547if match_pattern_list $test_count $verbose_only 548then 549exec4>&2 3>&1 550# Emit a delimiting blank line when going from 551# non-verbose to verbose. Within verbose mode the 552# delimiter is printed by test_expect_*. The choice 553# of the initial $last_verbose is such that before 554# test 1, we do not print it. 555test -z"$last_verbose"&&echo>&3"" 556 verbose=t 557else 558exec4>/dev/null 3>/dev/null 559 verbose= 560fi 561 last_verbose=$verbose 562} 563 564maybe_teardown_valgrind () { 565test -z"$GIT_VALGRIND"&&return 566 GIT_VALGRIND_ENABLED= 567} 568 569maybe_setup_valgrind () { 570test -z"$GIT_VALGRIND"&&return 571iftest -z"$valgrind_only" 572then 573 GIT_VALGRIND_ENABLED=t 574return 575fi 576 GIT_VALGRIND_ENABLED= 577if match_pattern_list $test_count $valgrind_only 578then 579 GIT_VALGRIND_ENABLED=t 580fi 581} 582 583want_trace () { 584test"$trace"= t &&test"$verbose"= t 585} 586 587# This is a separate function because some tests use 588# "return" to end a test_expect_success block early 589# (and we want to make sure we run any cleanup like 590# "set +x"). 591test_eval_inner_ () { 592# Do not add anything extra (including LF) after '$*' 593eval" 594 want_trace && set -x 595 $*" 596} 597 598test_eval_ () { 599# We run this block with stderr redirected to avoid extra cruft 600# during a "-x" trace. Once in "set -x" mode, we cannot prevent 601# the shell from printing the "set +x" to turn it off (nor the saving 602# of $? before that). But we can make sure that the output goes to 603# /dev/null. 604# 605# The test itself is run with stderr put back to &4 (so either to 606# /dev/null, or to the original stderr if --verbose was used). 607{ 608 test_eval_inner_ "$@"</dev/null >&3 2>&4 609 test_eval_ret_=$? 610if want_trace 611then 612set+x 613iftest"$test_eval_ret_"!=0 614then 615 say_color error >&4"error: last command exited with \$?=$test_eval_ret_" 616fi 617fi 618}2>/dev/null 619return$test_eval_ret_ 620} 621 622test_run_ () { 623 test_cleanup=: 624 expecting_failure=$2 625 626iftest"${GIT_TEST_CHAIN_LINT:-1}"!=0;then 627# turn off tracing for this test-eval, as it simply creates 628# confusing noise in the "-x" output 629 trace_tmp=$trace 630 trace= 631# 117 is magic because it is unlikely to match the exit 632# code of other programs 633iftest"OK-117"!="$(test_eval_ "(exit 117)&&$1${LF}${LF}echo OK-\$?"3>&1)" 634 then 635 error "bug in the testscript: broken &&-chain or run-away HERE-DOC:$1" 636 fi 637 trace=$trace_tmp 638 fi 639 640 setup_malloc_check 641 test_eval_ "$1" 642 eval_ret=$? 643 teardown_malloc_check 644 645 if test -z "$immediate" || test$eval_ret= 0 || 646 test -n "$expecting_failure" && test "$test_cleanup" != ":" 647 then 648 setup_malloc_check 649 test_eval_ "$test_cleanup" 650 teardown_malloc_check 651 fi 652 if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE" 653 then 654 echo "" 655 fi 656 return "$eval_ret" 657} 658 659test_start_ () { 660 test_count=$(($test_count+1)) 661 maybe_setup_verbose 662 maybe_setup_valgrind 663} 664 665test_finish_ () { 666 echo >&3 "" 667 maybe_teardown_valgrind 668 maybe_teardown_verbose 669} 670 671test_skip () { 672 to_skip= 673 skipped_reason= 674 if match_pattern_list$this_test.$test_count$GIT_SKIP_TESTS 675 then 676 to_skip=t 677 skipped_reason="GIT_SKIP_TESTS" 678 fi 679 if test -z "$to_skip" && test -n "$test_prereq" && 680 ! test_have_prereq "$test_prereq" 681 then 682 to_skip=t 683 684 of_prereq= 685 if test "$missing_prereq" != "$test_prereq" 686 then 687 of_prereq=" of $test_prereq" 688 fi 689 skipped_reason="missing $missing_prereq${of_prereq}" 690 fi 691 if test -z "$to_skip" && test -n "$run_list" && 692 ! match_test_selector_list '--run'$test_count"$run_list" 693 then 694 to_skip=t 695 skipped_reason="--run" 696 fi 697 698 case "$to_skip" in 699 t) 700 say_color skip >&3 "skipping test: $@" 701 say_color skip "ok $test_count# skip $1 ($skipped_reason)" 702: true 703;; 704*) 705 false 706;; 707esac 708} 709 710# stub; perf-lib overrides it 711test_at_end_hook_ () { 712: 713} 714 715test_done () { 716 GIT_EXIT_OK=t 717 718iftest -z"$HARNESS_ACTIVE" 719then 720 test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" 721mkdir-p"$test_results_dir" 722 base=${0##*/} 723 test_results_path="$test_results_dir/${base%.sh}.counts" 724 725cat>"$test_results_path"<<-EOF 726 total$test_count 727 success$test_success 728 fixed$test_fixed 729 broken$test_broken 730 failed$test_failure 731 732 EOF 733fi 734 735iftest"$test_fixed"!=0 736then 737 say_color error "#$test_fixedknown breakage(s) vanished; please update test(s)" 738fi 739iftest"$test_broken"!=0 740then 741 say_color warn "# still have$test_brokenknown breakage(s)" 742fi 743iftest"$test_broken"!=0||test"$test_fixed"!=0 744then 745 test_remaining=$(( $test_count - $test_broken - $test_fixed )) 746 msg="remaining$test_remainingtest(s)" 747else 748 test_remaining=$test_count 749 msg="$test_counttest(s)" 750fi 751case"$test_failure"in 7520) 753iftest$test_external_has_tap-eq0 754then 755iftest$test_remaining-gt0 756then 757 say_color pass "# passed all$msg" 758fi 759 760# Maybe print SKIP message 761test -z"$skip_all"|| skip_all="# SKIP$skip_all" 762case"$test_count"in 7630) 764 say "1..$test_count${skip_all:+ $skip_all}" 765;; 766*) 767test -z"$skip_all"|| 768 say_color warn "$skip_all" 769 say "1..$test_count" 770;; 771esac 772fi 773 774iftest -z"$debug" 775then 776test -d"$TRASH_DIRECTORY"|| 777 error "Tests passed but trash directory already removed before test cleanup; aborting" 778 779cd"$TRASH_DIRECTORY/.."&& 780rm-fr"$TRASH_DIRECTORY"|| 781 error "Tests passed but test cleanup failed; aborting" 782fi 783 test_at_end_hook_ 784 785exit0;; 786 787*) 788iftest$test_external_has_tap-eq0 789then 790 say_color error "# failed$test_failureamong$msg" 791 say "1..$test_count" 792fi 793 794exit1;; 795 796esac 797} 798 799iftest -n"$valgrind" 800then 801 make_symlink () { 802test -h"$2"&& 803test"$1"="$(readlink "$2")"|| { 804# be super paranoid 805ifmkdir"$2".lock 806then 807rm-f"$2"&& 808ln-s"$1""$2"&& 809rm-r"$2".lock 810else 811whiletest -d"$2".lock 812do 813 say "Waiting for lock on$2." 814sleep1 815done 816fi 817} 818} 819 820 make_valgrind_symlink () { 821# handle only executables, unless they are shell libraries that 822# need to be in the exec-path. 823test -x"$1"|| 824test"# "="$(head -c 2 <"$1")"|| 825return; 826 827 base=$(basename "$1") 828case"$base"in 829test-*) 830 symlink_target="$GIT_BUILD_DIR/t/helper/$base" 831;; 832*) 833 symlink_target="$GIT_BUILD_DIR/$base" 834;; 835esac 836# do not override scripts 837iftest -x"$symlink_target"&& 838test!-d"$symlink_target"&& 839test"#!"!="$(head -c 2 < "$symlink_target")" 840then 841 symlink_target=../valgrind.sh 842fi 843case"$base"in 844*.sh|*.perl) 845 symlink_target=../unprocessed-script 846esac 847# create the link, or replace it if it is out of date 848 make_symlink "$symlink_target""$GIT_VALGRIND/bin/$base"||exit 849} 850 851# override all git executables in TEST_DIRECTORY/.. 852 GIT_VALGRIND=$TEST_DIRECTORY/valgrind 853mkdir-p"$GIT_VALGRIND"/bin 854forfilein$GIT_BUILD_DIR/git*$GIT_BUILD_DIR/t/helper/test-* 855do 856 make_valgrind_symlink $file 857done 858# special-case the mergetools loadables 859 make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools" 860 OLDIFS=$IFS 861 IFS=: 862for path in$PATH 863do 864ls"$path"/git-*2> /dev/null | 865whilereadfile 866do 867 make_valgrind_symlink "$file" 868done 869done 870 IFS=$OLDIFS 871 PATH=$GIT_VALGRIND/bin:$PATH 872 GIT_EXEC_PATH=$GIT_VALGRIND/bin 873export GIT_VALGRIND 874 GIT_VALGRIND_MODE="$valgrind" 875export GIT_VALGRIND_MODE 876 GIT_VALGRIND_ENABLED=t 877test -n"$valgrind_only"&& GIT_VALGRIND_ENABLED= 878export GIT_VALGRIND_ENABLED 879eliftest -n"$GIT_TEST_INSTALLED" 880then 881 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path)|| 882 error "Cannot run git from$GIT_TEST_INSTALLED." 883 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH 884 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} 885else# normal case, use ../bin-wrappers only unless $with_dashes: 886 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers" 887if!test -x"$git_bin_dir/git" 888then 889iftest -z"$with_dashes" 890then 891 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" 892fi 893 with_dashes=t 894fi 895 PATH="$git_bin_dir:$PATH" 896 GIT_EXEC_PATH=$GIT_BUILD_DIR 897iftest -n"$with_dashes" 898then 899 PATH="$GIT_BUILD_DIR:$PATH" 900fi 901fi 902GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt 903GIT_CONFIG_NOSYSTEM=1 904GIT_ATTR_NOSYSTEM=1 905export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM 906 907iftest -z"$GIT_TEST_CMP" 908then 909iftest -n"$GIT_TEST_CMP_USE_COPIED_CONTEXT" 910then 911 GIT_TEST_CMP="$DIFF-c" 912else 913 GIT_TEST_CMP="$DIFF-u" 914fi 915fi 916 917GITPERLLIB="$GIT_BUILD_DIR"/perl/blib/lib:"$GIT_BUILD_DIR"/perl/blib/arch/auto/Git 918export GITPERLLIB 919test -d"$GIT_BUILD_DIR"/templates/blt || { 920 error "You haven't built things yet, have you?" 921} 922 923if!test -x"$GIT_BUILD_DIR"/t/helper/test-chmtime 924then 925echo>&2'You need to build test-chmtime:' 926echo>&2'Run "make t/helper/test-chmtime" in the source (toplevel) directory' 927exit1 928fi 929 930# Test repository 931TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)" 932test -n"$root"&& TRASH_DIRECTORY="$root/$TRASH_DIRECTORY" 933case"$TRASH_DIRECTORY"in 934/*) ;;# absolute path is good 935*) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY";; 936esac 937rm-fr"$TRASH_DIRECTORY"|| { 938 GIT_EXIT_OK=t 939echo>&5"FATAL: Cannot prepare test area" 940exit1 941} 942 943HOME="$TRASH_DIRECTORY" 944GNUPGHOME="$HOME/gnupg-home-not-used" 945export HOME GNUPGHOME 946 947iftest -z"$TEST_NO_CREATE_REPO" 948then 949 test_create_repo "$TRASH_DIRECTORY" 950else 951mkdir-p"$TRASH_DIRECTORY" 952fi 953# Use -P to resolve symlinks in our working directory so that the cwd 954# in subprocesses like git equals our $PWD (for pathname comparisons). 955cd -P"$TRASH_DIRECTORY"||exit1 956 957this_test=${0##*/} 958this_test=${this_test%%-*} 959if match_pattern_list "$this_test"$GIT_SKIP_TESTS 960then 961 say_color info >&3"skipping test$this_testaltogether" 962 skip_all="skip all tests in$this_test" 963 test_done 964fi 965 966# Provide an implementation of the 'yes' utility 967yes() { 968iftest$#=0 969then 970 y=y 971else 972 y="$*" 973fi 974 975 i=0 976whiletest$i-lt99 977do 978echo"$y" 979 i=$(($i+1)) 980done 981} 982 983# Fix some commands on Windows 984uname_s=$(uname -s) 985case$uname_sin 986*MINGW*) 987# Windows has its own (incompatible) sort and find 988sort() { 989/usr/bin/sort"$@" 990} 991find() { 992/usr/bin/find"$@" 993} 994# git sees Windows-style pwd 995pwd() { 996builtin pwd -W 997} 998# no POSIX permissions 999# backslashes in pathspec are converted to '/'1000# exec does not inherit the PID1001 test_set_prereq MINGW1002 test_set_prereq NATIVE_CRLF1003 test_set_prereq SED_STRIPS_CR1004 test_set_prereq GREP_STRIPS_CR1005 GIT_TEST_CMP=mingw_test_cmp1006;;1007*CYGWIN*)1008 test_set_prereq POSIXPERM1009 test_set_prereq EXECKEEPSPID1010 test_set_prereq CYGWIN1011 test_set_prereq SED_STRIPS_CR1012 test_set_prereq GREP_STRIPS_CR1013;;1014*)1015 test_set_prereq POSIXPERM1016 test_set_prereq BSLASHPSPEC1017 test_set_prereq EXECKEEPSPID1018;;1019esac10201021( COLUMNS=1&&test$COLUMNS=1) && test_set_prereq COLUMNS_CAN_BE_11022test -z"$NO_PERL"&& test_set_prereq PERL1023test -z"$NO_PTHREADS"&& test_set_prereq PTHREADS1024test -z"$NO_PYTHON"&& test_set_prereq PYTHON1025test -n"$USE_LIBPCRE1$USE_LIBPCRE2"&& test_set_prereq PCRE1026test -z"$NO_GETTEXT"&& test_set_prereq GETTEXT10271028# Can we rely on git's output in the C locale?1029iftest -n"$GETTEXT_POISON"1030then1031 GIT_GETTEXT_POISON=YesPlease1032export GIT_GETTEXT_POISON1033 test_set_prereq GETTEXT_POISON1034else1035 test_set_prereq C_LOCALE_OUTPUT1036fi10371038# Use this instead of test_cmp to compare files that contain expected and1039# actual output from git commands that can be translated. When running1040# under GETTEXT_POISON this pretends that the command produced expected1041# results.1042test_i18ncmp () {1043test -n"$GETTEXT_POISON"|| test_cmp "$@"1044}10451046# Use this instead of "grep expected-string actual" to see if the1047# output from a git command that can be translated either contains an1048# expected string, or does not contain an unwanted one. When running1049# under GETTEXT_POISON this pretends that the command produced expected1050# results.1051test_i18ngrep () {1052iftest -n"$GETTEXT_POISON"1053then1054:# pretend success1055eliftest"x!"="x$1"1056then1057shift1058!grep"$@"1059else1060grep"$@"1061fi1062}10631064test_lazy_prereq PIPE '1065 # test whether the filesystem supports FIFOs1066 case$(uname -s)in1067 CYGWIN*|MINGW*)1068 false1069 ;;1070 *)1071 rm -f testfifo && mkfifo testfifo1072 ;;1073 esac1074'10751076test_lazy_prereq SYMLINKS '1077 # test whether the filesystem supports symbolic links1078 ln -s x y && test -h y1079'10801081test_lazy_prereq FILEMODE '1082 test "$(git config --bool core.filemode)" = true1083'10841085test_lazy_prereq CASE_INSENSITIVE_FS '1086 echo good >CamelCase &&1087 echo bad >camelcase &&1088 test "$(cat CamelCase)" != good1089'10901091test_lazy_prereq UTF8_NFD_TO_NFC '1092 # check whether FS converts nfd unicode to nfc1093 auml=$(printf "\303\244")1094 aumlcdiar=$(printf "\141\314\210")1095 >"$auml" &&1096 case "$(echo *)" in1097 "$aumlcdiar")1098 true ;;1099 *)1100 false ;;1101 esac1102'11031104test_lazy_prereq AUTOIDENT '1105 sane_unset GIT_AUTHOR_NAME &&1106 sane_unset GIT_AUTHOR_EMAIL &&1107 git var GIT_AUTHOR_IDENT1108'11091110test_lazy_prereq EXPENSIVE '1111 test -n "$GIT_TEST_LONG"1112'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 'run_with_limited_cmdline true'11701171build_option () {1172 git version --build-options|1173sed-ne"s/^$1: //p"1174}11751176test_lazy_prereq LONG_IS_64BIT '1177 test 8 -le "$(build_option sizeof-long)"1178'11791180test_lazy_prereq TIME_IS_64BIT 'test-date is64bit'1181test_lazy_prereq TIME_T_IS_64BIT 'test-date time_t-is64bit'