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