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