scalar: fix command documentation section header
[git/gitster.git] / t / test-lib.sh
blob377cc1c1203d6fdfc7418f4ce189bb313cfb0b75
1 # Test framework for git. See t/README for usage.
3 # Copyright (c) 2005 Junio C Hamano
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.
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.
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/ .
18 # Test the binaries we have just built. The tests are kept in
19 # t/ subdirectory and are run in 'trash directory' subdirectory.
20 if test -z "$TEST_DIRECTORY"
21 then
22 # ensure that TEST_DIRECTORY is an absolute path so that it
23 # is valid even if the current working directory is changed
24 TEST_DIRECTORY=$(pwd)
25 else
26 # The TEST_DIRECTORY will always be the path to the "t"
27 # directory in the git.git checkout. This is overridden by
28 # e.g. t/lib-subtest.sh, but only because its $(pwd) is
29 # different. Those tests still set "$TEST_DIRECTORY" to the
30 # same path.
32 # See use of "$GIT_BUILD_DIR" and "$TEST_DIRECTORY" below for
33 # hard assumptions about "$GIT_BUILD_DIR/t" existing and being
34 # the "$TEST_DIRECTORY", and e.g. "$TEST_DIRECTORY/helper"
35 # needing to exist.
36 TEST_DIRECTORY=$(cd "$TEST_DIRECTORY" && pwd) || exit 1
38 if test -z "$TEST_OUTPUT_DIRECTORY"
39 then
40 # Similarly, override this to store the test-results subdir
41 # elsewhere
42 TEST_OUTPUT_DIRECTORY=$TEST_DIRECTORY
44 GIT_BUILD_DIR="${TEST_DIRECTORY%/t}"
45 if test "$TEST_DIRECTORY" = "$GIT_BUILD_DIR"
46 then
47 echo "PANIC: Running in a $TEST_DIRECTORY that doesn't end in '/t'?" >&2
48 exit 1
51 # Prepend a string to a VAR using an arbitrary ":" delimiter, not
52 # adding the delimiter if VAR or VALUE is empty. I.e. a generalized:
54 # VAR=$1${VAR:+${1:+$2}$VAR}
56 # Usage (using ":" as the $2 delimiter):
58 # prepend_var VAR : VALUE
59 prepend_var () {
60 eval "$1=\"$3\${$1:+${3:+$2}\$$1}\""
63 # If [AL]SAN is in effect we want to abort so that we notice
64 # problems. The GIT_SAN_OPTIONS variable can be used to set common
65 # defaults shared between [AL]SAN_OPTIONS.
66 prepend_var GIT_SAN_OPTIONS : abort_on_error=1
67 prepend_var GIT_SAN_OPTIONS : strip_path_prefix="$GIT_BUILD_DIR/"
69 # If we were built with ASAN, it may complain about leaks
70 # of program-lifetime variables. Disable it by default to lower
71 # the noise level. This needs to happen at the start of the script,
72 # before we even do our "did we build git yet" check (since we don't
73 # want that one to complain to stderr).
74 prepend_var ASAN_OPTIONS : $GIT_SAN_OPTIONS
75 prepend_var ASAN_OPTIONS : detect_leaks=0
76 export ASAN_OPTIONS
78 prepend_var LSAN_OPTIONS : $GIT_SAN_OPTIONS
79 prepend_var LSAN_OPTIONS : fast_unwind_on_malloc=0
80 export LSAN_OPTIONS
82 if test ! -f "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS
83 then
84 echo >&2 'error: GIT-BUILD-OPTIONS missing (has Git been built?).'
85 exit 1
87 . "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS
88 export PERL_PATH SHELL_PATH
90 # In t0000, we need to override test directories of nested testcases. In case
91 # the developer has TEST_OUTPUT_DIRECTORY part of his build options, then we'd
92 # reset this value to instead contain what the developer has specified. We thus
93 # have this knob to allow overriding the directory.
94 if test -n "${TEST_OUTPUT_DIRECTORY_OVERRIDE}"
95 then
96 TEST_OUTPUT_DIRECTORY="${TEST_OUTPUT_DIRECTORY_OVERRIDE}"
99 # Disallow the use of abbreviated options in the test suite by default
100 if test -z "${GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS}"
101 then
102 GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=true
103 export GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS
106 # Explicitly set the default branch name for testing, to avoid the
107 # transitory "git init" warning under --verbose.
108 : ${GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME:=master}
109 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
111 ################################################################
112 # It appears that people try to run tests without building...
113 "${GIT_TEST_INSTALLED:-$GIT_BUILD_DIR}/git$X" >/dev/null
114 if test $? != 1
115 then
116 if test -n "$GIT_TEST_INSTALLED"
117 then
118 echo >&2 "error: there is no working Git at '$GIT_TEST_INSTALLED'"
119 else
120 echo >&2 'error: you do not seem to have built git yet.'
122 exit 1
125 store_arg_to=
126 opt_required_arg=
127 # $1: option string
128 # $2: name of the var where the arg will be stored
129 mark_option_requires_arg () {
130 if test -n "$opt_required_arg"
131 then
132 echo "error: options that require args cannot be bundled" \
133 "together: '$opt_required_arg' and '$1'" >&2
134 exit 1
136 opt_required_arg=$1
137 store_arg_to=$2
140 # These functions can be overridden e.g. to output JUnit XML
141 start_test_output () { :; }
142 start_test_case_output () { :; }
143 finalize_test_case_output () { :; }
144 finalize_test_output () { :; }
146 parse_option () {
147 local opt="$1"
149 case "$opt" in
150 -d|--d|--de|--deb|--debu|--debug)
151 debug=t ;;
152 -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
153 immediate=t ;;
154 -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
155 GIT_TEST_LONG=t; export GIT_TEST_LONG ;;
157 mark_option_requires_arg "$opt" run_list
159 --run=*)
160 run_list=${opt#--*=} ;;
161 -h|--h|--he|--hel|--help)
162 help=t ;;
163 -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
164 verbose=t ;;
165 --verbose-only=*)
166 verbose_only=${opt#--*=}
168 -q|--q|--qu|--qui|--quie|--quiet)
169 # Ignore --quiet under a TAP::Harness. Saying how many tests
170 # passed without the ok/not ok details is always an error.
171 test -z "$HARNESS_ACTIVE" && quiet=t ;;
172 --with-dashes)
173 with_dashes=t ;;
174 --no-bin-wrappers)
175 no_bin_wrappers=t ;;
176 --no-color)
177 color= ;;
178 --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
179 valgrind=memcheck
180 tee=t
182 --valgrind=*)
183 valgrind=${opt#--*=}
184 tee=t
186 --valgrind-only=*)
187 valgrind_only=${opt#--*=}
188 tee=t
190 --tee)
191 tee=t ;;
192 --root=*)
193 root=${opt#--*=} ;;
194 --chain-lint)
195 GIT_TEST_CHAIN_LINT=1 ;;
196 --no-chain-lint)
197 GIT_TEST_CHAIN_LINT=0 ;;
199 trace=t ;;
200 -V|--verbose-log)
201 verbose_log=t
202 tee=t
204 --write-junit-xml)
205 . "$TEST_DIRECTORY/test-lib-junit.sh"
207 --github-workflow-markup)
208 . "$TEST_DIRECTORY/test-lib-github-workflow-markup.sh"
210 --stress)
211 stress=t ;;
212 --stress=*)
213 echo "error: --stress does not accept an argument: '$opt'" >&2
214 echo "did you mean --stress-jobs=${opt#*=} or --stress-limit=${opt#*=}?" >&2
215 exit 1
217 --stress-jobs=*)
218 stress=t;
219 stress_jobs=${opt#--*=}
220 case "$stress_jobs" in
221 *[!0-9]*|0*|"")
222 echo "error: --stress-jobs=<N> requires the number of jobs to run" >&2
223 exit 1
225 *) # Good.
227 esac
229 --stress-limit=*)
230 stress=t;
231 stress_limit=${opt#--*=}
232 case "$stress_limit" in
233 *[!0-9]*|0*|"")
234 echo "error: --stress-limit=<N> requires the number of repetitions" >&2
235 exit 1
237 *) # Good.
239 esac
241 --invert-exit-code)
242 invert_exit_code=t
245 echo "error: unknown test option '$opt'" >&2; exit 1 ;;
246 esac
249 # Parse options while taking care to leave $@ intact, so we will still
250 # have all the original command line options when executing the test
251 # script again for '--tee' and '--verbose-log' later.
252 for opt
254 if test -n "$store_arg_to"
255 then
256 eval $store_arg_to=\$opt
257 store_arg_to=
258 opt_required_arg=
259 continue
262 case "$opt" in
263 --*|-?)
264 parse_option "$opt" ;;
265 -?*)
266 # bundled short options must be fed separately to parse_option
267 opt=${opt#-}
268 while test -n "$opt"
270 extra=${opt#?}
271 this=${opt%$extra}
272 opt=$extra
273 parse_option "-$this"
274 done
277 echo "error: unknown test option '$opt'" >&2; exit 1 ;;
278 esac
279 done
280 if test -n "$store_arg_to"
281 then
282 echo "error: $opt_required_arg requires an argument" >&2
283 exit 1
286 if test -n "$valgrind_only"
287 then
288 test -z "$valgrind" && valgrind=memcheck
289 test -z "$verbose" && verbose_only="$valgrind_only"
290 elif test -n "$valgrind"
291 then
292 test -z "$verbose_log" && verbose=t
295 if test -n "$stress"
296 then
297 verbose=t
298 trace=t
299 immediate=t
302 TEST_STRESS_JOB_SFX="${GIT_TEST_STRESS_JOB_NR:+.stress-$GIT_TEST_STRESS_JOB_NR}"
303 TEST_NAME="$(basename "$0" .sh)"
304 TEST_NUMBER="${TEST_NAME%%-*}"
305 TEST_NUMBER="${TEST_NUMBER#t}"
306 TEST_RESULTS_DIR="$TEST_OUTPUT_DIRECTORY/test-results"
307 TEST_RESULTS_BASE="$TEST_RESULTS_DIR/$TEST_NAME$TEST_STRESS_JOB_SFX"
308 TEST_RESULTS_SAN_FILE_PFX=trace
309 TEST_RESULTS_SAN_DIR_SFX=leak
310 TEST_RESULTS_SAN_FILE=
311 TEST_RESULTS_SAN_DIR="$TEST_RESULTS_DIR/$TEST_NAME.$TEST_RESULTS_SAN_DIR_SFX"
312 TEST_RESULTS_SAN_DIR_NR_LEAKS_STARTUP=
313 TRASH_DIRECTORY="trash directory.$TEST_NAME$TEST_STRESS_JOB_SFX"
314 test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"
315 case "$TRASH_DIRECTORY" in
316 /*) ;; # absolute path is good
317 *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;;
318 esac
320 # Utility functions using $TEST_RESULTS_* variables
321 nr_san_dir_leaks_ () {
322 # stderr piped to /dev/null because the directory may have
323 # been "rmdir"'d already.
324 find "$TEST_RESULTS_SAN_DIR" \
325 -type f \
326 -name "$TEST_RESULTS_SAN_FILE_PFX.*" 2>/dev/null |
327 wc -l
330 # If --stress was passed, run this test repeatedly in several parallel loops.
331 if test "$GIT_TEST_STRESS_STARTED" = "done"
332 then
333 : # Don't stress test again.
334 elif test -n "$stress"
335 then
336 if test -n "$stress_jobs"
337 then
338 job_count=$stress_jobs
339 elif test -n "$GIT_TEST_STRESS_LOAD"
340 then
341 job_count="$GIT_TEST_STRESS_LOAD"
342 elif job_count=$(getconf _NPROCESSORS_ONLN 2>/dev/null) &&
343 test -n "$job_count"
344 then
345 job_count=$((2 * $job_count))
346 else
347 job_count=8
350 mkdir -p "$TEST_RESULTS_DIR"
351 stressfail="$TEST_RESULTS_BASE.stress-failed"
352 rm -f "$stressfail"
354 stress_exit=0
355 trap '
356 kill $job_pids 2>/dev/null
357 wait
358 stress_exit=1
359 ' TERM INT HUP
361 job_pids=
362 job_nr=0
363 while test $job_nr -lt "$job_count"
366 GIT_TEST_STRESS_STARTED=done
367 GIT_TEST_STRESS_JOB_NR=$job_nr
368 export GIT_TEST_STRESS_STARTED GIT_TEST_STRESS_JOB_NR
370 trap '
371 kill $test_pid 2>/dev/null
372 wait
373 exit 1
374 ' TERM INT
376 cnt=1
377 while ! test -e "$stressfail" &&
378 { test -z "$stress_limit" ||
379 test $cnt -le $stress_limit ; }
381 $TEST_SHELL_PATH "$0" "$@" >"$TEST_RESULTS_BASE.stress-$job_nr.out" 2>&1 &
382 test_pid=$!
384 if wait $test_pid
385 then
386 printf "OK %2d.%d\n" $GIT_TEST_STRESS_JOB_NR $cnt
387 else
388 echo $GIT_TEST_STRESS_JOB_NR >>"$stressfail"
389 printf "FAIL %2d.%d\n" $GIT_TEST_STRESS_JOB_NR $cnt
391 cnt=$(($cnt + 1))
392 done
394 job_pids="$job_pids $!"
395 job_nr=$(($job_nr + 1))
396 done
398 wait
400 if test -f "$stressfail"
401 then
402 stress_exit=1
403 echo "Log(s) of failed test run(s):"
404 for failed_job_nr in $(sort -n "$stressfail")
406 echo "Contents of '$TEST_RESULTS_BASE.stress-$failed_job_nr.out':"
407 cat "$TEST_RESULTS_BASE.stress-$failed_job_nr.out"
408 done
409 rm -rf "$TRASH_DIRECTORY.stress-failed"
410 # Move the last one.
411 mv "$TRASH_DIRECTORY.stress-$failed_job_nr" "$TRASH_DIRECTORY.stress-failed"
414 exit $stress_exit
417 # if --tee was passed, write the output not only to the terminal, but
418 # additionally to the file test-results/$BASENAME.out, too.
419 if test "$GIT_TEST_TEE_STARTED" = "done"
420 then
421 : # do not redirect again
422 elif test -n "$tee"
423 then
424 mkdir -p "$TEST_RESULTS_DIR"
426 # Make this filename available to the sub-process in case it is using
427 # --verbose-log.
428 GIT_TEST_TEE_OUTPUT_FILE=$TEST_RESULTS_BASE.out
429 export GIT_TEST_TEE_OUTPUT_FILE
431 # Truncate before calling "tee -a" to get rid of the results
432 # from any previous runs.
433 >"$GIT_TEST_TEE_OUTPUT_FILE"
435 (GIT_TEST_TEE_STARTED=done ${TEST_SHELL_PATH} "$0" "$@" 2>&1;
436 echo $? >"$TEST_RESULTS_BASE.exit") | tee -a "$GIT_TEST_TEE_OUTPUT_FILE"
437 test "$(cat "$TEST_RESULTS_BASE.exit")" = 0
438 exit
441 if test -n "$trace" && test -n "$test_untraceable"
442 then
443 # '-x' tracing requested, but this test script can't be reliably
444 # traced, unless it is run with a Bash version supporting
445 # BASH_XTRACEFD (introduced in Bash v4.1).
447 # Perform this version check _after_ the test script was
448 # potentially re-executed with $TEST_SHELL_PATH for '--tee' or
449 # '--verbose-log', so the right shell is checked and the
450 # warning is issued only once.
451 if test -n "$BASH_VERSION" && eval '
452 test ${BASH_VERSINFO[0]} -gt 4 || {
453 test ${BASH_VERSINFO[0]} -eq 4 &&
454 test ${BASH_VERSINFO[1]} -ge 1
457 then
458 : Executed by a Bash version supporting BASH_XTRACEFD. Good.
459 else
460 echo >&2 "warning: ignoring -x; '$0' is untraceable without BASH_XTRACEFD"
461 trace=
464 if test -n "$trace" && test -z "$verbose_log"
465 then
466 verbose=t
469 # Since bash 5.0, checkwinsize is enabled by default which does
470 # update the COLUMNS variable every time a non-builtin command
471 # completes, even for non-interactive shells.
472 # Disable that since we are aiming for repeatability.
473 test -n "$BASH_VERSION" && shopt -u checkwinsize 2>/dev/null
475 # For repeatability, reset the environment to known value.
476 # TERM is sanitized below, after saving color control sequences.
477 LANG=C
478 LC_ALL=C
479 PAGER=cat
480 TZ=UTC
481 COLUMNS=80
482 export LANG LC_ALL PAGER TZ COLUMNS
483 EDITOR=:
485 # A call to "unset" with no arguments causes at least Solaris 10
486 # /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets
487 # deriving from the command substitution clustered with the other
488 # ones.
489 unset VISUAL EMAIL LANGUAGE $("$PERL_PATH" -e '
490 my @env = keys %ENV;
491 my $ok = join("|", qw(
492 TRACE
493 DEBUG
494 TEST
495 .*_TEST
496 PROVE
497 VALGRIND
498 UNZIP
499 PERF_
500 CURL_VERBOSE
501 TRACE_CURL
503 my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env);
504 print join("\n", @vars);
506 unset XDG_CACHE_HOME
507 unset XDG_CONFIG_HOME
508 unset GITPERLLIB
509 unset GIT_TRACE2_PARENT_NAME
510 unset GIT_TRACE2_PARENT_SID
511 TEST_AUTHOR_LOCALNAME=author
512 TEST_AUTHOR_DOMAIN=example.com
513 GIT_AUTHOR_EMAIL=${TEST_AUTHOR_LOCALNAME}@${TEST_AUTHOR_DOMAIN}
514 GIT_AUTHOR_NAME='A U Thor'
515 GIT_AUTHOR_DATE='1112354055 +0200'
516 TEST_COMMITTER_LOCALNAME=committer
517 TEST_COMMITTER_DOMAIN=example.com
518 GIT_COMMITTER_EMAIL=${TEST_COMMITTER_LOCALNAME}@${TEST_COMMITTER_DOMAIN}
519 GIT_COMMITTER_NAME='C O Mitter'
520 GIT_COMMITTER_DATE='1112354055 +0200'
521 GIT_MERGE_VERBOSITY=5
522 GIT_MERGE_AUTOEDIT=no
523 export GIT_MERGE_VERBOSITY GIT_MERGE_AUTOEDIT
524 export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
525 export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
526 export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
527 export EDITOR
529 GIT_DEFAULT_HASH="${GIT_TEST_DEFAULT_HASH:-sha1}"
530 export GIT_DEFAULT_HASH
531 GIT_TEST_MERGE_ALGORITHM="${GIT_TEST_MERGE_ALGORITHM:-ort}"
532 export GIT_TEST_MERGE_ALGORITHM
534 # Tests using GIT_TRACE typically don't want <timestamp> <file>:<line> output
535 GIT_TRACE_BARE=1
536 export GIT_TRACE_BARE
538 # Some tests scan the GIT_TRACE2_EVENT feed for events, but the
539 # default depth is 2, which frequently causes issues when the
540 # events are wrapped in new regions. Set it to a sufficiently
541 # large depth to avoid custom changes in the test suite.
542 GIT_TRACE2_EVENT_NESTING=100
543 export GIT_TRACE2_EVENT_NESTING
545 # Use specific version of the index file format
546 if test -n "${GIT_TEST_INDEX_VERSION:+isset}"
547 then
548 GIT_INDEX_VERSION="$GIT_TEST_INDEX_VERSION"
549 export GIT_INDEX_VERSION
552 if test -n "$GIT_TEST_PERL_FATAL_WARNINGS"
553 then
554 GIT_PERL_FATAL_WARNINGS=1
555 export GIT_PERL_FATAL_WARNINGS
558 case $GIT_TEST_FSYNC in
560 GIT_TEST_FSYNC=0
561 export GIT_TEST_FSYNC
563 esac
565 # Add libc MALLOC and MALLOC_PERTURB test only if we are not executing
566 # the test with valgrind and have not compiled with SANITIZE=address.
567 if test -n "$valgrind" ||
568 test -n "$SANITIZE_ADDRESS" ||
569 test -n "$TEST_NO_MALLOC_CHECK"
570 then
571 setup_malloc_check () {
572 : nothing
574 teardown_malloc_check () {
575 : nothing
577 else
578 _USE_GLIBC_TUNABLES=
579 if _GLIBC_VERSION=$(getconf GNU_LIBC_VERSION 2>/dev/null) &&
580 _GLIBC_VERSION=${_GLIBC_VERSION#"glibc "} &&
581 expr 2.34 \<= "$_GLIBC_VERSION" >/dev/null
582 then
583 _USE_GLIBC_TUNABLES=YesPlease
585 setup_malloc_check () {
586 local g
587 local t
588 MALLOC_CHECK_=3 MALLOC_PERTURB_=165
589 export MALLOC_CHECK_ MALLOC_PERTURB_
590 if test -n "$_USE_GLIBC_TUNABLES"
591 then
593 LD_PRELOAD="libc_malloc_debug.so.0"
594 for t in \
595 glibc.malloc.check=1 \
596 glibc.malloc.perturb=165
598 g="${g#:}:$t"
599 done
600 GLIBC_TUNABLES=$g
601 export LD_PRELOAD GLIBC_TUNABLES
604 teardown_malloc_check () {
605 unset MALLOC_CHECK_ MALLOC_PERTURB_
606 unset LD_PRELOAD GLIBC_TUNABLES
610 # Protect ourselves from common misconfiguration to export
611 # CDPATH into the environment
612 unset CDPATH
614 unset GREP_OPTIONS
615 unset UNZIP
617 case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
618 1|2|true)
619 GIT_TRACE=4
621 esac
623 # Line feed
624 LF='
627 # Single quote
628 SQ=\'
630 # UTF-8 ZERO WIDTH NON-JOINER, which HFS+ ignores
631 # when case-folding filenames
632 u200c=$(printf '\342\200\214')
634 export _x05 _x35 LF u200c EMPTY_TREE EMPTY_BLOB ZERO_OID OID_REGEX
636 # Each test should start with something like this, after copyright notices:
638 # test_description='Description of this test...
639 # This test checks if command xyzzy does the right thing...
641 # . ./test-lib.sh
642 test "x$TERM" != "xdumb" && (
643 test -t 1 &&
644 tput bold >/dev/null 2>&1 &&
645 tput setaf 1 >/dev/null 2>&1 &&
646 tput sgr0 >/dev/null 2>&1
647 ) &&
648 color=t
650 if test -n "$color"
651 then
652 # Save the color control sequences now rather than run tput
653 # each time say_color() is called. This is done for two
654 # reasons:
655 # * TERM will be changed to dumb
656 # * HOME will be changed to a temporary directory and tput
657 # might need to read ~/.terminfo from the original HOME
658 # directory to get the control sequences
659 # Note: This approach assumes the control sequences don't end
660 # in a newline for any terminal of interest (command
661 # substitutions strip trailing newlines). Given that most
662 # (all?) terminals in common use are related to ECMA-48, this
663 # shouldn't be a problem.
664 say_color_error=$(tput bold; tput setaf 1) # bold red
665 say_color_skip=$(tput setaf 4) # blue
666 say_color_warn=$(tput setaf 3) # brown/yellow
667 say_color_pass=$(tput setaf 2) # green
668 say_color_info=$(tput setaf 6) # cyan
669 say_color_reset=$(tput sgr0)
670 say_color_="" # no formatting for normal text
671 say_color () {
672 test -z "$1" && test -n "$quiet" && return
673 eval "say_color_color=\$say_color_$1"
674 shift
675 printf "%s\\n" "$say_color_color$*$say_color_reset"
677 else
678 say_color() {
679 test -z "$1" && test -n "$quiet" && return
680 shift
681 printf "%s\n" "$*"
685 USER_TERM="$TERM"
686 TERM=dumb
687 export TERM USER_TERM
689 # What is written by tests to stdout and stderr is sent to different places
690 # depending on the test mode (e.g. /dev/null in non-verbose mode, piped to tee
691 # with --tee option, etc.). We save the original stdin to FD #6 and stdout and
692 # stderr to #5 and #7, so that the test framework can use them (e.g. for
693 # printing errors within the test framework) independently of the test mode.
694 exec 5>&1
695 exec 6<&0
696 exec 7>&2
698 _error_exit () {
699 finalize_test_output
700 GIT_EXIT_OK=t
701 exit 1
704 error () {
705 say_color error "error: $*"
706 _error_exit
709 BUG () {
710 error >&7 "bug in the test script: $*"
713 BAIL_OUT () {
714 test $# -ne 1 && BUG "1 param"
716 # Do not change "Bail out! " string. It's part of TAP syntax:
717 # https://testanything.org/tap-specification.html
718 local bail_out="Bail out! "
719 local message="$1"
721 say_color >&5 error $bail_out "$message"
722 _error_exit
725 say () {
726 say_color info "$*"
729 if test -n "$HARNESS_ACTIVE"
730 then
731 if test "$verbose" = t || test -n "$verbose_only"
732 then
733 BAIL_OUT 'verbose mode forbidden under TAP harness; try --verbose-log'
737 test "${test_description}" != "" ||
738 error "Test script did not set test_description."
740 if test "$help" = "t"
741 then
742 printf '%s\n' "$test_description"
743 exit 0
746 if test "$verbose_log" = "t"
747 then
748 exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3
749 elif test "$verbose" = "t"
750 then
751 exec 4>&2 3>&1
752 else
753 exec 4>/dev/null 3>/dev/null
756 # Send any "-x" output directly to stderr to avoid polluting tests
757 # which capture stderr. We can do this unconditionally since it
758 # has no effect if tracing isn't turned on.
760 # Note that this sets up the trace fd as soon as we assign the variable, so it
761 # must come after the creation of descriptor 4 above. Likewise, we must never
762 # unset this, as it has the side effect of closing descriptor 4, which we
763 # use to show verbose tests to the user.
765 # Note also that we don't need or want to export it. The tracing is local to
766 # this shell, and we would not want to influence any shells we exec.
767 BASH_XTRACEFD=4
769 test_failure=0
770 test_count=0
771 test_fixed=0
772 test_broken=0
773 test_success=0
775 test_missing_prereq=
777 test_external_has_tap=0
779 die () {
780 code=$?
781 # This is responsible for running the atexit commands even when a
782 # test script run with '--immediate' fails, or when the user hits
783 # ctrl-C, i.e. when 'test_done' is not invoked at all.
784 test_atexit_handler || code=$?
785 if test -n "$GIT_EXIT_OK"
786 then
787 exit $code
788 else
789 echo >&5 "FATAL: Unexpected exit with code $code"
790 exit 1
794 GIT_EXIT_OK=
795 trap 'die' EXIT
796 # Disable '-x' tracing, because with some shells, notably dash, it
797 # prevents running the cleanup commands when a test script run with
798 # '--verbose-log -x' is interrupted.
799 trap '{ code=$?; set +x; } 2>/dev/null; exit $code' INT TERM HUP
801 # The user-facing functions are loaded from a separate file so that
802 # test_perf subshells can have them too
803 . "$TEST_DIRECTORY/test-lib-functions.sh"
805 # You are not expected to call test_ok_ and test_failure_ directly, use
806 # the test_expect_* functions instead.
808 test_ok_ () {
809 test_success=$(($test_success + 1))
810 say_color "" "ok $test_count - $@"
811 finalize_test_case_output ok "$@"
814 _invert_exit_code_failure_end_blurb () {
815 say_color warn "# faked up failures as TODO & now exiting with 0 due to --invert-exit-code"
818 test_failure_ () {
819 failure_label=$1
820 test_failure=$(($test_failure + 1))
821 local pfx=""
822 if test -n "$invert_exit_code" # && test -n "$HARNESS_ACTIVE"
823 then
824 pfx="# TODO induced breakage (--invert-exit-code):"
826 say_color error "not ok $test_count - ${pfx:+$pfx }$1"
827 shift
828 printf '%s\n' "$*" | sed -e 's/^/# /'
829 if test -n "$immediate"
830 then
831 say_color error "1..$test_count"
832 if test -n "$invert_exit_code"
833 then
834 finalize_test_output
835 _invert_exit_code_failure_end_blurb
836 GIT_EXIT_OK=t
837 exit 0
839 _error_exit
841 finalize_test_case_output failure "$failure_label" "$@"
844 test_known_broken_ok_ () {
845 test_fixed=$(($test_fixed+1))
846 say_color error "ok $test_count - $1 # TODO known breakage vanished"
847 finalize_test_case_output fixed "$1"
850 test_known_broken_failure_ () {
851 test_broken=$(($test_broken+1))
852 say_color warn "not ok $test_count - $1 # TODO known breakage"
853 finalize_test_case_output broken "$1"
856 test_debug () {
857 test "$debug" = "" || eval "$1"
860 match_pattern_list () {
861 arg="$1"
862 shift
863 test -z "$*" && return 1
864 # We need to use "$*" to get field-splitting, but we want to
865 # disable globbing, since we are matching against an arbitrary
866 # $arg, not what's in the filesystem. Using "set -f" accomplishes
867 # that, but we must do it in a subshell to avoid impacting the
868 # rest of the script. The exit value of the subshell becomes
869 # the function's return value.
871 set -f
872 for pattern_ in $*
874 case "$arg" in
875 $pattern_)
876 exit 0
878 esac
879 done
880 exit 1
884 match_test_selector_list () {
885 operation="$1"
886 shift
887 title="$1"
888 shift
889 arg="$1"
890 shift
891 test -z "$1" && return 0
893 # Commas are accepted as separators.
894 OLDIFS=$IFS
895 IFS=','
896 set -- $1
897 IFS=$OLDIFS
899 # If the first selector is negative we include by default.
900 include=
901 case "$1" in
902 !*) include=t ;;
903 esac
905 for selector
907 orig_selector=$selector
909 positive=t
910 case "$selector" in
912 positive=
913 selector=${selector##?}
915 esac
917 test -z "$selector" && continue
919 case "$selector" in
920 *-*)
921 if expr "z${selector%%-*}" : "z[0-9]*[^0-9]" >/dev/null
922 then
923 echo "error: $operation: invalid non-numeric in range" \
924 "start: '$orig_selector'" >&2
925 exit 1
927 if expr "z${selector#*-}" : "z[0-9]*[^0-9]" >/dev/null
928 then
929 echo "error: $operation: invalid non-numeric in range" \
930 "end: '$orig_selector'" >&2
931 exit 1
935 if expr "z$selector" : "z[0-9]*[^0-9]" >/dev/null
936 then
937 case "$title" in *${selector}*)
938 include=$positive
940 esac
941 continue
943 esac
945 # Short cut for "obvious" cases
946 test -z "$include" && test -z "$positive" && continue
947 test -n "$include" && test -n "$positive" && continue
949 case "$selector" in
951 if test $arg -le ${selector#-}
952 then
953 include=$positive
957 if test $arg -ge ${selector%-}
958 then
959 include=$positive
962 *-*)
963 if test ${selector%%-*} -le $arg \
964 && test $arg -le ${selector#*-}
965 then
966 include=$positive
970 if test $arg -eq $selector
971 then
972 include=$positive
975 esac
976 done
978 test -n "$include"
981 maybe_teardown_verbose () {
982 test -z "$verbose_only" && return
983 exec 4>/dev/null 3>/dev/null
984 verbose=
987 last_verbose=t
988 maybe_setup_verbose () {
989 test -z "$verbose_only" && return
990 if match_pattern_list $test_count "$verbose_only"
991 then
992 exec 4>&2 3>&1
993 # Emit a delimiting blank line when going from
994 # non-verbose to verbose. Within verbose mode the
995 # delimiter is printed by test_expect_*. The choice
996 # of the initial $last_verbose is such that before
997 # test 1, we do not print it.
998 test -z "$last_verbose" && echo >&3 ""
999 verbose=t
1000 else
1001 exec 4>/dev/null 3>/dev/null
1002 verbose=
1004 last_verbose=$verbose
1007 maybe_teardown_valgrind () {
1008 test -z "$GIT_VALGRIND" && return
1009 GIT_VALGRIND_ENABLED=
1012 maybe_setup_valgrind () {
1013 test -z "$GIT_VALGRIND" && return
1014 if test -z "$valgrind_only"
1015 then
1016 GIT_VALGRIND_ENABLED=t
1017 return
1019 GIT_VALGRIND_ENABLED=
1020 if match_pattern_list $test_count "$valgrind_only"
1021 then
1022 GIT_VALGRIND_ENABLED=t
1026 trace_level_=0
1027 want_trace () {
1028 test "$trace" = t && {
1029 test "$verbose" = t || test "$verbose_log" = t
1033 # This is a separate function because some tests use
1034 # "return" to end a test_expect_success block early
1035 # (and we want to make sure we run any cleanup like
1036 # "set +x").
1037 test_eval_inner_ () {
1038 # Do not add anything extra (including LF) after '$*'
1039 eval "
1040 want_trace && trace_level_=$(($trace_level_+1)) && set -x
1044 test_eval_ () {
1045 # If "-x" tracing is in effect, then we want to avoid polluting stderr
1046 # with non-test commands. But once in "set -x" mode, we cannot prevent
1047 # the shell from printing the "set +x" to turn it off (nor the saving
1048 # of $? before that). But we can make sure that the output goes to
1049 # /dev/null.
1051 # There are a few subtleties here:
1053 # - we have to redirect descriptor 4 in addition to 2, to cover
1054 # BASH_XTRACEFD
1056 # - the actual eval has to come before the redirection block (since
1057 # it needs to see descriptor 4 to set up its stderr)
1059 # - likewise, any error message we print must be outside the block to
1060 # access descriptor 4
1062 # - checking $? has to come immediately after the eval, but it must
1063 # be _inside_ the block to avoid polluting the "set -x" output
1066 test_eval_inner_ "$@" </dev/null >&3 2>&4
1068 test_eval_ret_=$?
1069 if want_trace
1070 then
1071 test 1 = $trace_level_ && set +x
1072 trace_level_=$(($trace_level_-1))
1074 } 2>/dev/null 4>&2
1076 if test "$test_eval_ret_" != 0 && want_trace
1077 then
1078 say_color error >&4 "error: last command exited with \$?=$test_eval_ret_"
1080 return $test_eval_ret_
1083 test_run_ () {
1084 test_cleanup=:
1085 expecting_failure=$2
1087 if test "${GIT_TEST_CHAIN_LINT:-1}" != 0; then
1088 # turn off tracing for this test-eval, as it simply creates
1089 # confusing noise in the "-x" output
1090 trace_tmp=$trace
1091 trace=
1092 # 117 is magic because it is unlikely to match the exit
1093 # code of other programs
1094 if test "OK-117" != "$(test_eval_ "(exit 117) && $1${LF}${LF}echo OK-\$?" 3>&1)" ||
1096 test "${GIT_TEST_CHAIN_LINT_HARDER:-${GIT_TEST_CHAIN_LINT_HARDER_DEFAULT:-1}}" != 0 &&
1097 $(printf '%s\n' "$1" | sed -f "$GIT_BUILD_DIR/t/chainlint.sed" | grep -q '?![A-Z][A-Z]*?!')
1099 then
1100 BUG "broken &&-chain or run-away HERE-DOC: $1"
1102 trace=$trace_tmp
1105 setup_malloc_check
1106 test_eval_ "$1"
1107 eval_ret=$?
1108 teardown_malloc_check
1110 if test -z "$immediate" || test $eval_ret = 0 ||
1111 test -n "$expecting_failure" && test "$test_cleanup" != ":"
1112 then
1113 setup_malloc_check
1114 test_eval_ "$test_cleanup"
1115 teardown_malloc_check
1117 if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"
1118 then
1119 echo ""
1121 return "$eval_ret"
1124 test_start_ () {
1125 test_count=$(($test_count+1))
1126 maybe_setup_verbose
1127 maybe_setup_valgrind
1128 start_test_case_output "$@"
1131 test_finish_ () {
1132 echo >&3 ""
1133 maybe_teardown_valgrind
1134 maybe_teardown_verbose
1135 if test -n "$GIT_TEST_TEE_OFFSET"
1136 then
1137 GIT_TEST_TEE_OFFSET=$(test-tool path-utils file-size \
1138 "$GIT_TEST_TEE_OUTPUT_FILE")
1142 test_skip () {
1143 to_skip=
1144 skipped_reason=
1145 if match_pattern_list $this_test.$test_count "$GIT_SKIP_TESTS"
1146 then
1147 to_skip=t
1148 skipped_reason="GIT_SKIP_TESTS"
1150 if test -z "$to_skip" && test -n "$run_list" &&
1151 ! match_test_selector_list '--run' "$1" $test_count "$run_list"
1152 then
1153 to_skip=t
1154 skipped_reason="--run"
1156 if test -z "$to_skip" && test -n "$test_prereq" &&
1157 ! test_have_prereq "$test_prereq"
1158 then
1159 to_skip=t
1161 of_prereq=
1162 if test "$missing_prereq" != "$test_prereq"
1163 then
1164 of_prereq=" of $test_prereq"
1166 skipped_reason="missing $missing_prereq${of_prereq}"
1168 # Keep a list of all the missing prereq for result aggregation
1169 if test -z "$missing_prereq"
1170 then
1171 test_missing_prereq=$missing_prereq
1172 else
1173 test_missing_prereq="$test_missing_prereq,$missing_prereq"
1177 case "$to_skip" in
1180 say_color skip "ok $test_count # skip $1 ($skipped_reason)"
1181 : true
1182 finalize_test_case_output skip "$@"
1185 false
1187 esac
1190 # stub; perf-lib overrides it
1191 test_at_end_hook_ () {
1195 test_atexit_cleanup=:
1196 test_atexit_handler () {
1197 # In a succeeding test script 'test_atexit_handler' is invoked
1198 # twice: first from 'test_done', then from 'die' in the trap on
1199 # EXIT.
1200 # This condition and resetting 'test_atexit_cleanup' below makes
1201 # sure that the registered cleanup commands are run only once.
1202 test : != "$test_atexit_cleanup" || return 0
1204 setup_malloc_check
1205 test_eval_ "$test_atexit_cleanup"
1206 test_atexit_cleanup=:
1207 teardown_malloc_check
1210 sanitize_leak_log_message_ () {
1211 local new="$1" &&
1212 local old="$2" &&
1213 local file="$3" &&
1215 printf "With SANITIZE=leak at exit we have %d leak logs, but started with %d
1217 This means that we have a blindspot where git is leaking but we're
1218 losing the exit code somewhere, or not propagating it appropriately
1219 upwards!
1221 See the logs at \"%s.*\";
1222 those logs are reproduced below." \
1223 "$new" "$old" "$file"
1226 check_test_results_san_file_ () {
1227 if test -z "$TEST_RESULTS_SAN_FILE"
1228 then
1229 return
1230 fi &&
1231 local old="$TEST_RESULTS_SAN_DIR_NR_LEAKS_STARTUP" &&
1232 local new="$(nr_san_dir_leaks_)" &&
1234 if test $new -le $old
1235 then
1236 return
1237 fi &&
1238 local out="$(sanitize_leak_log_message_ "$new" "$old" "$TEST_RESULTS_SAN_FILE")" &&
1239 say_color error "$out" &&
1240 if test "$old" != 0
1241 then
1242 echo &&
1243 say_color error "The logs include output from past runs to avoid" &&
1244 say_color error "that remove 'test-results' between runs."
1245 fi &&
1246 say_color error "$(cat "$TEST_RESULTS_SAN_FILE".*)" &&
1248 if test -n "$passes_sanitize_leak" && test "$test_failure" = 0
1249 then
1250 say "As TEST_PASSES_SANITIZE_LEAK=true and our logs show we're leaking, exit non-zero!" &&
1251 invert_exit_code=t
1252 elif test -n "$passes_sanitize_leak"
1253 then
1254 say "As TEST_PASSES_SANITIZE_LEAK=true and our logs show we're leaking, and we're failing for other reasons too..." &&
1255 invert_exit_code=
1256 elif test -n "$sanitize_leak_check" && test "$test_failure" = 0
1257 then
1258 say "As TEST_PASSES_SANITIZE_LEAK=true isn't set the above leak is 'ok' with GIT_TEST_PASSING_SANITIZE_LEAK=check" &&
1259 invert_exit_code=
1260 elif test -n "$sanitize_leak_check"
1261 then
1262 say "As TEST_PASSES_SANITIZE_LEAK=true isn't set the above leak is 'ok' with GIT_TEST_PASSING_SANITIZE_LEAK=check" &&
1263 invert_exit_code=t
1264 else
1265 say "With GIT_TEST_SANITIZE_LEAK_LOG=true our logs revealed a memory leak, exit non-zero!" &&
1266 invert_exit_code=t
1270 test_done () {
1271 # Run the atexit commands _before_ the trash directory is
1272 # removed, so the commands can access pidfiles and socket files.
1273 test_atexit_handler
1275 finalize_test_output
1277 if test -z "$HARNESS_ACTIVE"
1278 then
1279 mkdir -p "$TEST_RESULTS_DIR"
1281 cat >"$TEST_RESULTS_BASE.counts" <<-EOF
1282 total $test_count
1283 success $test_success
1284 fixed $test_fixed
1285 broken $test_broken
1286 failed $test_failure
1287 missing_prereq $test_missing_prereq
1292 if test "$test_fixed" != 0
1293 then
1294 say_color error "# $test_fixed known breakage(s) vanished; please update test(s)"
1296 if test "$test_broken" != 0
1297 then
1298 say_color warn "# still have $test_broken known breakage(s)"
1300 if test "$test_broken" != 0 || test "$test_fixed" != 0
1301 then
1302 test_remaining=$(( $test_count - $test_broken - $test_fixed ))
1303 msg="remaining $test_remaining test(s)"
1304 else
1305 test_remaining=$test_count
1306 msg="$test_count test(s)"
1308 case "$test_failure" in
1310 if test $test_remaining -gt 0
1311 then
1312 say_color pass "# passed all $msg"
1315 # Maybe print SKIP message
1316 test -z "$skip_all" || skip_all="# SKIP $skip_all"
1317 case "$test_count" in
1319 say "1..$test_count${skip_all:+ $skip_all}"
1322 test -z "$skip_all" ||
1323 say_color warn "$skip_all"
1324 say "1..$test_count"
1326 esac
1328 if test -n "$stress" && test -n "$invert_exit_code"
1329 then
1330 # We're about to move our "$TRASH_DIRECTORY"
1331 # to "$TRASH_DIRECTORY.stress-failed" if
1332 # --stress is combined with
1333 # --invert-exit-code.
1334 say "with --stress and --invert-exit-code we're not removing '$TRASH_DIRECTORY'"
1335 elif test -z "$debug" && test -n "$remove_trash"
1336 then
1337 test -d "$TRASH_DIRECTORY" ||
1338 error "Tests passed but trash directory already removed before test cleanup; aborting"
1340 cd "$TRASH_DIRECTORY/.." &&
1341 rm -fr "$TRASH_DIRECTORY" || {
1342 # try again in a bit
1343 sleep 5;
1344 rm -fr "$TRASH_DIRECTORY"
1345 } ||
1346 error "Tests passed but test cleanup failed; aborting"
1349 check_test_results_san_file_ "$test_failure"
1351 if test -z "$skip_all" && test -n "$invert_exit_code"
1352 then
1353 say_color warn "# faking up non-zero exit with --invert-exit-code"
1354 GIT_EXIT_OK=t
1355 exit 1
1358 test_at_end_hook_
1360 GIT_EXIT_OK=t
1361 exit 0 ;;
1364 say_color error "# failed $test_failure among $msg"
1365 say "1..$test_count"
1367 check_test_results_san_file_ "$test_failure"
1369 if test -n "$invert_exit_code"
1370 then
1371 _invert_exit_code_failure_end_blurb
1372 GIT_EXIT_OK=t
1373 exit 0
1376 GIT_EXIT_OK=t
1377 exit 1 ;;
1379 esac
1382 if test -n "$valgrind"
1383 then
1384 make_symlink () {
1385 test -h "$2" &&
1386 test "$1" = "$(readlink "$2")" || {
1387 # be super paranoid
1388 if mkdir "$2".lock
1389 then
1390 rm -f "$2" &&
1391 ln -s "$1" "$2" &&
1392 rm -r "$2".lock
1393 else
1394 while test -d "$2".lock
1396 say "Waiting for lock on $2."
1397 sleep 1
1398 done
1403 make_valgrind_symlink () {
1404 # handle only executables, unless they are shell libraries that
1405 # need to be in the exec-path.
1406 test -x "$1" ||
1407 test "# " = "$(test_copy_bytes 2 <"$1")" ||
1408 return;
1410 base=$(basename "$1")
1411 case "$base" in
1412 test-*)
1413 symlink_target="$GIT_BUILD_DIR/t/helper/$base"
1416 symlink_target="$GIT_BUILD_DIR/$base"
1418 esac
1419 # do not override scripts
1420 if test -x "$symlink_target" &&
1421 test ! -d "$symlink_target" &&
1422 test "#!" != "$(test_copy_bytes 2 <"$symlink_target")"
1423 then
1424 symlink_target=../valgrind.sh
1426 case "$base" in
1427 *.sh|*.perl)
1428 symlink_target=../unprocessed-script
1429 esac
1430 # create the link, or replace it if it is out of date
1431 make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
1434 # override all git executables in TEST_DIRECTORY/..
1435 GIT_VALGRIND=$TEST_DIRECTORY/valgrind
1436 mkdir -p "$GIT_VALGRIND"/bin
1437 for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/t/helper/test-*
1439 make_valgrind_symlink $file
1440 done
1441 # special-case the mergetools loadables
1442 make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools"
1443 OLDIFS=$IFS
1444 IFS=:
1445 for path in $PATH
1447 ls "$path"/git-* 2> /dev/null |
1448 while read file
1450 make_valgrind_symlink "$file"
1451 done
1452 done
1453 IFS=$OLDIFS
1454 PATH=$GIT_VALGRIND/bin:$PATH
1455 GIT_EXEC_PATH=$GIT_VALGRIND/bin
1456 export GIT_VALGRIND
1457 GIT_VALGRIND_MODE="$valgrind"
1458 export GIT_VALGRIND_MODE
1459 GIT_VALGRIND_ENABLED=t
1460 test -n "$valgrind_only" && GIT_VALGRIND_ENABLED=
1461 export GIT_VALGRIND_ENABLED
1462 elif test -n "$GIT_TEST_INSTALLED"
1463 then
1464 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) ||
1465 error "Cannot run git from $GIT_TEST_INSTALLED."
1466 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR/t/helper:$PATH
1467 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
1468 else # normal case, use ../bin-wrappers only unless $with_dashes:
1469 if test -n "$no_bin_wrappers"
1470 then
1471 with_dashes=t
1472 else
1473 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers"
1474 if ! test -x "$git_bin_dir/git"
1475 then
1476 if test -z "$with_dashes"
1477 then
1478 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"
1480 with_dashes=t
1482 PATH="$git_bin_dir:$PATH"
1484 GIT_EXEC_PATH=$GIT_BUILD_DIR
1485 if test -n "$with_dashes"
1486 then
1487 PATH="$GIT_BUILD_DIR:$GIT_BUILD_DIR/t/helper:$PATH"
1490 GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt
1491 GIT_CONFIG_NOSYSTEM=1
1492 GIT_ATTR_NOSYSTEM=1
1493 GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY/.."
1494 export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM GIT_CEILING_DIRECTORIES
1496 if test -z "$GIT_TEST_CMP"
1497 then
1498 if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT"
1499 then
1500 GIT_TEST_CMP="$DIFF -c"
1501 else
1502 GIT_TEST_CMP="$DIFF -u"
1506 GITPERLLIB="$GIT_BUILD_DIR"/perl/build/lib
1507 export GITPERLLIB
1508 test -d "$GIT_BUILD_DIR"/templates/blt || {
1509 BAIL_OUT "You haven't built things yet, have you?"
1512 if ! test -x "$GIT_BUILD_DIR"/t/helper/test-tool$X
1513 then
1514 BAIL_OUT 'You need to build test-tool; Run "make t/helper/test-tool" in the source (toplevel) directory'
1517 # Are we running this test at all?
1518 remove_trash=
1519 this_test=${0##*/}
1520 this_test=${this_test%%-*}
1521 if match_pattern_list "$this_test" "$GIT_SKIP_TESTS"
1522 then
1523 say_color info >&3 "skipping test $this_test altogether"
1524 skip_all="skip all tests in $this_test"
1525 test_done
1528 BAIL_OUT_ENV_NEEDS_SANITIZE_LEAK () {
1529 BAIL_OUT "$1 has no effect except when compiled with SANITIZE=leak"
1532 if test -n "$SANITIZE_LEAK"
1533 then
1534 # Normalize with test_bool_env
1535 passes_sanitize_leak=
1537 # We need to see TEST_PASSES_SANITIZE_LEAK in "git
1538 # env--helper" (via test_bool_env)
1539 export TEST_PASSES_SANITIZE_LEAK
1540 if test_bool_env TEST_PASSES_SANITIZE_LEAK false
1541 then
1542 passes_sanitize_leak=t
1545 if test "$GIT_TEST_PASSING_SANITIZE_LEAK" = "check"
1546 then
1547 sanitize_leak_check=t
1548 if test -n "$invert_exit_code"
1549 then
1550 BAIL_OUT "cannot use --invert-exit-code under GIT_TEST_PASSING_SANITIZE_LEAK=check"
1553 if test -z "$passes_sanitize_leak"
1554 then
1555 say "in GIT_TEST_PASSING_SANITIZE_LEAK=check mode, setting --invert-exit-code for TEST_PASSES_SANITIZE_LEAK != true"
1556 invert_exit_code=t
1558 elif test -z "$passes_sanitize_leak" &&
1559 test_bool_env GIT_TEST_PASSING_SANITIZE_LEAK false
1560 then
1561 skip_all="skipping $this_test under GIT_TEST_PASSING_SANITIZE_LEAK=true"
1562 test_done
1565 if test_bool_env GIT_TEST_SANITIZE_LEAK_LOG false
1566 then
1567 if ! mkdir -p "$TEST_RESULTS_SAN_DIR"
1568 then
1569 BAIL_OUT "cannot create $TEST_RESULTS_SAN_DIR"
1570 fi &&
1571 TEST_RESULTS_SAN_FILE="$TEST_RESULTS_SAN_DIR/$TEST_RESULTS_SAN_FILE_PFX"
1573 # In case "test-results" is left over from a previous
1574 # run: Only report if new leaks show up.
1575 TEST_RESULTS_SAN_DIR_NR_LEAKS_STARTUP=$(nr_san_dir_leaks_)
1577 # Don't litter *.leak dirs if there was nothing to report
1578 test_atexit "rmdir \"$TEST_RESULTS_SAN_DIR\" 2>/dev/null || :"
1580 prepend_var LSAN_OPTIONS : dedup_token_length=9999
1581 prepend_var LSAN_OPTIONS : log_exe_name=1
1582 prepend_var LSAN_OPTIONS : log_path=\"$TEST_RESULTS_SAN_FILE\"
1583 export LSAN_OPTIONS
1585 elif test "$GIT_TEST_PASSING_SANITIZE_LEAK" = "check" ||
1586 test_bool_env GIT_TEST_PASSING_SANITIZE_LEAK false
1587 then
1588 BAIL_OUT_ENV_NEEDS_SANITIZE_LEAK "GIT_TEST_PASSING_SANITIZE_LEAK=true"
1589 elif test_bool_env GIT_TEST_SANITIZE_LEAK_LOG false
1590 then
1591 BAIL_OUT_ENV_NEEDS_SANITIZE_LEAK "GIT_TEST_SANITIZE_LEAK_LOG=true"
1594 # Last-minute variable setup
1595 USER_HOME="$HOME"
1596 HOME="$TRASH_DIRECTORY"
1597 GNUPGHOME="$HOME/gnupg-home-not-used"
1598 export HOME GNUPGHOME USER_HOME
1600 # "rm -rf" existing trash directory, even if a previous run left it
1601 # with bad permissions.
1602 remove_trash_directory () {
1603 dir="$1"
1604 if ! rm -rf "$dir" 2>/dev/null
1605 then
1606 chmod -R u+rwx "$dir"
1607 rm -rf "$dir"
1609 ! test -d "$dir"
1612 # Test repository
1613 remove_trash_directory "$TRASH_DIRECTORY" || {
1614 BAIL_OUT 'cannot prepare test area'
1617 remove_trash=t
1618 if test -z "$TEST_NO_CREATE_REPO"
1619 then
1620 git init \
1621 ${TEST_CREATE_REPO_NO_TEMPLATE:+--template=} \
1622 "$TRASH_DIRECTORY" >&3 2>&4 ||
1623 error "cannot run git init"
1624 else
1625 mkdir -p "$TRASH_DIRECTORY"
1628 # Use -P to resolve symlinks in our working directory so that the cwd
1629 # in subprocesses like git equals our $PWD (for pathname comparisons).
1630 cd -P "$TRASH_DIRECTORY" || BAIL_OUT "cannot cd -P to \"$TRASH_DIRECTORY\""
1632 start_test_output "$0"
1634 # Convenience
1635 # A regexp to match 5 and 35 hexdigits
1636 _x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
1637 _x35="$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
1639 test_oid_init
1641 ZERO_OID=$(test_oid zero)
1642 OID_REGEX=$(echo $ZERO_OID | sed -e 's/0/[0-9a-f]/g')
1643 OIDPATH_REGEX=$(test_oid_to_path $ZERO_OID | sed -e 's/0/[0-9a-f]/g')
1644 EMPTY_TREE=$(test_oid empty_tree)
1645 EMPTY_BLOB=$(test_oid empty_blob)
1647 # Provide an implementation of the 'yes' utility; the upper bound
1648 # limit is there to help Windows that cannot stop this loop from
1649 # wasting cycles when the downstream stops reading, so do not be
1650 # tempted to turn it into an infinite loop. cf. 6129c930 ("test-lib:
1651 # limit the output of the yes utility", 2016-02-02)
1652 yes () {
1653 if test $# = 0
1654 then
1656 else
1657 y="$*"
1661 while test $i -lt 99
1663 echo "$y"
1664 i=$(($i+1))
1665 done
1668 # The GIT_TEST_FAIL_PREREQS code hooks into test_set_prereq(), and
1669 # thus needs to be set up really early, and set an internal variable
1670 # for convenience so the hot test_set_prereq() codepath doesn't need
1671 # to call "git env--helper" (via test_bool_env). Only do that work
1672 # if needed by seeing if GIT_TEST_FAIL_PREREQS is set at all.
1673 GIT_TEST_FAIL_PREREQS_INTERNAL=
1674 if test -n "$GIT_TEST_FAIL_PREREQS"
1675 then
1676 if test_bool_env GIT_TEST_FAIL_PREREQS false
1677 then
1678 GIT_TEST_FAIL_PREREQS_INTERNAL=true
1679 test_set_prereq FAIL_PREREQS
1681 else
1682 test_lazy_prereq FAIL_PREREQS '
1683 test_bool_env GIT_TEST_FAIL_PREREQS false
1687 # Fix some commands on Windows, and other OS-specific things
1688 uname_s=$(uname -s)
1689 case $uname_s in
1690 *MINGW*)
1691 # Windows has its own (incompatible) sort and find
1692 sort () {
1693 /usr/bin/sort "$@"
1695 find () {
1696 /usr/bin/find "$@"
1698 # git sees Windows-style pwd
1699 pwd () {
1700 builtin pwd -W
1702 # no POSIX permissions
1703 # backslashes in pathspec are converted to '/'
1704 # exec does not inherit the PID
1705 test_set_prereq MINGW
1706 test_set_prereq NATIVE_CRLF
1707 test_set_prereq SED_STRIPS_CR
1708 test_set_prereq GREP_STRIPS_CR
1709 test_set_prereq WINDOWS
1710 GIT_TEST_CMP=mingw_test_cmp
1712 *CYGWIN*)
1713 test_set_prereq POSIXPERM
1714 test_set_prereq EXECKEEPSPID
1715 test_set_prereq CYGWIN
1716 test_set_prereq SED_STRIPS_CR
1717 test_set_prereq GREP_STRIPS_CR
1718 test_set_prereq WINDOWS
1721 test_set_prereq POSIXPERM
1722 test_set_prereq BSLASHPSPEC
1723 test_set_prereq EXECKEEPSPID
1725 esac
1727 # Detect arches where a few things don't work
1728 uname_m=$(uname -m)
1729 case $uname_m in
1730 parisc* | hppa*)
1731 test_set_prereq HPPA
1733 esac
1735 test_set_prereq REFFILES
1737 ( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_1
1738 test -z "$NO_CURL" && test_set_prereq LIBCURL
1739 test -z "$NO_PERL" && test_set_prereq PERL
1740 test -z "$NO_PTHREADS" && test_set_prereq PTHREADS
1741 test -z "$NO_PYTHON" && test_set_prereq PYTHON
1742 test -n "$USE_LIBPCRE2" && test_set_prereq PCRE
1743 test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE2
1744 test -z "$NO_GETTEXT" && test_set_prereq GETTEXT
1745 test -n "$SANITIZE_LEAK" && test_set_prereq SANITIZE_LEAK
1746 test -n "$GIT_VALGRIND_ENABLED" && test_set_prereq VALGRIND
1748 if test -z "$GIT_TEST_CHECK_CACHE_TREE"
1749 then
1750 GIT_TEST_CHECK_CACHE_TREE=true
1751 export GIT_TEST_CHECK_CACHE_TREE
1754 test_lazy_prereq PIPE '
1755 # test whether the filesystem supports FIFOs
1756 test_have_prereq !MINGW,!CYGWIN &&
1757 rm -f testfifo && mkfifo testfifo
1760 test_lazy_prereq SYMLINKS '
1761 # test whether the filesystem supports symbolic links
1762 ln -s x y && test -h y
1765 test_lazy_prereq SYMLINKS_WINDOWS '
1766 # test whether symbolic links are enabled on Windows
1767 test_have_prereq MINGW &&
1768 cmd //c "mklink y x" &> /dev/null && test -h y
1771 test_lazy_prereq FILEMODE '
1772 test "$(git config --bool core.filemode)" = true
1775 test_lazy_prereq CASE_INSENSITIVE_FS '
1776 echo good >CamelCase &&
1777 echo bad >camelcase &&
1778 test "$(cat CamelCase)" != good
1781 test_lazy_prereq FUNNYNAMES '
1782 test_have_prereq !MINGW &&
1783 touch -- \
1784 "FUNNYNAMES tab embedded" \
1785 "FUNNYNAMES \"quote embedded\"" \
1786 "FUNNYNAMES newline
1787 embedded" 2>/dev/null &&
1788 rm -- \
1789 "FUNNYNAMES tab embedded" \
1790 "FUNNYNAMES \"quote embedded\"" \
1791 "FUNNYNAMES newline
1792 embedded" 2>/dev/null
1795 test_lazy_prereq UTF8_NFD_TO_NFC '
1796 # check whether FS converts nfd unicode to nfc
1797 auml=$(printf "\303\244")
1798 aumlcdiar=$(printf "\141\314\210")
1799 >"$auml" &&
1800 test -f "$aumlcdiar"
1803 test_lazy_prereq AUTOIDENT '
1804 sane_unset GIT_AUTHOR_NAME &&
1805 sane_unset GIT_AUTHOR_EMAIL &&
1806 git var GIT_AUTHOR_IDENT
1809 test_lazy_prereq EXPENSIVE '
1810 test -n "$GIT_TEST_LONG"
1813 test_lazy_prereq EXPENSIVE_ON_WINDOWS '
1814 test_have_prereq EXPENSIVE || test_have_prereq !MINGW,!CYGWIN
1817 test_lazy_prereq USR_BIN_TIME '
1818 test -x /usr/bin/time
1821 test_lazy_prereq NOT_ROOT '
1822 uid=$(id -u) &&
1823 test "$uid" != 0
1826 test_lazy_prereq JGIT '
1827 jgit --version
1830 # SANITY is about "can you correctly predict what the filesystem would
1831 # do by only looking at the permission bits of the files and
1832 # directories?" A typical example of !SANITY is running the test
1833 # suite as root, where a test may expect "chmod -r file && cat file"
1834 # to fail because file is supposed to be unreadable after a successful
1835 # chmod. In an environment (i.e. combination of what filesystem is
1836 # being used and who is running the tests) that lacks SANITY, you may
1837 # be able to delete or create a file when the containing directory
1838 # doesn't have write permissions, or access a file even if the
1839 # containing directory doesn't have read or execute permissions.
1841 test_lazy_prereq SANITY '
1842 mkdir SANETESTD.1 SANETESTD.2 &&
1844 chmod +w SANETESTD.1 SANETESTD.2 &&
1845 >SANETESTD.1/x 2>SANETESTD.2/x &&
1846 chmod -w SANETESTD.1 &&
1847 chmod -r SANETESTD.1/x &&
1848 chmod -rx SANETESTD.2 ||
1849 BUG "cannot prepare SANETESTD"
1851 ! test -r SANETESTD.1/x &&
1852 ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x
1853 status=$?
1855 chmod +rwx SANETESTD.1 SANETESTD.2 &&
1856 rm -rf SANETESTD.1 SANETESTD.2 ||
1857 BUG "cannot clean SANETESTD"
1858 return $status
1861 test FreeBSD != $uname_s || GIT_UNZIP=${GIT_UNZIP:-/usr/local/bin/unzip}
1862 GIT_UNZIP=${GIT_UNZIP:-unzip}
1863 test_lazy_prereq UNZIP '
1864 "$GIT_UNZIP" -v
1865 test $? -ne 127
1868 run_with_limited_cmdline () {
1869 (ulimit -s 128 && "$@")
1872 test_lazy_prereq CMDLINE_LIMIT '
1873 test_have_prereq !HPPA,!MINGW,!CYGWIN &&
1874 run_with_limited_cmdline true
1877 run_with_limited_stack () {
1878 (ulimit -s 128 && "$@")
1881 test_lazy_prereq ULIMIT_STACK_SIZE '
1882 test_have_prereq !HPPA,!MINGW,!CYGWIN &&
1883 run_with_limited_stack true
1886 run_with_limited_open_files () {
1887 (ulimit -n 32 && "$@")
1890 test_lazy_prereq ULIMIT_FILE_DESCRIPTORS '
1891 test_have_prereq !MINGW,!CYGWIN &&
1892 run_with_limited_open_files true
1895 build_option () {
1896 git version --build-options |
1897 sed -ne "s/^$1: //p"
1900 test_lazy_prereq SIZE_T_IS_64BIT '
1901 test 8 -eq "$(build_option sizeof-size_t)"
1904 test_lazy_prereq LONG_IS_64BIT '
1905 test 8 -le "$(build_option sizeof-long)"
1908 test_lazy_prereq TIME_IS_64BIT 'test-tool date is64bit'
1909 test_lazy_prereq TIME_T_IS_64BIT 'test-tool date time_t-is64bit'
1911 test_lazy_prereq CURL '
1912 curl --version
1915 # SHA1 is a test if the hash algorithm in use is SHA-1. This is both for tests
1916 # which will not work with other hash algorithms and tests that work but don't
1917 # test anything meaningful (e.g. special values which cause short collisions).
1918 test_lazy_prereq SHA1 '
1919 case "$GIT_DEFAULT_HASH" in
1920 sha1) true ;;
1921 "") test $(git hash-object /dev/null) = e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 ;;
1922 *) false ;;
1923 esac
1926 test_lazy_prereq ADD_I_USE_BUILTIN '
1927 test_bool_env GIT_TEST_ADD_I_USE_BUILTIN true
1930 # Ensure that no test accidentally triggers a Git command
1931 # that runs the actual maintenance scheduler, affecting a user's
1932 # system permanently.
1933 # Tests that verify the scheduler integration must set this locally
1934 # to avoid errors.
1935 GIT_TEST_MAINT_SCHEDULER="none:exit 1"
1937 # Does this platform support `git fsmonitor--daemon`
1939 test_lazy_prereq FSMONITOR_DAEMON '
1940 git version --build-options >output &&
1941 grep "feature: fsmonitor--daemon" output