t / test-lib.shon commit test-lib: whitelist GIT_TR2_* in the environment (c1ee579)
   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################################################################
  61# It appears that people try to run tests without building...
  62"${GIT_TEST_INSTALLED:-$GIT_BUILD_DIR}/git$X" >/dev/null
  63if test $? != 1
  64then
  65        if test -n "$GIT_TEST_INSTALLED"
  66        then
  67                echo >&2 "error: there is no working Git at '$GIT_TEST_INSTALLED'"
  68        else
  69                echo >&2 'error: you do not seem to have built git yet.'
  70        fi
  71        exit 1
  72fi
  73
  74# Parse options while taking care to leave $@ intact, so we will still
  75# have all the original command line options when executing the test
  76# script again for '--tee' and '--verbose-log' below.
  77store_arg_to=
  78prev_opt=
  79for opt
  80do
  81        if test -n "$store_arg_to"
  82        then
  83                eval $store_arg_to=\$opt
  84                store_arg_to=
  85                prev_opt=
  86                continue
  87        fi
  88
  89        case "$opt" in
  90        -d|--d|--de|--deb|--debu|--debug)
  91                debug=t ;;
  92        -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
  93                immediate=t ;;
  94        -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
  95                GIT_TEST_LONG=t; export GIT_TEST_LONG ;;
  96        -r)
  97                store_arg_to=run_list
  98                ;;
  99        --run=*)
 100                run_list=${opt#--*=} ;;
 101        -h|--h|--he|--hel|--help)
 102                help=t ;;
 103        -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
 104                verbose=t ;;
 105        --verbose-only=*)
 106                verbose_only=${opt#--*=}
 107                ;;
 108        -q|--q|--qu|--qui|--quie|--quiet)
 109                # Ignore --quiet under a TAP::Harness. Saying how many tests
 110                # passed without the ok/not ok details is always an error.
 111                test -z "$HARNESS_ACTIVE" && quiet=t ;;
 112        --with-dashes)
 113                with_dashes=t ;;
 114        --no-bin-wrappers)
 115                no_bin_wrappers=t ;;
 116        --no-color)
 117                color= ;;
 118        --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
 119                valgrind=memcheck
 120                tee=t
 121                ;;
 122        --valgrind=*)
 123                valgrind=${opt#--*=}
 124                tee=t
 125                ;;
 126        --valgrind-only=*)
 127                valgrind_only=${opt#--*=}
 128                tee=t
 129                ;;
 130        --tee)
 131                tee=t ;;
 132        --root=*)
 133                root=${opt#--*=} ;;
 134        --chain-lint)
 135                GIT_TEST_CHAIN_LINT=1 ;;
 136        --no-chain-lint)
 137                GIT_TEST_CHAIN_LINT=0 ;;
 138        -x)
 139                trace=t ;;
 140        -V|--verbose-log)
 141                verbose_log=t
 142                tee=t
 143                ;;
 144        --write-junit-xml)
 145                write_junit_xml=t
 146                ;;
 147        --stress)
 148                stress=t ;;
 149        --stress=*)
 150                echo "error: --stress does not accept an argument: '$opt'" >&2
 151                echo "did you mean --stress-jobs=${opt#*=} or --stress-limit=${opt#*=}?" >&2
 152                exit 1
 153                ;;
 154        --stress-jobs=*)
 155                stress=t;
 156                stress=${opt#--*=}
 157                case "$stress" in
 158                *[!0-9]*|0*|"")
 159                        echo "error: --stress-jobs=<N> requires the number of jobs to run" >&2
 160                        exit 1
 161                        ;;
 162                *)      # Good.
 163                        ;;
 164                esac
 165                ;;
 166        --stress-limit=*)
 167                stress=t;
 168                stress_limit=${opt#--*=}
 169                case "$stress_limit" in
 170                *[!0-9]*|0*|"")
 171                        echo "error: --stress-limit=<N> requires the number of repetitions" >&2
 172                        exit 1
 173                        ;;
 174                *)      # Good.
 175                        ;;
 176                esac
 177                ;;
 178        *)
 179                echo "error: unknown test option '$opt'" >&2; exit 1 ;;
 180        esac
 181
 182        prev_opt=$opt
 183done
 184if test -n "$store_arg_to"
 185then
 186        echo "error: $prev_opt requires an argument" >&2
 187        exit 1
 188fi
 189
 190if test -n "$valgrind_only"
 191then
 192        test -z "$valgrind" && valgrind=memcheck
 193        test -z "$verbose" && verbose_only="$valgrind_only"
 194elif test -n "$valgrind"
 195then
 196        test -z "$verbose_log" && verbose=t
 197fi
 198
 199if test -n "$stress"
 200then
 201        verbose=t
 202        trace=t
 203        immediate=t
 204fi
 205
 206TEST_STRESS_JOB_SFX="${GIT_TEST_STRESS_JOB_NR:+.stress-$GIT_TEST_STRESS_JOB_NR}"
 207TEST_NAME="$(basename "$0" .sh)"
 208TEST_RESULTS_DIR="$TEST_OUTPUT_DIRECTORY/test-results"
 209TEST_RESULTS_BASE="$TEST_RESULTS_DIR/$TEST_NAME$TEST_STRESS_JOB_SFX"
 210TRASH_DIRECTORY="trash directory.$TEST_NAME$TEST_STRESS_JOB_SFX"
 211test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"
 212case "$TRASH_DIRECTORY" in
 213/*) ;; # absolute path is good
 214 *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;;
 215esac
 216
 217# If --stress was passed, run this test repeatedly in several parallel loops.
 218if test "$GIT_TEST_STRESS_STARTED" = "done"
 219then
 220        : # Don't stress test again.
 221elif test -n "$stress"
 222then
 223        if test "$stress" != t
 224        then
 225                job_count=$stress
 226        elif test -n "$GIT_TEST_STRESS_LOAD"
 227        then
 228                job_count="$GIT_TEST_STRESS_LOAD"
 229        elif job_count=$(getconf _NPROCESSORS_ONLN 2>/dev/null) &&
 230             test -n "$job_count"
 231        then
 232                job_count=$((2 * $job_count))
 233        else
 234                job_count=8
 235        fi
 236
 237        mkdir -p "$TEST_RESULTS_DIR"
 238        stressfail="$TEST_RESULTS_BASE.stress-failed"
 239        rm -f "$stressfail"
 240
 241        stress_exit=0
 242        trap '
 243                kill $job_pids 2>/dev/null
 244                wait
 245                stress_exit=1
 246        ' TERM INT HUP
 247
 248        job_pids=
 249        job_nr=0
 250        while test $job_nr -lt "$job_count"
 251        do
 252                (
 253                        GIT_TEST_STRESS_STARTED=done
 254                        GIT_TEST_STRESS_JOB_NR=$job_nr
 255                        export GIT_TEST_STRESS_STARTED GIT_TEST_STRESS_JOB_NR
 256
 257                        trap '
 258                                kill $test_pid 2>/dev/null
 259                                wait
 260                                exit 1
 261                        ' TERM INT
 262
 263                        cnt=1
 264                        while ! test -e "$stressfail" &&
 265                              { test -z "$stress_limit" ||
 266                                test $cnt -le $stress_limit ; }
 267                        do
 268                                $TEST_SHELL_PATH "$0" "$@" >"$TEST_RESULTS_BASE.stress-$job_nr.out" 2>&1 &
 269                                test_pid=$!
 270
 271                                if wait $test_pid
 272                                then
 273                                        printf "OK   %2d.%d\n" $GIT_TEST_STRESS_JOB_NR $cnt
 274                                else
 275                                        echo $GIT_TEST_STRESS_JOB_NR >>"$stressfail"
 276                                        printf "FAIL %2d.%d\n" $GIT_TEST_STRESS_JOB_NR $cnt
 277                                fi
 278                                cnt=$(($cnt + 1))
 279                        done
 280                ) &
 281                job_pids="$job_pids $!"
 282                job_nr=$(($job_nr + 1))
 283        done
 284
 285        wait
 286
 287        if test -f "$stressfail"
 288        then
 289                stress_exit=1
 290                echo "Log(s) of failed test run(s):"
 291                for failed_job_nr in $(sort -n "$stressfail")
 292                do
 293                        echo "Contents of '$TEST_RESULTS_BASE.stress-$failed_job_nr.out':"
 294                        cat "$TEST_RESULTS_BASE.stress-$failed_job_nr.out"
 295                done
 296                rm -rf "$TRASH_DIRECTORY.stress-failed"
 297                # Move the last one.
 298                mv "$TRASH_DIRECTORY.stress-$failed_job_nr" "$TRASH_DIRECTORY.stress-failed"
 299        fi
 300
 301        exit $stress_exit
 302fi
 303
 304# if --tee was passed, write the output not only to the terminal, but
 305# additionally to the file test-results/$BASENAME.out, too.
 306if test "$GIT_TEST_TEE_STARTED" = "done"
 307then
 308        : # do not redirect again
 309elif test -n "$tee"
 310then
 311        mkdir -p "$TEST_RESULTS_DIR"
 312
 313        # Make this filename available to the sub-process in case it is using
 314        # --verbose-log.
 315        GIT_TEST_TEE_OUTPUT_FILE=$TEST_RESULTS_BASE.out
 316        export GIT_TEST_TEE_OUTPUT_FILE
 317
 318        # Truncate before calling "tee -a" to get rid of the results
 319        # from any previous runs.
 320        >"$GIT_TEST_TEE_OUTPUT_FILE"
 321
 322        (GIT_TEST_TEE_STARTED=done ${TEST_SHELL_PATH} "$0" "$@" 2>&1;
 323         echo $? >"$TEST_RESULTS_BASE.exit") | tee -a "$GIT_TEST_TEE_OUTPUT_FILE"
 324        test "$(cat "$TEST_RESULTS_BASE.exit")" = 0
 325        exit
 326fi
 327
 328if test -n "$trace" && test -n "$test_untraceable"
 329then
 330        # '-x' tracing requested, but this test script can't be reliably
 331        # traced, unless it is run with a Bash version supporting
 332        # BASH_XTRACEFD (introduced in Bash v4.1).
 333        #
 334        # Perform this version check _after_ the test script was
 335        # potentially re-executed with $TEST_SHELL_PATH for '--tee' or
 336        # '--verbose-log', so the right shell is checked and the
 337        # warning is issued only once.
 338        if test -n "$BASH_VERSION" && eval '
 339             test ${BASH_VERSINFO[0]} -gt 4 || {
 340               test ${BASH_VERSINFO[0]} -eq 4 &&
 341               test ${BASH_VERSINFO[1]} -ge 1
 342             }
 343           '
 344        then
 345                : Executed by a Bash version supporting BASH_XTRACEFD.  Good.
 346        else
 347                echo >&2 "warning: ignoring -x; '$0' is untraceable without BASH_XTRACEFD"
 348                trace=
 349        fi
 350fi
 351if test -n "$trace" && test -z "$verbose_log"
 352then
 353        verbose=t
 354fi
 355
 356# For repeatability, reset the environment to known value.
 357# TERM is sanitized below, after saving color control sequences.
 358LANG=C
 359LC_ALL=C
 360PAGER=cat
 361TZ=UTC
 362export LANG LC_ALL PAGER TZ
 363EDITOR=:
 364
 365# GIT_TEST_GETTEXT_POISON should not influence git commands executed
 366# during initialization of test-lib and the test repo. Back it up,
 367# unset and then restore after initialization is finished.
 368if test -n "$GIT_TEST_GETTEXT_POISON"
 369then
 370        GIT_TEST_GETTEXT_POISON_ORIG=$GIT_TEST_GETTEXT_POISON
 371        unset GIT_TEST_GETTEXT_POISON
 372fi
 373
 374# A call to "unset" with no arguments causes at least Solaris 10
 375# /usr/xpg4/bin/sh and /bin/ksh to bail out.  So keep the unsets
 376# deriving from the command substitution clustered with the other
 377# ones.
 378unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH" -e '
 379        my @env = keys %ENV;
 380        my $ok = join("|", qw(
 381                TRACE
 382                TR2_
 383                DEBUG
 384                TEST
 385                .*_TEST
 386                PROVE
 387                VALGRIND
 388                UNZIP
 389                PERF_
 390                CURL_VERBOSE
 391                TRACE_CURL
 392        ));
 393        my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env);
 394        print join("\n", @vars);
 395')
 396unset XDG_CACHE_HOME
 397unset XDG_CONFIG_HOME
 398unset GITPERLLIB
 399GIT_AUTHOR_EMAIL=author@example.com
 400GIT_AUTHOR_NAME='A U Thor'
 401GIT_COMMITTER_EMAIL=committer@example.com
 402GIT_COMMITTER_NAME='C O Mitter'
 403GIT_MERGE_VERBOSITY=5
 404GIT_MERGE_AUTOEDIT=no
 405export GIT_MERGE_VERBOSITY GIT_MERGE_AUTOEDIT
 406export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
 407export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
 408export EDITOR
 409
 410# Tests using GIT_TRACE typically don't want <timestamp> <file>:<line> output
 411GIT_TRACE_BARE=1
 412export GIT_TRACE_BARE
 413
 414check_var_migration () {
 415        # the warnings and hints given from this helper depends
 416        # on end-user settings, which will disrupt the self-test
 417        # done on the test framework itself.
 418        case "$GIT_TEST_FRAMEWORK_SELFTEST" in
 419        t)      return ;;
 420        esac
 421
 422        old_name=$1 new_name=$2
 423        eval "old_isset=\${${old_name}:+isset}"
 424        eval "new_isset=\${${new_name}:+isset}"
 425
 426        case "$old_isset,$new_isset" in
 427        isset,)
 428                echo >&2 "warning: $old_name is now $new_name"
 429                echo >&2 "hint: set $new_name too during the transition period"
 430                eval "$new_name=\$$old_name"
 431                ;;
 432        isset,isset)
 433                # do this later
 434                # echo >&2 "warning: $old_name is now $new_name"
 435                # echo >&2 "hint: remove $old_name"
 436                ;;
 437        esac
 438}
 439
 440check_var_migration GIT_FSMONITOR_TEST GIT_TEST_FSMONITOR
 441check_var_migration TEST_GIT_INDEX_VERSION GIT_TEST_INDEX_VERSION
 442check_var_migration GIT_FORCE_PRELOAD_TEST GIT_TEST_PRELOAD_INDEX
 443
 444# Use specific version of the index file format
 445if test -n "${GIT_TEST_INDEX_VERSION:+isset}"
 446then
 447        GIT_INDEX_VERSION="$GIT_TEST_INDEX_VERSION"
 448        export GIT_INDEX_VERSION
 449fi
 450
 451# Add libc MALLOC and MALLOC_PERTURB test
 452# only if we are not executing the test with valgrind
 453if test -n "$valgrind" ||
 454   test -n "$TEST_NO_MALLOC_CHECK"
 455then
 456        setup_malloc_check () {
 457                : nothing
 458        }
 459        teardown_malloc_check () {
 460                : nothing
 461        }
 462else
 463        setup_malloc_check () {
 464                MALLOC_CHECK_=3 MALLOC_PERTURB_=165
 465                export MALLOC_CHECK_ MALLOC_PERTURB_
 466        }
 467        teardown_malloc_check () {
 468                unset MALLOC_CHECK_ MALLOC_PERTURB_
 469        }
 470fi
 471
 472# Protect ourselves from common misconfiguration to export
 473# CDPATH into the environment
 474unset CDPATH
 475
 476unset GREP_OPTIONS
 477unset UNZIP
 478
 479case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
 4801|2|true)
 481        GIT_TRACE=4
 482        ;;
 483esac
 484
 485# Convenience
 486#
 487# A regexp to match 5, 35 and 40 hexdigits
 488_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
 489_x35="$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
 490_x40="$_x35$_x05"
 491
 492# Zero SHA-1
 493_z40=0000000000000000000000000000000000000000
 494
 495OID_REGEX="$_x40"
 496ZERO_OID=$_z40
 497EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904
 498EMPTY_BLOB=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
 499
 500# Line feed
 501LF='
 502'
 503
 504# UTF-8 ZERO WIDTH NON-JOINER, which HFS+ ignores
 505# when case-folding filenames
 506u200c=$(printf '\342\200\214')
 507
 508export _x05 _x35 _x40 _z40 LF u200c EMPTY_TREE EMPTY_BLOB ZERO_OID OID_REGEX
 509
 510# Each test should start with something like this, after copyright notices:
 511#
 512# test_description='Description of this test...
 513# This test checks if command xyzzy does the right thing...
 514# '
 515# . ./test-lib.sh
 516test "x$TERM" != "xdumb" && (
 517                test -t 1 &&
 518                tput bold >/dev/null 2>&1 &&
 519                tput setaf 1 >/dev/null 2>&1 &&
 520                tput sgr0 >/dev/null 2>&1
 521        ) &&
 522        color=t
 523
 524if test -n "$color"
 525then
 526        # Save the color control sequences now rather than run tput
 527        # each time say_color() is called.  This is done for two
 528        # reasons:
 529        #   * TERM will be changed to dumb
 530        #   * HOME will be changed to a temporary directory and tput
 531        #     might need to read ~/.terminfo from the original HOME
 532        #     directory to get the control sequences
 533        # Note:  This approach assumes the control sequences don't end
 534        # in a newline for any terminal of interest (command
 535        # substitutions strip trailing newlines).  Given that most
 536        # (all?) terminals in common use are related to ECMA-48, this
 537        # shouldn't be a problem.
 538        say_color_error=$(tput bold; tput setaf 1) # bold red
 539        say_color_skip=$(tput setaf 4) # blue
 540        say_color_warn=$(tput setaf 3) # brown/yellow
 541        say_color_pass=$(tput setaf 2) # green
 542        say_color_info=$(tput setaf 6) # cyan
 543        say_color_reset=$(tput sgr0)
 544        say_color_="" # no formatting for normal text
 545        say_color () {
 546                test -z "$1" && test -n "$quiet" && return
 547                eval "say_color_color=\$say_color_$1"
 548                shift
 549                printf "%s\\n" "$say_color_color$*$say_color_reset"
 550        }
 551else
 552        say_color() {
 553                test -z "$1" && test -n "$quiet" && return
 554                shift
 555                printf "%s\n" "$*"
 556        }
 557fi
 558
 559TERM=dumb
 560export TERM
 561
 562error () {
 563        say_color error "error: $*"
 564        GIT_EXIT_OK=t
 565        exit 1
 566}
 567
 568BUG () {
 569        error >&7 "bug in the test script: $*"
 570}
 571
 572say () {
 573        say_color info "$*"
 574}
 575
 576if test -n "$HARNESS_ACTIVE"
 577then
 578        if test "$verbose" = t || test -n "$verbose_only"
 579        then
 580                printf 'Bail out! %s\n' \
 581                 'verbose mode forbidden under TAP harness; try --verbose-log'
 582                exit 1
 583        fi
 584fi
 585
 586test "${test_description}" != "" ||
 587error "Test script did not set test_description."
 588
 589if test "$help" = "t"
 590then
 591        printf '%s\n' "$test_description"
 592        exit 0
 593fi
 594
 595exec 5>&1
 596exec 6<&0
 597exec 7>&2
 598if test "$verbose_log" = "t"
 599then
 600        exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3
 601elif test "$verbose" = "t"
 602then
 603        exec 4>&2 3>&1
 604else
 605        exec 4>/dev/null 3>/dev/null
 606fi
 607
 608# Send any "-x" output directly to stderr to avoid polluting tests
 609# which capture stderr. We can do this unconditionally since it
 610# has no effect if tracing isn't turned on.
 611#
 612# Note that this sets up the trace fd as soon as we assign the variable, so it
 613# must come after the creation of descriptor 4 above. Likewise, we must never
 614# unset this, as it has the side effect of closing descriptor 4, which we
 615# use to show verbose tests to the user.
 616#
 617# Note also that we don't need or want to export it. The tracing is local to
 618# this shell, and we would not want to influence any shells we exec.
 619BASH_XTRACEFD=4
 620
 621test_failure=0
 622test_count=0
 623test_fixed=0
 624test_broken=0
 625test_success=0
 626
 627test_external_has_tap=0
 628
 629die () {
 630        code=$?
 631        if test -n "$GIT_EXIT_OK"
 632        then
 633                exit $code
 634        else
 635                echo >&5 "FATAL: Unexpected exit with code $code"
 636                exit 1
 637        fi
 638}
 639
 640GIT_EXIT_OK=
 641trap 'die' EXIT
 642trap 'exit $?' INT TERM HUP
 643
 644# The user-facing functions are loaded from a separate file so that
 645# test_perf subshells can have them too
 646. "$TEST_DIRECTORY/test-lib-functions.sh"
 647
 648# You are not expected to call test_ok_ and test_failure_ directly, use
 649# the test_expect_* functions instead.
 650
 651test_ok_ () {
 652        if test -n "$write_junit_xml"
 653        then
 654                write_junit_xml_testcase "$*"
 655        fi
 656        test_success=$(($test_success + 1))
 657        say_color "" "ok $test_count - $@"
 658}
 659
 660test_failure_ () {
 661        if test -n "$write_junit_xml"
 662        then
 663                junit_insert="<failure message=\"not ok $test_count -"
 664                junit_insert="$junit_insert $(xml_attr_encode "$1")\">"
 665                junit_insert="$junit_insert $(xml_attr_encode \
 666                        "$(if test -n "$GIT_TEST_TEE_OUTPUT_FILE"
 667                           then
 668                                test-tool path-utils skip-n-bytes \
 669                                        "$GIT_TEST_TEE_OUTPUT_FILE" $GIT_TEST_TEE_OFFSET
 670                           else
 671                                printf '%s\n' "$@" | sed 1d
 672                           fi)")"
 673                junit_insert="$junit_insert</failure>"
 674                if test -n "$GIT_TEST_TEE_OUTPUT_FILE"
 675                then
 676                        junit_insert="$junit_insert<system-err>$(xml_attr_encode \
 677                                "$(cat "$GIT_TEST_TEE_OUTPUT_FILE")")</system-err>"
 678                fi
 679                write_junit_xml_testcase "$1" "      $junit_insert"
 680        fi
 681        test_failure=$(($test_failure + 1))
 682        say_color error "not ok $test_count - $1"
 683        shift
 684        printf '%s\n' "$*" | sed -e 's/^/#      /'
 685        test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
 686}
 687
 688test_known_broken_ok_ () {
 689        if test -n "$write_junit_xml"
 690        then
 691                write_junit_xml_testcase "$* (breakage fixed)"
 692        fi
 693        test_fixed=$(($test_fixed+1))
 694        say_color error "ok $test_count - $@ # TODO known breakage vanished"
 695}
 696
 697test_known_broken_failure_ () {
 698        if test -n "$write_junit_xml"
 699        then
 700                write_junit_xml_testcase "$* (known breakage)"
 701        fi
 702        test_broken=$(($test_broken+1))
 703        say_color warn "not ok $test_count - $@ # TODO known breakage"
 704}
 705
 706test_debug () {
 707        test "$debug" = "" || eval "$1"
 708}
 709
 710match_pattern_list () {
 711        arg="$1"
 712        shift
 713        test -z "$*" && return 1
 714        for pattern_
 715        do
 716                case "$arg" in
 717                $pattern_)
 718                        return 0
 719                esac
 720        done
 721        return 1
 722}
 723
 724match_test_selector_list () {
 725        title="$1"
 726        shift
 727        arg="$1"
 728        shift
 729        test -z "$1" && return 0
 730
 731        # Both commas and whitespace are accepted as separators.
 732        OLDIFS=$IFS
 733        IFS='   ,'
 734        set -- $1
 735        IFS=$OLDIFS
 736
 737        # If the first selector is negative we include by default.
 738        include=
 739        case "$1" in
 740                !*) include=t ;;
 741        esac
 742
 743        for selector
 744        do
 745                orig_selector=$selector
 746
 747                positive=t
 748                case "$selector" in
 749                        !*)
 750                                positive=
 751                                selector=${selector##?}
 752                                ;;
 753                esac
 754
 755                test -z "$selector" && continue
 756
 757                case "$selector" in
 758                        *-*)
 759                                if expr "z${selector%%-*}" : "z[0-9]*[^0-9]" >/dev/null
 760                                then
 761                                        echo "error: $title: invalid non-numeric in range" \
 762                                                "start: '$orig_selector'" >&2
 763                                        exit 1
 764                                fi
 765                                if expr "z${selector#*-}" : "z[0-9]*[^0-9]" >/dev/null
 766                                then
 767                                        echo "error: $title: invalid non-numeric in range" \
 768                                                "end: '$orig_selector'" >&2
 769                                        exit 1
 770                                fi
 771                                ;;
 772                        *)
 773                                if expr "z$selector" : "z[0-9]*[^0-9]" >/dev/null
 774                                then
 775                                        echo "error: $title: invalid non-numeric in test" \
 776                                                "selector: '$orig_selector'" >&2
 777                                        exit 1
 778                                fi
 779                esac
 780
 781                # Short cut for "obvious" cases
 782                test -z "$include" && test -z "$positive" && continue
 783                test -n "$include" && test -n "$positive" && continue
 784
 785                case "$selector" in
 786                        -*)
 787                                if test $arg -le ${selector#-}
 788                                then
 789                                        include=$positive
 790                                fi
 791                                ;;
 792                        *-)
 793                                if test $arg -ge ${selector%-}
 794                                then
 795                                        include=$positive
 796                                fi
 797                                ;;
 798                        *-*)
 799                                if test ${selector%%-*} -le $arg \
 800                                        && test $arg -le ${selector#*-}
 801                                then
 802                                        include=$positive
 803                                fi
 804                                ;;
 805                        *)
 806                                if test $arg -eq $selector
 807                                then
 808                                        include=$positive
 809                                fi
 810                                ;;
 811                esac
 812        done
 813
 814        test -n "$include"
 815}
 816
 817maybe_teardown_verbose () {
 818        test -z "$verbose_only" && return
 819        exec 4>/dev/null 3>/dev/null
 820        verbose=
 821}
 822
 823last_verbose=t
 824maybe_setup_verbose () {
 825        test -z "$verbose_only" && return
 826        if match_pattern_list $test_count $verbose_only
 827        then
 828                exec 4>&2 3>&1
 829                # Emit a delimiting blank line when going from
 830                # non-verbose to verbose.  Within verbose mode the
 831                # delimiter is printed by test_expect_*.  The choice
 832                # of the initial $last_verbose is such that before
 833                # test 1, we do not print it.
 834                test -z "$last_verbose" && echo >&3 ""
 835                verbose=t
 836        else
 837                exec 4>/dev/null 3>/dev/null
 838                verbose=
 839        fi
 840        last_verbose=$verbose
 841}
 842
 843maybe_teardown_valgrind () {
 844        test -z "$GIT_VALGRIND" && return
 845        GIT_VALGRIND_ENABLED=
 846}
 847
 848maybe_setup_valgrind () {
 849        test -z "$GIT_VALGRIND" && return
 850        if test -z "$valgrind_only"
 851        then
 852                GIT_VALGRIND_ENABLED=t
 853                return
 854        fi
 855        GIT_VALGRIND_ENABLED=
 856        if match_pattern_list $test_count $valgrind_only
 857        then
 858                GIT_VALGRIND_ENABLED=t
 859        fi
 860}
 861
 862want_trace () {
 863        test "$trace" = t && {
 864                test "$verbose" = t || test "$verbose_log" = t
 865        }
 866}
 867
 868# This is a separate function because some tests use
 869# "return" to end a test_expect_success block early
 870# (and we want to make sure we run any cleanup like
 871# "set +x").
 872test_eval_inner_ () {
 873        # Do not add anything extra (including LF) after '$*'
 874        eval "
 875                want_trace && set -x
 876                $*"
 877}
 878
 879test_eval_ () {
 880        # If "-x" tracing is in effect, then we want to avoid polluting stderr
 881        # with non-test commands. But once in "set -x" mode, we cannot prevent
 882        # the shell from printing the "set +x" to turn it off (nor the saving
 883        # of $? before that). But we can make sure that the output goes to
 884        # /dev/null.
 885        #
 886        # There are a few subtleties here:
 887        #
 888        #   - we have to redirect descriptor 4 in addition to 2, to cover
 889        #     BASH_XTRACEFD
 890        #
 891        #   - the actual eval has to come before the redirection block (since
 892        #     it needs to see descriptor 4 to set up its stderr)
 893        #
 894        #   - likewise, any error message we print must be outside the block to
 895        #     access descriptor 4
 896        #
 897        #   - checking $? has to come immediately after the eval, but it must
 898        #     be _inside_ the block to avoid polluting the "set -x" output
 899        #
 900
 901        test_eval_inner_ "$@" </dev/null >&3 2>&4
 902        {
 903                test_eval_ret_=$?
 904                if want_trace
 905                then
 906                        set +x
 907                fi
 908        } 2>/dev/null 4>&2
 909
 910        if test "$test_eval_ret_" != 0 && want_trace
 911        then
 912                say_color error >&4 "error: last command exited with \$?=$test_eval_ret_"
 913        fi
 914        return $test_eval_ret_
 915}
 916
 917test_run_ () {
 918        test_cleanup=:
 919        expecting_failure=$2
 920
 921        if test "${GIT_TEST_CHAIN_LINT:-1}" != 0; then
 922                # turn off tracing for this test-eval, as it simply creates
 923                # confusing noise in the "-x" output
 924                trace_tmp=$trace
 925                trace=
 926                # 117 is magic because it is unlikely to match the exit
 927                # code of other programs
 928                if $(printf '%s\n' "$1" | sed -f "$GIT_BUILD_DIR/t/chainlint.sed" | grep -q '?![A-Z][A-Z]*?!') ||
 929                        test "OK-117" != "$(test_eval_ "(exit 117) && $1${LF}${LF}echo OK-\$?" 3>&1)"
 930                then
 931                        BUG "broken &&-chain or run-away HERE-DOC: $1"
 932                fi
 933                trace=$trace_tmp
 934        fi
 935
 936        setup_malloc_check
 937        test_eval_ "$1"
 938        eval_ret=$?
 939        teardown_malloc_check
 940
 941        if test -z "$immediate" || test $eval_ret = 0 ||
 942           test -n "$expecting_failure" && test "$test_cleanup" != ":"
 943        then
 944                setup_malloc_check
 945                test_eval_ "$test_cleanup"
 946                teardown_malloc_check
 947        fi
 948        if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"
 949        then
 950                echo ""
 951        fi
 952        return "$eval_ret"
 953}
 954
 955test_start_ () {
 956        test_count=$(($test_count+1))
 957        maybe_setup_verbose
 958        maybe_setup_valgrind
 959        if test -n "$write_junit_xml"
 960        then
 961                junit_start=$(test-tool date getnanos)
 962        fi
 963}
 964
 965test_finish_ () {
 966        echo >&3 ""
 967        maybe_teardown_valgrind
 968        maybe_teardown_verbose
 969        if test -n "$GIT_TEST_TEE_OFFSET"
 970        then
 971                GIT_TEST_TEE_OFFSET=$(test-tool path-utils file-size \
 972                        "$GIT_TEST_TEE_OUTPUT_FILE")
 973        fi
 974}
 975
 976test_skip () {
 977        to_skip=
 978        skipped_reason=
 979        if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS
 980        then
 981                to_skip=t
 982                skipped_reason="GIT_SKIP_TESTS"
 983        fi
 984        if test -z "$to_skip" && test -n "$test_prereq" &&
 985           ! test_have_prereq "$test_prereq"
 986        then
 987                to_skip=t
 988
 989                of_prereq=
 990                if test "$missing_prereq" != "$test_prereq"
 991                then
 992                        of_prereq=" of $test_prereq"
 993                fi
 994                skipped_reason="missing $missing_prereq${of_prereq}"
 995        fi
 996        if test -z "$to_skip" && test -n "$run_list" &&
 997                ! match_test_selector_list '--run' $test_count "$run_list"
 998        then
 999                to_skip=t
1000                skipped_reason="--run"
1001        fi
1002
1003        case "$to_skip" in
1004        t)
1005                if test -n "$write_junit_xml"
1006                then
1007                        message="$(xml_attr_encode "$skipped_reason")"
1008                        write_junit_xml_testcase "$1" \
1009                                "      <skipped message=\"$message\" />"
1010                fi
1011
1012                say_color skip >&3 "skipping test: $@"
1013                say_color skip "ok $test_count # skip $1 ($skipped_reason)"
1014                : true
1015                ;;
1016        *)
1017                false
1018                ;;
1019        esac
1020}
1021
1022# stub; perf-lib overrides it
1023test_at_end_hook_ () {
1024        :
1025}
1026
1027write_junit_xml () {
1028        case "$1" in
1029        --truncate)
1030                >"$junit_xml_path"
1031                junit_have_testcase=
1032                shift
1033                ;;
1034        esac
1035        printf '%s\n' "$@" >>"$junit_xml_path"
1036}
1037
1038xml_attr_encode () {
1039        printf '%s\n' "$@" | test-tool xml-encode
1040}
1041
1042write_junit_xml_testcase () {
1043        junit_attrs="name=\"$(xml_attr_encode "$this_test.$test_count $1")\""
1044        shift
1045        junit_attrs="$junit_attrs classname=\"$this_test\""
1046        junit_attrs="$junit_attrs time=\"$(test-tool \
1047                date getnanos $junit_start)\""
1048        write_junit_xml "$(printf '%s\n' \
1049                "    <testcase $junit_attrs>" "$@" "    </testcase>")"
1050        junit_have_testcase=t
1051}
1052
1053test_done () {
1054        GIT_EXIT_OK=t
1055
1056        if test -n "$write_junit_xml" && test -n "$junit_xml_path"
1057        then
1058                test -n "$junit_have_testcase" || {
1059                        junit_start=$(test-tool date getnanos)
1060                        write_junit_xml_testcase "all tests skipped"
1061                }
1062
1063                # adjust the overall time
1064                junit_time=$(test-tool date getnanos $junit_suite_start)
1065                sed "s/<testsuite [^>]*/& time=\"$junit_time\"/" \
1066                        <"$junit_xml_path" >"$junit_xml_path.new"
1067                mv "$junit_xml_path.new" "$junit_xml_path"
1068
1069                write_junit_xml "  </testsuite>" "</testsuites>"
1070        fi
1071
1072        if test -z "$HARNESS_ACTIVE"
1073        then
1074                mkdir -p "$TEST_RESULTS_DIR"
1075
1076                cat >"$TEST_RESULTS_BASE.counts" <<-EOF
1077                total $test_count
1078                success $test_success
1079                fixed $test_fixed
1080                broken $test_broken
1081                failed $test_failure
1082
1083                EOF
1084        fi
1085
1086        if test "$test_fixed" != 0
1087        then
1088                say_color error "# $test_fixed known breakage(s) vanished; please update test(s)"
1089        fi
1090        if test "$test_broken" != 0
1091        then
1092                say_color warn "# still have $test_broken known breakage(s)"
1093        fi
1094        if test "$test_broken" != 0 || test "$test_fixed" != 0
1095        then
1096                test_remaining=$(( $test_count - $test_broken - $test_fixed ))
1097                msg="remaining $test_remaining test(s)"
1098        else
1099                test_remaining=$test_count
1100                msg="$test_count test(s)"
1101        fi
1102        case "$test_failure" in
1103        0)
1104                if test $test_external_has_tap -eq 0
1105                then
1106                        if test $test_remaining -gt 0
1107                        then
1108                                say_color pass "# passed all $msg"
1109                        fi
1110
1111                        # Maybe print SKIP message
1112                        test -z "$skip_all" || skip_all="# SKIP $skip_all"
1113                        case "$test_count" in
1114                        0)
1115                                say "1..$test_count${skip_all:+ $skip_all}"
1116                                ;;
1117                        *)
1118                                test -z "$skip_all" ||
1119                                say_color warn "$skip_all"
1120                                say "1..$test_count"
1121                                ;;
1122                        esac
1123                fi
1124
1125                if test -z "$debug"
1126                then
1127                        test -d "$TRASH_DIRECTORY" ||
1128                        error "Tests passed but trash directory already removed before test cleanup; aborting"
1129
1130                        cd "$TRASH_DIRECTORY/.." &&
1131                        rm -fr "$TRASH_DIRECTORY" || {
1132                                # try again in a bit
1133                                sleep 5;
1134                                rm -fr "$TRASH_DIRECTORY"
1135                        } ||
1136                        error "Tests passed but test cleanup failed; aborting"
1137                fi
1138                test_at_end_hook_
1139
1140                exit 0 ;;
1141
1142        *)
1143                if test $test_external_has_tap -eq 0
1144                then
1145                        say_color error "# failed $test_failure among $msg"
1146                        say "1..$test_count"
1147                fi
1148
1149                exit 1 ;;
1150
1151        esac
1152}
1153
1154if test -n "$valgrind"
1155then
1156        make_symlink () {
1157                test -h "$2" &&
1158                test "$1" = "$(readlink "$2")" || {
1159                        # be super paranoid
1160                        if mkdir "$2".lock
1161                        then
1162                                rm -f "$2" &&
1163                                ln -s "$1" "$2" &&
1164                                rm -r "$2".lock
1165                        else
1166                                while test -d "$2".lock
1167                                do
1168                                        say "Waiting for lock on $2."
1169                                        sleep 1
1170                                done
1171                        fi
1172                }
1173        }
1174
1175        make_valgrind_symlink () {
1176                # handle only executables, unless they are shell libraries that
1177                # need to be in the exec-path.
1178                test -x "$1" ||
1179                test "# " = "$(test_copy_bytes 2 <"$1")" ||
1180                return;
1181
1182                base=$(basename "$1")
1183                case "$base" in
1184                test-*)
1185                        symlink_target="$GIT_BUILD_DIR/t/helper/$base"
1186                        ;;
1187                *)
1188                        symlink_target="$GIT_BUILD_DIR/$base"
1189                        ;;
1190                esac
1191                # do not override scripts
1192                if test -x "$symlink_target" &&
1193                    test ! -d "$symlink_target" &&
1194                    test "#!" != "$(test_copy_bytes 2 <"$symlink_target")"
1195                then
1196                        symlink_target=../valgrind.sh
1197                fi
1198                case "$base" in
1199                *.sh|*.perl)
1200                        symlink_target=../unprocessed-script
1201                esac
1202                # create the link, or replace it if it is out of date
1203                make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
1204        }
1205
1206        # override all git executables in TEST_DIRECTORY/..
1207        GIT_VALGRIND=$TEST_DIRECTORY/valgrind
1208        mkdir -p "$GIT_VALGRIND"/bin
1209        for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/t/helper/test-*
1210        do
1211                make_valgrind_symlink $file
1212        done
1213        # special-case the mergetools loadables
1214        make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools"
1215        OLDIFS=$IFS
1216        IFS=:
1217        for path in $PATH
1218        do
1219                ls "$path"/git-* 2> /dev/null |
1220                while read file
1221                do
1222                        make_valgrind_symlink "$file"
1223                done
1224        done
1225        IFS=$OLDIFS
1226        PATH=$GIT_VALGRIND/bin:$PATH
1227        GIT_EXEC_PATH=$GIT_VALGRIND/bin
1228        export GIT_VALGRIND
1229        GIT_VALGRIND_MODE="$valgrind"
1230        export GIT_VALGRIND_MODE
1231        GIT_VALGRIND_ENABLED=t
1232        test -n "$valgrind_only" && GIT_VALGRIND_ENABLED=
1233        export GIT_VALGRIND_ENABLED
1234elif test -n "$GIT_TEST_INSTALLED"
1235then
1236        GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path)  ||
1237        error "Cannot run git from $GIT_TEST_INSTALLED."
1238        PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR/t/helper:$PATH
1239        GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
1240else # normal case, use ../bin-wrappers only unless $with_dashes:
1241        if test -n "$no_bin_wrappers"
1242        then
1243                with_dashes=t
1244        else
1245                git_bin_dir="$GIT_BUILD_DIR/bin-wrappers"
1246                if ! test -x "$git_bin_dir/git"
1247                then
1248                        if test -z "$with_dashes"
1249                        then
1250                                say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"
1251                        fi
1252                        with_dashes=t
1253                fi
1254                PATH="$git_bin_dir:$PATH"
1255        fi
1256        GIT_EXEC_PATH=$GIT_BUILD_DIR
1257        if test -n "$with_dashes"
1258        then
1259                PATH="$GIT_BUILD_DIR:$GIT_BUILD_DIR/t/helper:$PATH"
1260        fi
1261fi
1262GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt
1263GIT_CONFIG_NOSYSTEM=1
1264GIT_ATTR_NOSYSTEM=1
1265export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM
1266
1267if test -z "$GIT_TEST_CMP"
1268then
1269        if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT"
1270        then
1271                GIT_TEST_CMP="$DIFF -c"
1272        else
1273                GIT_TEST_CMP="$DIFF -u"
1274        fi
1275fi
1276
1277GITPERLLIB="$GIT_BUILD_DIR"/perl/build/lib
1278export GITPERLLIB
1279test -d "$GIT_BUILD_DIR"/templates/blt || {
1280        error "You haven't built things yet, have you?"
1281}
1282
1283if ! test -x "$GIT_BUILD_DIR"/t/helper/test-tool$X
1284then
1285        echo >&2 'You need to build test-tool:'
1286        echo >&2 'Run "make t/helper/test-tool" in the source (toplevel) directory'
1287        exit 1
1288fi
1289
1290# Test repository
1291rm -fr "$TRASH_DIRECTORY" || {
1292        GIT_EXIT_OK=t
1293        echo >&5 "FATAL: Cannot prepare test area"
1294        exit 1
1295}
1296
1297HOME="$TRASH_DIRECTORY"
1298GNUPGHOME="$HOME/gnupg-home-not-used"
1299export HOME GNUPGHOME
1300
1301if test -z "$TEST_NO_CREATE_REPO"
1302then
1303        test_create_repo "$TRASH_DIRECTORY"
1304else
1305        mkdir -p "$TRASH_DIRECTORY"
1306fi
1307
1308# Use -P to resolve symlinks in our working directory so that the cwd
1309# in subprocesses like git equals our $PWD (for pathname comparisons).
1310cd -P "$TRASH_DIRECTORY" || exit 1
1311
1312this_test=${0##*/}
1313this_test=${this_test%%-*}
1314if match_pattern_list "$this_test" $GIT_SKIP_TESTS
1315then
1316        say_color info >&3 "skipping test $this_test altogether"
1317        skip_all="skip all tests in $this_test"
1318        test_done
1319fi
1320
1321if test -n "$write_junit_xml"
1322then
1323        junit_xml_dir="$TEST_OUTPUT_DIRECTORY/out"
1324        mkdir -p "$junit_xml_dir"
1325        junit_xml_base=${0##*/}
1326        junit_xml_path="$junit_xml_dir/TEST-${junit_xml_base%.sh}.xml"
1327        junit_attrs="name=\"${junit_xml_base%.sh}\""
1328        junit_attrs="$junit_attrs timestamp=\"$(TZ=UTC \
1329                date +%Y-%m-%dT%H:%M:%S)\""
1330        write_junit_xml --truncate "<testsuites>" "  <testsuite $junit_attrs>"
1331        junit_suite_start=$(test-tool date getnanos)
1332        if test -n "$GIT_TEST_TEE_OUTPUT_FILE"
1333        then
1334                GIT_TEST_TEE_OFFSET=0
1335        fi
1336fi
1337
1338# Provide an implementation of the 'yes' utility; the upper bound
1339# limit is there to help Windows that cannot stop this loop from
1340# wasting cycles when the downstream stops reading, so do not be
1341# tempted to turn it into an infinite loop. cf. 6129c930 ("test-lib:
1342# limit the output of the yes utility", 2016-02-02)
1343yes () {
1344        if test $# = 0
1345        then
1346                y=y
1347        else
1348                y="$*"
1349        fi
1350
1351        i=0
1352        while test $i -lt 99
1353        do
1354                echo "$y"
1355                i=$(($i+1))
1356        done
1357}
1358
1359# Fix some commands on Windows
1360uname_s=$(uname -s)
1361case $uname_s in
1362*MINGW*)
1363        # Windows has its own (incompatible) sort and find
1364        sort () {
1365                /usr/bin/sort "$@"
1366        }
1367        find () {
1368                /usr/bin/find "$@"
1369        }
1370        # git sees Windows-style pwd
1371        pwd () {
1372                builtin pwd -W
1373        }
1374        # no POSIX permissions
1375        # backslashes in pathspec are converted to '/'
1376        # exec does not inherit the PID
1377        test_set_prereq MINGW
1378        test_set_prereq NATIVE_CRLF
1379        test_set_prereq SED_STRIPS_CR
1380        test_set_prereq GREP_STRIPS_CR
1381        GIT_TEST_CMP=mingw_test_cmp
1382        ;;
1383*CYGWIN*)
1384        test_set_prereq POSIXPERM
1385        test_set_prereq EXECKEEPSPID
1386        test_set_prereq CYGWIN
1387        test_set_prereq SED_STRIPS_CR
1388        test_set_prereq GREP_STRIPS_CR
1389        ;;
1390*)
1391        test_set_prereq POSIXPERM
1392        test_set_prereq BSLASHPSPEC
1393        test_set_prereq EXECKEEPSPID
1394        ;;
1395esac
1396
1397( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_1
1398test -z "$NO_PERL" && test_set_prereq PERL
1399test -z "$NO_PTHREADS" && test_set_prereq PTHREADS
1400test -z "$NO_PYTHON" && test_set_prereq PYTHON
1401test -n "$USE_LIBPCRE1$USE_LIBPCRE2" && test_set_prereq PCRE
1402test -n "$USE_LIBPCRE1" && test_set_prereq LIBPCRE1
1403test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE2
1404test -z "$NO_GETTEXT" && test_set_prereq GETTEXT
1405
1406if test -n "$GIT_TEST_GETTEXT_POISON_ORIG"
1407then
1408        GIT_TEST_GETTEXT_POISON=$GIT_TEST_GETTEXT_POISON_ORIG
1409        unset GIT_TEST_GETTEXT_POISON_ORIG
1410fi
1411
1412# Can we rely on git's output in the C locale?
1413if test -z "$GIT_TEST_GETTEXT_POISON"
1414then
1415        test_set_prereq C_LOCALE_OUTPUT
1416fi
1417
1418if test -z "$GIT_TEST_CHECK_CACHE_TREE"
1419then
1420        GIT_TEST_CHECK_CACHE_TREE=true
1421        export GIT_TEST_CHECK_CACHE_TREE
1422fi
1423
1424test_lazy_prereq PIPE '
1425        # test whether the filesystem supports FIFOs
1426        test_have_prereq !MINGW,!CYGWIN &&
1427        rm -f testfifo && mkfifo testfifo
1428'
1429
1430test_lazy_prereq SYMLINKS '
1431        # test whether the filesystem supports symbolic links
1432        ln -s x y && test -h y
1433'
1434
1435test_lazy_prereq FILEMODE '
1436        test "$(git config --bool core.filemode)" = true
1437'
1438
1439test_lazy_prereq CASE_INSENSITIVE_FS '
1440        echo good >CamelCase &&
1441        echo bad >camelcase &&
1442        test "$(cat CamelCase)" != good
1443'
1444
1445test_lazy_prereq FUNNYNAMES '
1446        test_have_prereq !MINGW &&
1447        touch -- \
1448                "FUNNYNAMES tab embedded" \
1449                "FUNNYNAMES \"quote embedded\"" \
1450                "FUNNYNAMES newline
1451embedded" 2>/dev/null &&
1452        rm -- \
1453                "FUNNYNAMES tab embedded" \
1454                "FUNNYNAMES \"quote embedded\"" \
1455                "FUNNYNAMES newline
1456embedded" 2>/dev/null
1457'
1458
1459test_lazy_prereq UTF8_NFD_TO_NFC '
1460        # check whether FS converts nfd unicode to nfc
1461        auml=$(printf "\303\244")
1462        aumlcdiar=$(printf "\141\314\210")
1463        >"$auml" &&
1464        test -f "$aumlcdiar"
1465'
1466
1467test_lazy_prereq AUTOIDENT '
1468        sane_unset GIT_AUTHOR_NAME &&
1469        sane_unset GIT_AUTHOR_EMAIL &&
1470        git var GIT_AUTHOR_IDENT
1471'
1472
1473test_lazy_prereq EXPENSIVE '
1474        test -n "$GIT_TEST_LONG"
1475'
1476
1477test_lazy_prereq EXPENSIVE_ON_WINDOWS '
1478        test_have_prereq EXPENSIVE || test_have_prereq !MINGW,!CYGWIN
1479'
1480
1481test_lazy_prereq USR_BIN_TIME '
1482        test -x /usr/bin/time
1483'
1484
1485test_lazy_prereq NOT_ROOT '
1486        uid=$(id -u) &&
1487        test "$uid" != 0
1488'
1489
1490test_lazy_prereq JGIT '
1491        type jgit
1492'
1493
1494# SANITY is about "can you correctly predict what the filesystem would
1495# do by only looking at the permission bits of the files and
1496# directories?"  A typical example of !SANITY is running the test
1497# suite as root, where a test may expect "chmod -r file && cat file"
1498# to fail because file is supposed to be unreadable after a successful
1499# chmod.  In an environment (i.e. combination of what filesystem is
1500# being used and who is running the tests) that lacks SANITY, you may
1501# be able to delete or create a file when the containing directory
1502# doesn't have write permissions, or access a file even if the
1503# containing directory doesn't have read or execute permissions.
1504
1505test_lazy_prereq SANITY '
1506        mkdir SANETESTD.1 SANETESTD.2 &&
1507
1508        chmod +w SANETESTD.1 SANETESTD.2 &&
1509        >SANETESTD.1/x 2>SANETESTD.2/x &&
1510        chmod -w SANETESTD.1 &&
1511        chmod -r SANETESTD.1/x &&
1512        chmod -rx SANETESTD.2 ||
1513        BUG "cannot prepare SANETESTD"
1514
1515        ! test -r SANETESTD.1/x &&
1516        ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x
1517        status=$?
1518
1519        chmod +rwx SANETESTD.1 SANETESTD.2 &&
1520        rm -rf SANETESTD.1 SANETESTD.2 ||
1521        BUG "cannot clean SANETESTD"
1522        return $status
1523'
1524
1525test FreeBSD != $uname_s || GIT_UNZIP=${GIT_UNZIP:-/usr/local/bin/unzip}
1526GIT_UNZIP=${GIT_UNZIP:-unzip}
1527test_lazy_prereq UNZIP '
1528        "$GIT_UNZIP" -v
1529        test $? -ne 127
1530'
1531
1532run_with_limited_cmdline () {
1533        (ulimit -s 128 && "$@")
1534}
1535
1536test_lazy_prereq CMDLINE_LIMIT '
1537        test_have_prereq !MINGW,!CYGWIN &&
1538        run_with_limited_cmdline true
1539'
1540
1541run_with_limited_stack () {
1542        (ulimit -s 128 && "$@")
1543}
1544
1545test_lazy_prereq ULIMIT_STACK_SIZE '
1546        test_have_prereq !MINGW,!CYGWIN &&
1547        run_with_limited_stack true
1548'
1549
1550build_option () {
1551        git version --build-options |
1552        sed -ne "s/^$1: //p"
1553}
1554
1555test_lazy_prereq LONG_IS_64BIT '
1556        test 8 -le "$(build_option sizeof-long)"
1557'
1558
1559test_lazy_prereq TIME_IS_64BIT 'test-tool date is64bit'
1560test_lazy_prereq TIME_T_IS_64BIT 'test-tool date time_t-is64bit'
1561
1562test_lazy_prereq CURL '
1563        curl --version
1564'
1565
1566# SHA1 is a test if the hash algorithm in use is SHA-1.  This is both for tests
1567# which will not work with other hash algorithms and tests that work but don't
1568# test anything meaningful (e.g. special values which cause short collisions).
1569test_lazy_prereq SHA1 '
1570        test $(git hash-object /dev/null) = e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
1571'
1572
1573test_lazy_prereq REBASE_P '
1574        test -z "$GIT_TEST_SKIP_REBASE_P"
1575'