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