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 52if test ! -f "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS 53then 54 echo >&2 'error: GIT-BUILD-OPTIONS missing (has Git been built?).' 55 exit 1 56fi 57. "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS 58export PERL_PATH SHELL_PATH 59 60# Disallow the use of abbreviated options in the test suite by default 61if test -z "${GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS}" 62then 63 GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=true 64 export GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS 65fi 66 67################################################################ 68# It appears that people try to run tests without building... 69"${GIT_TEST_INSTALLED:-$GIT_BUILD_DIR}/git$X" >/dev/null 70if test $? != 1 71then 72 if test -n "$GIT_TEST_INSTALLED" 73 then 74 echo >&2 "error: there is no working Git at '$GIT_TEST_INSTALLED'" 75 else 76 echo >&2 'error: you do not seem to have built git yet.' 77 fi 78 exit 1 79fi 80 81# Parse options while taking care to leave $@ intact, so we will still 82# have all the original command line options when executing the test 83# script again for '--tee' and '--verbose-log' below. 84store_arg_to= 85prev_opt= 86for opt 87do 88 if test -n "$store_arg_to" 89 then 90 eval $store_arg_to=\$opt 91 store_arg_to= 92 prev_opt= 93 continue 94 fi 95 96 case "$opt" in 97 -d|--d|--de|--deb|--debu|--debug) 98 debug=t ;; 99 -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 100 immediate=t ;; 101 -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests) 102 GIT_TEST_LONG=t; export GIT_TEST_LONG ;; 103 -r) 104 store_arg_to=run_list 105 ;; 106 --run=*) 107 run_list=${opt#--*=} ;; 108 -h|--h|--he|--hel|--help) 109 help=t ;; 110 -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 111 verbose=t ;; 112 --verbose-only=*) 113 verbose_only=${opt#--*=} 114 ;; 115 -q|--q|--qu|--qui|--quie|--quiet) 116 # Ignore --quiet under a TAP::Harness. Saying how many tests 117 # passed without the ok/not ok details is always an error. 118 test -z "$HARNESS_ACTIVE" && quiet=t ;; 119 --with-dashes) 120 with_dashes=t ;; 121 --no-bin-wrappers) 122 no_bin_wrappers=t ;; 123 --no-color) 124 color= ;; 125 --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind) 126 valgrind=memcheck 127 tee=t 128 ;; 129 --valgrind=*) 130 valgrind=${opt#--*=} 131 tee=t 132 ;; 133 --valgrind-only=*) 134 valgrind_only=${opt#--*=} 135 tee=t 136 ;; 137 --tee) 138 tee=t ;; 139 --root=*) 140 root=${opt#--*=} ;; 141 --chain-lint) 142 GIT_TEST_CHAIN_LINT=1 ;; 143 --no-chain-lint) 144 GIT_TEST_CHAIN_LINT=0 ;; 145 -x) 146 trace=t ;; 147 -V|--verbose-log) 148 verbose_log=t 149 tee=t 150 ;; 151 --write-junit-xml) 152 write_junit_xml=t 153 ;; 154 --stress) 155 stress=t ;; 156 --stress=*) 157 echo "error: --stress does not accept an argument: '$opt'" >&2 158 echo "did you mean --stress-jobs=${opt#*=} or --stress-limit=${opt#*=}?" >&2 159 exit 1 160 ;; 161 --stress-jobs=*) 162 stress=t; 163 stress=${opt#--*=} 164 case "$stress" in 165 *[!0-9]*|0*|"") 166 echo "error: --stress-jobs=<N> requires the number of jobs to run" >&2 167 exit 1 168 ;; 169 *) # Good. 170 ;; 171 esac 172 ;; 173 --stress-limit=*) 174 stress=t; 175 stress_limit=${opt#--*=} 176 case "$stress_limit" in 177 *[!0-9]*|0*|"") 178 echo "error: --stress-limit=<N> requires the number of repetitions" >&2 179 exit 1 180 ;; 181 *) # Good. 182 ;; 183 esac 184 ;; 185 *) 186 echo "error: unknown test option '$opt'" >&2; exit 1 ;; 187 esac 188 189 prev_opt=$opt 190done 191if test -n "$store_arg_to" 192then 193 echo "error: $prev_opt requires an argument" >&2 194 exit 1 195fi 196 197if test -n "$valgrind_only" 198then 199 test -z "$valgrind" && valgrind=memcheck 200 test -z "$verbose" && verbose_only="$valgrind_only" 201elif test -n "$valgrind" 202then 203 test -z "$verbose_log" && verbose=t 204fi 205 206if test -n "$stress" 207then 208 verbose=t 209 trace=t 210 immediate=t 211fi 212 213TEST_STRESS_JOB_SFX="${GIT_TEST_STRESS_JOB_NR:+.stress-$GIT_TEST_STRESS_JOB_NR}" 214TEST_NAME="$(basename "$0" .sh)" 215TEST_NUMBER="${TEST_NAME%%-*}" 216TEST_NUMBER="${TEST_NUMBER#t}" 217TEST_RESULTS_DIR="$TEST_OUTPUT_DIRECTORY/test-results" 218TEST_RESULTS_BASE="$TEST_RESULTS_DIR/$TEST_NAME$TEST_STRESS_JOB_SFX" 219TRASH_DIRECTORY="trash directory.$TEST_NAME$TEST_STRESS_JOB_SFX" 220test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY" 221case "$TRASH_DIRECTORY" in 222/*) ;; # absolute path is good 223 *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;; 224esac 225 226# If --stress was passed, run this test repeatedly in several parallel loops. 227if test "$GIT_TEST_STRESS_STARTED" = "done" 228then 229 : # Don't stress test again. 230elif test -n "$stress" 231then 232 if test "$stress" != t 233 then 234 job_count=$stress 235 elif test -n "$GIT_TEST_STRESS_LOAD" 236 then 237 job_count="$GIT_TEST_STRESS_LOAD" 238 elif job_count=$(getconf _NPROCESSORS_ONLN 2>/dev/null) && 239 test -n "$job_count" 240 then 241 job_count=$((2 * $job_count)) 242 else 243 job_count=8 244 fi 245 246 mkdir -p "$TEST_RESULTS_DIR" 247 stressfail="$TEST_RESULTS_BASE.stress-failed" 248 rm -f "$stressfail" 249 250 stress_exit=0 251 trap ' 252 kill $job_pids 2>/dev/null 253 wait 254 stress_exit=1 255 ' TERM INT HUP 256 257 job_pids= 258 job_nr=0 259 while test $job_nr -lt "$job_count" 260 do 261 ( 262 GIT_TEST_STRESS_STARTED=done 263 GIT_TEST_STRESS_JOB_NR=$job_nr 264 export GIT_TEST_STRESS_STARTED GIT_TEST_STRESS_JOB_NR 265 266 trap ' 267 kill $test_pid 2>/dev/null 268 wait 269 exit 1 270 ' TERM INT 271 272 cnt=1 273 while ! test -e "$stressfail" && 274 { test -z "$stress_limit" || 275 test $cnt -le $stress_limit ; } 276 do 277 $TEST_SHELL_PATH "$0" "$@" >"$TEST_RESULTS_BASE.stress-$job_nr.out" 2>&1 & 278 test_pid=$! 279 280 if wait $test_pid 281 then 282 printf "OK %2d.%d\n" $GIT_TEST_STRESS_JOB_NR $cnt 283 else 284 echo $GIT_TEST_STRESS_JOB_NR >>"$stressfail" 285 printf "FAIL %2d.%d\n" $GIT_TEST_STRESS_JOB_NR $cnt 286 fi 287 cnt=$(($cnt + 1)) 288 done 289 ) & 290 job_pids="$job_pids $!" 291 job_nr=$(($job_nr + 1)) 292 done 293 294 wait 295 296 if test -f "$stressfail" 297 then 298 stress_exit=1 299 echo "Log(s) of failed test run(s):" 300 for failed_job_nr in $(sort -n "$stressfail") 301 do 302 echo "Contents of '$TEST_RESULTS_BASE.stress-$failed_job_nr.out':" 303 cat "$TEST_RESULTS_BASE.stress-$failed_job_nr.out" 304 done 305 rm -rf "$TRASH_DIRECTORY.stress-failed" 306 # Move the last one. 307 mv "$TRASH_DIRECTORY.stress-$failed_job_nr" "$TRASH_DIRECTORY.stress-failed" 308 fi 309 310 exit $stress_exit 311fi 312 313# if --tee was passed, write the output not only to the terminal, but 314# additionally to the file test-results/$BASENAME.out, too. 315if test "$GIT_TEST_TEE_STARTED" = "done" 316then 317 : # do not redirect again 318elif test -n "$tee" 319then 320 mkdir -p "$TEST_RESULTS_DIR" 321 322 # Make this filename available to the sub-process in case it is using 323 # --verbose-log. 324 GIT_TEST_TEE_OUTPUT_FILE=$TEST_RESULTS_BASE.out 325 export GIT_TEST_TEE_OUTPUT_FILE 326 327 # Truncate before calling "tee -a" to get rid of the results 328 # from any previous runs. 329 >"$GIT_TEST_TEE_OUTPUT_FILE" 330 331 (GIT_TEST_TEE_STARTED=done ${TEST_SHELL_PATH} "$0" "$@" 2>&1; 332 echo $? >"$TEST_RESULTS_BASE.exit") | tee -a "$GIT_TEST_TEE_OUTPUT_FILE" 333 test "$(cat "$TEST_RESULTS_BASE.exit")" = 0 334 exit 335fi 336 337if test -n "$trace" && test -n "$test_untraceable" 338then 339 # '-x' tracing requested, but this test script can't be reliably 340 # traced, unless it is run with a Bash version supporting 341 # BASH_XTRACEFD (introduced in Bash v4.1). 342 # 343 # Perform this version check _after_ the test script was 344 # potentially re-executed with $TEST_SHELL_PATH for '--tee' or 345 # '--verbose-log', so the right shell is checked and the 346 # warning is issued only once. 347 if test -n "$BASH_VERSION" && eval ' 348 test ${BASH_VERSINFO[0]} -gt 4 || { 349 test ${BASH_VERSINFO[0]} -eq 4 && 350 test ${BASH_VERSINFO[1]} -ge 1 351 } 352 ' 353 then 354 : Executed by a Bash version supporting BASH_XTRACEFD. Good. 355 else 356 echo >&2 "warning: ignoring -x; '$0' is untraceable without BASH_XTRACEFD" 357 trace= 358 fi 359fi 360if test -n "$trace" && test -z "$verbose_log" 361then 362 verbose=t 363fi 364 365# For repeatability, reset the environment to known value. 366# TERM is sanitized below, after saving color control sequences. 367LANG=C 368LC_ALL=C 369PAGER=cat 370TZ=UTC 371export LANG LC_ALL PAGER TZ 372EDITOR=: 373 374# GIT_TEST_GETTEXT_POISON should not influence git commands executed 375# during initialization of test-lib and the test repo. Back it up, 376# unset and then restore after initialization is finished. 377if test -n "$GIT_TEST_GETTEXT_POISON" 378then 379 GIT_TEST_GETTEXT_POISON_ORIG=$GIT_TEST_GETTEXT_POISON 380 unset GIT_TEST_GETTEXT_POISON 381fi 382 383# A call to "unset" with no arguments causes at least Solaris 10 384# /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets 385# deriving from the command substitution clustered with the other 386# ones. 387unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH" -e ' 388 my @env = keys %ENV; 389 my $ok = join("|", qw( 390 TRACE 391 DEBUG 392 TEST 393 .*_TEST 394 PROVE 395 VALGRIND 396 UNZIP 397 PERF_ 398 CURL_VERBOSE 399 TRACE_CURL 400 )); 401 my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env); 402 print join("\n", @vars); 403') 404unset XDG_CACHE_HOME 405unset XDG_CONFIG_HOME 406unset GITPERLLIB 407GIT_AUTHOR_EMAIL=author@example.com 408GIT_AUTHOR_NAME='A U Thor' 409GIT_COMMITTER_EMAIL=committer@example.com 410GIT_COMMITTER_NAME='C O Mitter' 411GIT_MERGE_VERBOSITY=5 412GIT_MERGE_AUTOEDIT=no 413export GIT_MERGE_VERBOSITY GIT_MERGE_AUTOEDIT 414export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME 415export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME 416export EDITOR 417 418# Tests using GIT_TRACE typically don't want <timestamp> <file>:<line> output 419GIT_TRACE_BARE=1 420export GIT_TRACE_BARE 421 422check_var_migration () { 423 # the warnings and hints given from this helper depends 424 # on end-user settings, which will disrupt the self-test 425 # done on the test framework itself. 426 case "$GIT_TEST_FRAMEWORK_SELFTEST" in 427 t) return ;; 428 esac 429 430 old_name=$1 new_name=$2 431 eval "old_isset=\${${old_name}:+isset}" 432 eval "new_isset=\${${new_name}:+isset}" 433 434 case "$old_isset,$new_isset" in 435 isset,) 436 echo >&2 "warning: $old_name is now $new_name" 437 echo >&2 "hint: set $new_name too during the transition period" 438 eval "$new_name=\$$old_name" 439 ;; 440 isset,isset) 441 # do this later 442 # echo >&2 "warning: $old_name is now $new_name" 443 # echo >&2 "hint: remove $old_name" 444 ;; 445 esac 446} 447 448check_var_migration GIT_FSMONITOR_TEST GIT_TEST_FSMONITOR 449check_var_migration TEST_GIT_INDEX_VERSION GIT_TEST_INDEX_VERSION 450check_var_migration GIT_FORCE_PRELOAD_TEST GIT_TEST_PRELOAD_INDEX 451 452# Use specific version of the index file format 453if test -n "${GIT_TEST_INDEX_VERSION:+isset}" 454then 455 GIT_INDEX_VERSION="$GIT_TEST_INDEX_VERSION" 456 export GIT_INDEX_VERSION 457fi 458 459# Add libc MALLOC and MALLOC_PERTURB test 460# only if we are not executing the test with valgrind 461if test -n "$valgrind" || 462 test -n "$TEST_NO_MALLOC_CHECK" 463then 464 setup_malloc_check () { 465 : nothing 466 } 467 teardown_malloc_check () { 468 : nothing 469 } 470else 471 setup_malloc_check () { 472 MALLOC_CHECK_=3 MALLOC_PERTURB_=165 473 export MALLOC_CHECK_ MALLOC_PERTURB_ 474 } 475 teardown_malloc_check () { 476 unset MALLOC_CHECK_ MALLOC_PERTURB_ 477 } 478fi 479 480# Protect ourselves from common misconfiguration to export 481# CDPATH into the environment 482unset CDPATH 483 484unset GREP_OPTIONS 485unset UNZIP 486 487case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in 4881|2|true) 489 GIT_TRACE=4 490 ;; 491esac 492 493# Convenience 494# 495# A regexp to match 5, 35 and 40 hexdigits 496_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' 497_x35="$_x05$_x05$_x05$_x05$_x05$_x05$_x05" 498_x40="$_x35$_x05" 499 500# Zero SHA-1 501_z40=0000000000000000000000000000000000000000 502 503OID_REGEX="$_x40" 504ZERO_OID=$_z40 505EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904 506EMPTY_BLOB=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 507 508# Line feed 509LF=' 510' 511 512# UTF-8 ZERO WIDTH NON-JOINER, which HFS+ ignores 513# when case-folding filenames 514u200c=$(printf '\342\200\214') 515 516export _x05 _x35 _x40 _z40 LF u200c EMPTY_TREE EMPTY_BLOB ZERO_OID OID_REGEX 517 518# Each test should start with something like this, after copyright notices: 519# 520# test_description='Description of this test... 521# This test checks if command xyzzy does the right thing... 522# ' 523# . ./test-lib.sh 524test "x$TERM" != "xdumb" && ( 525 test -t 1 && 526 tput bold >/dev/null 2>&1 && 527 tput setaf 1 >/dev/null 2>&1 && 528 tput sgr0 >/dev/null 2>&1 529 ) && 530 color=t 531 532if test -n "$color" 533then 534 # Save the color control sequences now rather than run tput 535 # each time say_color() is called. This is done for two 536 # reasons: 537 # * TERM will be changed to dumb 538 # * HOME will be changed to a temporary directory and tput 539 # might need to read ~/.terminfo from the original HOME 540 # directory to get the control sequences 541 # Note: This approach assumes the control sequences don't end 542 # in a newline for any terminal of interest (command 543 # substitutions strip trailing newlines). Given that most 544 # (all?) terminals in common use are related to ECMA-48, this 545 # shouldn't be a problem. 546 say_color_error=$(tput bold; tput setaf 1) # bold red 547 say_color_skip=$(tput setaf 4) # blue 548 say_color_warn=$(tput setaf 3) # brown/yellow 549 say_color_pass=$(tput setaf 2) # green 550 say_color_info=$(tput setaf 6) # cyan 551 say_color_reset=$(tput sgr0) 552 say_color_="" # no formatting for normal text 553 say_color () { 554 test -z "$1" && test -n "$quiet" && return 555 eval "say_color_color=\$say_color_$1" 556 shift 557 printf "%s\\n" "$say_color_color$*$say_color_reset" 558 } 559else 560 say_color() { 561 test -z "$1" && test -n "$quiet" && return 562 shift 563 printf "%s\n" "$*" 564 } 565fi 566 567TERM=dumb 568export TERM 569 570error () { 571 say_color error "error: $*" 572 GIT_EXIT_OK=t 573 exit 1 574} 575 576BUG () { 577 error >&7 "bug in the test script: $*" 578} 579 580say () { 581 say_color info "$*" 582} 583 584if test -n "$HARNESS_ACTIVE" 585then 586 if test "$verbose" = t || test -n "$verbose_only" 587 then 588 printf 'Bail out! %s\n' \ 589 'verbose mode forbidden under TAP harness; try --verbose-log' 590 exit 1 591 fi 592fi 593 594test "${test_description}" != "" || 595error "Test script did not set test_description." 596 597if test "$help" = "t" 598then 599 printf '%s\n' "$test_description" 600 exit 0 601fi 602 603exec 5>&1 604exec 6<&0 605exec 7>&2 606if test "$verbose_log" = "t" 607then 608 exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3 609elif test "$verbose" = "t" 610then 611 exec 4>&2 3>&1 612else 613 exec 4>/dev/null 3>/dev/null 614fi 615 616# Send any "-x" output directly to stderr to avoid polluting tests 617# which capture stderr. We can do this unconditionally since it 618# has no effect if tracing isn't turned on. 619# 620# Note that this sets up the trace fd as soon as we assign the variable, so it 621# must come after the creation of descriptor 4 above. Likewise, we must never 622# unset this, as it has the side effect of closing descriptor 4, which we 623# use to show verbose tests to the user. 624# 625# Note also that we don't need or want to export it. The tracing is local to 626# this shell, and we would not want to influence any shells we exec. 627BASH_XTRACEFD=4 628 629test_failure=0 630test_count=0 631test_fixed=0 632test_broken=0 633test_success=0 634 635test_external_has_tap=0 636 637die () { 638 code=$? 639 # This is responsible for running the atexit commands even when a 640 # test script run with '--immediate' fails, or when the user hits 641 # ctrl-C, i.e. when 'test_done' is not invoked at all. 642 test_atexit_handler || code=$? 643 if test -n "$GIT_EXIT_OK" 644 then 645 exit $code 646 else 647 echo >&5 "FATAL: Unexpected exit with code $code" 648 exit 1 649 fi 650} 651 652GIT_EXIT_OK= 653trap 'die' EXIT 654# Disable '-x' tracing, because with some shells, notably dash, it 655# prevents running the cleanup commands when a test script run with 656# '--verbose-log -x' is interrupted. 657trap '{ code=$?; set +x; } 2>/dev/null; exit $code' INT TERM HUP 658 659# The user-facing functions are loaded from a separate file so that 660# test_perf subshells can have them too 661. "$TEST_DIRECTORY/test-lib-functions.sh" 662 663# You are not expected to call test_ok_ and test_failure_ directly, use 664# the test_expect_* functions instead. 665 666test_ok_ () { 667 if test -n "$write_junit_xml" 668 then 669 write_junit_xml_testcase "$*" 670 fi 671 test_success=$(($test_success + 1)) 672 say_color "" "ok $test_count - $@" 673} 674 675test_failure_ () { 676 if test -n "$write_junit_xml" 677 then 678 junit_insert="<failure message=\"not ok $test_count -" 679 junit_insert="$junit_insert $(xml_attr_encode "$1")\">" 680 junit_insert="$junit_insert $(xml_attr_encode \ 681 "$(if test -n "$GIT_TEST_TEE_OUTPUT_FILE" 682 then 683 test-tool path-utils skip-n-bytes \ 684 "$GIT_TEST_TEE_OUTPUT_FILE" $GIT_TEST_TEE_OFFSET 685 else 686 printf '%s\n' "$@" | sed 1d 687 fi)")" 688 junit_insert="$junit_insert</failure>" 689 if test -n "$GIT_TEST_TEE_OUTPUT_FILE" 690 then 691 junit_insert="$junit_insert<system-err>$(xml_attr_encode \ 692 "$(cat "$GIT_TEST_TEE_OUTPUT_FILE")")</system-err>" 693 fi 694 write_junit_xml_testcase "$1" " $junit_insert" 695 fi 696 test_failure=$(($test_failure + 1)) 697 say_color error "not ok $test_count - $1" 698 shift 699 printf '%s\n' "$*" | sed -e 's/^/# /' 700 test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; } 701} 702 703test_known_broken_ok_ () { 704 if test -n "$write_junit_xml" 705 then 706 write_junit_xml_testcase "$* (breakage fixed)" 707 fi 708 test_fixed=$(($test_fixed+1)) 709 say_color error "ok $test_count - $@ # TODO known breakage vanished" 710} 711 712test_known_broken_failure_ () { 713 if test -n "$write_junit_xml" 714 then 715 write_junit_xml_testcase "$* (known breakage)" 716 fi 717 test_broken=$(($test_broken+1)) 718 say_color warn "not ok $test_count - $@ # TODO known breakage" 719} 720 721test_debug () { 722 test "$debug" = "" || eval "$1" 723} 724 725match_pattern_list () { 726 arg="$1" 727 shift 728 test -z "$*" && return 1 729 for pattern_ 730 do 731 case "$arg" in 732 $pattern_) 733 return 0 734 esac 735 done 736 return 1 737} 738 739match_test_selector_list () { 740 title="$1" 741 shift 742 arg="$1" 743 shift 744 test -z "$1" && return 0 745 746 # Both commas and whitespace are accepted as separators. 747 OLDIFS=$IFS 748 IFS=' ,' 749 set -- $1 750 IFS=$OLDIFS 751 752 # If the first selector is negative we include by default. 753 include= 754 case "$1" in 755 !*) include=t ;; 756 esac 757 758 for selector 759 do 760 orig_selector=$selector 761 762 positive=t 763 case "$selector" in 764 !*) 765 positive= 766 selector=${selector##?} 767 ;; 768 esac 769 770 test -z "$selector" && continue 771 772 case "$selector" in 773 *-*) 774 if expr "z${selector%%-*}" : "z[0-9]*[^0-9]" >/dev/null 775 then 776 echo "error: $title: invalid non-numeric in range" \ 777 "start: '$orig_selector'" >&2 778 exit 1 779 fi 780 if expr "z${selector#*-}" : "z[0-9]*[^0-9]" >/dev/null 781 then 782 echo "error: $title: invalid non-numeric in range" \ 783 "end: '$orig_selector'" >&2 784 exit 1 785 fi 786 ;; 787 *) 788 if expr "z$selector" : "z[0-9]*[^0-9]" >/dev/null 789 then 790 echo "error: $title: invalid non-numeric in test" \ 791 "selector: '$orig_selector'" >&2 792 exit 1 793 fi 794 esac 795 796 # Short cut for "obvious" cases 797 test -z "$include" && test -z "$positive" && continue 798 test -n "$include" && test -n "$positive" && continue 799 800 case "$selector" in 801 -*) 802 if test $arg -le ${selector#-} 803 then 804 include=$positive 805 fi 806 ;; 807 *-) 808 if test $arg -ge ${selector%-} 809 then 810 include=$positive 811 fi 812 ;; 813 *-*) 814 if test ${selector%%-*} -le $arg \ 815 && test $arg -le ${selector#*-} 816 then 817 include=$positive 818 fi 819 ;; 820 *) 821 if test $arg -eq $selector 822 then 823 include=$positive 824 fi 825 ;; 826 esac 827 done 828 829 test -n "$include" 830} 831 832maybe_teardown_verbose () { 833 test -z "$verbose_only" && return 834 exec 4>/dev/null 3>/dev/null 835 verbose= 836} 837 838last_verbose=t 839maybe_setup_verbose () { 840 test -z "$verbose_only" && return 841 if match_pattern_list $test_count $verbose_only 842 then 843 exec 4>&2 3>&1 844 # Emit a delimiting blank line when going from 845 # non-verbose to verbose. Within verbose mode the 846 # delimiter is printed by test_expect_*. The choice 847 # of the initial $last_verbose is such that before 848 # test 1, we do not print it. 849 test -z "$last_verbose" && echo >&3 "" 850 verbose=t 851 else 852 exec 4>/dev/null 3>/dev/null 853 verbose= 854 fi 855 last_verbose=$verbose 856} 857 858maybe_teardown_valgrind () { 859 test -z "$GIT_VALGRIND" && return 860 GIT_VALGRIND_ENABLED= 861} 862 863maybe_setup_valgrind () { 864 test -z "$GIT_VALGRIND" && return 865 if test -z "$valgrind_only" 866 then 867 GIT_VALGRIND_ENABLED=t 868 return 869 fi 870 GIT_VALGRIND_ENABLED= 871 if match_pattern_list $test_count $valgrind_only 872 then 873 GIT_VALGRIND_ENABLED=t 874 fi 875} 876 877want_trace () { 878 test "$trace" = t && { 879 test "$verbose" = t || test "$verbose_log" = t 880 } 881} 882 883# This is a separate function because some tests use 884# "return" to end a test_expect_success block early 885# (and we want to make sure we run any cleanup like 886# "set +x"). 887test_eval_inner_ () { 888 # Do not add anything extra (including LF) after '$*' 889 eval " 890 want_trace && set -x 891 $*" 892} 893 894test_eval_ () { 895 # If "-x" tracing is in effect, then we want to avoid polluting stderr 896 # with non-test commands. But once in "set -x" mode, we cannot prevent 897 # the shell from printing the "set +x" to turn it off (nor the saving 898 # of $? before that). But we can make sure that the output goes to 899 # /dev/null. 900 # 901 # There are a few subtleties here: 902 # 903 # - we have to redirect descriptor 4 in addition to 2, to cover 904 # BASH_XTRACEFD 905 # 906 # - the actual eval has to come before the redirection block (since 907 # it needs to see descriptor 4 to set up its stderr) 908 # 909 # - likewise, any error message we print must be outside the block to 910 # access descriptor 4 911 # 912 # - checking $? has to come immediately after the eval, but it must 913 # be _inside_ the block to avoid polluting the "set -x" output 914 # 915 916 test_eval_inner_ "$@" </dev/null >&3 2>&4 917 { 918 test_eval_ret_=$? 919 if want_trace 920 then 921 set +x 922 fi 923 } 2>/dev/null 4>&2 924 925 if test "$test_eval_ret_" != 0 && want_trace 926 then 927 say_color error >&4 "error: last command exited with \$?=$test_eval_ret_" 928 fi 929 return $test_eval_ret_ 930} 931 932test_run_ () { 933 test_cleanup=: 934 expecting_failure=$2 935 936 if test "${GIT_TEST_CHAIN_LINT:-1}" != 0; then 937 # turn off tracing for this test-eval, as it simply creates 938 # confusing noise in the "-x" output 939 trace_tmp=$trace 940 trace= 941 # 117 is magic because it is unlikely to match the exit 942 # code of other programs 943 if $(printf '%s\n' "$1" | sed -f "$GIT_BUILD_DIR/t/chainlint.sed" | grep -q '?![A-Z][A-Z]*?!') || 944 test "OK-117" != "$(test_eval_ "(exit 117) && $1${LF}${LF}echo OK-\$?" 3>&1)" 945 then 946 BUG "broken &&-chain or run-away HERE-DOC: $1" 947 fi 948 trace=$trace_tmp 949 fi 950 951 setup_malloc_check 952 test_eval_ "$1" 953 eval_ret=$? 954 teardown_malloc_check 955 956 if test -z "$immediate" || test $eval_ret = 0 || 957 test -n "$expecting_failure" && test "$test_cleanup" != ":" 958 then 959 setup_malloc_check 960 test_eval_ "$test_cleanup" 961 teardown_malloc_check 962 fi 963 if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE" 964 then 965 echo "" 966 fi 967 return "$eval_ret" 968} 969 970test_start_ () { 971 test_count=$(($test_count+1)) 972 maybe_setup_verbose 973 maybe_setup_valgrind 974 if test -n "$write_junit_xml" 975 then 976 junit_start=$(test-tool date getnanos) 977 fi 978} 979 980test_finish_ () { 981 echo >&3 "" 982 maybe_teardown_valgrind 983 maybe_teardown_verbose 984 if test -n "$GIT_TEST_TEE_OFFSET" 985 then 986 GIT_TEST_TEE_OFFSET=$(test-tool path-utils file-size \ 987 "$GIT_TEST_TEE_OUTPUT_FILE") 988 fi 989} 990 991test_skip () { 992 to_skip= 993 skipped_reason= 994 if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS 995 then 996 to_skip=t 997 skipped_reason="GIT_SKIP_TESTS" 998 fi 999 if test -z "$to_skip" && test -n "$test_prereq" &&1000 ! test_have_prereq "$test_prereq"1001 then1002 to_skip=t10031004 of_prereq=1005 if test "$missing_prereq" != "$test_prereq"1006 then1007 of_prereq=" of $test_prereq"1008 fi1009 skipped_reason="missing $missing_prereq${of_prereq}"1010 fi1011 if test -z "$to_skip" && test -n "$run_list" &&1012 ! match_test_selector_list '--run' $test_count "$run_list"1013 then1014 to_skip=t1015 skipped_reason="--run"1016 fi10171018 case "$to_skip" in1019 t)1020 if test -n "$write_junit_xml"1021 then1022 message="$(xml_attr_encode "$skipped_reason")"1023 write_junit_xml_testcase "$1" \1024 " <skipped message=\"$message\" />"1025 fi10261027 say_color skip >&3 "skipping test: $@"1028 say_color skip "ok $test_count # skip $1 ($skipped_reason)"1029 : true1030 ;;1031 *)1032 false1033 ;;1034 esac1035}10361037# stub; perf-lib overrides it1038test_at_end_hook_ () {1039 :1040}10411042write_junit_xml () {1043 case "$1" in1044 --truncate)1045 >"$junit_xml_path"1046 junit_have_testcase=1047 shift1048 ;;1049 esac1050 printf '%s\n' "$@" >>"$junit_xml_path"1051}10521053xml_attr_encode () {1054 printf '%s\n' "$@" | test-tool xml-encode1055}10561057write_junit_xml_testcase () {1058 junit_attrs="name=\"$(xml_attr_encode "$this_test.$test_count $1")\""1059 shift1060 junit_attrs="$junit_attrs classname=\"$this_test\""1061 junit_attrs="$junit_attrs time=\"$(test-tool \1062 date getnanos $junit_start)\""1063 write_junit_xml "$(printf '%s\n' \1064 " <testcase $junit_attrs>" "$@" " </testcase>")"1065 junit_have_testcase=t1066}10671068test_atexit_cleanup=:1069test_atexit_handler () {1070 # In a succeeding test script 'test_atexit_handler' is invoked1071 # twice: first from 'test_done', then from 'die' in the trap on1072 # EXIT.1073 # This condition and resetting 'test_atexit_cleanup' below makes1074 # sure that the registered cleanup commands are run only once.1075 test : != "$test_atexit_cleanup" || return 010761077 setup_malloc_check1078 test_eval_ "$test_atexit_cleanup"1079 test_atexit_cleanup=:1080 teardown_malloc_check1081}10821083test_done () {1084 GIT_EXIT_OK=t10851086 # Run the atexit commands _before_ the trash directory is1087 # removed, so the commands can access pidfiles and socket files.1088 test_atexit_handler10891090 if test -n "$write_junit_xml" && test -n "$junit_xml_path"1091 then1092 test -n "$junit_have_testcase" || {1093 junit_start=$(test-tool date getnanos)1094 write_junit_xml_testcase "all tests skipped"1095 }10961097 # adjust the overall time1098 junit_time=$(test-tool date getnanos $junit_suite_start)1099 sed "s/<testsuite [^>]*/& time=\"$junit_time\"/" \1100 <"$junit_xml_path" >"$junit_xml_path.new"1101 mv "$junit_xml_path.new" "$junit_xml_path"11021103 write_junit_xml " </testsuite>" "</testsuites>"1104 fi11051106 if test -z "$HARNESS_ACTIVE"1107 then1108 mkdir -p "$TEST_RESULTS_DIR"11091110 cat >"$TEST_RESULTS_BASE.counts" <<-EOF1111 total $test_count1112 success $test_success1113 fixed $test_fixed1114 broken $test_broken1115 failed $test_failure11161117 EOF1118 fi11191120 if test "$test_fixed" != 01121 then1122 say_color error "# $test_fixed known breakage(s) vanished; please update test(s)"1123 fi1124 if test "$test_broken" != 01125 then1126 say_color warn "# still have $test_broken known breakage(s)"1127 fi1128 if test "$test_broken" != 0 || test "$test_fixed" != 01129 then1130 test_remaining=$(( $test_count - $test_broken - $test_fixed ))1131 msg="remaining $test_remaining test(s)"1132 else1133 test_remaining=$test_count1134 msg="$test_count test(s)"1135 fi1136 case "$test_failure" in1137 0)1138 if test $test_external_has_tap -eq 01139 then1140 if test $test_remaining -gt 01141 then1142 say_color pass "# passed all $msg"1143 fi11441145 # Maybe print SKIP message1146 test -z "$skip_all" || skip_all="# SKIP $skip_all"1147 case "$test_count" in1148 0)1149 say "1..$test_count${skip_all:+ $skip_all}"1150 ;;1151 *)1152 test -z "$skip_all" ||1153 say_color warn "$skip_all"1154 say "1..$test_count"1155 ;;1156 esac1157 fi11581159 if test -z "$debug"1160 then1161 test -d "$TRASH_DIRECTORY" ||1162 error "Tests passed but trash directory already removed before test cleanup; aborting"11631164 cd "$TRASH_DIRECTORY/.." &&1165 rm -fr "$TRASH_DIRECTORY" || {1166 # try again in a bit1167 sleep 5;1168 rm -fr "$TRASH_DIRECTORY"1169 } ||1170 error "Tests passed but test cleanup failed; aborting"1171 fi1172 test_at_end_hook_11731174 exit 0 ;;11751176 *)1177 if test $test_external_has_tap -eq 01178 then1179 say_color error "# failed $test_failure among $msg"1180 say "1..$test_count"1181 fi11821183 exit 1 ;;11841185 esac1186}11871188if test -n "$valgrind"1189then1190 make_symlink () {1191 test -h "$2" &&1192 test "$1" = "$(readlink "$2")" || {1193 # be super paranoid1194 if mkdir "$2".lock1195 then1196 rm -f "$2" &&1197 ln -s "$1" "$2" &&1198 rm -r "$2".lock1199 else1200 while test -d "$2".lock1201 do1202 say "Waiting for lock on $2."1203 sleep 11204 done1205 fi1206 }1207 }12081209 make_valgrind_symlink () {1210 # handle only executables, unless they are shell libraries that1211 # need to be in the exec-path.1212 test -x "$1" ||1213 test "# " = "$(test_copy_bytes 2 <"$1")" ||1214 return;12151216 base=$(basename "$1")1217 case "$base" in1218 test-*)1219 symlink_target="$GIT_BUILD_DIR/t/helper/$base"1220 ;;1221 *)1222 symlink_target="$GIT_BUILD_DIR/$base"1223 ;;1224 esac1225 # do not override scripts1226 if test -x "$symlink_target" &&1227 test ! -d "$symlink_target" &&1228 test "#!" != "$(test_copy_bytes 2 <"$symlink_target")"1229 then1230 symlink_target=../valgrind.sh1231 fi1232 case "$base" in1233 *.sh|*.perl)1234 symlink_target=../unprocessed-script1235 esac1236 # create the link, or replace it if it is out of date1237 make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit1238 }12391240 # override all git executables in TEST_DIRECTORY/..1241 GIT_VALGRIND=$TEST_DIRECTORY/valgrind1242 mkdir -p "$GIT_VALGRIND"/bin1243 for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/t/helper/test-*1244 do1245 make_valgrind_symlink $file1246 done1247 # special-case the mergetools loadables1248 make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools"1249 OLDIFS=$IFS1250 IFS=:1251 for path in $PATH1252 do1253 ls "$path"/git-* 2> /dev/null |1254 while read file1255 do1256 make_valgrind_symlink "$file"1257 done1258 done1259 IFS=$OLDIFS1260 PATH=$GIT_VALGRIND/bin:$PATH1261 GIT_EXEC_PATH=$GIT_VALGRIND/bin1262 export GIT_VALGRIND1263 GIT_VALGRIND_MODE="$valgrind"1264 export GIT_VALGRIND_MODE1265 GIT_VALGRIND_ENABLED=t1266 test -n "$valgrind_only" && GIT_VALGRIND_ENABLED=1267 export GIT_VALGRIND_ENABLED1268elif test -n "$GIT_TEST_INSTALLED"1269then1270 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) ||1271 error "Cannot run git from $GIT_TEST_INSTALLED."1272 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR/t/helper:$PATH1273 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}1274else # normal case, use ../bin-wrappers only unless $with_dashes:1275 if test -n "$no_bin_wrappers"1276 then1277 with_dashes=t1278 else1279 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers"1280 if ! test -x "$git_bin_dir/git"1281 then1282 if test -z "$with_dashes"1283 then1284 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"1285 fi1286 with_dashes=t1287 fi1288 PATH="$git_bin_dir:$PATH"1289 fi1290 GIT_EXEC_PATH=$GIT_BUILD_DIR1291 if test -n "$with_dashes"1292 then1293 PATH="$GIT_BUILD_DIR:$GIT_BUILD_DIR/t/helper:$PATH"1294 fi1295fi1296GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt1297GIT_CONFIG_NOSYSTEM=11298GIT_ATTR_NOSYSTEM=11299export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM13001301if test -z "$GIT_TEST_CMP"1302then1303 if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT"1304 then1305 GIT_TEST_CMP="$DIFF -c"1306 else1307 GIT_TEST_CMP="$DIFF -u"1308 fi1309fi13101311GITPERLLIB="$GIT_BUILD_DIR"/perl/build/lib1312export GITPERLLIB1313test -d "$GIT_BUILD_DIR"/templates/blt || {1314 error "You haven't built things yet, have you?"1315}13161317if ! test -x "$GIT_BUILD_DIR"/t/helper/test-tool$X1318then1319 echo >&2 'You need to build test-tool:'1320 echo >&2 'Run "make t/helper/test-tool" in the source (toplevel) directory'1321 exit 11322fi13231324# Test repository1325rm -fr "$TRASH_DIRECTORY" || {1326 GIT_EXIT_OK=t1327 echo >&5 "FATAL: Cannot prepare test area"1328 exit 11329}13301331HOME="$TRASH_DIRECTORY"1332GNUPGHOME="$HOME/gnupg-home-not-used"1333export HOME GNUPGHOME13341335if test -z "$TEST_NO_CREATE_REPO"1336then1337 test_create_repo "$TRASH_DIRECTORY"1338else1339 mkdir -p "$TRASH_DIRECTORY"1340fi13411342# Use -P to resolve symlinks in our working directory so that the cwd1343# in subprocesses like git equals our $PWD (for pathname comparisons).1344cd -P "$TRASH_DIRECTORY" || exit 113451346this_test=${0##*/}1347this_test=${this_test%%-*}1348if match_pattern_list "$this_test" $GIT_SKIP_TESTS1349then1350 say_color info >&3 "skipping test $this_test altogether"1351 skip_all="skip all tests in $this_test"1352 test_done1353fi13541355if test -n "$write_junit_xml"1356then1357 junit_xml_dir="$TEST_OUTPUT_DIRECTORY/out"1358 mkdir -p "$junit_xml_dir"1359 junit_xml_base=${0##*/}1360 junit_xml_path="$junit_xml_dir/TEST-${junit_xml_base%.sh}.xml"1361 junit_attrs="name=\"${junit_xml_base%.sh}\""1362 junit_attrs="$junit_attrs timestamp=\"$(TZ=UTC \1363 date +%Y-%m-%dT%H:%M:%S)\""1364 write_junit_xml --truncate "<testsuites>" " <testsuite $junit_attrs>"1365 junit_suite_start=$(test-tool date getnanos)1366 if test -n "$GIT_TEST_TEE_OUTPUT_FILE"1367 then1368 GIT_TEST_TEE_OFFSET=01369 fi1370fi13711372# Provide an implementation of the 'yes' utility; the upper bound1373# limit is there to help Windows that cannot stop this loop from1374# wasting cycles when the downstream stops reading, so do not be1375# tempted to turn it into an infinite loop. cf. 6129c930 ("test-lib:1376# limit the output of the yes utility", 2016-02-02)1377yes () {1378 if test $# = 01379 then1380 y=y1381 else1382 y="$*"1383 fi13841385 i=01386 while test $i -lt 991387 do1388 echo "$y"1389 i=$(($i+1))1390 done1391}13921393# The GIT_TEST_FAIL_PREREQS code hooks into test_set_prereq(), and1394# thus needs to be set up really early, and set an internal variable1395# for convenience so the hot test_set_prereq() codepath doesn't need1396# to call "git env--helper". Only do that work if needed by seeing if1397# GIT_TEST_FAIL_PREREQS is set at all.1398GIT_TEST_FAIL_PREREQS_INTERNAL=1399if test -n "$GIT_TEST_FAIL_PREREQS"1400then1401 if git env--helper --type=bool --default=0 --exit-code GIT_TEST_FAIL_PREREQS1402 then1403 GIT_TEST_FAIL_PREREQS_INTERNAL=true1404 test_set_prereq FAIL_PREREQS1405 fi1406else1407 test_lazy_prereq FAIL_PREREQS '1408 git env--helper --type=bool --default=0 --exit-code GIT_TEST_FAIL_PREREQS1409 '1410fi14111412# Fix some commands on Windows1413uname_s=$(uname -s)1414case $uname_s in1415*MINGW*)1416 # Windows has its own (incompatible) sort and find1417 sort () {1418 /usr/bin/sort "$@"1419 }1420 find () {1421 /usr/bin/find "$@"1422 }1423 # git sees Windows-style pwd1424 pwd () {1425 builtin pwd -W1426 }1427 # no POSIX permissions1428 # backslashes in pathspec are converted to '/'1429 # exec does not inherit the PID1430 test_set_prereq MINGW1431 test_set_prereq NATIVE_CRLF1432 test_set_prereq SED_STRIPS_CR1433 test_set_prereq GREP_STRIPS_CR1434 GIT_TEST_CMP=mingw_test_cmp1435 ;;1436*CYGWIN*)1437 test_set_prereq POSIXPERM1438 test_set_prereq EXECKEEPSPID1439 test_set_prereq CYGWIN1440 test_set_prereq SED_STRIPS_CR1441 test_set_prereq GREP_STRIPS_CR1442 ;;1443*)1444 test_set_prereq POSIXPERM1445 test_set_prereq BSLASHPSPEC1446 test_set_prereq EXECKEEPSPID1447 ;;1448esac14491450( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_11451test -z "$NO_PERL" && test_set_prereq PERL1452test -z "$NO_PTHREADS" && test_set_prereq PTHREADS1453test -z "$NO_PYTHON" && test_set_prereq PYTHON1454test -n "$USE_LIBPCRE1$USE_LIBPCRE2" && test_set_prereq PCRE1455test -n "$USE_LIBPCRE1" && test_set_prereq LIBPCRE11456test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE21457test -z "$NO_GETTEXT" && test_set_prereq GETTEXT14581459if test -n "$GIT_TEST_GETTEXT_POISON_ORIG"1460then1461 GIT_TEST_GETTEXT_POISON=$GIT_TEST_GETTEXT_POISON_ORIG1462 export GIT_TEST_GETTEXT_POISON1463 unset GIT_TEST_GETTEXT_POISON_ORIG1464fi14651466test_lazy_prereq C_LOCALE_OUTPUT '1467 ! git env--helper --type=bool --default=0 --exit-code GIT_TEST_GETTEXT_POISON1468'14691470if test -z "$GIT_TEST_CHECK_CACHE_TREE"1471then1472 GIT_TEST_CHECK_CACHE_TREE=true1473 export GIT_TEST_CHECK_CACHE_TREE1474fi14751476test_lazy_prereq PIPE '1477 # test whether the filesystem supports FIFOs1478 test_have_prereq !MINGW,!CYGWIN &&1479 rm -f testfifo && mkfifo testfifo1480'14811482test_lazy_prereq SYMLINKS '1483 # test whether the filesystem supports symbolic links1484 ln -s x y && test -h y1485'14861487test_lazy_prereq FILEMODE '1488 test "$(git config --bool core.filemode)" = true1489'14901491test_lazy_prereq CASE_INSENSITIVE_FS '1492 echo good >CamelCase &&1493 echo bad >camelcase &&1494 test "$(cat CamelCase)" != good1495'14961497test_lazy_prereq FUNNYNAMES '1498 test_have_prereq !MINGW &&1499 touch -- \1500 "FUNNYNAMES tab embedded" \1501 "FUNNYNAMES \"quote embedded\"" \1502 "FUNNYNAMES newline1503embedded" 2>/dev/null &&1504 rm -- \1505 "FUNNYNAMES tab embedded" \1506 "FUNNYNAMES \"quote embedded\"" \1507 "FUNNYNAMES newline1508embedded" 2>/dev/null1509'15101511test_lazy_prereq UTF8_NFD_TO_NFC '1512 # check whether FS converts nfd unicode to nfc1513 auml=$(printf "\303\244")1514 aumlcdiar=$(printf "\141\314\210")1515 >"$auml" &&1516 test -f "$aumlcdiar"1517'15181519test_lazy_prereq AUTOIDENT '1520 sane_unset GIT_AUTHOR_NAME &&1521 sane_unset GIT_AUTHOR_EMAIL &&1522 git var GIT_AUTHOR_IDENT1523'15241525test_lazy_prereq EXPENSIVE '1526 test -n "$GIT_TEST_LONG"1527'15281529test_lazy_prereq EXPENSIVE_ON_WINDOWS '1530 test_have_prereq EXPENSIVE || test_have_prereq !MINGW,!CYGWIN1531'15321533test_lazy_prereq USR_BIN_TIME '1534 test -x /usr/bin/time1535'15361537test_lazy_prereq NOT_ROOT '1538 uid=$(id -u) &&1539 test "$uid" != 01540'15411542test_lazy_prereq JGIT '1543 jgit --version1544'15451546# SANITY is about "can you correctly predict what the filesystem would1547# do by only looking at the permission bits of the files and1548# directories?" A typical example of !SANITY is running the test1549# suite as root, where a test may expect "chmod -r file && cat file"1550# to fail because file is supposed to be unreadable after a successful1551# chmod. In an environment (i.e. combination of what filesystem is1552# being used and who is running the tests) that lacks SANITY, you may1553# be able to delete or create a file when the containing directory1554# doesn't have write permissions, or access a file even if the1555# containing directory doesn't have read or execute permissions.15561557test_lazy_prereq SANITY '1558 mkdir SANETESTD.1 SANETESTD.2 &&15591560 chmod +w SANETESTD.1 SANETESTD.2 &&1561 >SANETESTD.1/x 2>SANETESTD.2/x &&1562 chmod -w SANETESTD.1 &&1563 chmod -r SANETESTD.1/x &&1564 chmod -rx SANETESTD.2 ||1565 BUG "cannot prepare SANETESTD"15661567 ! test -r SANETESTD.1/x &&1568 ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x1569 status=$?15701571 chmod +rwx SANETESTD.1 SANETESTD.2 &&1572 rm -rf SANETESTD.1 SANETESTD.2 ||1573 BUG "cannot clean SANETESTD"1574 return $status1575'15761577test FreeBSD != $uname_s || GIT_UNZIP=${GIT_UNZIP:-/usr/local/bin/unzip}1578GIT_UNZIP=${GIT_UNZIP:-unzip}1579test_lazy_prereq UNZIP '1580 "$GIT_UNZIP" -v1581 test $? -ne 1271582'15831584run_with_limited_cmdline () {1585 (ulimit -s 128 && "$@")1586}15871588test_lazy_prereq CMDLINE_LIMIT '1589 test_have_prereq !MINGW,!CYGWIN &&1590 run_with_limited_cmdline true1591'15921593run_with_limited_stack () {1594 (ulimit -s 128 && "$@")1595}15961597test_lazy_prereq ULIMIT_STACK_SIZE '1598 test_have_prereq !MINGW,!CYGWIN &&1599 run_with_limited_stack true1600'16011602build_option () {1603 git version --build-options |1604 sed -ne "s/^$1: //p"1605}16061607test_lazy_prereq LONG_IS_64BIT '1608 test 8 -le "$(build_option sizeof-long)"1609'16101611test_lazy_prereq TIME_IS_64BIT 'test-tool date is64bit'1612test_lazy_prereq TIME_T_IS_64BIT 'test-tool date time_t-is64bit'16131614test_lazy_prereq CURL '1615 curl --version1616'16171618# SHA1 is a test if the hash algorithm in use is SHA-1. This is both for tests1619# which will not work with other hash algorithms and tests that work but don't1620# test anything meaningful (e.g. special values which cause short collisions).1621test_lazy_prereq SHA1 '1622 test $(git hash-object /dev/null) = e69de29bb2d1d6434b8b29ae775ad8c2e48c53911623'16241625test_lazy_prereq REBASE_P '1626 test -z "$GIT_TEST_SKIP_REBASE_P"1627'