1# Test framework for git. See t/README for usage. 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 19ORIGINAL_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. 23iftest -z"$TEST_DIRECTORY" 24then 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) 29else 30# ensure that TEST_DIRECTORY is an absolute path so that it 31# is valid even if the current working directory is changed 32 TEST_DIRECTORY=$(cd"$TEST_DIRECTORY"&&pwd) ||exit1 33fi 34iftest -z"$TEST_OUTPUT_DIRECTORY" 35then 36# Similarly, override this to store the test-results subdir 37# elsewhere 38 TEST_OUTPUT_DIRECTORY=$TEST_DIRECTORY 39fi 40GIT_BUILD_DIR="$TEST_DIRECTORY"/.. 41 42################################################################ 43# It appears that people try to run tests without building... 44"$GIT_BUILD_DIR/git">/dev/null 45iftest $? !=1 46then 47echo>&2'error: you do not seem to have built git yet.' 48exit1 49fi 50 51. "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS 52export PERL_PATH SHELL_PATH 53 54# if --tee was passed, write the output not only to the terminal, but 55# additionally to the file test-results/$BASENAME.out, too. 56case"$GIT_TEST_TEE_STARTED, $* "in 57done,*) 58# do not redirect again 59;; 60*' --tee '*|*' --va'*) 61mkdir-p"$TEST_OUTPUT_DIRECTORY/test-results" 62 BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)" 63(GIT_TEST_TEE_STARTED=done${SHELL_PATH}"$0""$@"2>&1; 64echo $? >$BASE.exit) |tee$BASE.out 65test"$(cat$BASE.exit)"=0 66exit 67;; 68esac 69 70# For repeatability, reset the environment to known value. 71LANG=C 72LC_ALL=C 73PAGER=cat 74TZ=UTC 75TERM=dumb 76export LANG LC_ALL PAGER TERM TZ 77EDITOR=: 78# A call to "unset" with no arguments causes at least Solaris 10 79# /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets 80# deriving from the command substitution clustered with the other 81# ones. 82unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH"-e' 83 my @env = keys %ENV; 84 my$ok= join("|", qw( 85 TRACE 86 DEBUG 87 USE_LOOKUP 88 TEST 89 .*_TEST 90 PROVE 91 VALGRIND 92 UNZIP 93 PERF_ 94 CURL_VERBOSE 95 )); 96 my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env); 97 print join("\n", @vars); 98') 99unset XDG_CONFIG_HOME 100unset GITPERLLIB 101GIT_AUTHOR_EMAIL=author@example.com 102GIT_AUTHOR_NAME='A U Thor' 103GIT_COMMITTER_EMAIL=committer@example.com 104GIT_COMMITTER_NAME='C O Mitter' 105GIT_MERGE_VERBOSITY=5 106GIT_MERGE_AUTOEDIT=no 107export GIT_MERGE_VERBOSITY GIT_MERGE_AUTOEDIT 108export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME 109export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME 110export EDITOR 111 112# Tests using GIT_TRACE typically don't want <timestamp> <file>:<line> output 113GIT_TRACE_BARE=1 114export GIT_TRACE_BARE 115 116iftest -n"${TEST_GIT_INDEX_VERSION:+isset}" 117then 118 GIT_INDEX_VERSION="$TEST_GIT_INDEX_VERSION" 119export GIT_INDEX_VERSION 120fi 121 122# Add libc MALLOC and MALLOC_PERTURB test 123# only if we are not executing the test with valgrind 124ifexpr"$GIT_TEST_OPTS":".* --valgrind ">/dev/null || 125test -n"$TEST_NO_MALLOC_CHECK" 126then 127 setup_malloc_check () { 128: nothing 129} 130 teardown_malloc_check () { 131: nothing 132} 133else 134 setup_malloc_check () { 135 MALLOC_CHECK_=3 MALLOC_PERTURB_=165 136export MALLOC_CHECK_ MALLOC_PERTURB_ 137} 138 teardown_malloc_check () { 139unset MALLOC_CHECK_ MALLOC_PERTURB_ 140} 141fi 142 143:${ASAN_OPTIONS=detect_leaks=0} 144export ASAN_OPTIONS 145 146# Protect ourselves from common misconfiguration to export 147# CDPATH into the environment 148unset CDPATH 149 150unset GREP_OPTIONS 151unset UNZIP 152 153case $(echo$GIT_TRACE|tr"[A-Z]""[a-z]")in 1541|2|true) 155echo"* warning: Some tests will not work if GIT_TRACE" \ 156"is set as to trace on STDERR ! *" 157echo"* warning: Please set GIT_TRACE to something" \ 158"other than 1, 2 or true ! *" 159;; 160esac 161 162# Convenience 163# 164# A regexp to match 5 and 40 hexdigits 165_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' 166_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05" 167 168# Zero SHA-1 169_z40=0000000000000000000000000000000000000000 170 171# Line feed 172LF=' 173' 174 175# UTF-8 ZERO WIDTH NON-JOINER, which HFS+ ignores 176# when case-folding filenames 177u200c=$(printf'\342\200\214') 178 179export _x05 _x40 _z40 LF u200c 180 181# Each test should start with something like this, after copyright notices: 182# 183# test_description='Description of this test... 184# This test checks if command xyzzy does the right thing... 185# ' 186# . ./test-lib.sh 187 188unset color 189whiletest"$#"-ne0 190do 191case"$1"in 192-d|--d|--de|--deb|--debu|--debug) 193 debug=t;shift;; 194-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 195 immediate=t;shift;; 196-l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests) 197 GIT_TEST_LONG=t;export GIT_TEST_LONG;shift;; 198-r) 199shift;test"$#"-ne0|| { 200echo'error: -r requires an argument'>&2; 201exit1; 202} 203 run_list=$1;shift;; 204--run=*) 205 run_list=$(expr"z$1":'z[^=]*=\(.*\)');shift;; 206-h|--h|--he|--hel|--help) 207help=t;shift;; 208-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 209 verbose=t;shift;; 210--verbose-only=*) 211 verbose_only=$(expr"z$1":'z[^=]*=\(.*\)') 212shift;; 213-q|--q|--qu|--qui|--quie|--quiet) 214# Ignore --quiet under a TAP::Harness. Saying how many tests 215# passed without the ok/not ok details is always an error. 216test -z"$HARNESS_ACTIVE"&& quiet=t;shift;; 217--with-dashes) 218 with_dashes=t;shift;; 219--no-color) 220 color=;shift;; 221--va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind) 222 valgrind=memcheck 223shift;; 224--valgrind=*) 225 valgrind=$(expr"z$1":'z[^=]*=\(.*\)') 226shift;; 227--valgrind-only=*) 228 valgrind_only=$(expr"z$1":'z[^=]*=\(.*\)') 229shift;; 230--tee) 231shift;;# was handled already 232--root=*) 233 root=$(expr"z$1":'z[^=]*=\(.*\)') 234shift;; 235-x) 236 trace=t 237 verbose=t 238shift;; 239*) 240echo"error: unknown test option '$1'">&2;exit1;; 241esac 242done 243 244iftest -n"$valgrind_only" 245then 246test -z"$valgrind"&& valgrind=memcheck 247test -z"$verbose"&& verbose_only="$valgrind_only" 248eliftest -n"$valgrind" 249then 250 verbose=t 251fi 252 253error () { 254 say_color error "error: $*" 255 GIT_EXIT_OK=t 256exit1 257} 258 259say () { 260 say_color info "$*" 261} 262 263test"${test_description}"!=""|| 264error "Test script did not set test_description." 265 266iftest"$help"="t" 267then 268printf'%s\n'"$test_description" 269exit0 270fi 271 272exec5>&1 273exec6<&0 274iftest"$verbose"="t" 275then 276exec4>&2 3>&1 277else 278exec4>/dev/null 3>/dev/null 279fi 280 281test_failure=0 282test_count=0 283test_fixed=0 284test_broken=0 285test_success=0 286 287test_external_has_tap=0 288 289die () { 290 code=$? 291iftest -n"$GIT_EXIT_OK" 292then 293exit$code 294else 295echo>&5"FATAL: Unexpected exit with code$code" 296exit1 297fi 298} 299 300GIT_EXIT_OK= 301trap'die' EXIT 302 303# The user-facing functions are loaded from a separate file so that 304# test_perf subshells can have them too 305. "$TEST_DIRECTORY/test-lib-functions.sh" 306 307# You are not expected to call test_ok_ and test_failure_ directly, use 308# the test_expect_* functions instead. 309 310test_ok_ () { 311 test_success=$(($test_success+1)) 312 say_color """ok$test_count- $@" 313} 314 315test_failure_ () { 316 test_failure=$(($test_failure+1)) 317 say_color error "not ok$test_count-$1" 318shift 319printf'%s\n'"$*"|sed-e's/^/# /' 320test"$immediate"=""|| { GIT_EXIT_OK=t;exit1; } 321} 322 323test_known_broken_ok_ () { 324 test_fixed=$(($test_fixed+1)) 325 say_color error "ok$test_count- $@ # TODO known breakage vanished" 326} 327 328test_known_broken_failure_ () { 329 test_broken=$(($test_broken+1)) 330 say_color warn "not ok$test_count- $@ # TODO known breakage" 331} 332 333test_debug () { 334test"$debug"=""||eval"$1" 335} 336 337match_pattern_list () { 338 arg="$1" 339shift 340test -z"$*"&&return1 341for pattern_ 342do 343case"$arg"in 344$pattern_) 345return0 346esac 347done 348return1 349} 350 351match_test_selector_list () { 352 title="$1" 353shift 354 arg="$1" 355shift 356test -z"$1"&&return0 357 358# Both commas and whitespace are accepted as separators. 359 OLDIFS=$IFS 360 IFS=' ,' 361set --$1 362 IFS=$OLDIFS 363 364# If the first selector is negative we include by default. 365 include= 366case"$1"in 367!*) include=t ;; 368esac 369 370for selector 371do 372 orig_selector=$selector 373 374 positive=t 375case"$selector"in 376!*) 377 positive= 378 selector=${selector##?} 379;; 380esac 381 382test -z"$selector"&&continue 383 384case"$selector"in 385*-*) 386ifexpr"z${selector%%-*}":"z[0-9]*[^0-9]">/dev/null 387then 388echo"error:$title: invalid non-numeric in range" \ 389"start: '$orig_selector'">&2 390exit1 391fi 392ifexpr"z${selector#*-}":"z[0-9]*[^0-9]">/dev/null 393then 394echo"error:$title: invalid non-numeric in range" \ 395"end: '$orig_selector'">&2 396exit1 397fi 398;; 399*) 400ifexpr"z$selector":"z[0-9]*[^0-9]">/dev/null 401then 402echo"error:$title: invalid non-numeric in test" \ 403"selector: '$orig_selector'">&2 404exit1 405fi 406esac 407 408# Short cut for "obvious" cases 409test -z"$include"&&test -z"$positive"&&continue 410test -n"$include"&&test -n"$positive"&&continue 411 412case"$selector"in 413-*) 414iftest$arg-le${selector#-} 415then 416 include=$positive 417fi 418;; 419*-) 420iftest$arg-ge${selector%-} 421then 422 include=$positive 423fi 424;; 425*-*) 426iftest${selector%%-*}-le$arg \ 427&&test$arg-le${selector#*-} 428then 429 include=$positive 430fi 431;; 432*) 433iftest$arg-eq$selector 434then 435 include=$positive 436fi 437;; 438esac 439done 440 441test -n"$include" 442} 443 444maybe_teardown_verbose () { 445test -z"$verbose_only"&&return 446exec4>/dev/null 3>/dev/null 447 verbose= 448} 449 450last_verbose=t 451maybe_setup_verbose () { 452test -z"$verbose_only"&&return 453if match_pattern_list $test_count $verbose_only 454then 455exec4>&2 3>&1 456# Emit a delimiting blank line when going from 457# non-verbose to verbose. Within verbose mode the 458# delimiter is printed by test_expect_*. The choice 459# of the initial $last_verbose is such that before 460# test 1, we do not print it. 461test -z"$last_verbose"&&echo>&3"" 462 verbose=t 463else 464exec4>/dev/null 3>/dev/null 465 verbose= 466fi 467 last_verbose=$verbose 468} 469 470maybe_teardown_valgrind () { 471test -z"$GIT_VALGRIND"&&return 472 GIT_VALGRIND_ENABLED= 473} 474 475maybe_setup_valgrind () { 476test -z"$GIT_VALGRIND"&&return 477iftest -z"$valgrind_only" 478then 479 GIT_VALGRIND_ENABLED=t 480return 481fi 482 GIT_VALGRIND_ENABLED= 483if match_pattern_list $test_count $valgrind_only 484then 485 GIT_VALGRIND_ENABLED=t 486fi 487} 488 489# This is a separate function because some tests use 490# "return" to end a test_expect_success block early 491# (and we want to make sure we run any cleanup like 492# "set +x"). 493test_eval_inner_ () { 494# Do not add anything extra (including LF) after '$*' 495eval" 496 test\"$trace\"= t && set -x 497 $*" 498} 499 500test_eval_ () { 501# We run this block with stderr redirected to avoid extra cruft 502# during a "-x" trace. Once in "set -x" mode, we cannot prevent 503# the shell from printing the "set +x" to turn it off (nor the saving 504# of $? before that). But we can make sure that the output goes to 505# /dev/null. 506# 507# The test itself is run with stderr put back to &4 (so either to 508# /dev/null, or to the original stderr if --verbose was used). 509{ 510 test_eval_inner_ "$@"</dev/null >&3 2>&4 511 test_eval_ret_=$? 512iftest"$trace"= t 513then 514set+x 515iftest"$test_eval_ret_"!=0 516then 517 say_color error >&4"error: last command exited with \$?=$test_eval_ret_" 518fi 519fi 520}2>/dev/null 521return$test_eval_ret_ 522} 523 524test_run_ () { 525 test_cleanup=: 526 expecting_failure=$2 527 setup_malloc_check 528 test_eval_ "$1" 529 eval_ret=$? 530 teardown_malloc_check 531 532iftest -z"$immediate"||test$eval_ret=0|| 533test -n"$expecting_failure"&&test"$test_cleanup"!=":" 534then 535 setup_malloc_check 536 test_eval_ "$test_cleanup" 537 teardown_malloc_check 538fi 539iftest"$verbose"="t"&&test -n"$HARNESS_ACTIVE" 540then 541echo"" 542fi 543return"$eval_ret" 544} 545 546test_start_ () { 547 test_count=$(($test_count+1)) 548 maybe_setup_verbose 549 maybe_setup_valgrind 550} 551 552test_finish_ () { 553echo>&3"" 554 maybe_teardown_valgrind 555 maybe_teardown_verbose 556} 557 558test_skip () { 559 to_skip= 560 skipped_reason= 561if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS 562then 563 to_skip=t 564 skipped_reason="GIT_SKIP_TESTS" 565fi 566iftest -z"$to_skip"&&test -n"$test_prereq"&& 567! test_have_prereq "$test_prereq" 568then 569 to_skip=t 570 571 of_prereq= 572iftest"$missing_prereq"!="$test_prereq" 573then 574 of_prereq=" of$test_prereq" 575fi 576 skipped_reason="missing$missing_prereq${of_prereq}" 577fi 578iftest -z"$to_skip"&&test -n"$run_list"&& 579! match_test_selector_list '--run'$test_count"$run_list" 580then 581 to_skip=t 582 skipped_reason="--run" 583fi 584 585case"$to_skip"in 586 t) 587 say_color skip >&3"skipping test: $@" 588 say_color skip "ok$test_count# skip$1($skipped_reason)" 589: true 590;; 591*) 592 false 593;; 594esac 595} 596 597# stub; perf-lib overrides it 598test_at_end_hook_ () { 599: 600} 601 602test_done () { 603 GIT_EXIT_OK=t 604 605iftest -z"$HARNESS_ACTIVE" 606then 607 test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" 608mkdir-p"$test_results_dir" 609 base=${0##*/} 610 test_results_path="$test_results_dir/${base%.sh}-$$.counts" 611 612cat>>"$test_results_path"<<-EOF 613 total$test_count 614 success$test_success 615 fixed$test_fixed 616 broken$test_broken 617 failed$test_failure 618 619 EOF 620fi 621 622iftest"$test_fixed"!=0 623then 624 say_color error "#$test_fixedknown breakage(s) vanished; please update test(s)" 625fi 626iftest"$test_broken"!=0 627then 628 say_color warn "# still have$test_brokenknown breakage(s)" 629fi 630iftest"$test_broken"!=0||test"$test_fixed"!=0 631then 632 test_remaining=$(($test_count-$test_broken-$test_fixed)) 633 msg="remaining$test_remainingtest(s)" 634else 635 test_remaining=$test_count 636 msg="$test_counttest(s)" 637fi 638case"$test_failure"in 6390) 640# Maybe print SKIP message 641iftest -n"$skip_all"&&test$test_count-gt0 642then 643 error "Can't use skip_all after running some tests" 644fi 645test -z"$skip_all"|| skip_all=" # SKIP$skip_all" 646 647iftest$test_external_has_tap-eq0 648then 649iftest$test_remaining-gt0 650then 651 say_color pass "# passed all$msg" 652fi 653 say "1..$test_count$skip_all" 654fi 655 656test -d"$remove_trash"&& 657cd"$(dirname "$remove_trash")"&& 658rm-rf"$(basename "$remove_trash")" 659 660 test_at_end_hook_ 661 662exit0;; 663 664*) 665iftest$test_external_has_tap-eq0 666then 667 say_color error "# failed$test_failureamong$msg" 668 say "1..$test_count" 669fi 670 671exit1;; 672 673esac 674} 675 676iftest -n"$valgrind" 677then 678 make_symlink () { 679test -h"$2"&& 680test"$1"="$(readlink "$2")"|| { 681# be super paranoid 682ifmkdir"$2".lock 683then 684rm-f"$2"&& 685ln-s"$1""$2"&& 686rm-r"$2".lock 687else 688whiletest -d"$2".lock 689do 690 say "Waiting for lock on$2." 691sleep1 692done 693fi 694} 695} 696 697 make_valgrind_symlink () { 698# handle only executables, unless they are shell libraries that 699# need to be in the exec-path. 700test -x"$1"|| 701test"# "="$(head -c 2 <"$1")"|| 702return; 703 704 base=$(basename"$1") 705 symlink_target=$GIT_BUILD_DIR/$base 706# do not override scripts 707iftest -x"$symlink_target"&& 708test!-d"$symlink_target"&& 709test"#!"!="$(head -c 2 < "$symlink_target")" 710then 711 symlink_target=../valgrind.sh 712fi 713case"$base"in 714*.sh|*.perl) 715 symlink_target=../unprocessed-script 716esac 717# create the link, or replace it if it is out of date 718 make_symlink "$symlink_target""$GIT_VALGRIND/bin/$base"||exit 719} 720 721# override all git executables in TEST_DIRECTORY/.. 722 GIT_VALGRIND=$TEST_DIRECTORY/valgrind 723mkdir-p"$GIT_VALGRIND"/bin 724forfilein$GIT_BUILD_DIR/git*$GIT_BUILD_DIR/test-* 725do 726 make_valgrind_symlink $file 727done 728# special-case the mergetools loadables 729 make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools" 730 OLDIFS=$IFS 731 IFS=: 732for path in$PATH 733do 734ls"$path"/git-*2> /dev/null | 735whilereadfile 736do 737 make_valgrind_symlink "$file" 738done 739done 740 IFS=$OLDIFS 741 PATH=$GIT_VALGRIND/bin:$PATH 742 GIT_EXEC_PATH=$GIT_VALGRIND/bin 743export GIT_VALGRIND 744 GIT_VALGRIND_MODE="$valgrind" 745export GIT_VALGRIND_MODE 746 GIT_VALGRIND_ENABLED=t 747test -n"$valgrind_only"&& GIT_VALGRIND_ENABLED= 748export GIT_VALGRIND_ENABLED 749eliftest -n"$GIT_TEST_INSTALLED" 750then 751 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) || 752 error "Cannot run git from$GIT_TEST_INSTALLED." 753 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH 754 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} 755else# normal case, use ../bin-wrappers only unless $with_dashes: 756 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers" 757if!test -x"$git_bin_dir/git" 758then 759iftest -z"$with_dashes" 760then 761 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" 762fi 763 with_dashes=t 764fi 765 PATH="$git_bin_dir:$PATH" 766 GIT_EXEC_PATH=$GIT_BUILD_DIR 767iftest -n"$with_dashes" 768then 769 PATH="$GIT_BUILD_DIR:$PATH" 770fi 771fi 772GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt 773GIT_CONFIG_NOSYSTEM=1 774GIT_ATTR_NOSYSTEM=1 775export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM 776 777iftest -z"$GIT_TEST_CMP" 778then 779iftest -n"$GIT_TEST_CMP_USE_COPIED_CONTEXT" 780then 781 GIT_TEST_CMP="$DIFF-c" 782else 783 GIT_TEST_CMP="$DIFF-u" 784fi 785fi 786 787GITPERLLIB="$GIT_BUILD_DIR"/perl/blib/lib:"$GIT_BUILD_DIR"/perl/blib/arch/auto/Git 788export GITPERLLIB 789test -d"$GIT_BUILD_DIR"/templates/blt || { 790 error "You haven't built things yet, have you?" 791} 792 793if!test -x"$GIT_BUILD_DIR"/test-chmtime 794then 795echo>&2'You need to build test-chmtime:' 796echo>&2'Run "make test-chmtime" in the source (toplevel) directory' 797exit1 798fi 799 800# Test repository 801TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)" 802test -n"$root"&& TRASH_DIRECTORY="$root/$TRASH_DIRECTORY" 803case"$TRASH_DIRECTORY"in 804/*) ;;# absolute path is good 805*) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY";; 806esac 807test!-z"$debug"|| remove_trash=$TRASH_DIRECTORY 808rm-fr"$TRASH_DIRECTORY"|| { 809 GIT_EXIT_OK=t 810echo>&5"FATAL: Cannot prepare test area" 811exit1 812} 813 814HOME="$TRASH_DIRECTORY" 815GNUPGHOME="$HOME/gnupg-home-not-used" 816export HOME GNUPGHOME 817 818# run the tput tests *after* changing HOME (in case ncurses needs 819# ~/.terminfo for $TERM) 820test -n"${color+set}"||test"x$ORIGINAL_TERM"!="xdumb"&& ( 821 TERM=$ORIGINAL_TERM&& 822export TERM && 823test -t1&& 824tput bold >/dev/null 2>&1&& 825tput setaf 1>/dev/null 2>&1&& 826tput sgr0 >/dev/null 2>&1 827) && 828 color=t 829 830iftest -n"$color" 831then 832 say_color () { 833( 834 TERM=$ORIGINAL_TERM 835export TERM 836case"$1"in 837 error) 838tput bold;tput setaf 1;;# bold red 839 skip) 840tput setaf 4;;# blue 841 warn) 842tput setaf 3;;# brown/yellow 843 pass) 844tput setaf 2;;# green 845 info) 846tput setaf 6;;# cyan 847*) 848test -n"$quiet"&&return;; 849esac 850shift 851printf"%s""$*" 852tput sgr0 853echo 854) 855} 856else 857 say_color() { 858test -z"$1"&&test -n"$quiet"&&return 859shift 860printf"%s\n""$*" 861} 862fi 863 864iftest -z"$TEST_NO_CREATE_REPO" 865then 866 test_create_repo "$TRASH_DIRECTORY" 867else 868mkdir-p"$TRASH_DIRECTORY" 869fi 870# Use -P to resolve symlinks in our working directory so that the cwd 871# in subprocesses like git equals our $PWD (for pathname comparisons). 872cd -P"$TRASH_DIRECTORY"||exit1 873 874this_test=${0##*/} 875this_test=${this_test%%-*} 876if match_pattern_list "$this_test"$GIT_SKIP_TESTS 877then 878 say_color info >&3"skipping test$this_testaltogether" 879 skip_all="skip all tests in$this_test" 880 test_done 881fi 882 883# Provide an implementation of the 'yes' utility 884yes() { 885iftest$#=0 886then 887 y=y 888else 889 y="$*" 890fi 891 892whileecho"$y" 893do 894: 895done 896} 897 898# Fix some commands on Windows 899case $(uname -s)in 900*MINGW*) 901# Windows has its own (incompatible) sort and find 902sort() { 903/usr/bin/sort"$@" 904} 905find() { 906/usr/bin/find"$@" 907} 908sum() { 909md5sum"$@" 910} 911# git sees Windows-style pwd 912pwd() { 913builtin pwd -W 914} 915# no POSIX permissions 916# backslashes in pathspec are converted to '/' 917# exec does not inherit the PID 918 test_set_prereq MINGW 919 test_set_prereq NATIVE_CRLF 920 test_set_prereq SED_STRIPS_CR 921 test_set_prereq GREP_STRIPS_CR 922 GIT_TEST_CMP=mingw_test_cmp 923;; 924*CYGWIN*) 925 test_set_prereq POSIXPERM 926 test_set_prereq EXECKEEPSPID 927 test_set_prereq CYGWIN 928 test_set_prereq SED_STRIPS_CR 929 test_set_prereq GREP_STRIPS_CR 930;; 931*) 932 test_set_prereq POSIXPERM 933 test_set_prereq BSLASHPSPEC 934 test_set_prereq EXECKEEPSPID 935;; 936esac 937 938( COLUMNS=1&&test$COLUMNS=1) && test_set_prereq COLUMNS_CAN_BE_1 939test -z"$NO_PERL"&& test_set_prereq PERL 940test -z"$NO_PYTHON"&& test_set_prereq PYTHON 941test -n"$USE_LIBPCRE"&& test_set_prereq LIBPCRE 942test -z"$NO_GETTEXT"&& test_set_prereq GETTEXT 943 944# Can we rely on git's output in the C locale? 945iftest -n"$GETTEXT_POISON" 946then 947 GIT_GETTEXT_POISON=YesPlease 948export GIT_GETTEXT_POISON 949 test_set_prereq GETTEXT_POISON 950else 951 test_set_prereq C_LOCALE_OUTPUT 952fi 953 954# Use this instead of test_cmp to compare files that contain expected and 955# actual output from git commands that can be translated. When running 956# under GETTEXT_POISON this pretends that the command produced expected 957# results. 958test_i18ncmp () { 959test -n"$GETTEXT_POISON"|| test_cmp "$@" 960} 961 962# Use this instead of "grep expected-string actual" to see if the 963# output from a git command that can be translated either contains an 964# expected string, or does not contain an unwanted one. When running 965# under GETTEXT_POISON this pretends that the command produced expected 966# results. 967test_i18ngrep () { 968iftest -n"$GETTEXT_POISON" 969then 970:# pretend success 971eliftest"x!"="x$1" 972then 973shift 974!grep"$@" 975else 976grep"$@" 977fi 978} 979 980test_lazy_prereq PIPE ' 981 # test whether the filesystem supports FIFOs 982 case $(uname -s) in 983 CYGWIN*) 984 false 985 ;; 986 *) 987 rm -f testfifo && mkfifo testfifo 988 ;; 989 esac 990' 991 992test_lazy_prereq SYMLINKS ' 993 # test whether the filesystem supports symbolic links 994 ln -s x y && test -h y 995' 996 997test_lazy_prereq FILEMODE ' 998 test "$(git config --bool core.filemode)" = true 999'10001001test_lazy_prereq CASE_INSENSITIVE_FS '1002 echo good >CamelCase &&1003 echo bad >camelcase &&1004 test "$(cat CamelCase)" != good1005'10061007test_lazy_prereq UTF8_NFD_TO_NFC '1008 # check whether FS converts nfd unicode to nfc1009 auml=$(printf "\303\244")1010 aumlcdiar=$(printf "\141\314\210")1011 >"$auml" &&1012 case "$(echo *)" in1013 "$aumlcdiar")1014 true ;;1015 *)1016 false ;;1017 esac1018'10191020test_lazy_prereq AUTOIDENT '1021 sane_unset GIT_AUTHOR_NAME &&1022 sane_unset GIT_AUTHOR_EMAIL &&1023 git var GIT_AUTHOR_IDENT1024'10251026test_lazy_prereq EXPENSIVE '1027 test -n "$GIT_TEST_LONG"1028'10291030test_lazy_prereq USR_BIN_TIME '1031 test -x /usr/bin/time1032'10331034test_lazy_prereq NOT_ROOT '1035 uid=$(id -u) &&1036 test "$uid" != 01037'10381039# On a filesystem that lacks SANITY, a file can be deleted even if1040# the containing directory doesn't have write permissions, or a file1041# can be accessed even if the containing directory doesn't have read1042# or execute permissions, causing our tests that validate that Git1043# works sensibly in such situations.1044test_lazy_prereq SANITY '1045 mkdir SANETESTD.1 SANETESTD.2 &&10461047 chmod +w SANETESTD.1 SANETESTD.2 &&1048 >SANETESTD.1/x 2>SANETESTD.2/x &&1049 chmod -w SANETESTD.1 &&1050 chmod -rx SANETESTD.2 ||1051 error "bug in test sript: cannot prepare SANETESTD"10521053 ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x1054 status=$?10551056 chmod +rwx SANETESTD.1 SANETESTD.2 &&1057 rm -rf SANETESTD.1 SANETESTD.2 ||1058 error "bug in test sript: cannot clean SANETESTD"1059 return$status1060'10611062GIT_UNZIP=${GIT_UNZIP:-unzip}1063test_lazy_prereq UNZIP '1064 "$GIT_UNZIP" -v1065 test $? -ne 1271066'