Commit | Line | Data |
---|---|---|
aa9b1b9d YD |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2005 Junio C Hamano | |
4 | # Copyright (c) 2006 Yann Dirson - tuning for stgit | |
5 | # | |
6 | ||
7 | # For repeatability, reset the environment to known value. | |
8 | LANG=C | |
9 | LC_ALL=C | |
10 | PAGER=cat | |
11 | TZ=UTC | |
12 | export LANG LC_ALL PAGER TZ | |
48eaeebe YD |
13 | EDITOR=: |
14 | VISUAL=: | |
aa9b1b9d YD |
15 | unset AUTHOR_DATE |
16 | unset AUTHOR_EMAIL | |
17 | unset AUTHOR_NAME | |
18 | unset COMMIT_AUTHOR_EMAIL | |
19 | unset COMMIT_AUTHOR_NAME | |
48eaeebe | 20 | unset EMAIL |
aa9b1b9d YD |
21 | unset GIT_ALTERNATE_OBJECT_DIRECTORIES |
22 | unset GIT_AUTHOR_DATE | |
5cd9e87f CM |
23 | #GIT_AUTHOR_EMAIL=author@example.com |
24 | #GIT_AUTHOR_NAME='A U Thor' | |
aa9b1b9d | 25 | unset GIT_COMMITTER_DATE |
5cd9e87f CM |
26 | #GIT_COMMITTER_EMAIL=committer@example.com |
27 | #GIT_COMMITTER_NAME='C O Mitter' | |
aa9b1b9d YD |
28 | unset GIT_DIFF_OPTS |
29 | unset GIT_DIR | |
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 | |
48eaeebe YD |
35 | GIT_MERGE_VERBOSITY=5 |
36 | export GIT_MERGE_VERBOSITY | |
aa9b1b9d YD |
37 | export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME |
38 | export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME | |
48eaeebe YD |
39 | export EDITOR VISUAL |
40 | ||
41 | # Protect ourselves from common misconfiguration to export | |
42 | # CDPATH into the environment | |
43 | unset CDPATH | |
44 | ||
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 ! *" | |
51 | ;; | |
52 | esac | |
aa9b1b9d YD |
53 | |
54 | # Each test should start with something like this, after copyright notices: | |
55 | # | |
56 | # test_description='Description of this test... | |
57 | # This test checks if command xyzzy does the right thing... | |
58 | # ' | |
59 | # . ./test-lib.sh | |
60 | ||
61 | error () { | |
62 | echo "* error: $*" | |
63 | trap - exit | |
64 | exit 1 | |
65 | } | |
66 | ||
67 | say () { | |
68 | echo "* $*" | |
69 | } | |
70 | ||
71 | test "${test_description}" != "" || | |
72 | error "Test script did not set test_description." | |
73 | ||
74 | while test "$#" -ne 0 | |
75 | do | |
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) | |
b2017c38 | 85 | export STGIT_DEBUG_LEVEL="-1" |
aa9b1b9d YD |
86 | verbose=t; shift ;; |
87 | *) | |
88 | break ;; | |
89 | esac | |
90 | done | |
91 | ||
92 | exec 5>&1 | |
93 | if test "$verbose" = "t" | |
94 | then | |
95 | exec 4>&2 3>&1 | |
96 | else | |
97 | exec 4>/dev/null 3>/dev/null | |
98 | fi | |
99 | ||
100 | test_failure=0 | |
101 | test_count=0 | |
102 | ||
103 | trap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit | |
104 | ||
48eaeebe YD |
105 | test_tick () { |
106 | if test -z "${test_tick+set}" | |
107 | then | |
108 | test_tick=1112911993 | |
109 | else | |
110 | test_tick=$(($test_tick + 60)) | |
111 | fi | |
112 | GIT_COMMITTER_DATE="$test_tick -0700" | |
113 | GIT_AUTHOR_DATE="$test_tick -0700" | |
114 | export GIT_COMMITTER_DATE GIT_AUTHOR_DATE | |
115 | } | |
aa9b1b9d YD |
116 | |
117 | # You are not expected to call test_ok_ and test_failure_ directly, use | |
118 | # the text_expect_* functions instead. | |
119 | ||
120 | test_ok_ () { | |
121 | test_count=$(expr "$test_count" + 1) | |
122 | say " ok $test_count: $@" | |
123 | } | |
124 | ||
125 | test_failure_ () { | |
126 | test_count=$(expr "$test_count" + 1) | |
127 | test_failure=$(expr "$test_failure" + 1); | |
128 | say "FAIL $test_count: $1" | |
129 | shift | |
130 | echo "$@" | sed -e 's/^/ /' | |
131 | test "$immediate" = "" || { trap - exit; exit 1; } | |
132 | } | |
133 | ||
134 | ||
135 | test_debug () { | |
136 | test "$debug" = "" || eval "$1" | |
137 | } | |
138 | ||
139 | test_run_ () { | |
140 | eval >&3 2>&4 "$1" | |
141 | eval_ret="$?" | |
142 | return 0 | |
143 | } | |
144 | ||
48eaeebe YD |
145 | test_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 | ||
aa9b1b9d YD |
169 | test_expect_failure () { |
170 | test "$#" = 2 || | |
171 | error "bug in the test script: not 2 parameters to test-expect-failure" | |
48eaeebe | 172 | if ! test_skip "$@" |
aa9b1b9d | 173 | then |
48eaeebe YD |
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 | |
aa9b1b9d | 182 | fi |
48eaeebe | 183 | echo >&3 "" |
aa9b1b9d YD |
184 | } |
185 | ||
186 | test_expect_success () { | |
187 | test "$#" = 2 || | |
188 | error "bug in the test script: not 2 parameters to test-expect-success" | |
48eaeebe | 189 | if ! test_skip "$@" |
aa9b1b9d | 190 | then |
48eaeebe YD |
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 | |
aa9b1b9d | 199 | fi |
48eaeebe | 200 | echo >&3 "" |
aa9b1b9d YD |
201 | } |
202 | ||
203 | test_expect_code () { | |
204 | test "$#" = 3 || | |
205 | error "bug in the test script: not 3 parameters to test-expect-code" | |
48eaeebe | 206 | if ! test_skip "$@" |
aa9b1b9d | 207 | then |
48eaeebe YD |
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 | |
aa9b1b9d | 216 | fi |
48eaeebe | 217 | echo >&3 "" |
aa9b1b9d YD |
218 | } |
219 | ||
220 | # Most tests can use the created repository, but some amy need to create more. | |
221 | # Usage: test_create_repo <directory> | |
222 | test_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" | |
48eaeebe YD |
229 | git-init >/dev/null 2>&1 || |
230 | error "cannot run git-init -- have you installed git-core?" | |
aa9b1b9d YD |
231 | mv .git/hooks .git/hooks-disabled |
232 | echo "empty start" | | |
56ba8918 | 233 | git-commit-tree `git-write-tree` >.git/refs/heads/master 2>&4 || |
a9d090f4 | 234 | error "cannot run git-commit -- is your git-core functioning?" |
aa9b1b9d YD |
235 | cd "$owd" |
236 | } | |
237 | ||
238 | test_done () { | |
239 | trap - exit | |
240 | case "$test_failure" in | |
241 | 0) | |
242 | # We could: | |
243 | # cd .. && rm -fr trash | |
244 | # but that means we forbid any tests that use their own | |
245 | # subdirectory from calling test_done without coming back | |
246 | # to where they started from. | |
247 | # The Makefile provided will clean this test area so | |
248 | # we will leave things as they are. | |
249 | ||
250 | say "passed all $test_count test(s)" | |
251 | exit 0 ;; | |
252 | ||
253 | *) | |
254 | say "failed $test_failure among $test_count test(s)" | |
255 | exit 1 ;; | |
256 | ||
257 | esac | |
258 | } | |
259 | ||
260 | # Test the binaries we have just built. The tests are kept in | |
261 | # t/ subdirectory and are run in trash subdirectory. | |
262 | PATH=$(pwd)/..:$PATH | |
29d9e8ce | 263 | HOME=$(pwd)/trash |
48eaeebe YD |
264 | GIT_CONFIG=.git/config |
265 | export PATH HOME GIT_CONFIG | |
aa9b1b9d YD |
266 | |
267 | ||
268 | # Test repository | |
269 | test=trash | |
270 | rm -fr "$test" | |
271 | test_create_repo $test | |
272 | cd "$test" | |
48eaeebe YD |
273 | |
274 | this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$') | |
275 | for skp in $GIT_SKIP_TESTS | |
276 | do | |
277 | to_skip= | |
278 | for skp in $GIT_SKIP_TESTS | |
279 | do | |
280 | case "$this_test" in | |
281 | $skp) | |
282 | to_skip=t | |
283 | esac | |
284 | done | |
285 | case "$to_skip" in | |
286 | t) | |
287 | say >&3 "skipping test $this_test altogether" | |
288 | say "skip all tests in $this_test" | |
289 | test_done | |
290 | esac | |
291 | done |