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