Move the user-facing test library to test-lib-functions.sh

This just moves all the user-facing functions to a separate file and sources that instead. Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Thomas Rast committed Feb 17, 2012 at 11:25 UTC 12a29b1a50d47594eb3a29003e3f1eb540580aaa
2 files changed +568 -549
t/test-lib-functions.sh new
+565
@@ -0,0 +1,565 @@
1 +#!/bin/sh
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 +# The semantics of the editor variables are that of invoking
19 +# sh -c "$EDITOR \"$@\"" files ...
20 +#
21 +# If our trash directory contains shell metacharacters, they will be
22 +# interpreted if we just set $EDITOR directly, so do a little dance with
23 +# environment variables to work around this.
24 +#
25 +# In particular, quoting isn't enough, as the path may contain the same quote
26 +# that we're using.
27 +test_set_editor () {
28 + FAKE_EDITOR="$1"
29 + export FAKE_EDITOR
30 + EDITOR='"$FAKE_EDITOR"'
31 + export EDITOR
32 +}
33 +
34 +test_decode_color () {
35 + awk '
36 + function name(n) {
37 + if (n == 0) return "RESET";
38 + if (n == 1) return "BOLD";
39 + if (n == 30) return "BLACK";
40 + if (n == 31) return "RED";
41 + if (n == 32) return "GREEN";
42 + if (n == 33) return "YELLOW";
43 + if (n == 34) return "BLUE";
44 + if (n == 35) return "MAGENTA";
45 + if (n == 36) return "CYAN";
46 + if (n == 37) return "WHITE";
47 + if (n == 40) return "BLACK";
48 + if (n == 41) return "BRED";
49 + if (n == 42) return "BGREEN";
50 + if (n == 43) return "BYELLOW";
51 + if (n == 44) return "BBLUE";
52 + if (n == 45) return "BMAGENTA";
53 + if (n == 46) return "BCYAN";
54 + if (n == 47) return "BWHITE";
55 + }
56 + {
57 + while (match($0, /\033\[[0-9;]*m/) != 0) {
58 + printf "%s<", substr($0, 1, RSTART-1);
59 + codes = substr($0, RSTART+2, RLENGTH-3);
60 + if (length(codes) == 0)
61 + printf "%s", name(0)
62 + else {
63 + n = split(codes, ary, ";");
64 + sep = "";
65 + for (i = 1; i <= n; i++) {
66 + printf "%s%s", sep, name(ary[i]);
67 + sep = ";"
68 + }
69 + }
70 + printf ">";
71 + $0 = substr($0, RSTART + RLENGTH, length($0) - RSTART - RLENGTH + 1);
72 + }
73 + print
74 + }
75 + '
76 +}
77 +
78 +nul_to_q () {
79 + perl -pe 'y/\000/Q/'
80 +}
81 +
82 +q_to_nul () {
83 + perl -pe 'y/Q/\000/'
84 +}
85 +
86 +q_to_cr () {
87 + tr Q '\015'
88 +}
89 +
90 +q_to_tab () {
91 + tr Q '\011'
92 +}
93 +
94 +append_cr () {
95 + sed -e 's/$/Q/' | tr Q '\015'
96 +}
97 +
98 +remove_cr () {
99 + tr '\015' Q | sed -e 's/Q$//'
100 +}
101 +
102 +# In some bourne shell implementations, the "unset" builtin returns
103 +# nonzero status when a variable to be unset was not set in the first
104 +# place.
105 +#
106 +# Use sane_unset when that should not be considered an error.
107 +
108 +sane_unset () {
109 + unset "$@"
110 + return 0
111 +}
112 +
113 +test_tick () {
114 + if test -z "${test_tick+set}"
115 + then
116 + test_tick=1112911993
117 + else
118 + test_tick=$(($test_tick + 60))
119 + fi
120 + GIT_COMMITTER_DATE="$test_tick -0700"
121 + GIT_AUTHOR_DATE="$test_tick -0700"
122 + export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
123 +}
124 +
125 +# Stop execution and start a shell. This is useful for debugging tests and
126 +# only makes sense together with "-v".
127 +#
128 +# Be sure to remove all invocations of this command before submitting.
129 +
130 +test_pause () {
131 + if test "$verbose" = t; then
132 + "$SHELL_PATH" <&6 >&3 2>&4
133 + else
134 + error >&5 "test_pause requires --verbose"
135 + fi
136 +}
137 +
138 +# Call test_commit with the arguments "<message> [<file> [<contents>]]"
139 +#
140 +# This will commit a file with the given contents and the given commit
141 +# message. It will also add a tag with <message> as name.
142 +#
143 +# Both <file> and <contents> default to <message>.
144 +
145 +test_commit () {
146 + file=${2:-"$1.t"}
147 + echo "${3-$1}" > "$file" &&
148 + git add "$file" &&
149 + test_tick &&
150 + git commit -m "$1" &&
151 + git tag "$1"
152 +}
153 +
154 +# Call test_merge with the arguments "<message> <commit>", where <commit>
155 +# can be a tag pointing to the commit-to-merge.
156 +
157 +test_merge () {
158 + test_tick &&
159 + git merge -m "$1" "$2" &&
160 + git tag "$1"
161 +}
162 +
163 +# This function helps systems where core.filemode=false is set.
164 +# Use it instead of plain 'chmod +x' to set or unset the executable bit
165 +# of a file in the working directory and add it to the index.
166 +
167 +test_chmod () {
168 + chmod "$@" &&
169 + git update-index --add "--chmod=$@"
170 +}
171 +
172 +# Unset a configuration variable, but don't fail if it doesn't exist.
173 +test_unconfig () {
174 + git config --unset-all "$@"
175 + config_status=$?
176 + case "$config_status" in
177 + 5) # ok, nothing to unset
178 + config_status=0
179 + ;;
180 + esac
181 + return $config_status
182 +}
183 +
184 +# Set git config, automatically unsetting it after the test is over.
185 +test_config () {
186 + test_when_finished "test_unconfig '$1'" &&
187 + git config "$@"
188 +}
189 +
190 +test_config_global () {
191 + test_when_finished "test_unconfig --global '$1'" &&
192 + git config --global "$@"
193 +}
194 +
195 +write_script () {
196 + {
197 + echo "#!${2-"$SHELL_PATH"}" &&
198 + cat
199 + } >"$1" &&
200 + chmod +x "$1"
201 +}
202 +
203 +# Use test_set_prereq to tell that a particular prerequisite is available.
204 +# The prerequisite can later be checked for in two ways:
205 +#
206 +# - Explicitly using test_have_prereq.
207 +#
208 +# - Implicitly by specifying the prerequisite tag in the calls to
209 +# test_expect_{success,failure,code}.
210 +#
211 +# The single parameter is the prerequisite tag (a simple word, in all
212 +# capital letters by convention).
213 +
214 +test_set_prereq () {
215 + satisfied="$satisfied$1 "
216 +}
217 +satisfied=" "
218 +
219 +test_have_prereq () {
220 + # prerequisites can be concatenated with ','
221 + save_IFS=$IFS
222 + IFS=,
223 + set -- $*
224 + IFS=$save_IFS
225 +
226 + total_prereq=0
227 + ok_prereq=0
228 + missing_prereq=
229 +
230 + for prerequisite
231 + do
232 + total_prereq=$(($total_prereq + 1))
233 + case $satisfied in
234 + *" $prerequisite "*)
235 + ok_prereq=$(($ok_prereq + 1))
236 + ;;
237 + *)
238 + # Keep a list of missing prerequisites
239 + if test -z "$missing_prereq"
240 + then
241 + missing_prereq=$prerequisite
242 + else
243 + missing_prereq="$prerequisite,$missing_prereq"
244 + fi
245 + esac
246 + done
247 +
248 + test $total_prereq = $ok_prereq
249 +}
250 +
251 +test_declared_prereq () {
252 + case ",$test_prereq," in
253 + *,$1,*)
254 + return 0
255 + ;;
256 + esac
257 + return 1
258 +}
259 +
260 +test_expect_failure () {
261 + test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
262 + test "$#" = 2 ||
263 + error "bug in the test script: not 2 or 3 parameters to test-expect-failure"
264 + export test_prereq
265 + if ! test_skip "$@"
266 + then
267 + say >&3 "checking known breakage: $2"
268 + if test_run_ "$2" expecting_failure
269 + then
270 + test_known_broken_ok_ "$1"
271 + else
272 + test_known_broken_failure_ "$1"
273 + fi
274 + fi
275 + echo >&3 ""
276 +}
277 +
278 +test_expect_success () {
279 + test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
280 + test "$#" = 2 ||
281 + error "bug in the test script: not 2 or 3 parameters to test-expect-success"
282 + export test_prereq
283 + if ! test_skip "$@"
284 + then
285 + say >&3 "expecting success: $2"
286 + if test_run_ "$2"
287 + then
288 + test_ok_ "$1"
289 + else
290 + test_failure_ "$@"
291 + fi
292 + fi
293 + echo >&3 ""
294 +}
295 +
296 +# test_external runs external test scripts that provide continuous
297 +# test output about their progress, and succeeds/fails on
298 +# zero/non-zero exit code. It outputs the test output on stdout even
299 +# in non-verbose mode, and announces the external script with "# run
300 +# <n>: ..." before running it. When providing relative paths, keep in
301 +# mind that all scripts run in "trash directory".
302 +# Usage: test_external description command arguments...
303 +# Example: test_external 'Perl API' perl ../path/to/test.pl
304 +test_external () {
305 + test "$#" = 4 && { test_prereq=$1; shift; } || test_prereq=
306 + test "$#" = 3 ||
307 + error >&5 "bug in the test script: not 3 or 4 parameters to test_external"
308 + descr="$1"
309 + shift
310 + export test_prereq
311 + if ! test_skip "$descr" "$@"
312 + then
313 + # Announce the script to reduce confusion about the
314 + # test output that follows.
315 + say_color "" "# run $test_count: $descr ($*)"
316 + # Export TEST_DIRECTORY, TRASH_DIRECTORY and GIT_TEST_LONG
317 + # to be able to use them in script
318 + export TEST_DIRECTORY TRASH_DIRECTORY GIT_TEST_LONG
319 + # Run command; redirect its stderr to &4 as in
320 + # test_run_, but keep its stdout on our stdout even in
321 + # non-verbose mode.
322 + "$@" 2>&4
323 + if [ "$?" = 0 ]
324 + then
325 + if test $test_external_has_tap -eq 0; then
326 + test_ok_ "$descr"
327 + else
328 + say_color "" "# test_external test $descr was ok"
329 + test_success=$(($test_success + 1))
330 + fi
331 + else
332 + if test $test_external_has_tap -eq 0; then
333 + test_failure_ "$descr" "$@"
334 + else
335 + say_color error "# test_external test $descr failed: $@"
336 + test_failure=$(($test_failure + 1))
337 + fi
338 + fi
339 + fi
340 +}
341 +
342 +# Like test_external, but in addition tests that the command generated
343 +# no output on stderr.
344 +test_external_without_stderr () {
345 + # The temporary file has no (and must have no) security
346 + # implications.
347 + tmp=${TMPDIR:-/tmp}
348 + stderr="$tmp/git-external-stderr.$$.tmp"
349 + test_external "$@" 4> "$stderr"
350 + [ -f "$stderr" ] || error "Internal error: $stderr disappeared."
351 + descr="no stderr: $1"
352 + shift
353 + say >&3 "# expecting no stderr from previous command"
354 + if [ ! -s "$stderr" ]; then
355 + rm "$stderr"
356 +
357 + if test $test_external_has_tap -eq 0; then
358 + test_ok_ "$descr"
359 + else
360 + say_color "" "# test_external_without_stderr test $descr was ok"
361 + test_success=$(($test_success + 1))
362 + fi
363 + else
364 + if [ "$verbose" = t ]; then
365 + output=`echo; echo "# Stderr is:"; cat "$stderr"`
366 + else
367 + output=
368 + fi
369 + # rm first in case test_failure exits.
370 + rm "$stderr"
371 + if test $test_external_has_tap -eq 0; then
372 + test_failure_ "$descr" "$@" "$output"
373 + else
374 + say_color error "# test_external_without_stderr test $descr failed: $@: $output"
375 + test_failure=$(($test_failure + 1))
376 + fi
377 + fi
378 +}
379 +
380 +# debugging-friendly alternatives to "test [-f|-d|-e]"
381 +# The commands test the existence or non-existence of $1. $2 can be
382 +# given to provide a more precise diagnosis.
383 +test_path_is_file () {
384 + if ! [ -f "$1" ]
385 + then
386 + echo "File $1 doesn't exist. $*"
387 + false
388 + fi
389 +}
390 +
391 +test_path_is_dir () {
392 + if ! [ -d "$1" ]
393 + then
394 + echo "Directory $1 doesn't exist. $*"
395 + false
396 + fi
397 +}
398 +
399 +test_path_is_missing () {
400 + if [ -e "$1" ]
401 + then
402 + echo "Path exists:"
403 + ls -ld "$1"
404 + if [ $# -ge 1 ]; then
405 + echo "$*"
406 + fi
407 + false
408 + fi
409 +}
410 +
411 +# test_line_count checks that a file has the number of lines it
412 +# ought to. For example:
413 +#
414 +# test_expect_success 'produce exactly one line of output' '
415 +# do something >output &&
416 +# test_line_count = 1 output
417 +# '
418 +#
419 +# is like "test $(wc -l <output) = 1" except that it passes the
420 +# output through when the number of lines is wrong.
421 +
422 +test_line_count () {
423 + if test $# != 3
424 + then
425 + error "bug in the test script: not 3 parameters to test_line_count"
426 + elif ! test $(wc -l <"$3") "$1" "$2"
427 + then
428 + echo "test_line_count: line count for $3 !$1 $2"
429 + cat "$3"
430 + return 1
431 + fi
432 +}
433 +
434 +# This is not among top-level (test_expect_success | test_expect_failure)
435 +# but is a prefix that can be used in the test script, like:
436 +#
437 +# test_expect_success 'complain and die' '
438 +# do something &&
439 +# do something else &&
440 +# test_must_fail git checkout ../outerspace
441 +# '
442 +#
443 +# Writing this as "! git checkout ../outerspace" is wrong, because
444 +# the failure could be due to a segv. We want a controlled failure.
445 +
446 +test_must_fail () {
447 + "$@"
448 + exit_code=$?
449 + if test $exit_code = 0; then
450 + echo >&2 "test_must_fail: command succeeded: $*"
451 + return 1
452 + elif test $exit_code -gt 129 -a $exit_code -le 192; then
453 + echo >&2 "test_must_fail: died by signal: $*"
454 + return 1
455 + elif test $exit_code = 127; then
456 + echo >&2 "test_must_fail: command not found: $*"
457 + return 1
458 + fi
459 + return 0
460 +}
461 +
462 +# Similar to test_must_fail, but tolerates success, too. This is
463 +# meant to be used in contexts like:
464 +#
465 +# test_expect_success 'some command works without configuration' '
466 +# test_might_fail git config --unset all.configuration &&
467 +# do something
468 +# '
469 +#
470 +# Writing "git config --unset all.configuration || :" would be wrong,
471 +# because we want to notice if it fails due to segv.
472 +
473 +test_might_fail () {
474 + "$@"
475 + exit_code=$?
476 + if test $exit_code -gt 129 -a $exit_code -le 192; then
477 + echo >&2 "test_might_fail: died by signal: $*"
478 + return 1
479 + elif test $exit_code = 127; then
480 + echo >&2 "test_might_fail: command not found: $*"
481 + return 1
482 + fi
483 + return 0
484 +}
485 +
486 +# Similar to test_must_fail and test_might_fail, but check that a
487 +# given command exited with a given exit code. Meant to be used as:
488 +#
489 +# test_expect_success 'Merge with d/f conflicts' '
490 +# test_expect_code 1 git merge "merge msg" B master
491 +# '
492 +
493 +test_expect_code () {
494 + want_code=$1
495 + shift
496 + "$@"
497 + exit_code=$?
498 + if test $exit_code = $want_code
499 + then
500 + return 0
501 + fi
502 +
503 + echo >&2 "test_expect_code: command exited with $exit_code, we wanted $want_code $*"
504 + return 1
505 +}
506 +
507 +# test_cmp is a helper function to compare actual and expected output.
508 +# You can use it like:
509 +#
510 +# test_expect_success 'foo works' '
511 +# echo expected >expected &&
512 +# foo >actual &&
513 +# test_cmp expected actual
514 +# '
515 +#
516 +# This could be written as either "cmp" or "diff -u", but:
517 +# - cmp's output is not nearly as easy to read as diff -u
518 +# - not all diff versions understand "-u"
519 +
520 +test_cmp() {
521 + $GIT_TEST_CMP "$@"
522 +}
523 +
524 +# This function can be used to schedule some commands to be run
525 +# unconditionally at the end of the test to restore sanity:
526 +#
527 +# test_expect_success 'test core.capslock' '
528 +# git config core.capslock true &&
529 +# test_when_finished "git config --unset core.capslock" &&
530 +# hello world
531 +# '
532 +#
533 +# That would be roughly equivalent to
534 +#
535 +# test_expect_success 'test core.capslock' '
536 +# git config core.capslock true &&
537 +# hello world
538 +# git config --unset core.capslock
539 +# '
540 +#
541 +# except that the greeting and config --unset must both succeed for
542 +# the test to pass.
543 +#
544 +# Note that under --immediate mode, no clean-up is done to help diagnose
545 +# what went wrong.
546 +
547 +test_when_finished () {
548 + test_cleanup="{ $*
549 + } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup"
550 +}
551 +
552 +# Most tests can use the created repository, but some may need to create more.
553 +# Usage: test_create_repo <directory>
554 +test_create_repo () {
555 + test "$#" = 1 ||
556 + error "bug in the test script: not 1 parameter to test-create-repo"
557 + repo="$1"
558 + mkdir -p "$repo"
559 + (
560 + cd "$repo" || error "Cannot setup test environment"
561 + "$GIT_EXEC_PATH/git-init" "--template=$GIT_BUILD_DIR/templates/blt/" >&3 2>&4 ||
562 + error "cannot run git init -- have you built things yet?"
563 + mv .git/hooks .git/hooks-disabled
564 + ) || exit
565 +}
t/test-lib.sh
+3 -549
@@ -223,248 +223,9 @@ die () {
223 GIT_EXIT_OK=
224 trap 'die' EXIT
225
226 -# The semantics of the editor variables are that of invoking
227 -# sh -c "$EDITOR \"$@\"" files ...
228 -#
229 -# If our trash directory contains shell metacharacters, they will be
230 -# interpreted if we just set $EDITOR directly, so do a little dance with
231 -# environment variables to work around this.
232 -#
233 -# In particular, quoting isn't enough, as the path may contain the same quote
234 -# that we're using.
235 -test_set_editor () {
236 - FAKE_EDITOR="$1"
237 - export FAKE_EDITOR
238 - EDITOR='"$FAKE_EDITOR"'
239 - export EDITOR
240 -}
241 -
242 -test_decode_color () {
243 - awk '
244 - function name(n) {
245 - if (n == 0) return "RESET";
246 - if (n == 1) return "BOLD";
247 - if (n == 30) return "BLACK";
248 - if (n == 31) return "RED";
249 - if (n == 32) return "GREEN";
250 - if (n == 33) return "YELLOW";
251 - if (n == 34) return "BLUE";
252 - if (n == 35) return "MAGENTA";
253 - if (n == 36) return "CYAN";
254 - if (n == 37) return "WHITE";
255 - if (n == 40) return "BLACK";
256 - if (n == 41) return "BRED";
257 - if (n == 42) return "BGREEN";
258 - if (n == 43) return "BYELLOW";
259 - if (n == 44) return "BBLUE";
260 - if (n == 45) return "BMAGENTA";
261 - if (n == 46) return "BCYAN";
262 - if (n == 47) return "BWHITE";
263 - }
264 - {
265 - while (match($0, /\033\[[0-9;]*m/) != 0) {
266 - printf "%s<", substr($0, 1, RSTART-1);
267 - codes = substr($0, RSTART+2, RLENGTH-3);
268 - if (length(codes) == 0)
269 - printf "%s", name(0)
270 - else {
271 - n = split(codes, ary, ";");
272 - sep = "";
273 - for (i = 1; i <= n; i++) {
274 - printf "%s%s", sep, name(ary[i]);
275 - sep = ";"
276 - }
277 - }
278 - printf ">";
279 - $0 = substr($0, RSTART + RLENGTH, length($0) - RSTART - RLENGTH + 1);
280 - }
281 - print
282 - }
283 - '
284 -}
285 -
286 -nul_to_q () {
287 - perl -pe 'y/\000/Q/'
288 -}
289 -
290 -q_to_nul () {
291 - perl -pe 'y/Q/\000/'
292 -}
293 -
294 -q_to_cr () {
295 - tr Q '\015'
296 -}
297 -
298 -q_to_tab () {
299 - tr Q '\011'
300 -}
301 -
302 -append_cr () {
303 - sed -e 's/$/Q/' | tr Q '\015'
304 -}
305 -
306 -remove_cr () {
307 - tr '\015' Q | sed -e 's/Q$//'
308 -}
309 -
310 -# In some bourne shell implementations, the "unset" builtin returns
311 -# nonzero status when a variable to be unset was not set in the first
312 -# place.
313 -#
314 -# Use sane_unset when that should not be considered an error.
315 -
316 -sane_unset () {
317 - unset "$@"
318 - return 0
319 -}
320 -
321 -test_tick () {
322 - if test -z "${test_tick+set}"
323 - then
324 - test_tick=1112911993
325 - else
326 - test_tick=$(($test_tick + 60))
327 - fi
328 - GIT_COMMITTER_DATE="$test_tick -0700"
329 - GIT_AUTHOR_DATE="$test_tick -0700"
330 - export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
331 -}
332 -
333 -# Stop execution and start a shell. This is useful for debugging tests and
334 -# only makes sense together with "-v".
335 -#
336 -# Be sure to remove all invocations of this command before submitting.
337 -
338 -test_pause () {
339 - if test "$verbose" = t; then
340 - "$SHELL_PATH" <&6 >&3 2>&4
341 - else
342 - error >&5 "test_pause requires --verbose"
343 - fi
344 -}
345 -
346 -# Call test_commit with the arguments "<message> [<file> [<contents>]]"
347 -#
348 -# This will commit a file with the given contents and the given commit
349 -# message. It will also add a tag with <message> as name.
350 -#
351 -# Both <file> and <contents> default to <message>.
352 -
353 -test_commit () {
354 - file=${2:-"$1.t"}
355 - echo "${3-$1}" > "$file" &&
356 - git add "$file" &&
357 - test_tick &&
358 - git commit -m "$1" &&
359 - git tag "$1"
360 -}
361 -
362 -# Call test_merge with the arguments "<message> <commit>", where <commit>
363 -# can be a tag pointing to the commit-to-merge.
364 -
365 -test_merge () {
366 - test_tick &&
367 - git merge -m "$1" "$2" &&
368 - git tag "$1"
369 -}
370 -
371 -# This function helps systems where core.filemode=false is set.
372 -# Use it instead of plain 'chmod +x' to set or unset the executable bit
373 -# of a file in the working directory and add it to the index.
374 -
375 -test_chmod () {
376 - chmod "$@" &&
377 - git update-index --add "--chmod=$@"
378 -}
379 -
380 -# Unset a configuration variable, but don't fail if it doesn't exist.
381 -test_unconfig () {
382 - git config --unset-all "$@"
383 - config_status=$?
384 - case "$config_status" in
385 - 5) # ok, nothing to unset
386 - config_status=0
387 - ;;
388 - esac
389 - return $config_status
390 -}
391 -
392 -# Set git config, automatically unsetting it after the test is over.
393 -test_config () {
394 - test_when_finished "test_unconfig '$1'" &&
395 - git config "$@"
396 -}
397 -
398 -
399 -test_config_global () {
400 - test_when_finished "test_unconfig --global '$1'" &&
401 - git config --global "$@"
402 -}
403 -
404 -write_script () {
405 - {
406 - echo "#!${2-"$SHELL_PATH"}" &&
407 - cat
408 - } >"$1" &&
409 - chmod +x "$1"
410 -}
411 -
412 -# Use test_set_prereq to tell that a particular prerequisite is available.
413 -# The prerequisite can later be checked for in two ways:
414 -#
415 -# - Explicitly using test_have_prereq.
416 -#
417 -# - Implicitly by specifying the prerequisite tag in the calls to
418 -# test_expect_{success,failure,code}.
419 -#
420 -# The single parameter is the prerequisite tag (a simple word, in all
421 -# capital letters by convention).
422 -
423 -test_set_prereq () {
424 - satisfied="$satisfied$1 "
425 -}
426 -satisfied=" "
427 -
428 -test_have_prereq () {
429 - # prerequisites can be concatenated with ','
430 - save_IFS=$IFS
431 - IFS=,
432 - set -- $*
433 - IFS=$save_IFS
434 -
435 - total_prereq=0
436 - ok_prereq=0
437 - missing_prereq=
438 -
439 - for prerequisite
440 - do
441 - total_prereq=$(($total_prereq + 1))
442 - case $satisfied in
443 - *" $prerequisite "*)
444 - ok_prereq=$(($ok_prereq + 1))
445 - ;;
446 - *)
447 - # Keep a list of missing prerequisites
448 - if test -z "$missing_prereq"
449 - then
450 - missing_prereq=$prerequisite
451 - else
452 - missing_prereq="$prerequisite,$missing_prereq"
453 - fi
454 - esac
455 - done
456 -
457 - test $total_prereq = $ok_prereq
458 -}
459 -
460 -test_declared_prereq () {
461 - case ",$test_prereq," in
462 - *,$1,*)
463 - return 0
464 - ;;
465 - esac
466 - return 1
467 -}
226 +# The user-facing functions are loaded from a separate file so that
227 +# test_perf subshells can have them too
228 +. "${TEST_DIRECTORY:-.}"/test-lib-functions.sh
229
230 # You are not expected to call test_ok_ and test_failure_ directly, use
231 # the text_expect_* functions instead.
@@ -552,313 +313,6 @@ test_skip () {
313 esac
314 }
315
555 -test_expect_failure () {
556 - test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
557 - test "$#" = 2 ||
558 - error "bug in the test script: not 2 or 3 parameters to test-expect-failure"
559 - export test_prereq
560 - if ! test_skip "$@"
561 - then
562 - say >&3 "checking known breakage: $2"
563 - if test_run_ "$2" expecting_failure
564 - then
565 - test_known_broken_ok_ "$1"
566 - else
567 - test_known_broken_failure_ "$1"
568 - fi
569 - fi
570 - echo >&3 ""
571 -}
572 -
573 -test_expect_success () {
574 - test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
575 - test "$#" = 2 ||
576 - error "bug in the test script: not 2 or 3 parameters to test-expect-success"
577 - export test_prereq
578 - if ! test_skip "$@"
579 - then
580 - say >&3 "expecting success: $2"
581 - if test_run_ "$2"
582 - then
583 - test_ok_ "$1"
584 - else
585 - test_failure_ "$@"
586 - fi
587 - fi
588 - echo >&3 ""
589 -}
590 -
591 -# test_external runs external test scripts that provide continuous
592 -# test output about their progress, and succeeds/fails on
593 -# zero/non-zero exit code. It outputs the test output on stdout even
594 -# in non-verbose mode, and announces the external script with "# run
595 -# <n>: ..." before running it. When providing relative paths, keep in
596 -# mind that all scripts run in "trash directory".
597 -# Usage: test_external description command arguments...
598 -# Example: test_external 'Perl API' perl ../path/to/test.pl
599 -test_external () {
600 - test "$#" = 4 && { test_prereq=$1; shift; } || test_prereq=
601 - test "$#" = 3 ||
602 - error >&5 "bug in the test script: not 3 or 4 parameters to test_external"
603 - descr="$1"
604 - shift
605 - export test_prereq
606 - if ! test_skip "$descr" "$@"
607 - then
608 - # Announce the script to reduce confusion about the
609 - # test output that follows.
610 - say_color "" "# run $test_count: $descr ($*)"
611 - # Export TEST_DIRECTORY, TRASH_DIRECTORY and GIT_TEST_LONG
612 - # to be able to use them in script
613 - export TEST_DIRECTORY TRASH_DIRECTORY GIT_TEST_LONG
614 - # Run command; redirect its stderr to &4 as in
615 - # test_run_, but keep its stdout on our stdout even in
616 - # non-verbose mode.
617 - "$@" 2>&4
618 - if [ "$?" = 0 ]
619 - then
620 - if test $test_external_has_tap -eq 0; then
621 - test_ok_ "$descr"
622 - else
623 - say_color "" "# test_external test $descr was ok"
624 - test_success=$(($test_success + 1))
625 - fi
626 - else
627 - if test $test_external_has_tap -eq 0; then
628 - test_failure_ "$descr" "$@"
629 - else
630 - say_color error "# test_external test $descr failed: $@"
631 - test_failure=$(($test_failure + 1))
632 - fi
633 - fi
634 - fi
635 -}
636 -
637 -# Like test_external, but in addition tests that the command generated
638 -# no output on stderr.
639 -test_external_without_stderr () {
640 - # The temporary file has no (and must have no) security
641 - # implications.
642 - tmp=${TMPDIR:-/tmp}
643 - stderr="$tmp/git-external-stderr.$$.tmp"
644 - test_external "$@" 4> "$stderr"
645 - [ -f "$stderr" ] || error "Internal error: $stderr disappeared."
646 - descr="no stderr: $1"
647 - shift
648 - say >&3 "# expecting no stderr from previous command"
649 - if [ ! -s "$stderr" ]; then
650 - rm "$stderr"
651 -
652 - if test $test_external_has_tap -eq 0; then
653 - test_ok_ "$descr"
654 - else
655 - say_color "" "# test_external_without_stderr test $descr was ok"
656 - test_success=$(($test_success + 1))
657 - fi
658 - else
659 - if [ "$verbose" = t ]; then
660 - output=`echo; echo "# Stderr is:"; cat "$stderr"`
661 - else
662 - output=
663 - fi
664 - # rm first in case test_failure exits.
665 - rm "$stderr"
666 - if test $test_external_has_tap -eq 0; then
667 - test_failure_ "$descr" "$@" "$output"
668 - else
669 - say_color error "# test_external_without_stderr test $descr failed: $@: $output"
670 - test_failure=$(($test_failure + 1))
671 - fi
672 - fi
673 -}
674 -
675 -# debugging-friendly alternatives to "test [-f|-d|-e]"
676 -# The commands test the existence or non-existence of $1. $2 can be
677 -# given to provide a more precise diagnosis.
678 -test_path_is_file () {
679 - if ! [ -f "$1" ]
680 - then
681 - echo "File $1 doesn't exist. $*"
682 - false
683 - fi
684 -}
685 -
686 -test_path_is_dir () {
687 - if ! [ -d "$1" ]
688 - then
689 - echo "Directory $1 doesn't exist. $*"
690 - false
691 - fi
692 -}
693 -
694 -test_path_is_missing () {
695 - if [ -e "$1" ]
696 - then
697 - echo "Path exists:"
698 - ls -ld "$1"
699 - if [ $# -ge 1 ]; then
700 - echo "$*"
701 - fi
702 - false
703 - fi
704 -}
705 -
706 -# test_line_count checks that a file has the number of lines it
707 -# ought to. For example:
708 -#
709 -# test_expect_success 'produce exactly one line of output' '
710 -# do something >output &&
711 -# test_line_count = 1 output
712 -# '
713 -#
714 -# is like "test $(wc -l <output) = 1" except that it passes the
715 -# output through when the number of lines is wrong.
716 -
717 -test_line_count () {
718 - if test $# != 3
719 - then
720 - error "bug in the test script: not 3 parameters to test_line_count"
721 - elif ! test $(wc -l <"$3") "$1" "$2"
722 - then
723 - echo "test_line_count: line count for $3 !$1 $2"
724 - cat "$3"
725 - return 1
726 - fi
727 -}
728 -
729 -# This is not among top-level (test_expect_success | test_expect_failure)
730 -# but is a prefix that can be used in the test script, like:
731 -#
732 -# test_expect_success 'complain and die' '
733 -# do something &&
734 -# do something else &&
735 -# test_must_fail git checkout ../outerspace
736 -# '
737 -#
738 -# Writing this as "! git checkout ../outerspace" is wrong, because
739 -# the failure could be due to a segv. We want a controlled failure.
740 -
741 -test_must_fail () {
742 - "$@"
743 - exit_code=$?
744 - if test $exit_code = 0; then
745 - echo >&2 "test_must_fail: command succeeded: $*"
746 - return 1
747 - elif test $exit_code -gt 129 -a $exit_code -le 192; then
748 - echo >&2 "test_must_fail: died by signal: $*"
749 - return 1
750 - elif test $exit_code = 127; then
751 - echo >&2 "test_must_fail: command not found: $*"
752 - return 1
753 - fi
754 - return 0
755 -}
756 -
757 -# Similar to test_must_fail, but tolerates success, too. This is
758 -# meant to be used in contexts like:
759 -#
760 -# test_expect_success 'some command works without configuration' '
761 -# test_might_fail git config --unset all.configuration &&
762 -# do something
763 -# '
764 -#
765 -# Writing "git config --unset all.configuration || :" would be wrong,
766 -# because we want to notice if it fails due to segv.
767 -
768 -test_might_fail () {
769 - "$@"
770 - exit_code=$?
771 - if test $exit_code -gt 129 -a $exit_code -le 192; then
772 - echo >&2 "test_might_fail: died by signal: $*"
773 - return 1
774 - elif test $exit_code = 127; then
775 - echo >&2 "test_might_fail: command not found: $*"
776 - return 1
777 - fi
778 - return 0
779 -}
780 -
781 -# Similar to test_must_fail and test_might_fail, but check that a
782 -# given command exited with a given exit code. Meant to be used as:
783 -#
784 -# test_expect_success 'Merge with d/f conflicts' '
785 -# test_expect_code 1 git merge "merge msg" B master
786 -# '
787 -
788 -test_expect_code () {
789 - want_code=$1
790 - shift
791 - "$@"
792 - exit_code=$?
793 - if test $exit_code = $want_code
794 - then
795 - return 0
796 - fi
797 -
798 - echo >&2 "test_expect_code: command exited with $exit_code, we wanted $want_code $*"
799 - return 1
800 -}
801 -
802 -# test_cmp is a helper function to compare actual and expected output.
803 -# You can use it like:
804 -#
805 -# test_expect_success 'foo works' '
806 -# echo expected >expected &&
807 -# foo >actual &&
808 -# test_cmp expected actual
809 -# '
810 -#
811 -# This could be written as either "cmp" or "diff -u", but:
812 -# - cmp's output is not nearly as easy to read as diff -u
813 -# - not all diff versions understand "-u"
814 -
815 -test_cmp() {
816 - $GIT_TEST_CMP "$@"
817 -}
818 -
819 -# This function can be used to schedule some commands to be run
820 -# unconditionally at the end of the test to restore sanity:
821 -#
822 -# test_expect_success 'test core.capslock' '
823 -# git config core.capslock true &&
824 -# test_when_finished "git config --unset core.capslock" &&
825 -# hello world
826 -# '
827 -#
828 -# That would be roughly equivalent to
829 -#
830 -# test_expect_success 'test core.capslock' '
831 -# git config core.capslock true &&
832 -# hello world
833 -# git config --unset core.capslock
834 -# '
835 -#
836 -# except that the greeting and config --unset must both succeed for
837 -# the test to pass.
838 -#
839 -# Note that under --immediate mode, no clean-up is done to help diagnose
840 -# what went wrong.
841 -
842 -test_when_finished () {
843 - test_cleanup="{ $*
844 - } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup"
845 -}
846 -
847 -# Most tests can use the created repository, but some may need to create more.
848 -# Usage: test_create_repo <directory>
849 -test_create_repo () {
850 - test "$#" = 1 ||
851 - error "bug in the test script: not 1 parameter to test-create-repo"
852 - repo="$1"
853 - mkdir -p "$repo"
854 - (
855 - cd "$repo" || error "Cannot setup test environment"
856 - "$GIT_EXEC_PATH/git-init" "--template=$GIT_BUILD_DIR/templates/blt/" >&3 2>&4 ||
857 - error "cannot run git init -- have you built things yet?"
858 - mv .git/hooks .git/hooks-disabled
859 - ) || exit
860 -}
861 -
316 test_done () {
317 GIT_EXIT_OK=t
318