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