rpatch 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/t/test-lib.sh ADDED
@@ -0,0 +1,623 @@
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
+ # Keep the original TERM for say_color
19
+ ORIGINAL_TERM=$TERM
20
+
21
+ # Test the binaries we have just built. The tests are kept in
22
+ # t/ subdirectory and are run in 'trash directory' subdirectory.
23
+ if test -z "$TEST_DIRECTORY"
24
+ then
25
+ # We allow tests to override this, in case they want to run tests
26
+ # outside of t/, e.g. for running tests on the test library
27
+ # itself.
28
+ TEST_DIRECTORY=$(pwd)
29
+ fi
30
+ if test -z "$TEST_OUTPUT_DIRECTORY"
31
+ then
32
+ # Similarly, override this to store the test-results subdir
33
+ # elsewhere
34
+ TEST_OUTPUT_DIRECTORY=$TEST_DIRECTORY
35
+ fi
36
+
37
+ ################################################################
38
+ # It appears that people try to run tests without building...
39
+ "rpatch" -h >/dev/null
40
+ if test $? != 0
41
+ then
42
+ echo >&2 'error: can not find rpatch for test.'
43
+ exit 1
44
+ fi
45
+
46
+ SHELL_PATH="/bin/sh"
47
+ RUBY_PATH="$(which ruby)"
48
+ DIFF='diff'
49
+ export RUBY_PATH SHELL_PATH
50
+
51
+ # if --tee was passed, write the output not only to the terminal, but
52
+ # additionally to the file test-results/$BASENAME.out, too.
53
+ case "$GIT_TEST_TEE_STARTED, $* " in
54
+ done,*)
55
+ # do not redirect again
56
+ ;;
57
+ *' --tee '*|*' --va'*)
58
+ mkdir -p "$TEST_OUTPUT_DIRECTORY/test-results"
59
+ BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)"
60
+ (GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1;
61
+ echo $? > $BASE.exit) | tee $BASE.out
62
+ test "$(cat $BASE.exit)" = 0
63
+ exit
64
+ ;;
65
+ esac
66
+
67
+ # For repeatability, reset the environment to known value.
68
+ #LANG=C
69
+ #LC_ALL=C
70
+ PAGER=cat
71
+ TZ=UTC
72
+ TERM=dumb
73
+ export LANG LC_ALL PAGER TERM TZ
74
+
75
+ # Add libc MALLOC and MALLOC_PERTURB test
76
+ # only if we are not executing the test with valgrind
77
+ if test -n "$TEST_NO_MALLOC_CHECK"
78
+ then
79
+ setup_malloc_check () {
80
+ : nothing
81
+ }
82
+ teardown_malloc_check () {
83
+ : nothing
84
+ }
85
+ else
86
+ setup_malloc_check () {
87
+ MALLOC_CHECK_=3 MALLOC_PERTURB_=165
88
+ export MALLOC_CHECK_ MALLOC_PERTURB_
89
+ }
90
+ teardown_malloc_check () {
91
+ unset MALLOC_CHECK_ MALLOC_PERTURB_
92
+ }
93
+ fi
94
+
95
+ # Protect ourselves from common misconfiguration to export
96
+ # CDPATH into the environment
97
+ unset CDPATH
98
+
99
+ unset GREP_OPTIONS
100
+ unset UNZIP
101
+
102
+ # Convenience
103
+ #
104
+ # A regexp to match 5 and 40 hexdigits
105
+ _x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
106
+ _x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
107
+
108
+ # Zero SHA-1
109
+ _z40=0000000000000000000000000000000000000000
110
+
111
+ # Line feed
112
+ LF='
113
+ '
114
+
115
+ export _x05 _x40 _z40 LF
116
+
117
+ # Each test should start with something like this, after copyright notices:
118
+ #
119
+ # test_description='Description of this test...
120
+ # This test checks if command xyzzy does the right thing...
121
+ # '
122
+ # . ./test-lib.sh
123
+ [ "x$ORIGINAL_TERM" != "xdumb" ] && (
124
+ TERM=$ORIGINAL_TERM &&
125
+ export TERM &&
126
+ [ -t 1 ] &&
127
+ tput bold >/dev/null 2>&1 &&
128
+ tput setaf 1 >/dev/null 2>&1 &&
129
+ tput sgr0 >/dev/null 2>&1
130
+ ) &&
131
+ color=t
132
+
133
+ while test "$#" -ne 0
134
+ do
135
+ case "$1" in
136
+ -d|--d|--de|--deb|--debu|--debug)
137
+ debug=t; shift ;;
138
+ -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
139
+ immediate=t; shift ;;
140
+ -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
141
+ GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;;
142
+ -h|--h|--he|--hel|--help)
143
+ help=t; shift ;;
144
+ -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
145
+ verbose=t; shift ;;
146
+ --verbose-only=*)
147
+ verbose_only=$(expr "z$1" : 'z[^=]*=\(.*\)')
148
+ shift ;;
149
+ -q|--q|--qu|--qui|--quie|--quiet)
150
+ # Ignore --quiet under a TAP::Harness. Saying how many tests
151
+ # passed without the ok/not ok details is always an error.
152
+ test -z "$HARNESS_ACTIVE" && quiet=t; shift ;;
153
+ --no-color)
154
+ color=; shift ;;
155
+ --tee)
156
+ shift ;; # was handled already
157
+ --root=*)
158
+ root=$(expr "z$1" : 'z[^=]*=\(.*\)')
159
+ shift ;;
160
+ --statusprefix=*)
161
+ statusprefix=$(expr "z$1" : 'z[^=]*=\(.*\)')
162
+ shift ;;
163
+ *)
164
+ echo "error: unknown test option '$1'" >&2; exit 1 ;;
165
+ esac
166
+ done
167
+
168
+ if test -n "$color"
169
+ then
170
+ say_color () {
171
+ (
172
+ TERM=$ORIGINAL_TERM
173
+ export TERM
174
+ case "$1" in
175
+ error)
176
+ tput bold; tput setaf 1;; # bold red
177
+ skip)
178
+ tput setaf 4;; # blue
179
+ warn)
180
+ tput setaf 3;; # brown/yellow
181
+ pass)
182
+ tput setaf 2;; # green
183
+ info)
184
+ tput setaf 6;; # cyan
185
+ *)
186
+ test -n "$quiet" && return;;
187
+ esac
188
+ shift
189
+ printf "%s" "$*"
190
+ tput sgr0
191
+ echo
192
+ )
193
+ }
194
+ else
195
+ say_color() {
196
+ test -z "$1" && test -n "$quiet" && return
197
+ shift
198
+ printf "%s\n" "$*"
199
+ }
200
+ fi
201
+
202
+ error () {
203
+ say_color error "error: $*"
204
+ GIT_EXIT_OK=t
205
+ exit 1
206
+ }
207
+
208
+ say () {
209
+ say_color info "$*"
210
+ }
211
+
212
+ ## TODO: ##test "${test_description}" != "" ||
213
+ ## TODO: ##error "Test script did not set test_description."
214
+
215
+ if test "$help" = "t"
216
+ then
217
+ echo "$test_description"
218
+ exit 0
219
+ fi
220
+
221
+ exec 5>&1
222
+ exec 6<&0
223
+ if test "$verbose" = "t"
224
+ then
225
+ exec 4>&2 3>&1
226
+ else
227
+ exec 4>/dev/null 3>/dev/null
228
+ fi
229
+
230
+ test_failure=0
231
+ test_count=0
232
+ test_fixed=0
233
+ test_broken=0
234
+ test_success=0
235
+
236
+ test_external_has_tap=0
237
+
238
+ die () {
239
+ code=$?
240
+ if test -n "$GIT_EXIT_OK"
241
+ then
242
+ exit $code
243
+ else
244
+ echo >&5 "FATAL: Unexpected exit with code $code"
245
+ exit 1
246
+ fi
247
+ }
248
+
249
+ GIT_EXIT_OK=
250
+ trap 'die' EXIT
251
+
252
+ # The user-facing functions are loaded from a separate file so that
253
+ # test_perf subshells can have them too
254
+ . "$TEST_DIRECTORY/test-lib-functions.sh"
255
+
256
+ # You are not expected to call test_ok_ and test_failure_ directly, use
257
+ # the text_expect_* functions instead.
258
+
259
+ test_ok_ () {
260
+ test_success=$(($test_success + 1))
261
+ say_color "" "${statusprefix}ok $test_count - $@"
262
+ }
263
+
264
+ test_failure_ () {
265
+ test_failure=$(($test_failure + 1))
266
+ say_color error "${statusprefix}not ok $test_count - $1"
267
+ shift
268
+ echo "$@" | sed -e 's/^/# /'
269
+ test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
270
+ }
271
+
272
+ test_known_broken_ok_ () {
273
+ test_fixed=$(($test_fixed+1))
274
+ say_color error "${statusprefix}ok $test_count - $@ # TODO known breakage vanished"
275
+ }
276
+
277
+ test_known_broken_failure_ () {
278
+ test_broken=$(($test_broken+1))
279
+ say_color warn "${statusprefix}not ok $test_count - $@ # TODO known breakage"
280
+ }
281
+
282
+ test_debug () {
283
+ test "$debug" = "" || eval "$1"
284
+ }
285
+
286
+ match_pattern_list () {
287
+ arg="$1"
288
+ shift
289
+ test -z "$*" && return 1
290
+ for pattern_
291
+ do
292
+ case "$arg" in
293
+ $pattern_)
294
+ return 0
295
+ esac
296
+ done
297
+ return 1
298
+ }
299
+
300
+ maybe_teardown_verbose () {
301
+ test -z "$verbose_only" && return
302
+ exec 4>/dev/null 3>/dev/null
303
+ verbose=
304
+ }
305
+
306
+ last_verbose=t
307
+ maybe_setup_verbose () {
308
+ test -z "$verbose_only" && return
309
+ if match_pattern_list $test_count $verbose_only
310
+ then
311
+ exec 4>&2 3>&1
312
+ # Emit a delimiting blank line when going from
313
+ # non-verbose to verbose. Within verbose mode the
314
+ # delimiter is printed by test_expect_*. The choice
315
+ # of the initial $last_verbose is such that before
316
+ # test 1, we do not print it.
317
+ test -z "$last_verbose" && echo >&3 ""
318
+ verbose=t
319
+ else
320
+ exec 4>/dev/null 3>/dev/null
321
+ verbose=
322
+ fi
323
+ last_verbose=$verbose
324
+ }
325
+
326
+ test_eval_ () {
327
+ # This is a separate function because some tests use
328
+ # "return" to end a test_expect_success block early.
329
+ eval </dev/null >&3 2>&4 "$*"
330
+ }
331
+
332
+ test_run_ () {
333
+ test_cleanup=:
334
+ expecting_failure=$2
335
+ setup_malloc_check
336
+ test_eval_ "$1"
337
+ eval_ret=$?
338
+ teardown_malloc_check
339
+
340
+ if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"
341
+ then
342
+ setup_malloc_check
343
+ test_eval_ "$test_cleanup"
344
+ teardown_malloc_check
345
+ fi
346
+ if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"
347
+ then
348
+ echo ""
349
+ fi
350
+ return "$eval_ret"
351
+ }
352
+
353
+ test_start_ () {
354
+ test_count=$(($test_count+1))
355
+ maybe_setup_verbose
356
+ }
357
+
358
+ test_finish_ () {
359
+ echo >&3 ""
360
+ maybe_teardown_verbose
361
+ }
362
+
363
+ test_skip () {
364
+ to_skip=
365
+ if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS
366
+ then
367
+ to_skip=t
368
+ fi
369
+ if test -z "$to_skip" && test -n "$test_prereq" &&
370
+ ! test_have_prereq "$test_prereq"
371
+ then
372
+ to_skip=t
373
+ fi
374
+ case "$to_skip" in
375
+ t)
376
+ of_prereq=
377
+ if test "$missing_prereq" != "$test_prereq"
378
+ then
379
+ of_prereq=" of $test_prereq"
380
+ fi
381
+
382
+ say_color skip >&3 "${statusprefix}skipping test: $@"
383
+ say_color skip "${statusprefix}ok $test_count # skip $1 (missing $missing_prereq${of_prereq})"
384
+ : true
385
+ ;;
386
+ *)
387
+ false
388
+ ;;
389
+ esac
390
+ }
391
+
392
+ # stub; perf-lib overrides it
393
+ test_at_end_hook_ () {
394
+ :
395
+ }
396
+
397
+ test_done () {
398
+ GIT_EXIT_OK=t
399
+
400
+ # Note: t0000 relies on $HARNESS_ACTIVE disabling the .counts
401
+ # output file
402
+ if test -z "$HARNESS_ACTIVE"
403
+ then
404
+ test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results"
405
+ mkdir -p "$test_results_dir"
406
+ base=${0##*/}
407
+ test_results_path="$test_results_dir/${base%.sh}-$$.counts"
408
+
409
+ cat >>"$test_results_path" <<-EOF
410
+ total $test_count
411
+ success $test_success
412
+ fixed $test_fixed
413
+ broken $test_broken
414
+ failed $test_failure
415
+
416
+ EOF
417
+ fi
418
+
419
+ if test "$test_fixed" != 0
420
+ then
421
+ say_color error "${statusprefix}# $test_fixed known breakage(s) vanished; please update test(s)"
422
+ fi
423
+ if test "$test_broken" != 0
424
+ then
425
+ say_color warn "${statusprefix}# still have $test_broken known breakage(s)"
426
+ fi
427
+ if test "$test_broken" != 0 || test "$test_fixed" != 0
428
+ then
429
+ test_remaining=$(( $test_count - $test_broken - $test_fixed ))
430
+ msg="remaining $test_remaining test(s)"
431
+ else
432
+ test_remaining=$test_count
433
+ msg="$test_count test(s)"
434
+ fi
435
+ case "$test_failure" in
436
+ 0)
437
+ # Maybe print SKIP message
438
+ if test -n "$skip_all" && test $test_count -gt 0
439
+ then
440
+ error "Can't use skip_all after running some tests"
441
+ fi
442
+ [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all"
443
+
444
+ if test $test_external_has_tap -eq 0
445
+ then
446
+ if test $test_remaining -gt 0
447
+ then
448
+ say_color pass "${statusprefix}# passed all $msg"
449
+ fi
450
+ say "${statusprefix}1..$test_count$skip_all"
451
+ fi
452
+
453
+ test -d "$remove_trash" &&
454
+ cd "$(dirname "$remove_trash")" &&
455
+ rm -rf "$(basename "$remove_trash")"
456
+
457
+ test_at_end_hook_
458
+
459
+ exit 0 ;;
460
+
461
+ *)
462
+ if test $test_external_has_tap -eq 0
463
+ then
464
+ say_color error "${statusprefix}# failed $test_failure among $msg"
465
+ say "${statusprefix}1..$test_count"
466
+ fi
467
+
468
+ exit 1 ;;
469
+
470
+ esac
471
+ }
472
+
473
+
474
+ # Set up a directory that we can put in PATH which redirects all gistore
475
+ # calls.
476
+ if test -n "$GIT_TEST_INSTALLED"
477
+ then
478
+ PATH=$GIT_TEST_INSTALLED:$PATH
479
+ else
480
+ PATH="$PATH"
481
+ fi
482
+ export PATH
483
+
484
+ # GIT_TEST_CMP is used in function test_cmp
485
+ if test -z "$GIT_TEST_CMP"
486
+ then
487
+ if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT"
488
+ then
489
+ GIT_TEST_CMP="$DIFF -c"
490
+ else
491
+ GIT_TEST_CMP="$DIFF -u"
492
+ fi
493
+ fi
494
+
495
+ # Test repository
496
+ TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)"
497
+ test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"
498
+ case "$TRASH_DIRECTORY" in
499
+ /*) ;; # absolute path is good
500
+ *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;;
501
+ esac
502
+ test ! -z "$debug" || remove_trash=$TRASH_DIRECTORY
503
+ rm -fr "$TRASH_DIRECTORY" || {
504
+ GIT_EXIT_OK=t
505
+ echo >&5 "FATAL: Cannot prepare test area"
506
+ exit 1
507
+ }
508
+
509
+ HOME="$TRASH_DIRECTORY"
510
+ export HOME
511
+ mkdir -p "$TRASH_DIRECTORY"
512
+
513
+ # Use -P to resolve symlinks in our working directory so that the cwd
514
+ # in subprocesses like git equals our $PWD (for pathname comparisons).
515
+ cd -P "$TRASH_DIRECTORY" || exit 1
516
+
517
+ this_test=${0##*/}
518
+ this_test=${this_test%%-*}
519
+ if match_pattern_list "$this_test" $GIT_SKIP_TESTS
520
+ then
521
+ say_color info >&3 "skipping test $this_test altogether"
522
+ skip_all="skip all tests in $this_test"
523
+ test_done
524
+ fi
525
+
526
+ # Provide an implementation of the 'yes' utility
527
+ yes () {
528
+ if test $# = 0
529
+ then
530
+ y=y
531
+ else
532
+ y="$*"
533
+ fi
534
+
535
+ while echo "$y"
536
+ do
537
+ :
538
+ done
539
+ }
540
+
541
+ ( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_1
542
+ test -z "$NO_PERL" && test_set_prereq PERL
543
+ test -z "$NO_PYTHON" && test_set_prereq PYTHON
544
+ test -n "$USE_LIBPCRE" && test_set_prereq LIBPCRE
545
+ test -z "$NO_GETTEXT" && test_set_prereq GETTEXT
546
+
547
+ # Use this instead of test_cmp to compare files that contain expected and
548
+ # actual output from git commands that can be translated. When running
549
+ # under GETTEXT_POISON this pretends that the command produced expected
550
+ # results.
551
+ test_i18ncmp () {
552
+ test -n "$GETTEXT_POISON" || test_cmp "$@"
553
+ }
554
+
555
+ # Use this instead of "grep expected-string actual" to see if the
556
+ # output from a git command that can be translated either contains an
557
+ # expected string, or does not contain an unwanted one. When running
558
+ # under GETTEXT_POISON this pretends that the command produced expected
559
+ # results.
560
+ test_i18ngrep () {
561
+ if test -n "$GETTEXT_POISON"
562
+ then
563
+ : # pretend success
564
+ elif test "x!" = "x$1"
565
+ then
566
+ shift
567
+ ! grep "$@"
568
+ else
569
+ grep "$@"
570
+ fi
571
+ }
572
+
573
+ test_lazy_prereq PIPE '
574
+ # test whether the filesystem supports FIFOs
575
+ case $(uname -s) in
576
+ CYGWIN*)
577
+ false
578
+ ;;
579
+ *)
580
+ rm -f testfifo && mkfifo testfifo
581
+ ;;
582
+ esac
583
+ '
584
+
585
+ test_lazy_prereq SYMLINKS '
586
+ # test whether the filesystem supports symbolic links
587
+ ln -s x y && test -h y
588
+ '
589
+
590
+ test_lazy_prereq CASE_INSENSITIVE_FS '
591
+ echo good >CamelCase &&
592
+ echo bad >camelcase &&
593
+ test "$(cat CamelCase)" != good
594
+ '
595
+
596
+ test_lazy_prereq UTF8_NFD_TO_NFC '
597
+ # check whether FS converts nfd unicode to nfc
598
+ auml=$(printf "\303\244")
599
+ aumlcdiar=$(printf "\141\314\210")
600
+ >"$auml" &&
601
+ case "$(echo *)" in
602
+ "$aumlcdiar")
603
+ true ;;
604
+ *)
605
+ false ;;
606
+ esac
607
+ '
608
+
609
+ test_lazy_prereq AUTOIDENT '
610
+ sane_unset GIT_AUTHOR_NAME &&
611
+ sane_unset GIT_AUTHOR_EMAIL &&
612
+ git var GIT_AUTHOR_IDENT
613
+ '
614
+
615
+ # When the tests are run as root, permission tests will report that
616
+ # things are writable when they shouldn't be.
617
+ test -w / || test_set_prereq SANITY
618
+
619
+ GIT_UNZIP=${GIT_UNZIP:-unzip}
620
+ test_lazy_prereq UNZIP '
621
+ "$GIT_UNZIP" -v
622
+ test $? -ne 127
623
+ '