Merge branch 'lt/diff-tree'
[git/git.git] / t / test-lib.sh
CommitLineData
e1970ce4
JH
1#!/bin/sh
2#
3# Copyright (c) 2005 Junio C Hamano
4#
5
6# For repeatability, reset the environment to known value.
7LANG=C
899460f3 8LC_ALL=C
d9bdd39e 9PAGER=cat
e1970ce4 10TZ=UTC
899460f3 11export LANG LC_ALL PAGER TZ
e1970ce4
JH
12unset AUTHOR_DATE
13unset AUTHOR_EMAIL
14unset AUTHOR_NAME
15unset COMMIT_AUTHOR_EMAIL
16unset COMMIT_AUTHOR_NAME
17unset GIT_ALTERNATE_OBJECT_DIRECTORIES
18unset GIT_AUTHOR_DATE
19unset GIT_AUTHOR_EMAIL
20unset GIT_AUTHOR_NAME
6677c466 21unset GIT_COMMITTER_DATE
e1970ce4
JH
22unset GIT_COMMITTER_EMAIL
23unset GIT_COMMITTER_NAME
24unset GIT_DIFF_OPTS
25unset GIT_DIR
26unset GIT_EXTERNAL_DIFF
27unset GIT_INDEX_FILE
28unset GIT_OBJECT_DIRECTORY
29unset SHA1_FILE_DIRECTORIES
30unset SHA1_FILE_DIRECTORY
31
32# Each test should start with something like this, after copyright notices:
33#
34# test_description='Description of this test...
35# This test checks if command xyzzy does the right thing...
36# '
37# . ./test-lib.sh
38
39error () {
40 echo "* error: $*"
41184273 41 trap - exit
e1970ce4
JH
42 exit 1
43}
44
45say () {
46 echo "* $*"
47}
48
49test "${test_description}" != "" ||
50error "Test script did not set test_description."
51
52while test "$#" -ne 0
53do
54 case "$1" in
55 -d|--d|--de|--deb|--debu|--debug)
56 debug=t; shift ;;
886856ab
JH
57 -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
58 immediate=t; shift ;;
e1970ce4
JH
59 -h|--h|--he|--hel|--help)
60 echo "$test_description"
61 exit 0 ;;
62 -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
63 verbose=t; shift ;;
64 *)
65 break ;;
66 esac
67done
68
4d9d62fa 69exec 5>&1
e1970ce4
JH
70if test "$verbose" = "t"
71then
72 exec 4>&2 3>&1
73else
74 exec 4>/dev/null 3>/dev/null
75fi
76
77test_failure=0
78test_count=0
79
41184273
PR
80trap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit
81
e1970ce4 82
886856ab
JH
83# You are not expected to call test_ok_ and test_failure_ directly, use
84# the text_expect_* functions instead.
85
86test_ok_ () {
e1970ce4 87 test_count=$(expr "$test_count" + 1)
94e8afa2 88 say " ok $test_count: $@"
e1970ce4
JH
89}
90
886856ab 91test_failure_ () {
e1970ce4
JH
92 test_count=$(expr "$test_count" + 1)
93 test_failure=$(expr "$test_failure" + 1);
bf0dd8a8
JH
94 say "FAIL $test_count: $1"
95 shift
96 echo "$@" | sed -e 's/^/ /'
41184273 97 test "$immediate" = "" || { trap - exit; exit 1; }
886856ab
JH
98}
99
100
101test_debug () {
8e832ebc 102 test "$debug" = "" || eval "$1"
e1970ce4
JH
103}
104
4d9d62fa 105test_run_ () {
4d9d62fa
PR
106 eval >&3 2>&4 "$1"
107 eval_ret="$?"
4d9d62fa
PR
108 return 0
109}
110
e1970ce4 111test_expect_failure () {
8e832ebc 112 test "$#" = 2 ||
e1970ce4
JH
113 error "bug in the test script: not 2 parameters to test-expect-failure"
114 say >&3 "expecting failure: $2"
4d9d62fa
PR
115 test_run_ "$2"
116 if [ "$?" = 0 -a "$eval_ret" != 0 ]
e1970ce4 117 then
886856ab 118 test_ok_ "$1"
4d9d62fa
PR
119 else
120 test_failure_ "$@"
e1970ce4
JH
121 fi
122}
123
124test_expect_success () {
8e832ebc 125 test "$#" = 2 ||
e1970ce4
JH
126 error "bug in the test script: not 2 parameters to test-expect-success"
127 say >&3 "expecting success: $2"
4d9d62fa
PR
128 test_run_ "$2"
129 if [ "$?" = 0 -a "$eval_ret" = 0 ]
e1970ce4 130 then
886856ab 131 test_ok_ "$1"
e1970ce4 132 else
886856ab 133 test_failure_ "$@"
e1970ce4
JH
134 fi
135}
136
d3bfdb75
FK
137test_expect_code () {
138 test "$#" = 3 ||
139 error "bug in the test script: not 3 parameters to test-expect-code"
140 say >&3 "expecting exit code $1: $3"
141 test_run_ "$3"
142 if [ "$?" = 0 -a "$eval_ret" = "$1" ]
143 then
144 test_ok_ "$2"
145 else
146 test_failure_ "$@"
147 fi
148}
149
e1970ce4 150test_done () {
41184273 151 trap - exit
e1970ce4 152 case "$test_failure" in
10b94e28 153 0)
e1970ce4
JH
154 # We could:
155 # cd .. && rm -fr trash
156 # but that means we forbid any tests that use their own
157 # subdirectory from calling test_done without coming back
158 # to where they started from.
159 # The Makefile provided will clean this test area so
160 # we will leave things as they are.
161
162 say "passed all $test_count test(s)"
163 exit 0 ;;
164
165 *)
166 say "failed $test_failure among $test_count test(s)"
167 exit 1 ;;
168
169 esac
170}
171
172# Test the binaries we have just built. The tests are kept in
173# t/ subdirectory and are run in trash subdirectory.
174PATH=$(pwd)/..:$PATH
a0fa2a10 175GIT_EXEC_PATH=$(pwd)/..
49ccb087
JH
176export PATH GIT_EXEC_PATH
177
178# Similarly use ../compat/subprocess.py if our python does not
179# have subprocess.py on its own.
180PYTHON=`sed -e '1{
181 s/^#!//
182 q
eea42069
JH
183}' ../git-merge-recursive` || {
184 error "You haven't built things yet, have you?"
185}
49ccb087
JH
186"$PYTHON" -c 'import subprocess' 2>/dev/null || {
187 PYTHONPATH=$(pwd)/../compat
188 export PYTHONPATH
189}
eea42069
JH
190test -d ../templates/blt || {
191 error "You haven't built things yet, have you?"
192}
e1970ce4
JH
193
194# Test repository
195test=trash
196rm -fr "$test"
197mkdir "$test"
2ccd2027 198cd "$test" || error "Cannot setup test environment"
10b94e28 199"$GIT_EXEC_PATH/git" init-db --template=../../templates/blt/ 2>/dev/null ||
eea42069 200error "cannot run git init-db -- have you built things yet?"
c09a69a8
JH
201
202mv .git/hooks .git/hooks-disabled