Merge branch 'jk/enable-test-lint-by-default'
[git.git] / t / test-lib.sh
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 GIT_BUILD_DIR="$TEST_DIRECTORY"/..
37
38 ################################################################
39 # It appears that people try to run tests without building...
40 "$GIT_BUILD_DIR/git" >/dev/null
41 if test $? != 1
42 then
43         echo >&2 'error: you do not seem to have built git yet.'
44         exit 1
45 fi
46
47 . "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS
48 export PERL_PATH SHELL_PATH
49
50 # if --tee was passed, write the output not only to the terminal, but
51 # additionally to the file test-results/$BASENAME.out, too.
52 case "$GIT_TEST_TEE_STARTED, $* " in
53 done,*)
54         # do not redirect again
55         ;;
56 *' --tee '*|*' --va'*)
57         mkdir -p test-results
58         BASE=test-results/$(basename "$0" .sh)
59         (GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1;
60          echo $? > $BASE.exit) | tee $BASE.out
61         test "$(cat $BASE.exit)" = 0
62         exit
63         ;;
64 esac
65
66 # For repeatability, reset the environment to known value.
67 LANG=C
68 LC_ALL=C
69 PAGER=cat
70 TZ=UTC
71 TERM=dumb
72 export LANG LC_ALL PAGER TERM TZ
73 EDITOR=:
74 # A call to "unset" with no arguments causes at least Solaris 10
75 # /usr/xpg4/bin/sh and /bin/ksh to bail out.  So keep the unsets
76 # deriving from the command substitution clustered with the other
77 # ones.
78 unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH" -e '
79         my @env = keys %ENV;
80         my $ok = join("|", qw(
81                 TRACE
82                 DEBUG
83                 USE_LOOKUP
84                 TEST
85                 .*_TEST
86                 PROVE
87                 VALGRIND
88                 PERF_AGGREGATING_LATER
89         ));
90         my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env);
91         print join("\n", @vars);
92 ')
93 unset XDG_CONFIG_HOME
94 GIT_AUTHOR_EMAIL=author@example.com
95 GIT_AUTHOR_NAME='A U Thor'
96 GIT_COMMITTER_EMAIL=committer@example.com
97 GIT_COMMITTER_NAME='C O Mitter'
98 GIT_MERGE_VERBOSITY=5
99 GIT_MERGE_AUTOEDIT=no
100 export GIT_MERGE_VERBOSITY GIT_MERGE_AUTOEDIT
101 export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
102 export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
103 export EDITOR
104
105 # Add libc MALLOC and MALLOC_PERTURB test
106 # only if we are not executing the test with valgrind
107 if expr " $GIT_TEST_OPTS " : ".* --valgrind " >/dev/null ||
108    test -n "$TEST_NO_MALLOC_CHECK"
109 then
110         setup_malloc_check () {
111                 : nothing
112         }
113         teardown_malloc_check () {
114                 : nothing
115         }
116 else
117         setup_malloc_check () {
118                 MALLOC_CHECK_=3 MALLOC_PERTURB_=165
119                 export MALLOC_CHECK_ MALLOC_PERTURB_
120         }
121         teardown_malloc_check () {
122                 unset MALLOC_CHECK_ MALLOC_PERTURB_
123         }
124 fi
125
126 # Protect ourselves from common misconfiguration to export
127 # CDPATH into the environment
128 unset CDPATH
129
130 unset GREP_OPTIONS
131
132 case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
133 1|2|true)
134         echo "* warning: Some tests will not work if GIT_TRACE" \
135                 "is set as to trace on STDERR ! *"
136         echo "* warning: Please set GIT_TRACE to something" \
137                 "other than 1, 2 or true ! *"
138         ;;
139 esac
140
141 # Convenience
142 #
143 # A regexp to match 5 and 40 hexdigits
144 _x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
145 _x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
146
147 # Zero SHA-1
148 _z40=0000000000000000000000000000000000000000
149
150 # Line feed
151 LF='
152 '
153
154 export _x05 _x40 _z40 LF
155
156 # Each test should start with something like this, after copyright notices:
157 #
158 # test_description='Description of this test...
159 # This test checks if command xyzzy does the right thing...
160 # '
161 # . ./test-lib.sh
162 [ "x$ORIGINAL_TERM" != "xdumb" ] && (
163                 TERM=$ORIGINAL_TERM &&
164                 export TERM &&
165                 [ -t 1 ] &&
166                 tput bold >/dev/null 2>&1 &&
167                 tput setaf 1 >/dev/null 2>&1 &&
168                 tput sgr0 >/dev/null 2>&1
169         ) &&
170         color=t
171
172 while test "$#" -ne 0
173 do
174         case "$1" in
175         -d|--d|--de|--deb|--debu|--debug)
176                 debug=t; shift ;;
177         -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
178                 immediate=t; shift ;;
179         -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
180                 GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;;
181         -h|--h|--he|--hel|--help)
182                 help=t; shift ;;
183         -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
184                 verbose=t; shift ;;
185         -q|--q|--qu|--qui|--quie|--quiet)
186                 # Ignore --quiet under a TAP::Harness. Saying how many tests
187                 # passed without the ok/not ok details is always an error.
188                 test -z "$HARNESS_ACTIVE" && quiet=t; shift ;;
189         --with-dashes)
190                 with_dashes=t; shift ;;
191         --no-color)
192                 color=; shift ;;
193         --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
194                 valgrind=t; verbose=t; shift ;;
195         --tee)
196                 shift ;; # was handled already
197         --root=*)
198                 root=$(expr "z$1" : 'z[^=]*=\(.*\)')
199                 shift ;;
200         *)
201                 echo "error: unknown test option '$1'" >&2; exit 1 ;;
202         esac
203 done
204
205 if test -n "$color"
206 then
207         say_color () {
208                 (
209                 TERM=$ORIGINAL_TERM
210                 export TERM
211                 case "$1" in
212                 error)
213                         tput bold; tput setaf 1;; # bold red
214                 skip)
215                         tput setaf 4;; # blue
216                 warn)
217                         tput setaf 3;; # brown/yellow
218                 pass)
219                         tput setaf 2;; # green
220                 info)
221                         tput setaf 6;; # cyan
222                 *)
223                         test -n "$quiet" && return;;
224                 esac
225                 shift
226                 printf "%s" "$*"
227                 tput sgr0
228                 echo
229                 )
230         }
231 else
232         say_color() {
233                 test -z "$1" && test -n "$quiet" && return
234                 shift
235                 printf "%s\n" "$*"
236         }
237 fi
238
239 error () {
240         say_color error "error: $*"
241         GIT_EXIT_OK=t
242         exit 1
243 }
244
245 say () {
246         say_color info "$*"
247 }
248
249 test "${test_description}" != "" ||
250 error "Test script did not set test_description."
251
252 if test "$help" = "t"
253 then
254         echo "$test_description"
255         exit 0
256 fi
257
258 exec 5>&1
259 exec 6<&0
260 if test "$verbose" = "t"
261 then
262         exec 4>&2 3>&1
263 else
264         exec 4>/dev/null 3>/dev/null
265 fi
266
267 test_failure=0
268 test_count=0
269 test_fixed=0
270 test_broken=0
271 test_success=0
272
273 test_external_has_tap=0
274
275 die () {
276         code=$?
277         if test -n "$GIT_EXIT_OK"
278         then
279                 exit $code
280         else
281                 echo >&5 "FATAL: Unexpected exit with code $code"
282                 exit 1
283         fi
284 }
285
286 GIT_EXIT_OK=
287 trap 'die' EXIT
288
289 # The user-facing functions are loaded from a separate file so that
290 # test_perf subshells can have them too
291 . "$TEST_DIRECTORY/test-lib-functions.sh"
292
293 # You are not expected to call test_ok_ and test_failure_ directly, use
294 # the text_expect_* functions instead.
295
296 test_ok_ () {
297         test_success=$(($test_success + 1))
298         say_color "" "ok $test_count - $@"
299 }
300
301 test_failure_ () {
302         test_failure=$(($test_failure + 1))
303         say_color error "not ok $test_count - $1"
304         shift
305         echo "$@" | sed -e 's/^/#       /'
306         test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
307 }
308
309 test_known_broken_ok_ () {
310         test_fixed=$(($test_fixed+1))
311         say_color error "ok $test_count - $@ # TODO known breakage vanished"
312 }
313
314 test_known_broken_failure_ () {
315         test_broken=$(($test_broken+1))
316         say_color warn "not ok $test_count - $@ # TODO known breakage"
317 }
318
319 test_debug () {
320         test "$debug" = "" || eval "$1"
321 }
322
323 test_eval_ () {
324         # This is a separate function because some tests use
325         # "return" to end a test_expect_success block early.
326         eval </dev/null >&3 2>&4 "$*"
327 }
328
329 test_run_ () {
330         test_cleanup=:
331         expecting_failure=$2
332         test_eval_ "$1"
333         eval_ret=$?
334
335         if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"
336         then
337                 setup_malloc_check
338                 test_eval_ "$test_cleanup"
339                 teardown_malloc_check
340         fi
341         if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"
342         then
343                 echo ""
344         fi
345         return "$eval_ret"
346 }
347
348 test_skip () {
349         test_count=$(($test_count+1))
350         to_skip=
351         for skp in $GIT_SKIP_TESTS
352         do
353                 case $this_test.$test_count in
354                 $skp)
355                         to_skip=t
356                         break
357                 esac
358         done
359         if test -z "$to_skip" && test -n "$test_prereq" &&
360            ! test_have_prereq "$test_prereq"
361         then
362                 to_skip=t
363         fi
364         case "$to_skip" in
365         t)
366                 of_prereq=
367                 if test "$missing_prereq" != "$test_prereq"
368                 then
369                         of_prereq=" of $test_prereq"
370                 fi
371
372                 say_color skip >&3 "skipping test: $@"
373                 say_color skip "ok $test_count # skip $1 (missing $missing_prereq${of_prereq})"
374                 : true
375                 ;;
376         *)
377                 false
378                 ;;
379         esac
380 }
381
382 # stub; perf-lib overrides it
383 test_at_end_hook_ () {
384         :
385 }
386
387 test_done () {
388         GIT_EXIT_OK=t
389
390         if test -z "$HARNESS_ACTIVE"
391         then
392                 test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results"
393                 mkdir -p "$test_results_dir"
394                 base=${0##*/}
395                 test_results_path="$test_results_dir/${base%.sh}-$$.counts"
396
397                 cat >>"$test_results_path" <<-EOF
398                 total $test_count
399                 success $test_success
400                 fixed $test_fixed
401                 broken $test_broken
402                 failed $test_failure
403
404                 EOF
405         fi
406
407         if test "$test_fixed" != 0
408         then
409                 say_color error "# $test_fixed known breakage(s) vanished; please update test(s)"
410         fi
411         if test "$test_broken" != 0
412         then
413                 say_color warn "# still have $test_broken known breakage(s)"
414         fi
415         if test "$test_broken" != 0 || test "$test_fixed" != 0
416         then
417                 test_remaining=$(( $test_count - $test_broken - $test_fixed ))
418                 msg="remaining $test_remaining test(s)"
419         else
420                 test_remaining=$test_count
421                 msg="$test_count test(s)"
422         fi
423         case "$test_failure" in
424         0)
425                 # Maybe print SKIP message
426                 if test -n "$skip_all" && test $test_count -gt 0
427                 then
428                         error "Can't use skip_all after running some tests"
429                 fi
430                 [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all"
431
432                 if test $test_external_has_tap -eq 0
433                 then
434                         if test $test_remaining -gt 0
435                         then
436                                 say_color pass "# passed all $msg"
437                         fi
438                         say "1..$test_count$skip_all"
439                 fi
440
441                 test -d "$remove_trash" &&
442                 cd "$(dirname "$remove_trash")" &&
443                 rm -rf "$(basename "$remove_trash")"
444
445                 test_at_end_hook_
446
447                 exit 0 ;;
448
449         *)
450                 if test $test_external_has_tap -eq 0
451                 then
452                         say_color error "# failed $test_failure among $msg"
453                         say "1..$test_count"
454                 fi
455
456                 exit 1 ;;
457
458         esac
459 }
460
461 if test -n "$valgrind"
462 then
463         make_symlink () {
464                 test -h "$2" &&
465                 test "$1" = "$(readlink "$2")" || {
466                         # be super paranoid
467                         if mkdir "$2".lock
468                         then
469                                 rm -f "$2" &&
470                                 ln -s "$1" "$2" &&
471                                 rm -r "$2".lock
472                         else
473                                 while test -d "$2".lock
474                                 do
475                                         say "Waiting for lock on $2."
476                                         sleep 1
477                                 done
478                         fi
479                 }
480         }
481
482         make_valgrind_symlink () {
483                 # handle only executables, unless they are shell libraries that
484                 # need to be in the exec-path.  We will just use "#!" as a
485                 # guess for a shell-script, since we have no idea what the user
486                 # may have configured as the shell path.
487                 test -x "$1" ||
488                 test "#!" = "$(head -c 2 <"$1")" ||
489                 return;
490
491                 base=$(basename "$1")
492                 symlink_target=$GIT_BUILD_DIR/$base
493                 # do not override scripts
494                 if test -x "$symlink_target" &&
495                     test ! -d "$symlink_target" &&
496                     test "#!" != "$(head -c 2 < "$symlink_target")"
497                 then
498                         symlink_target=../valgrind.sh
499                 fi
500                 case "$base" in
501                 *.sh|*.perl)
502                         symlink_target=../unprocessed-script
503                 esac
504                 # create the link, or replace it if it is out of date
505                 make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
506         }
507
508         # override all git executables in TEST_DIRECTORY/..
509         GIT_VALGRIND=$TEST_DIRECTORY/valgrind
510         mkdir -p "$GIT_VALGRIND"/bin
511         for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/test-*
512         do
513                 make_valgrind_symlink $file
514         done
515         # special-case the mergetools loadables
516         make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools"
517         OLDIFS=$IFS
518         IFS=:
519         for path in $PATH
520         do
521                 ls "$path"/git-* 2> /dev/null |
522                 while read file
523                 do
524                         make_valgrind_symlink "$file"
525                 done
526         done
527         IFS=$OLDIFS
528         PATH=$GIT_VALGRIND/bin:$PATH
529         GIT_EXEC_PATH=$GIT_VALGRIND/bin
530         export GIT_VALGRIND
531 elif test -n "$GIT_TEST_INSTALLED"
532 then
533         GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path)  ||
534         error "Cannot run git from $GIT_TEST_INSTALLED."
535         PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH
536         GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
537 else # normal case, use ../bin-wrappers only unless $with_dashes:
538         git_bin_dir="$GIT_BUILD_DIR/bin-wrappers"
539         if ! test -x "$git_bin_dir/git"
540         then
541                 if test -z "$with_dashes"
542                 then
543                         say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"
544                 fi
545                 with_dashes=t
546         fi
547         PATH="$git_bin_dir:$PATH"
548         GIT_EXEC_PATH=$GIT_BUILD_DIR
549         if test -n "$with_dashes"
550         then
551                 PATH="$GIT_BUILD_DIR:$PATH"
552         fi
553 fi
554 GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt
555 unset GIT_CONFIG
556 GIT_CONFIG_NOSYSTEM=1
557 GIT_ATTR_NOSYSTEM=1
558 export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM
559
560 if test -z "$GIT_TEST_CMP"
561 then
562         if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT"
563         then
564                 GIT_TEST_CMP="$DIFF -c"
565         else
566                 GIT_TEST_CMP="$DIFF -u"
567         fi
568 fi
569
570 GITPERLLIB="$GIT_BUILD_DIR"/perl/blib/lib:"$GIT_BUILD_DIR"/perl/blib/arch/auto/Git
571 export GITPERLLIB
572 test -d "$GIT_BUILD_DIR"/templates/blt || {
573         error "You haven't built things yet, have you?"
574 }
575
576 if test -z "$GIT_TEST_INSTALLED" && test -z "$NO_PYTHON"
577 then
578         GITPYTHONLIB="$GIT_BUILD_DIR/git_remote_helpers/build/lib"
579         export GITPYTHONLIB
580         test -d "$GIT_BUILD_DIR"/git_remote_helpers/build || {
581                 error "You haven't built git_remote_helpers yet, have you?"
582         }
583 fi
584
585 if ! test -x "$GIT_BUILD_DIR"/test-chmtime
586 then
587         echo >&2 'You need to build test-chmtime:'
588         echo >&2 'Run "make test-chmtime" in the source (toplevel) directory'
589         exit 1
590 fi
591
592 # Test repository
593 test="trash directory.$(basename "$0" .sh)"
594 test -n "$root" && test="$root/$test"
595 case "$test" in
596 /*) TRASH_DIRECTORY="$test" ;;
597  *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$test" ;;
598 esac
599 test ! -z "$debug" || remove_trash=$TRASH_DIRECTORY
600 rm -fr "$test" || {
601         GIT_EXIT_OK=t
602         echo >&5 "FATAL: Cannot prepare test area"
603         exit 1
604 }
605
606 HOME="$TRASH_DIRECTORY"
607 export HOME
608
609 if test -z "$TEST_NO_CREATE_REPO"
610 then
611         test_create_repo "$test"
612 else
613         mkdir -p "$test"
614 fi
615 # Use -P to resolve symlinks in our working directory so that the cwd
616 # in subprocesses like git equals our $PWD (for pathname comparisons).
617 cd -P "$test" || exit 1
618
619 this_test=${0##*/}
620 this_test=${this_test%%-*}
621 for skp in $GIT_SKIP_TESTS
622 do
623         case "$this_test" in
624         $skp)
625                 say_color info >&3 "skipping test $this_test altogether"
626                 skip_all="skip all tests in $this_test"
627                 test_done
628         esac
629 done
630
631 # Provide an implementation of the 'yes' utility
632 yes () {
633         if test $# = 0
634         then
635                 y=y
636         else
637                 y="$*"
638         fi
639
640         while echo "$y"
641         do
642                 :
643         done
644 }
645
646 # Fix some commands on Windows
647 case $(uname -s) in
648 *MINGW*)
649         # Windows has its own (incompatible) sort and find
650         sort () {
651                 /usr/bin/sort "$@"
652         }
653         find () {
654                 /usr/bin/find "$@"
655         }
656         sum () {
657                 md5sum "$@"
658         }
659         # git sees Windows-style pwd
660         pwd () {
661                 builtin pwd -W
662         }
663         # no POSIX permissions
664         # backslashes in pathspec are converted to '/'
665         # exec does not inherit the PID
666         test_set_prereq MINGW
667         test_set_prereq SED_STRIPS_CR
668         ;;
669 *CYGWIN*)
670         test_set_prereq POSIXPERM
671         test_set_prereq EXECKEEPSPID
672         test_set_prereq NOT_MINGW
673         test_set_prereq SED_STRIPS_CR
674         ;;
675 *)
676         test_set_prereq POSIXPERM
677         test_set_prereq BSLASHPSPEC
678         test_set_prereq EXECKEEPSPID
679         test_set_prereq NOT_MINGW
680         ;;
681 esac
682
683 ( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_1
684 test -z "$NO_PERL" && test_set_prereq PERL
685 test -z "$NO_PYTHON" && test_set_prereq PYTHON
686 test -n "$USE_LIBPCRE" && test_set_prereq LIBPCRE
687 test -z "$NO_GETTEXT" && test_set_prereq GETTEXT
688
689 # Can we rely on git's output in the C locale?
690 if test -n "$GETTEXT_POISON"
691 then
692         GIT_GETTEXT_POISON=YesPlease
693         export GIT_GETTEXT_POISON
694         test_set_prereq GETTEXT_POISON
695 else
696         test_set_prereq C_LOCALE_OUTPUT
697 fi
698
699 # Use this instead of test_cmp to compare files that contain expected and
700 # actual output from git commands that can be translated.  When running
701 # under GETTEXT_POISON this pretends that the command produced expected
702 # results.
703 test_i18ncmp () {
704         test -n "$GETTEXT_POISON" || test_cmp "$@"
705 }
706
707 # Use this instead of "grep expected-string actual" to see if the
708 # output from a git command that can be translated either contains an
709 # expected string, or does not contain an unwanted one.  When running
710 # under GETTEXT_POISON this pretends that the command produced expected
711 # results.
712 test_i18ngrep () {
713         if test -n "$GETTEXT_POISON"
714         then
715             : # pretend success
716         elif test "x!" = "x$1"
717         then
718                 shift
719                 ! grep "$@"
720         else
721                 grep "$@"
722         fi
723 }
724
725 test_lazy_prereq SYMLINKS '
726         # test whether the filesystem supports symbolic links
727         ln -s x y && test -h y
728 '
729
730 test_lazy_prereq CASE_INSENSITIVE_FS '
731         echo good >CamelCase &&
732         echo bad >camelcase &&
733         test "$(cat CamelCase)" != good
734 '
735
736 test_lazy_prereq UTF8_NFD_TO_NFC '
737         # check whether FS converts nfd unicode to nfc
738         auml=$(printf "\303\244")
739         aumlcdiar=$(printf "\141\314\210")
740         >"$auml" &&
741         case "$(echo *)" in
742         "$aumlcdiar")
743                 true ;;
744         *)
745                 false ;;
746         esac
747 '
748
749 test_lazy_prereq AUTOIDENT '
750         sane_unset GIT_AUTHOR_NAME &&
751         sane_unset GIT_AUTHOR_EMAIL &&
752         git var GIT_AUTHOR_IDENT
753 '
754
755 # When the tests are run as root, permission tests will report that
756 # things are writable when they shouldn't be.
757 test -w / || test_set_prereq SANITY