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