]> git.ipfire.org Git - thirdparty/git.git/blame - t/test-lib.sh
tests: fix overeager scrubbing of environment variables
[thirdparty/git.git] / t / test-lib.sh
CommitLineData
e1970ce4
JH
1#!/bin/sh
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
44138559
JS
18# if --tee was passed, write the output not only to the terminal, but
19# additionally to the file test-results/$BASENAME.out, too.
20case "$GIT_TEST_TEE_STARTED, $* " in
21done,*)
22 # do not redirect again
23 ;;
3da93652 24*' --tee '*|*' --va'*)
44138559
JS
25 mkdir -p test-results
26 BASE=test-results/$(basename "$0" .sh)
27 (GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
28 echo $? > $BASE.exit) | tee $BASE.out
29 test "$(cat $BASE.exit)" = 0
30 exit
31 ;;
32esac
33
c2116a17
JH
34# Keep the original TERM for say_color
35ORIGINAL_TERM=$TERM
36
e1970ce4
JH
37# For repeatability, reset the environment to known value.
38LANG=C
899460f3 39LC_ALL=C
d9bdd39e 40PAGER=cat
e1970ce4 41TZ=UTC
c2116a17
JH
42TERM=dumb
43export LANG LC_ALL PAGER TERM TZ
8ff99e74 44EDITOR=:
d33738d7 45unset VISUAL
28a94f88 46unset EMAIL
95a1d12e
JN
47unset $(perl -e '
48 my @env = keys %ENV;
730477f1
JL
49 my $ok = join("|", qw(
50 TRACE
51 DEBUG
52 USE_LOOKUP
53 TEST
54 .*_TEST
55 PROVE
56 VALGRIND
57 ));
58 my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env);
95a1d12e
JN
59 print join("\n", @vars);
60')
29e55cd5
JH
61GIT_AUTHOR_EMAIL=author@example.com
62GIT_AUTHOR_NAME='A U Thor'
29e55cd5
JH
63GIT_COMMITTER_EMAIL=committer@example.com
64GIT_COMMITTER_NAME='C O Mitter'
8d0fc48f
SP
65GIT_MERGE_VERBOSITY=5
66export GIT_MERGE_VERBOSITY
29e55cd5
JH
67export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
68export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
d33738d7 69export EDITOR
e1970ce4 70
886a3907
JH
71# Protect ourselves from common misconfiguration to export
72# CDPATH into the environment
73unset CDPATH
74
5565f47c
BW
75unset GREP_OPTIONS
76
3d5c0cc9 77case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
6ce4e61f
CC
78 1|2|true)
79 echo "* warning: Some tests will not work if GIT_TRACE" \
80 "is set as to trace on STDERR ! *"
81 echo "* warning: Please set GIT_TRACE to something" \
82 "other than 1, 2 or true ! *"
83 ;;
84esac
85
cd3c095c
JH
86# Convenience
87#
88# A regexp to match 5 and 40 hexdigits
89_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
90_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
91
e1970ce4
JH
92# Each test should start with something like this, after copyright notices:
93#
94# test_description='Description of this test...
95# This test checks if command xyzzy does the right thing...
96# '
97# . ./test-lib.sh
c2116a17
JH
98[ "x$ORIGINAL_TERM" != "xdumb" ] && (
99 TERM=$ORIGINAL_TERM &&
100 export TERM &&
101 [ -t 1 ] &&
102 tput bold >/dev/null 2>&1 &&
103 tput setaf 1 >/dev/null 2>&1 &&
104 tput sgr0 >/dev/null 2>&1
105 ) &&
55db1df0 106 color=t
e1970ce4 107
e1970ce4
JH
108while test "$#" -ne 0
109do
110 case "$1" in
111 -d|--d|--de|--deb|--debu|--debug)
112 debug=t; shift ;;
886856ab
JH
113 -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
114 immediate=t; shift ;;
5e2c08c6 115 -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
91e80b98 116 GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;;
e1970ce4 117 -h|--h|--he|--hel|--help)
570f3226 118 help=t; shift ;;
e1970ce4
JH
119 -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
120 verbose=t; shift ;;
1ece1274 121 -q|--q|--qu|--qui|--quie|--quiet)
092c4334
ÆAB
122 # Ignore --quiet under a TAP::Harness. Saying how many tests
123 # passed without the ok/not ok details is always an error.
124 test -z "$HARNESS_ACTIVE" && quiet=t; shift ;;
e4597aae
MO
125 --with-dashes)
126 with_dashes=t; shift ;;
55db1df0 127 --no-color)
faa4bc35 128 color=; shift ;;
4e1be63c 129 --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
3da93652 130 valgrind=t; verbose=t; shift ;;
44138559
JS
131 --tee)
132 shift ;; # was handled already
f423ef5f
JK
133 --root=*)
134 root=$(expr "z$1" : 'z[^=]*=\(.*\)')
135 shift ;;
e1970ce4 136 *)
1f729dca 137 echo "error: unknown test option '$1'" >&2; exit 1 ;;
e1970ce4
JH
138 esac
139done
140
55db1df0
PH
141if test -n "$color"; then
142 say_color () {
c2116a17
JH
143 (
144 TERM=$ORIGINAL_TERM
145 export TERM
55db1df0
PH
146 case "$1" in
147 error) tput bold; tput setaf 1;; # bold red
148 skip) tput bold; tput setaf 2;; # bold green
149 pass) tput setaf 2;; # green
150 info) tput setaf 3;; # brown
1ece1274 151 *) test -n "$quiet" && return;;
55db1df0
PH
152 esac
153 shift
5099b99d 154 printf "%s" "$*"
55db1df0 155 tput sgr0
b8eecafd 156 echo
c2116a17 157 )
55db1df0
PH
158 }
159else
160 say_color() {
1ece1274 161 test -z "$1" && test -n "$quiet" && return
55db1df0 162 shift
5099b99d 163 echo "$*"
55db1df0
PH
164 }
165fi
166
167error () {
168 say_color error "error: $*"
6e7b5aaf 169 GIT_EXIT_OK=t
55db1df0
PH
170 exit 1
171}
172
173say () {
174 say_color info "$*"
175}
176
570f3226
MB
177test "${test_description}" != "" ||
178error "Test script did not set test_description."
179
180if test "$help" = "t"
181then
182 echo "$test_description"
183 exit 0
184fi
185
4d9d62fa 186exec 5>&1
e1970ce4
JH
187if test "$verbose" = "t"
188then
189 exec 4>&2 3>&1
190else
191 exec 4>/dev/null 3>/dev/null
192fi
193
194test_failure=0
195test_count=0
41ac414e
JH
196test_fixed=0
197test_broken=0
2d84e9fb 198test_success=0
e1970ce4 199
d998bd4a
ÆAB
200test_external_has_tap=0
201
faa4bc35 202die () {
6e7b5aaf
CB
203 code=$?
204 if test -n "$GIT_EXIT_OK"
205 then
206 exit $code
207 else
208 echo >&5 "FATAL: Unexpected exit with code $code"
209 exit 1
210 fi
faa4bc35
CB
211}
212
6e7b5aaf 213GIT_EXIT_OK=
35641310 214trap 'die' EXIT
41184273 215
02b35660
BD
216# The semantics of the editor variables are that of invoking
217# sh -c "$EDITOR \"$@\"" files ...
218#
219# If our trash directory contains shell metacharacters, they will be
220# interpreted if we just set $EDITOR directly, so do a little dance with
221# environment variables to work around this.
222#
223# In particular, quoting isn't enough, as the path may contain the same quote
7b7b4516 224# that we're using.
02b35660
BD
225test_set_editor () {
226 FAKE_EDITOR="$1"
227 export FAKE_EDITOR
d33738d7
JN
228 EDITOR='"$FAKE_EDITOR"'
229 export EDITOR
02b35660
BD
230}
231
68cfc6f5 232test_decode_color () {
a471833d
KB
233 awk '
234 function name(n) {
235 if (n == 0) return "RESET";
236 if (n == 1) return "BOLD";
237 if (n == 30) return "BLACK";
238 if (n == 31) return "RED";
239 if (n == 32) return "GREEN";
240 if (n == 33) return "YELLOW";
241 if (n == 34) return "BLUE";
242 if (n == 35) return "MAGENTA";
243 if (n == 36) return "CYAN";
244 if (n == 37) return "WHITE";
245 if (n == 40) return "BLACK";
246 if (n == 41) return "BRED";
247 if (n == 42) return "BGREEN";
248 if (n == 43) return "BYELLOW";
249 if (n == 44) return "BBLUE";
250 if (n == 45) return "BMAGENTA";
251 if (n == 46) return "BCYAN";
252 if (n == 47) return "BWHITE";
253 }
254 {
c2ed29b4 255 while (match($0, /\033\[[0-9;]*m/) != 0) {
a471833d
KB
256 printf "%s<", substr($0, 1, RSTART-1);
257 codes = substr($0, RSTART+2, RLENGTH-3);
258 if (length(codes) == 0)
259 printf "%s", name(0)
260 else {
261 n = split(codes, ary, ";");
262 sep = "";
263 for (i = 1; i <= n; i++) {
264 printf "%s%s", sep, name(ary[i]);
265 sep = ";"
266 }
267 }
268 printf ">";
269 $0 = substr($0, RSTART + RLENGTH, length($0) - RSTART - RLENGTH + 1);
270 }
271 print
272 }
273 '
68cfc6f5
MG
274}
275
9130ac9f
JK
276nul_to_q () {
277 perl -pe 'y/\000/Q/'
278}
279
c4f3f551
SB
280q_to_nul () {
281 perl -pe 'y/Q/\000/'
282}
283
284q_to_cr () {
285 tr Q '\015'
286}
287
800f1104
JN
288q_to_tab () {
289 tr Q '\011'
290}
291
c4f3f551
SB
292append_cr () {
293 sed -e 's/$/Q/' | tr Q '\015'
294}
295
296remove_cr () {
297 tr '\015' Q | sed -e 's/Q$//'
298}
299
00648ba0
EN
300# In some bourne shell implementations, the "unset" builtin returns
301# nonzero status when a variable to be unset was not set in the first
302# place.
303#
304# Use sane_unset when that should not be considered an error.
305
306sane_unset () {
307 unset "$@"
308 return 0
309}
310
04509738
JH
311test_tick () {
312 if test -z "${test_tick+set}"
313 then
21afc41c 314 test_tick=1112911993
04509738
JH
315 else
316 test_tick=$(($test_tick + 60))
317 fi
21afc41c
JH
318 GIT_COMMITTER_DATE="$test_tick -0700"
319 GIT_AUTHOR_DATE="$test_tick -0700"
04509738
JH
320 export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
321}
e1970ce4 322
00884968
JS
323# Call test_commit with the arguments "<message> [<file> [<contents>]]"
324#
325# This will commit a file with the given contents and the given commit
326# message. It will also add a tag with <message> as name.
327#
328# Both <file> and <contents> default to <message>.
329
330test_commit () {
e656fc97 331 file=${2:-"$1.t"}
00884968
JS
332 echo "${3-$1}" > "$file" &&
333 git add "$file" &&
334 test_tick &&
335 git commit -m "$1" &&
336 git tag "$1"
337}
338
339# Call test_merge with the arguments "<message> <commit>", where <commit>
340# can be a tag pointing to the commit-to-merge.
341
342test_merge () {
343 test_tick &&
344 git merge -m "$1" "$2" &&
345 git tag "$1"
346}
347
1f553918
JS
348# This function helps systems where core.filemode=false is set.
349# Use it instead of plain 'chmod +x' to set or unset the executable bit
350# of a file in the working directory and add it to the index.
351
352test_chmod () {
353 chmod "$@" &&
354 git update-index --add "--chmod=$@"
355}
356
a7bb3940
JS
357# Use test_set_prereq to tell that a particular prerequisite is available.
358# The prerequisite can later be checked for in two ways:
359#
360# - Explicitly using test_have_prereq.
361#
362# - Implicitly by specifying the prerequisite tag in the calls to
363# test_expect_{success,failure,code}.
364#
365# The single parameter is the prerequisite tag (a simple word, in all
366# capital letters by convention).
367
368test_set_prereq () {
369 satisfied="$satisfied$1 "
370}
371satisfied=" "
372
373test_have_prereq () {
93a57246
ÆAB
374 # prerequisites can be concatenated with ','
375 save_IFS=$IFS
376 IFS=,
377 set -- $*
378 IFS=$save_IFS
ce60653e
ÆAB
379
380 total_prereq=0
381 ok_prereq=0
382 missing_prereq=
383
93a57246
ÆAB
384 for prerequisite
385 do
ce60653e 386 total_prereq=$(($total_prereq + 1))
93a57246
ÆAB
387 case $satisfied in
388 *" $prerequisite "*)
ce60653e
ÆAB
389 ok_prereq=$(($ok_prereq + 1))
390 ;;
93a57246 391 *)
ce60653e
ÆAB
392 # Keep a list of missing prerequisites
393 if test -z "$missing_prereq"
394 then
395 missing_prereq=$prerequisite
396 else
397 missing_prereq="$prerequisite,$missing_prereq"
398 fi
93a57246
ÆAB
399 esac
400 done
ce60653e
ÆAB
401
402 test $total_prereq = $ok_prereq
a7bb3940
JS
403}
404
05236a5e
JN
405test_declared_prereq () {
406 case ",$test_prereq," in
407 *,$1,*)
408 return 0
409 ;;
410 esac
411 return 1
412}
413
886856ab
JH
414# You are not expected to call test_ok_ and test_failure_ directly, use
415# the text_expect_* functions instead.
416
417test_ok_ () {
d5d9de1b 418 test_success=$(($test_success + 1))
5099b99d 419 say_color "" "ok $test_count - $@"
e1970ce4
JH
420}
421
886856ab 422test_failure_ () {
d5d9de1b 423 test_failure=$(($test_failure + 1))
5099b99d 424 say_color error "not ok - $test_count $1"
bf0dd8a8 425 shift
5099b99d 426 echo "$@" | sed -e 's/^/# /'
6e7b5aaf 427 test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
886856ab
JH
428}
429
41ac414e 430test_known_broken_ok_ () {
41ac414e 431 test_fixed=$(($test_fixed+1))
5099b99d 432 say_color "" "ok $test_count - $@ # TODO known breakage"
41ac414e
JH
433}
434
435test_known_broken_failure_ () {
41ac414e 436 test_broken=$(($test_broken+1))
5099b99d 437 say_color skip "not ok $test_count - $@ # TODO known breakage"
41ac414e 438}
886856ab
JH
439
440test_debug () {
8e832ebc 441 test "$debug" = "" || eval "$1"
e1970ce4
JH
442}
443
4d9d62fa 444test_run_ () {
b6b0afdc 445 test_cleanup=:
4d9d62fa 446 eval >&3 2>&4 "$1"
b6b0afdc 447 eval_ret=$?
3bf78867 448 eval >&3 2>&4 "$test_cleanup"
57e1538a
ÆAB
449 if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then
450 echo ""
451 fi
4d9d62fa
PR
452 return 0
453}
454
04ece593 455test_skip () {
8586f98b 456 test_count=$(($test_count+1))
04ece593
JH
457 to_skip=
458 for skp in $GIT_SKIP_TESTS
459 do
8586f98b 460 case $this_test.$test_count in
04ece593
JH
461 $skp)
462 to_skip=t
47e67d47 463 break
04ece593
JH
464 esac
465 done
05236a5e
JN
466 if test -z "$to_skip" && test -n "$test_prereq" &&
467 ! test_have_prereq "$test_prereq"
a7bb3940
JS
468 then
469 to_skip=t
470 fi
04ece593
JH
471 case "$to_skip" in
472 t)
07431fc8 473 of_prereq=
05236a5e 474 if test "$missing_prereq" != "$test_prereq"
07431fc8 475 then
05236a5e 476 of_prereq=" of $test_prereq"
07431fc8
JN
477 fi
478
55db1df0 479 say_color skip >&3 "skipping test: $@"
07431fc8 480 say_color skip "ok $test_count # skip $1 (missing $missing_prereq${of_prereq})"
04ece593
JH
481 : true
482 ;;
483 *)
484 false
485 ;;
486 esac
487}
488
e1970ce4 489test_expect_failure () {
05236a5e 490 test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
8e832ebc 491 test "$#" = 2 ||
a7bb3940 492 error "bug in the test script: not 2 or 3 parameters to test-expect-failure"
05236a5e 493 export test_prereq
04ece593 494 if ! test_skip "$@"
e1970ce4 495 then
41ac414e 496 say >&3 "checking known breakage: $2"
04ece593 497 test_run_ "$2"
41ac414e 498 if [ "$?" = 0 -a "$eval_ret" = 0 ]
04ece593 499 then
41ac414e 500 test_known_broken_ok_ "$1"
04ece593 501 else
6e7b5aaf 502 test_known_broken_failure_ "$1"
04ece593 503 fi
e1970ce4 504 fi
7a0cf2d0 505 echo >&3 ""
e1970ce4
JH
506}
507
508test_expect_success () {
05236a5e 509 test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
8e832ebc 510 test "$#" = 2 ||
a7bb3940 511 error "bug in the test script: not 2 or 3 parameters to test-expect-success"
05236a5e 512 export test_prereq
04ece593 513 if ! test_skip "$@"
e1970ce4 514 then
04ece593
JH
515 say >&3 "expecting success: $2"
516 test_run_ "$2"
517 if [ "$?" = 0 -a "$eval_ret" = 0 ]
518 then
519 test_ok_ "$1"
520 else
521 test_failure_ "$@"
522 fi
e1970ce4 523 fi
7a0cf2d0 524 echo >&3 ""
e1970ce4
JH
525}
526
fb32c410
LW
527# test_external runs external test scripts that provide continuous
528# test output about their progress, and succeeds/fails on
529# zero/non-zero exit code. It outputs the test output on stdout even
d998bd4a 530# in non-verbose mode, and announces the external script with "# run
fb32c410
LW
531# <n>: ..." before running it. When providing relative paths, keep in
532# mind that all scripts run in "trash directory".
533# Usage: test_external description command arguments...
534# Example: test_external 'Perl API' perl ../path/to/test.pl
535test_external () {
05236a5e 536 test "$#" = 4 && { test_prereq=$1; shift; } || test_prereq=
a7bb3940
JS
537 test "$#" = 3 ||
538 error >&5 "bug in the test script: not 3 or 4 parameters to test_external"
fb32c410
LW
539 descr="$1"
540 shift
05236a5e 541 export test_prereq
fb32c410
LW
542 if ! test_skip "$descr" "$@"
543 then
544 # Announce the script to reduce confusion about the
545 # test output that follows.
d998bd4a 546 say_color "" "# run $test_count: $descr ($*)"
5ae8030f
JN
547 # Export TEST_DIRECTORY, TRASH_DIRECTORY and GIT_TEST_LONG
548 # to be able to use them in script
549 export TEST_DIRECTORY TRASH_DIRECTORY GIT_TEST_LONG
fb32c410
LW
550 # Run command; redirect its stderr to &4 as in
551 # test_run_, but keep its stdout on our stdout even in
552 # non-verbose mode.
553 "$@" 2>&4
554 if [ "$?" = 0 ]
555 then
d998bd4a
ÆAB
556 if test $test_external_has_tap -eq 0; then
557 test_ok_ "$descr"
558 else
559 say_color "" "# test_external test $descr was ok"
560 test_success=$(($test_success + 1))
561 fi
fb32c410 562 else
d998bd4a
ÆAB
563 if test $test_external_has_tap -eq 0; then
564 test_failure_ "$descr" "$@"
565 else
566 say_color error "# test_external test $descr failed: $@"
567 test_failure=$(($test_failure + 1))
568 fi
fb32c410
LW
569 fi
570 fi
571}
572
573# Like test_external, but in addition tests that the command generated
574# no output on stderr.
575test_external_without_stderr () {
576 # The temporary file has no (and must have no) security
577 # implications.
578 tmp="$TMPDIR"; if [ -z "$tmp" ]; then tmp=/tmp; fi
579 stderr="$tmp/git-external-stderr.$$.tmp"
580 test_external "$@" 4> "$stderr"
581 [ -f "$stderr" ] || error "Internal error: $stderr disappeared."
582 descr="no stderr: $1"
583 shift
d998bd4a 584 say >&3 "# expecting no stderr from previous command"
fb32c410
LW
585 if [ ! -s "$stderr" ]; then
586 rm "$stderr"
d998bd4a
ÆAB
587
588 if test $test_external_has_tap -eq 0; then
589 test_ok_ "$descr"
590 else
591 say_color "" "# test_external_without_stderr test $descr was ok"
592 test_success=$(($test_success + 1))
593 fi
fb32c410
LW
594 else
595 if [ "$verbose" = t ]; then
d998bd4a 596 output=`echo; echo "# Stderr is:"; cat "$stderr"`
fb32c410
LW
597 else
598 output=
599 fi
600 # rm first in case test_failure exits.
601 rm "$stderr"
d998bd4a
ÆAB
602 if test $test_external_has_tap -eq 0; then
603 test_failure_ "$descr" "$@" "$output"
604 else
605 say_color error "# test_external_without_stderr test $descr failed: $@: $output"
606 test_failure=$(($test_failure + 1))
607 fi
fb32c410
LW
608 fi
609}
610
2caf20c5
MM
611# debugging-friendly alternatives to "test [-f|-d|-e]"
612# The commands test the existence or non-existence of $1. $2 can be
613# given to provide a more precise diagnosis.
614test_path_is_file () {
615 if ! [ -f "$1" ]
616 then
617 echo "File $1 doesn't exist. $*"
618 false
619 fi
620}
621
622test_path_is_dir () {
623 if ! [ -d "$1" ]
624 then
625 echo "Directory $1 doesn't exist. $*"
626 false
627 fi
628}
629
630test_path_is_missing () {
631 if [ -e "$1" ]
632 then
633 echo "Path exists:"
634 ls -ld "$1"
635 if [ $# -ge 1 ]; then
636 echo "$*"
637 fi
638 false
639 fi
640}
641
fb3340a6
JN
642# test_line_count checks that a file has the number of lines it
643# ought to. For example:
644#
645# test_expect_success 'produce exactly one line of output' '
646# do something >output &&
647# test_line_count = 1 output
648# '
649#
650# is like "test $(wc -l <output) = 1" except that it passes the
651# output through when the number of lines is wrong.
652
653test_line_count () {
654 if test $# != 3
655 then
656 error "bug in the test script: not 3 parameters to test_line_count"
657 elif ! test $(wc -l <"$3") "$1" "$2"
658 then
659 echo "test_line_count: line count for $3 !$1 $2"
660 cat "$3"
661 return 1
662 fi
663}
2caf20c5 664
74359821
JH
665# This is not among top-level (test_expect_success | test_expect_failure)
666# but is a prefix that can be used in the test script, like:
667#
668# test_expect_success 'complain and die' '
669# do something &&
670# do something else &&
671# test_must_fail git checkout ../outerspace
672# '
673#
674# Writing this as "! git checkout ../outerspace" is wrong, because
675# the failure could be due to a segv. We want a controlled failure.
676
677test_must_fail () {
678 "$@"
16034fbe
JK
679 exit_code=$?
680 if test $exit_code = 0; then
681 echo >&2 "test_must_fail: command succeeded: $*"
682 return 1
683 elif test $exit_code -gt 129 -a $exit_code -le 192; then
684 echo >&2 "test_must_fail: died by signal: $*"
685 return 1
a54ce3ca
JK
686 elif test $exit_code = 127; then
687 echo >&2 "test_must_fail: command not found: $*"
688 return 1
16034fbe
JK
689 fi
690 return 0
74359821
JH
691}
692
fdf1bc48
JN
693# Similar to test_must_fail, but tolerates success, too. This is
694# meant to be used in contexts like:
695#
696# test_expect_success 'some command works without configuration' '
697# test_might_fail git config --unset all.configuration &&
698# do something
699# '
700#
701# Writing "git config --unset all.configuration || :" would be wrong,
702# because we want to notice if it fails due to segv.
703
704test_might_fail () {
705 "$@"
5c8e1414
JN
706 exit_code=$?
707 if test $exit_code -gt 129 -a $exit_code -le 192; then
708 echo >&2 "test_might_fail: died by signal: $*"
709 return 1
d0b8a617
JN
710 elif test $exit_code = 127; then
711 echo >&2 "test_might_fail: command not found: $*"
712 return 1
5c8e1414
JN
713 fi
714 return 0
fdf1bc48
JN
715}
716
892e6f7e
ÆAB
717# Similar to test_must_fail and test_might_fail, but check that a
718# given command exited with a given exit code. Meant to be used as:
719#
720# test_expect_success 'Merge with d/f conflicts' '
721# test_expect_code 1 git merge "merge msg" B master
722# '
723
724test_expect_code () {
725 want_code=$1
726 shift
727 "$@"
728 exit_code=$?
729 if test $exit_code = $want_code
730 then
731 echo >&2 "test_expect_code: command exited with $exit_code: $*"
732 return 0
733 else
734 echo >&2 "test_expect_code: command exited with $exit_code, we wanted $want_code $*"
735 return 1
736 fi
737}
738
82ebb0b6
JK
739# test_cmp is a helper function to compare actual and expected output.
740# You can use it like:
741#
742# test_expect_success 'foo works' '
743# echo expected >expected &&
744# foo >actual &&
745# test_cmp expected actual
746# '
747#
748# This could be written as either "cmp" or "diff -u", but:
749# - cmp's output is not nearly as easy to read as diff -u
750# - not all diff versions understand "-u"
751
752test_cmp() {
753 $GIT_TEST_CMP "$@"
754}
755
3bf78867
JN
756# This function can be used to schedule some commands to be run
757# unconditionally at the end of the test to restore sanity:
758#
759# test_expect_success 'test core.capslock' '
760# git config core.capslock true &&
761# test_when_finished "git config --unset core.capslock" &&
762# hello world
763# '
764#
765# That would be roughly equivalent to
766#
767# test_expect_success 'test core.capslock' '
768# git config core.capslock true &&
769# hello world
770# git config --unset core.capslock
771# '
772#
773# except that the greeting and config --unset must both succeed for
774# the test to pass.
775
776test_when_finished () {
b6b0afdc
JN
777 test_cleanup="{ $*
778 } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup"
3bf78867
JN
779}
780
0509eb21 781# Most tests can use the created repository, but some may need to create more.
eedf8f97
CW
782# Usage: test_create_repo <directory>
783test_create_repo () {
784 test "$#" = 1 ||
785 error "bug in the test script: not 1 parameter to test-create-repo"
eedf8f97 786 repo="$1"
bfdbee98 787 mkdir -p "$repo"
0d314ce8
ÆAB
788 (
789 cd "$repo" || error "Cannot setup test environment"
790 "$GIT_EXEC_PATH/git-init" "--template=$GIT_BUILD_DIR/templates/blt/" >&3 2>&4 ||
791 error "cannot run git init -- have you built things yet?"
792 mv .git/hooks .git/hooks-disabled
793 ) || exit
eedf8f97 794}
a6080a0a 795
e1970ce4 796test_done () {
6e7b5aaf 797 GIT_EXIT_OK=t
2d84e9fb 798
8ef1abe5
ÆAB
799 if test -z "$HARNESS_ACTIVE"; then
800 test_results_dir="$TEST_DIRECTORY/test-results"
801 mkdir -p "$test_results_dir"
802 test_results_path="$test_results_dir/${0%.sh}-$$.counts"
803
804 echo "total $test_count" >> $test_results_path
805 echo "success $test_success" >> $test_results_path
806 echo "fixed $test_fixed" >> $test_results_path
807 echo "broken $test_broken" >> $test_results_path
808 echo "failed $test_failure" >> $test_results_path
809 echo "" >> $test_results_path
810 fi
41ac414e
JH
811
812 if test "$test_fixed" != 0
813 then
5099b99d 814 say_color pass "# fixed $test_fixed known breakage(s)"
41ac414e
JH
815 fi
816 if test "$test_broken" != 0
817 then
5099b99d 818 say_color error "# still have $test_broken known breakage(s)"
11d54b8b
JH
819 msg="remaining $(($test_count-$test_broken)) test(s)"
820 else
821 msg="$test_count test(s)"
41ac414e 822 fi
e1970ce4 823 case "$test_failure" in
10b94e28 824 0)
5099b99d
ÆAB
825 # Maybe print SKIP message
826 [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all"
827
d998bd4a
ÆAB
828 if test $test_external_has_tap -eq 0; then
829 say_color pass "# passed all $msg"
830 say "1..$test_count$skip_all"
831 fi
abc5d372
JS
832
833 test -d "$remove_trash" &&
834 cd "$(dirname "$remove_trash")" &&
835 rm -rf "$(basename "$remove_trash")"
836
e1970ce4
JH
837 exit 0 ;;
838
839 *)
d998bd4a
ÆAB
840 if test $test_external_has_tap -eq 0; then
841 say_color error "# failed $test_failure among $msg"
842 say "1..$test_count"
843 fi
5099b99d 844
e1970ce4
JH
845 exit 1 ;;
846
847 esac
848}
849
850# Test the binaries we have just built. The tests are kept in
9adefee5 851# t/ subdirectory and are run in 'trash directory' subdirectory.
62f53904
ÆAB
852if test -z "$TEST_DIRECTORY"
853then
854 # We allow tests to override this, in case they want to run tests
855 # outside of t/, e.g. for running tests on the test library
856 # itself.
857 TEST_DIRECTORY=$(pwd)
858fi
6cec5c68
ÆAB
859GIT_BUILD_DIR="$TEST_DIRECTORY"/..
860
e4597aae 861if test -n "$valgrind"
4e1be63c 862then
4e1be63c
JS
863 make_symlink () {
864 test -h "$2" &&
865 test "$1" = "$(readlink "$2")" || {
866 # be super paranoid
867 if mkdir "$2".lock
868 then
869 rm -f "$2" &&
870 ln -s "$1" "$2" &&
871 rm -r "$2".lock
872 else
873 while test -d "$2".lock
874 do
875 say "Waiting for lock on $2."
876 sleep 1
877 done
878 fi
879 }
880 }
881
882 make_valgrind_symlink () {
883 # handle only executables
884 test -x "$1" || return
885
886 base=$(basename "$1")
6cec5c68 887 symlink_target=$GIT_BUILD_DIR/$base
4e1be63c
JS
888 # do not override scripts
889 if test -x "$symlink_target" &&
890 test ! -d "$symlink_target" &&
891 test "#!" != "$(head -c 2 < "$symlink_target")"
892 then
893 symlink_target=../valgrind.sh
894 fi
efd92ffd
JS
895 case "$base" in
896 *.sh|*.perl)
897 symlink_target=../unprocessed-script
898 esac
4e1be63c
JS
899 # create the link, or replace it if it is out of date
900 make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
901 }
902
903 # override all git executables in TEST_DIRECTORY/..
904 GIT_VALGRIND=$TEST_DIRECTORY/valgrind
905 mkdir -p "$GIT_VALGRIND"/bin
6cec5c68 906 for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/test-*
4e1be63c
JS
907 do
908 make_valgrind_symlink $file
909 done
efd92ffd
JS
910 OLDIFS=$IFS
911 IFS=:
912 for path in $PATH
913 do
914 ls "$path"/git-* 2> /dev/null |
915 while read file
916 do
917 make_valgrind_symlink "$file"
918 done
919 done
920 IFS=$OLDIFS
4e1be63c
JS
921 PATH=$GIT_VALGRIND/bin:$PATH
922 GIT_EXEC_PATH=$GIT_VALGRIND/bin
923 export GIT_VALGRIND
e4597aae
MO
924elif test -n "$GIT_TEST_INSTALLED" ; then
925 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) ||
926 error "Cannot run git from $GIT_TEST_INSTALLED."
6cec5c68 927 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH
e4597aae
MO
928 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
929else # normal case, use ../bin-wrappers only unless $with_dashes:
6cec5c68 930 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers"
e4597aae
MO
931 if ! test -x "$git_bin_dir/git" ; then
932 if test -z "$with_dashes" ; then
933 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"
934 fi
935 with_dashes=t
936 fi
937 PATH="$git_bin_dir:$PATH"
6cec5c68 938 GIT_EXEC_PATH=$GIT_BUILD_DIR
e4597aae 939 if test -n "$with_dashes" ; then
6cec5c68 940 PATH="$GIT_BUILD_DIR:$PATH"
e4597aae 941 fi
4e1be63c 942fi
6cec5c68 943GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt
8bfa6bd6 944unset GIT_CONFIG
8bfa6bd6 945GIT_CONFIG_NOSYSTEM=1
3c995beb 946GIT_ATTR_NOSYSTEM=1
8f323c00 947export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM
49ccb087 948
aed604c7 949. "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS
ac10a857 950
5e87eae9
JH
951if test -z "$GIT_TEST_CMP"
952then
953 if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT"
954 then
955 GIT_TEST_CMP="$DIFF -c"
956 else
957 GIT_TEST_CMP="$DIFF -u"
958 fi
959fi
960
6cec5c68 961GITPERLLIB="$GIT_BUILD_DIR"/perl/blib/lib:"$GIT_BUILD_DIR"/perl/blib/arch/auto/Git
6fcca938 962export GITPERLLIB
6cec5c68 963test -d "$GIT_BUILD_DIR"/templates/blt || {
eea42069
JH
964 error "You haven't built things yet, have you?"
965}
e1970ce4 966
ac10a857 967if test -z "$GIT_TEST_INSTALLED" && test -z "$NO_PYTHON"
2fe40b63 968then
6cec5c68 969 GITPYTHONLIB="$GIT_BUILD_DIR/git_remote_helpers/build/lib"
2fe40b63 970 export GITPYTHONLIB
6cec5c68 971 test -d "$GIT_BUILD_DIR"/git_remote_helpers/build || {
2fe40b63
SR
972 error "You haven't built git_remote_helpers yet, have you?"
973 }
974fi
975
6cec5c68 976if ! test -x "$GIT_BUILD_DIR"/test-chmtime; then
56cf9806
EW
977 echo >&2 'You need to build test-chmtime:'
978 echo >&2 'Run "make test-chmtime" in the source (toplevel) directory'
979 exit 1
980fi
981
e1970ce4 982# Test repository
abc5d372 983test="trash directory.$(basename "$0" .sh)"
f423ef5f
JK
984test -n "$root" && test="$root/$test"
985case "$test" in
986/*) TRASH_DIRECTORY="$test" ;;
987 *) TRASH_DIRECTORY="$TEST_DIRECTORY/$test" ;;
988esac
91c8b825 989test ! -z "$debug" || remove_trash=$TRASH_DIRECTORY
8d14ac94 990rm -fr "$test" || {
6e7b5aaf 991 GIT_EXIT_OK=t
8d14ac94
JH
992 echo >&5 "FATAL: Cannot prepare test area"
993 exit 1
994}
995
4a7aaccd 996test_create_repo "$test"
1bd9c648
LW
997# Use -P to resolve symlinks in our working directory so that the cwd
998# in subprocesses like git equals our $PWD (for pathname comparisons).
999cd -P "$test" || exit 1
04ece593 1000
e4c62e64
MM
1001HOME=$(pwd)
1002export HOME
1003
d5d9de1b
JS
1004this_test=${0##*/}
1005this_test=${this_test%%-*}
04ece593
JH
1006for skp in $GIT_SKIP_TESTS
1007do
47e67d47
MG
1008 case "$this_test" in
1009 $skp)
55db1df0 1010 say_color skip >&3 "skipping test $this_test altogether"
637ab29b 1011 skip_all="skip all tests in $this_test"
04ece593
JH
1012 test_done
1013 esac
1014done
f17e9fbb 1015
8648732e
BC
1016# Provide an implementation of the 'yes' utility
1017yes () {
1018 if test $# = 0
1019 then
1020 y=y
1021 else
1022 y="$*"
1023 fi
1024
1025 while echo "$y"
1026 do
1027 :
1028 done
1029}
1030
f17e9fbb
JS
1031# Fix some commands on Windows
1032case $(uname -s) in
1033*MINGW*)
1034 # Windows has its own (incompatible) sort and find
1035 sort () {
1036 /usr/bin/sort "$@"
1037 }
1038 find () {
1039 /usr/bin/find "$@"
1040 }
5397ea31
JS
1041 sum () {
1042 md5sum "$@"
1043 }
4114156a
JS
1044 # git sees Windows-style pwd
1045 pwd () {
1046 builtin pwd -W
1047 }
ee9fb68c 1048 # no POSIX permissions
6fd1106a 1049 # backslashes in pathspec are converted to '/'
fb9a2bea 1050 # exec does not inherit the PID
a94114ad 1051 test_set_prereq MINGW
a31d0665
RJ
1052 test_set_prereq SED_STRIPS_CR
1053 ;;
1054*CYGWIN*)
1055 test_set_prereq POSIXPERM
a31d0665
RJ
1056 test_set_prereq EXECKEEPSPID
1057 test_set_prereq NOT_MINGW
1058 test_set_prereq SED_STRIPS_CR
ee9fb68c
JS
1059 ;;
1060*)
1061 test_set_prereq POSIXPERM
6fd1106a 1062 test_set_prereq BSLASHPSPEC
fb9a2bea 1063 test_set_prereq EXECKEEPSPID
3ba9ba8f 1064 test_set_prereq NOT_MINGW
f17e9fbb
JS
1065 ;;
1066esac
704a3143 1067
1b19ccd2 1068test -z "$NO_PERL" && test_set_prereq PERL
d4e1b47a 1069test -z "$NO_PYTHON" && test_set_prereq PYTHON
1b19ccd2 1070
bb946bba 1071# Can we rely on git's output in the C locale?
30955229
JN
1072if test -n "$GETTEXT_POISON"
1073then
1074 GIT_GETTEXT_POISON=YesPlease
1075 export GIT_GETTEXT_POISON
1076else
1077 test_set_prereq C_LOCALE_OUTPUT
1078fi
bb946bba 1079
704a3143
JS
1080# test whether the filesystem supports symbolic links
1081ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS
1082rm -f y
c91cfd19
ÆAB
1083
1084# When the tests are run as root, permission tests will report that
1085# things are writable when they shouldn't be.
1086test -w / || test_set_prereq SANITY