1#!/bin/sh 2# 3# Copyright (c) 2005 Junio C Hamano 4# 5 6# For repeatability, reset the environment to known value. 7LANG=C 8LC_ALL=C 9PAGER=cat 10TZ=UTC 11export LANG LC_ALL PAGER TZ 12EDITOR=: 13VISUAL=: 14unset AUTHOR_DATE 15unset AUTHOR_EMAIL 16unset AUTHOR_NAME 17unset COMMIT_AUTHOR_EMAIL 18unset COMMIT_AUTHOR_NAME 19unset EMAIL 20unset GIT_ALTERNATE_OBJECT_DIRECTORIES 21unset GIT_AUTHOR_DATE 22GIT_AUTHOR_EMAIL=author@example.com 23GIT_AUTHOR_NAME='A U Thor' 24unset GIT_COMMITTER_DATE 25GIT_COMMITTER_EMAIL=committer@example.com 26GIT_COMMITTER_NAME='C O Mitter' 27unset GIT_DIFF_OPTS 28unset GIT_DIR 29unset GIT_EXTERNAL_DIFF 30unset GIT_INDEX_FILE 31unset GIT_OBJECT_DIRECTORY 32unset SHA1_FILE_DIRECTORIES 33unset SHA1_FILE_DIRECTORY 34GIT_MERGE_VERBOSITY=5 35export GIT_MERGE_VERBOSITY 36export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME 37export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME 38export EDITOR VISUAL 39 40# Protect ourselves from common misconfiguration to export 41# CDPATH into the environment 42unset CDPATH 43 44case$(echo $GIT_TRACE |tr "[A-Z]" "[a-z]")in 451|2|true) 46echo"* warning: Some tests will not work if GIT_TRACE" \ 47"is set as to trace on STDERR ! *" 48echo"* warning: Please set GIT_TRACE to something" \ 49"other than 1, 2 or true ! *" 50;; 51esac 52 53# Each test should start with something like this, after copyright notices: 54# 55# test_description='Description of this test... 56# This test checks if command xyzzy does the right thing... 57# ' 58# . ./test-lib.sh 59 60error () { 61echo"* error: $*" 62trap-exit 63exit1 64} 65 66say () { 67echo"* $*" 68} 69 70test"${test_description}"!=""|| 71error "Test script did not set test_description." 72 73whiletest"$#"-ne0 74do 75case"$1"in 76-d|--d|--de|--deb|--debu|--debug) 77 debug=t;shift;; 78-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 79 immediate=t;shift;; 80-h|--h|--he|--hel|--help) 81echo"$test_description" 82exit0;; 83-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 84 verbose=t;shift;; 85--no-python) 86# noop now... 87shift;; 88*) 89break;; 90esac 91done 92 93exec5>&1 94iftest"$verbose"="t" 95then 96exec4>&2 3>&1 97else 98exec4>/dev/null 3>/dev/null 99fi 100 101test_failure=0 102test_count=0 103 104trap'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1'exit 105 106test_tick () { 107iftest -z"${test_tick+set}" 108then 109 test_tick=1112911993 110else 111 test_tick=$(($test_tick + 60)) 112fi 113 GIT_COMMITTER_DATE="$test_tick-0700" 114 GIT_AUTHOR_DATE="$test_tick-0700" 115export GIT_COMMITTER_DATE GIT_AUTHOR_DATE 116} 117 118# You are not expected to call test_ok_ and test_failure_ directly, use 119# the text_expect_* functions instead. 120 121test_ok_ () { 122 test_count=$(expr "$test_count" + 1) 123 say " ok$test_count: $@" 124} 125 126test_failure_ () { 127 test_count=$(expr "$test_count" + 1) 128 test_failure=$(expr "$test_failure" + 1); 129 say "FAIL$test_count:$1" 130shift 131echo"$@"|sed-e's/^/ /' 132test"$immediate"=""|| {trap-exit;exit1; } 133} 134 135 136test_debug () { 137test"$debug"=""||eval"$1" 138} 139 140test_run_ () { 141eval>&3 2>&4"$1" 142 eval_ret="$?" 143return0 144} 145 146test_skip () { 147 this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$') 148 this_test="$this_test.$(expr "$test_count" + 1)" 149 to_skip= 150 for skp in$GIT_SKIP_TESTS 151 do 152 case "$this_test" in 153$skp) 154 to_skip=t 155 esac 156 done 157 case "$to_skip" in 158 t) 159 say >&3 "skipping test: $@" 160 test_count=$(expr "$test_count" + 1) 161 say "skip$test_count:$1" 162 : true 163 ;; 164 *) 165 false 166 ;; 167 esac 168} 169 170test_expect_failure () { 171 test "$#" = 2 || 172 error "bug in the test script: not 2 parameters to test-expect-failure" 173 if ! test_skip "$@" 174 then 175 say >&3 "expecting failure:$2" 176 test_run_ "$2" 177 if [ "$?" = 0 -a "$eval_ret" != 0 -a "$eval_ret" -lt 129 ] 178 then 179 test_ok_ "$1" 180 else 181 test_failure_ "$@" 182 fi 183 fi 184 echo >&3 "" 185} 186 187test_expect_success () { 188 test "$#" = 2 || 189 error "bug in the test script: not 2 parameters to test-expect-success" 190 if ! test_skip "$@" 191 then 192 say >&3 "expecting success:$2" 193 test_run_ "$2" 194 if [ "$?" = 0 -a "$eval_ret" = 0 ] 195 then 196 test_ok_ "$1" 197 else 198 test_failure_ "$@" 199 fi 200 fi 201 echo >&3 "" 202} 203 204test_expect_code () { 205 test "$#" = 3 || 206 error "bug in the test script: not 3 parameters to test-expect-code" 207 if ! test_skip "$@" 208 then 209 say >&3 "expecting exit code$1:$3" 210 test_run_ "$3" 211 if [ "$?" = 0 -a "$eval_ret" = "$1" ] 212 then 213 test_ok_ "$2" 214 else 215 test_failure_ "$@" 216 fi 217 fi 218 echo >&3 "" 219} 220 221# Most tests can use the created repository, but some amy need to create more. 222# Usage: test_create_repo <directory> 223test_create_repo () { 224 test "$#" = 1 || 225 error "bug in the test script: not 1 parameter to test-create-repo" 226 owd=`pwd` 227 repo="$1" 228 mkdir "$repo" 229 cd "$repo" || error "Cannot setup test environment" 230 "$GIT_EXEC_PATH/git" init --template=$GIT_EXEC_PATH/templates/blt/ >/dev/null 2>&1 || 231 error "cannot run git init -- have you built things yet?" 232 mv .git/hooks .git/hooks-disabled 233 cd "$owd" 234} 235 236test_done () { 237 trap - exit 238 case "$test_failure" in 239 0) 240 # We could: 241 # cd .. && rm -fr trash 242 # but that means we forbid any tests that use their own 243 # subdirectory from calling test_done without coming back 244 # to where they started from. 245 # The Makefile provided will clean this test area so 246 # we will leave things as they are. 247 248 say "passed all$test_counttest(s)" 249 exit 0 ;; 250 251 *) 252 say "failed$test_failureamong$test_counttest(s)" 253 exit 1 ;; 254 255 esac 256} 257 258# Test the binaries we have just built. The tests are kept in 259# t/ subdirectory and are run in trash subdirectory. 260PATH=$(pwd)/..:$PATH 261GIT_EXEC_PATH=$(pwd)/.. 262GIT_TEMPLATE_DIR=$(pwd)/../templates/blt 263GIT_CONFIG=.git/config 264export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG 265 266GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git 267export GITPERLLIB 268test -d ../templates/blt || { 269 error "You haven't built things yet, have you?" 270} 271 272if ! test -x ../test-chmtime; then 273 echo >&2 'You need to build test-chmtime:' 274 echo >&2 'Run "maketest-chmtime" in the source (toplevel) directory' 275 exit 1 276fi 277 278# Test repository 279test=trash 280rm -fr "$test" 281test_create_repo$test 282cd "$test" 283 284this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$') 285for skp in$GIT_SKIP_TESTS 286do 287 to_skip= 288 for skp in$GIT_SKIP_TESTS 289 do 290 case "$this_test" in 291$skp) 292 to_skip=t 293 esac 294 done 295 case "$to_skip" in 296 t) 297 say >&3 "skipping test$this_test altogether" 298 say "skip all tests in$this_test" 299 test_done 300 esac 301done