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