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