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