1#!/bin/sh 2# 3# Copyright (c) 2005 Junio C Hamano 4# 5 6# Keep the original TERM for say_color 7ORIGINAL_TERM=$TERM 8 9# For repeatability, reset the environment to known value. 10LANG=C 11LC_ALL=C 12PAGER=cat 13TZ=UTC 14TERM=dumb 15export LANG LC_ALL PAGER TERM TZ 16EDITOR=: 17VISUAL=: 18unset GIT_EDITOR 19unset AUTHOR_DATE 20unset AUTHOR_EMAIL 21unset AUTHOR_NAME 22unset COMMIT_AUTHOR_EMAIL 23unset COMMIT_AUTHOR_NAME 24unset EMAIL 25unset GIT_ALTERNATE_OBJECT_DIRECTORIES 26unset GIT_AUTHOR_DATE 27GIT_AUTHOR_EMAIL=author@example.com 28GIT_AUTHOR_NAME='A U Thor' 29unset GIT_COMMITTER_DATE 30GIT_COMMITTER_EMAIL=committer@example.com 31GIT_COMMITTER_NAME='C O Mitter' 32unset GIT_DIFF_OPTS 33unset GIT_DIR 34unset GIT_WORK_TREE 35unset GIT_EXTERNAL_DIFF 36unset GIT_INDEX_FILE 37unset GIT_OBJECT_DIRECTORY 38unset GIT_CEILING_DIRECTORIES 39unset SHA1_FILE_DIRECTORIES 40unset SHA1_FILE_DIRECTORY 41GIT_MERGE_VERBOSITY=5 42export GIT_MERGE_VERBOSITY 43export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME 44export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME 45export EDITOR VISUAL 46GIT_TEST_CMP=${GIT_TEST_CMP:-diff -u} 47 48# Protect ourselves from common misconfiguration to export 49# CDPATH into the environment 50unset CDPATH 51 52case$(echo $GIT_TRACE |tr "[A-Z]" "[a-z]")in 531|2|true) 54echo"* warning: Some tests will not work if GIT_TRACE" \ 55"is set as to trace on STDERR ! *" 56echo"* warning: Please set GIT_TRACE to something" \ 57"other than 1, 2 or true ! *" 58;; 59esac 60 61# Each test should start with something like this, after copyright notices: 62# 63# test_description='Description of this test... 64# This test checks if command xyzzy does the right thing... 65# ' 66# . ./test-lib.sh 67["x$ORIGINAL_TERM"!="xdumb"] && ( 68 TERM=$ORIGINAL_TERM&& 69export TERM && 70[-t1] && 71tput bold >/dev/null 2>&1&& 72tput setaf 1>/dev/null 2>&1&& 73tput sgr0 >/dev/null 2>&1 74) && 75 color=t 76 77whiletest"$#"-ne0 78do 79case"$1"in 80-d|--d|--de|--deb|--debu|--debug) 81 debug=t;shift;; 82-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 83 immediate=t;shift;; 84-h|--h|--he|--hel|--help) 85help=t;shift;; 86-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 87 verbose=t;shift;; 88-q|--q|--qu|--qui|--quie|--quiet) 89 quiet=t;shift;; 90--no-color) 91 color=;shift;; 92--no-python) 93# noop now... 94shift;; 95*) 96break;; 97esac 98done 99 100iftest -n"$color";then 101 say_color () { 102( 103 TERM=$ORIGINAL_TERM 104export TERM 105case"$1"in 106 error)tput bold;tput setaf 1;;# bold red 107 skip)tput bold;tput setaf 2;;# bold green 108 pass)tput setaf 2;;# green 109 info)tput setaf 3;;# brown 110*)test -n"$quiet"&&return;; 111esac 112shift 113echo"* $*" 114tput sgr0 115) 116} 117else 118 say_color() { 119test -z"$1"&&test -n"$quiet"&&return 120shift 121echo"* $*" 122} 123fi 124 125error () { 126 say_color error "error: $*" 127trap-exit 128exit1 129} 130 131say () { 132 say_color info "$*" 133} 134 135test"${test_description}"!=""|| 136error "Test script did not set test_description." 137 138iftest"$help"="t" 139then 140echo"$test_description" 141exit0 142fi 143 144exec5>&1 145iftest"$verbose"="t" 146then 147exec4>&2 3>&1 148else 149exec4>/dev/null 3>/dev/null 150fi 151 152test_failure=0 153test_count=0 154test_fixed=0 155test_broken=0 156 157die () { 158echo>&5"FATAL: Unexpected exit with code $?" 159exit1 160} 161 162trap'die'exit 163 164# The semantics of the editor variables are that of invoking 165# sh -c "$EDITOR \"$@\"" files ... 166# 167# If our trash directory contains shell metacharacters, they will be 168# interpreted if we just set $EDITOR directly, so do a little dance with 169# environment variables to work around this. 170# 171# In particular, quoting isn't enough, as the path may contain the same quote 172# that we're using. 173test_set_editor () { 174 FAKE_EDITOR="$1" 175export FAKE_EDITOR 176 VISUAL='"$FAKE_EDITOR"' 177export VISUAL 178} 179 180test_tick () { 181iftest -z"${test_tick+set}" 182then 183 test_tick=1112911993 184else 185 test_tick=$(($test_tick + 60)) 186fi 187 GIT_COMMITTER_DATE="$test_tick-0700" 188 GIT_AUTHOR_DATE="$test_tick-0700" 189export GIT_COMMITTER_DATE GIT_AUTHOR_DATE 190} 191 192# You are not expected to call test_ok_ and test_failure_ directly, use 193# the text_expect_* functions instead. 194 195test_ok_ () { 196 test_count=$(expr "$test_count" + 1) 197 say_color """ ok$test_count: $@" 198} 199 200test_failure_ () { 201 test_count=$(expr "$test_count" + 1) 202 test_failure=$(expr "$test_failure" + 1); 203 say_color error "FAIL$test_count:$1" 204shift 205echo"$@"|sed-e's/^/ /' 206test"$immediate"=""|| {trap-exit;exit1; } 207} 208 209test_known_broken_ok_ () { 210 test_count=$(expr "$test_count" + 1) 211 test_fixed=$(($test_fixed+1)) 212 say_color """ FIXED$test_count: $@" 213} 214 215test_known_broken_failure_ () { 216 test_count=$(expr "$test_count" + 1) 217 test_broken=$(($test_broken+1)) 218 say_color skip " still broken$test_count: $@" 219} 220 221test_debug () { 222test"$debug"=""||eval"$1" 223} 224 225test_run_ () { 226eval>&3 2>&4"$1" 227 eval_ret="$?" 228return0 229} 230 231test_skip () { 232 this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$') 233 this_test="$this_test.$(expr "$test_count" + 1)" 234 to_skip= 235 for skp in$GIT_SKIP_TESTS 236 do 237 case "$this_test" in 238$skp) 239 to_skip=t 240 esac 241 done 242 case "$to_skip" in 243 t) 244 say_color skip >&3 "skipping test: $@" 245 test_count=$(expr "$test_count" + 1) 246 say_color skip "skip$test_count:$1" 247 : true 248 ;; 249 *) 250 false 251 ;; 252 esac 253} 254 255test_expect_failure () { 256 test "$#" = 2 || 257 error "bug in the test script: not 2 parameters to test-expect-failure" 258 if ! test_skip "$@" 259 then 260 say >&3 "checking known breakage:$2" 261 test_run_ "$2" 262 if [ "$?" = 0 -a "$eval_ret" = 0 ] 263 then 264 test_known_broken_ok_ "$1" 265 else 266 test_known_broken_failure_ "$1" 267 fi 268 fi 269 echo >&3 "" 270} 271 272test_expect_success () { 273 test "$#" = 2 || 274 error "bug in the test script: not 2 parameters to test-expect-success" 275 if ! test_skip "$@" 276 then 277 say >&3 "expecting success:$2" 278 test_run_ "$2" 279 if [ "$?" = 0 -a "$eval_ret" = 0 ] 280 then 281 test_ok_ "$1" 282 else 283 test_failure_ "$@" 284 fi 285 fi 286 echo >&3 "" 287} 288 289test_expect_code () { 290 test "$#" = 3 || 291 error "bug in the test script: not 3 parameters to test-expect-code" 292 if ! test_skip "$@" 293 then 294 say >&3 "expecting exit code$1:$3" 295 test_run_ "$3" 296 if [ "$?" = 0 -a "$eval_ret" = "$1" ] 297 then 298 test_ok_ "$2" 299 else 300 test_failure_ "$@" 301 fi 302 fi 303 echo >&3 "" 304} 305 306# This is not among top-level (test_expect_success | test_expect_failure) 307# but is a prefix that can be used in the test script, like: 308# 309# test_expect_success 'complain and die' ' 310# do something && 311# do something else && 312# test_must_fail git checkout ../outerspace 313# ' 314# 315# Writing this as "! git checkout ../outerspace" is wrong, because 316# the failure could be due to a segv. We want a controlled failure. 317 318test_must_fail () { 319"$@" 320test $? -gt0-a $? -le129 321} 322 323# test_cmp is a helper function to compare actual and expected output. 324# You can use it like: 325# 326# test_expect_success 'foo works' ' 327# echo expected >expected && 328# foo >actual && 329# test_cmp expected actual 330# ' 331# 332# This could be written as either "cmp" or "diff -u", but: 333# - cmp's output is not nearly as easy to read as diff -u 334# - not all diff versions understand "-u" 335 336test_cmp() { 337$GIT_TEST_CMP"$@" 338} 339 340# Most tests can use the created repository, but some may need to create more. 341# Usage: test_create_repo <directory> 342test_create_repo () { 343test"$#"=1|| 344 error "bug in the test script: not 1 parameter to test-create-repo" 345 owd=`pwd` 346 repo="$1" 347mkdir"$repo" 348cd"$repo"|| error "Cannot setup test environment" 349"$GIT_EXEC_PATH/git" init "--template=$GIT_EXEC_PATH/templates/blt/">/dev/null 2>&1|| 350 error "cannot run git init -- have you built things yet?" 351mv .git/hooks .git/hooks-disabled 352cd"$owd" 353} 354 355test_done () { 356trap-exit 357 358iftest"$test_fixed"!=0 359then 360 say_color pass "fixed$test_fixedknown breakage(s)" 361fi 362iftest"$test_broken"!=0 363then 364 say_color error "still have$test_brokenknown breakage(s)" 365 msg="remaining$(($test_count-$test_broken)) test(s)" 366else 367 msg="$test_counttest(s)" 368fi 369case"$test_failure"in 3700) 371# We could: 372# cd .. && rm -fr trash 373# but that means we forbid any tests that use their own 374# subdirectory from calling test_done without coming back 375# to where they started from. 376# The Makefile provided will clean this test area so 377# we will leave things as they are. 378 379 say_color pass "passed all$msg" 380exit0;; 381 382*) 383 say_color error "failed$test_failureamong$msg" 384exit1;; 385 386esac 387} 388 389# Test the binaries we have just built. The tests are kept in 390# t/ subdirectory and are run in trash subdirectory. 391PATH=$(pwd)/..:$PATH 392GIT_EXEC_PATH=$(pwd)/.. 393GIT_TEMPLATE_DIR=$(pwd)/../templates/blt 394unset GIT_CONFIG 395unset GIT_CONFIG_LOCAL 396GIT_CONFIG_NOSYSTEM=1 397GIT_CONFIG_NOGLOBAL=1 398export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_CONFIG_NOGLOBAL 399 400GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git 401export GITPERLLIB 402test -d ../templates/blt || { 403 error "You haven't built things yet, have you?" 404} 405 406if!test -x ../test-chmtime;then 407echo>&2'You need to build test-chmtime:' 408echo>&2'Run "make test-chmtime" in the source (toplevel) directory' 409exit1 410fi 411 412. ../GIT-BUILD-OPTIONS 413 414# Test repository 415test="trash directory" 416rm-fr"$test"|| { 417trap-exit 418echo>&5"FATAL: Cannot prepare test area" 419exit1 420} 421 422test_create_repo "$test" 423cd"$test" 424 425this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$') 426for skp in$GIT_SKIP_TESTS 427do 428 to_skip= 429 for skp in$GIT_SKIP_TESTS 430 do 431 case "$this_test" in 432$skp) 433 to_skip=t 434 esac 435 done 436 case "$to_skip" in 437 t) 438 say_color skip >&3 "skipping test$this_testaltogether" 439 say_color skip "skip all tests in$this_test" 440 test_done 441 esac 442done