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