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