]>
Commit | Line | Data |
---|---|---|
e1970ce4 JH |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2005 Junio C Hamano | |
4 | # | |
5 | ||
c2116a17 JH |
6 | # Keep the original TERM for say_color |
7 | ORIGINAL_TERM=$TERM | |
8 | ||
e1970ce4 JH |
9 | # For repeatability, reset the environment to known value. |
10 | LANG=C | |
899460f3 | 11 | LC_ALL=C |
d9bdd39e | 12 | PAGER=cat |
e1970ce4 | 13 | TZ=UTC |
c2116a17 JH |
14 | TERM=dumb |
15 | export LANG LC_ALL PAGER TERM TZ | |
8ff99e74 EW |
16 | EDITOR=: |
17 | VISUAL=: | |
18508c39 | 18 | unset GIT_EDITOR |
e1970ce4 JH |
19 | unset AUTHOR_DATE |
20 | unset AUTHOR_EMAIL | |
21 | unset AUTHOR_NAME | |
22 | unset COMMIT_AUTHOR_EMAIL | |
23 | unset COMMIT_AUTHOR_NAME | |
28a94f88 | 24 | unset EMAIL |
e1970ce4 JH |
25 | unset GIT_ALTERNATE_OBJECT_DIRECTORIES |
26 | unset GIT_AUTHOR_DATE | |
29e55cd5 JH |
27 | GIT_AUTHOR_EMAIL=author@example.com |
28 | GIT_AUTHOR_NAME='A U Thor' | |
6677c466 | 29 | unset GIT_COMMITTER_DATE |
29e55cd5 JH |
30 | GIT_COMMITTER_EMAIL=committer@example.com |
31 | GIT_COMMITTER_NAME='C O Mitter' | |
e1970ce4 JH |
32 | unset GIT_DIFF_OPTS |
33 | unset GIT_DIR | |
892c41b9 | 34 | unset GIT_WORK_TREE |
e1970ce4 JH |
35 | unset GIT_EXTERNAL_DIFF |
36 | unset GIT_INDEX_FILE | |
37 | unset GIT_OBJECT_DIRECTORY | |
38 | unset SHA1_FILE_DIRECTORIES | |
39 | unset SHA1_FILE_DIRECTORY | |
8d0fc48f SP |
40 | GIT_MERGE_VERBOSITY=5 |
41 | export GIT_MERGE_VERBOSITY | |
29e55cd5 JH |
42 | export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME |
43 | export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME | |
8ff99e74 | 44 | export EDITOR VISUAL |
82ebb0b6 | 45 | GIT_TEST_CMP=${GIT_TEST_CMP:-diff -u} |
e1970ce4 | 46 | |
886a3907 JH |
47 | # Protect ourselves from common misconfiguration to export |
48 | # CDPATH into the environment | |
49 | unset CDPATH | |
50 | ||
3d5c0cc9 | 51 | case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in |
6ce4e61f CC |
52 | 1|2|true) |
53 | echo "* warning: Some tests will not work if GIT_TRACE" \ | |
54 | "is set as to trace on STDERR ! *" | |
55 | echo "* warning: Please set GIT_TRACE to something" \ | |
56 | "other than 1, 2 or true ! *" | |
57 | ;; | |
58 | esac | |
59 | ||
e1970ce4 JH |
60 | # Each test should start with something like this, after copyright notices: |
61 | # | |
62 | # test_description='Description of this test... | |
63 | # This test checks if command xyzzy does the right thing... | |
64 | # ' | |
65 | # . ./test-lib.sh | |
c2116a17 JH |
66 | [ "x$ORIGINAL_TERM" != "xdumb" ] && ( |
67 | TERM=$ORIGINAL_TERM && | |
68 | export TERM && | |
69 | [ -t 1 ] && | |
70 | tput bold >/dev/null 2>&1 && | |
71 | tput setaf 1 >/dev/null 2>&1 && | |
72 | tput sgr0 >/dev/null 2>&1 | |
73 | ) && | |
55db1df0 | 74 | color=t |
e1970ce4 | 75 | |
e1970ce4 JH |
76 | while test "$#" -ne 0 |
77 | do | |
78 | case "$1" in | |
79 | -d|--d|--de|--deb|--debu|--debug) | |
80 | debug=t; shift ;; | |
886856ab JH |
81 | -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) |
82 | immediate=t; shift ;; | |
e1970ce4 | 83 | -h|--h|--he|--hel|--help) |
570f3226 | 84 | help=t; shift ;; |
e1970ce4 JH |
85 | -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) |
86 | verbose=t; shift ;; | |
1ece1274 PH |
87 | -q|--q|--qu|--qui|--quie|--quiet) |
88 | quiet=t; shift ;; | |
55db1df0 | 89 | --no-color) |
faa4bc35 | 90 | color=; shift ;; |
abb7c7b3 | 91 | --no-python) |
7cdbff14 JH |
92 | # noop now... |
93 | shift ;; | |
e1970ce4 JH |
94 | *) |
95 | break ;; | |
96 | esac | |
97 | done | |
98 | ||
55db1df0 PH |
99 | if test -n "$color"; then |
100 | say_color () { | |
c2116a17 JH |
101 | ( |
102 | TERM=$ORIGINAL_TERM | |
103 | export TERM | |
55db1df0 PH |
104 | case "$1" in |
105 | error) tput bold; tput setaf 1;; # bold red | |
106 | skip) tput bold; tput setaf 2;; # bold green | |
107 | pass) tput setaf 2;; # green | |
108 | info) tput setaf 3;; # brown | |
1ece1274 | 109 | *) test -n "$quiet" && return;; |
55db1df0 PH |
110 | esac |
111 | shift | |
112 | echo "* $*" | |
113 | tput sgr0 | |
c2116a17 | 114 | ) |
55db1df0 PH |
115 | } |
116 | else | |
117 | say_color() { | |
1ece1274 | 118 | test -z "$1" && test -n "$quiet" && return |
55db1df0 PH |
119 | shift |
120 | echo "* $*" | |
121 | } | |
122 | fi | |
123 | ||
124 | error () { | |
125 | say_color error "error: $*" | |
126 | trap - exit | |
127 | exit 1 | |
128 | } | |
129 | ||
130 | say () { | |
131 | say_color info "$*" | |
132 | } | |
133 | ||
570f3226 MB |
134 | test "${test_description}" != "" || |
135 | error "Test script did not set test_description." | |
136 | ||
137 | if test "$help" = "t" | |
138 | then | |
139 | echo "$test_description" | |
140 | exit 0 | |
141 | fi | |
142 | ||
4d9d62fa | 143 | exec 5>&1 |
e1970ce4 JH |
144 | if test "$verbose" = "t" |
145 | then | |
146 | exec 4>&2 3>&1 | |
147 | else | |
148 | exec 4>/dev/null 3>/dev/null | |
149 | fi | |
150 | ||
151 | test_failure=0 | |
152 | test_count=0 | |
41ac414e JH |
153 | test_fixed=0 |
154 | test_broken=0 | |
e1970ce4 | 155 | |
faa4bc35 CB |
156 | die () { |
157 | echo >&5 "FATAL: Unexpected exit with code $?" | |
158 | exit 1 | |
159 | } | |
160 | ||
161 | trap 'die' exit | |
41184273 | 162 | |
04509738 JH |
163 | test_tick () { |
164 | if test -z "${test_tick+set}" | |
165 | then | |
21afc41c | 166 | test_tick=1112911993 |
04509738 JH |
167 | else |
168 | test_tick=$(($test_tick + 60)) | |
169 | fi | |
21afc41c JH |
170 | GIT_COMMITTER_DATE="$test_tick -0700" |
171 | GIT_AUTHOR_DATE="$test_tick -0700" | |
04509738 JH |
172 | export GIT_COMMITTER_DATE GIT_AUTHOR_DATE |
173 | } | |
e1970ce4 | 174 | |
886856ab JH |
175 | # You are not expected to call test_ok_ and test_failure_ directly, use |
176 | # the text_expect_* functions instead. | |
177 | ||
178 | test_ok_ () { | |
e1970ce4 | 179 | test_count=$(expr "$test_count" + 1) |
55db1df0 | 180 | say_color "" " ok $test_count: $@" |
e1970ce4 JH |
181 | } |
182 | ||
886856ab | 183 | test_failure_ () { |
e1970ce4 JH |
184 | test_count=$(expr "$test_count" + 1) |
185 | test_failure=$(expr "$test_failure" + 1); | |
55db1df0 | 186 | say_color error "FAIL $test_count: $1" |
bf0dd8a8 JH |
187 | shift |
188 | echo "$@" | sed -e 's/^/ /' | |
41184273 | 189 | test "$immediate" = "" || { trap - exit; exit 1; } |
886856ab JH |
190 | } |
191 | ||
41ac414e JH |
192 | test_known_broken_ok_ () { |
193 | test_count=$(expr "$test_count" + 1) | |
194 | test_fixed=$(($test_fixed+1)) | |
195 | say_color "" " FIXED $test_count: $@" | |
196 | } | |
197 | ||
198 | test_known_broken_failure_ () { | |
199 | test_count=$(expr "$test_count" + 1) | |
200 | test_broken=$(($test_broken+1)) | |
201 | say_color skip " still broken $test_count: $@" | |
202 | } | |
886856ab JH |
203 | |
204 | test_debug () { | |
8e832ebc | 205 | test "$debug" = "" || eval "$1" |
e1970ce4 JH |
206 | } |
207 | ||
4d9d62fa | 208 | test_run_ () { |
4d9d62fa PR |
209 | eval >&3 2>&4 "$1" |
210 | eval_ret="$?" | |
4d9d62fa PR |
211 | return 0 |
212 | } | |
213 | ||
04ece593 JH |
214 | test_skip () { |
215 | this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$') | |
216 | this_test="$this_test.$(expr "$test_count" + 1)" | |
217 | to_skip= | |
218 | for skp in $GIT_SKIP_TESTS | |
219 | do | |
220 | case "$this_test" in | |
221 | $skp) | |
222 | to_skip=t | |
223 | esac | |
224 | done | |
225 | case "$to_skip" in | |
226 | t) | |
55db1df0 | 227 | say_color skip >&3 "skipping test: $@" |
04ece593 | 228 | test_count=$(expr "$test_count" + 1) |
55db1df0 | 229 | say_color skip "skip $test_count: $1" |
04ece593 JH |
230 | : true |
231 | ;; | |
232 | *) | |
233 | false | |
234 | ;; | |
235 | esac | |
236 | } | |
237 | ||
e1970ce4 | 238 | test_expect_failure () { |
8e832ebc | 239 | test "$#" = 2 || |
e1970ce4 | 240 | error "bug in the test script: not 2 parameters to test-expect-failure" |
04ece593 | 241 | if ! test_skip "$@" |
e1970ce4 | 242 | then |
41ac414e | 243 | say >&3 "checking known breakage: $2" |
04ece593 | 244 | test_run_ "$2" |
41ac414e | 245 | if [ "$?" = 0 -a "$eval_ret" = 0 ] |
04ece593 | 246 | then |
41ac414e | 247 | test_known_broken_ok_ "$1" |
04ece593 | 248 | else |
41ac414e | 249 | test_known_broken_failure_ "$1" |
04ece593 | 250 | fi |
e1970ce4 | 251 | fi |
7a0cf2d0 | 252 | echo >&3 "" |
e1970ce4 JH |
253 | } |
254 | ||
255 | test_expect_success () { | |
8e832ebc | 256 | test "$#" = 2 || |
e1970ce4 | 257 | error "bug in the test script: not 2 parameters to test-expect-success" |
04ece593 | 258 | if ! test_skip "$@" |
e1970ce4 | 259 | then |
04ece593 JH |
260 | say >&3 "expecting success: $2" |
261 | test_run_ "$2" | |
262 | if [ "$?" = 0 -a "$eval_ret" = 0 ] | |
263 | then | |
264 | test_ok_ "$1" | |
265 | else | |
266 | test_failure_ "$@" | |
267 | fi | |
e1970ce4 | 268 | fi |
7a0cf2d0 | 269 | echo >&3 "" |
e1970ce4 JH |
270 | } |
271 | ||
d3bfdb75 FK |
272 | test_expect_code () { |
273 | test "$#" = 3 || | |
274 | error "bug in the test script: not 3 parameters to test-expect-code" | |
04ece593 | 275 | if ! test_skip "$@" |
d3bfdb75 | 276 | then |
04ece593 JH |
277 | say >&3 "expecting exit code $1: $3" |
278 | test_run_ "$3" | |
279 | if [ "$?" = 0 -a "$eval_ret" = "$1" ] | |
280 | then | |
281 | test_ok_ "$2" | |
282 | else | |
283 | test_failure_ "$@" | |
284 | fi | |
d3bfdb75 | 285 | fi |
7a0cf2d0 | 286 | echo >&3 "" |
d3bfdb75 FK |
287 | } |
288 | ||
74359821 JH |
289 | # This is not among top-level (test_expect_success | test_expect_failure) |
290 | # but is a prefix that can be used in the test script, like: | |
291 | # | |
292 | # test_expect_success 'complain and die' ' | |
293 | # do something && | |
294 | # do something else && | |
295 | # test_must_fail git checkout ../outerspace | |
296 | # ' | |
297 | # | |
298 | # Writing this as "! git checkout ../outerspace" is wrong, because | |
299 | # the failure could be due to a segv. We want a controlled failure. | |
300 | ||
301 | test_must_fail () { | |
302 | "$@" | |
303 | test $? -gt 0 -a $? -le 128 | |
304 | } | |
305 | ||
82ebb0b6 JK |
306 | # test_cmp is a helper function to compare actual and expected output. |
307 | # You can use it like: | |
308 | # | |
309 | # test_expect_success 'foo works' ' | |
310 | # echo expected >expected && | |
311 | # foo >actual && | |
312 | # test_cmp expected actual | |
313 | # ' | |
314 | # | |
315 | # This could be written as either "cmp" or "diff -u", but: | |
316 | # - cmp's output is not nearly as easy to read as diff -u | |
317 | # - not all diff versions understand "-u" | |
318 | ||
319 | test_cmp() { | |
320 | $GIT_TEST_CMP "$@" | |
321 | } | |
322 | ||
0509eb21 | 323 | # Most tests can use the created repository, but some may need to create more. |
eedf8f97 CW |
324 | # Usage: test_create_repo <directory> |
325 | test_create_repo () { | |
326 | test "$#" = 1 || | |
327 | error "bug in the test script: not 1 parameter to test-create-repo" | |
328 | owd=`pwd` | |
329 | repo="$1" | |
330 | mkdir "$repo" | |
331 | cd "$repo" || error "Cannot setup test environment" | |
5c94f87e NP |
332 | "$GIT_EXEC_PATH/git" init --template=$GIT_EXEC_PATH/templates/blt/ >/dev/null 2>&1 || |
333 | error "cannot run git init -- have you built things yet?" | |
eedf8f97 CW |
334 | mv .git/hooks .git/hooks-disabled |
335 | cd "$owd" | |
336 | } | |
a6080a0a | 337 | |
e1970ce4 | 338 | test_done () { |
41184273 | 339 | trap - exit |
41ac414e JH |
340 | |
341 | if test "$test_fixed" != 0 | |
342 | then | |
343 | say_color pass "fixed $test_fixed known breakage(s)" | |
344 | fi | |
345 | if test "$test_broken" != 0 | |
346 | then | |
347 | say_color error "still have $test_broken known breakage(s)" | |
11d54b8b JH |
348 | msg="remaining $(($test_count-$test_broken)) test(s)" |
349 | else | |
350 | msg="$test_count test(s)" | |
41ac414e | 351 | fi |
e1970ce4 | 352 | case "$test_failure" in |
10b94e28 | 353 | 0) |
e1970ce4 JH |
354 | # We could: |
355 | # cd .. && rm -fr trash | |
356 | # but that means we forbid any tests that use their own | |
357 | # subdirectory from calling test_done without coming back | |
358 | # to where they started from. | |
359 | # The Makefile provided will clean this test area so | |
360 | # we will leave things as they are. | |
361 | ||
11d54b8b | 362 | say_color pass "passed all $msg" |
e1970ce4 JH |
363 | exit 0 ;; |
364 | ||
365 | *) | |
11d54b8b | 366 | say_color error "failed $test_failure among $msg" |
e1970ce4 JH |
367 | exit 1 ;; |
368 | ||
369 | esac | |
370 | } | |
371 | ||
372 | # Test the binaries we have just built. The tests are kept in | |
373 | # t/ subdirectory and are run in trash subdirectory. | |
374 | PATH=$(pwd)/..:$PATH | |
a0fa2a10 | 375 | GIT_EXEC_PATH=$(pwd)/.. |
8683a45d | 376 | GIT_TEMPLATE_DIR=$(pwd)/../templates/blt |
8bfa6bd6 JK |
377 | unset GIT_CONFIG |
378 | unset GIT_CONFIG_LOCAL | |
379 | GIT_CONFIG_NOSYSTEM=1 | |
380 | GIT_CONFIG_NOGLOBAL=1 | |
381 | export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_CONFIG_NOGLOBAL | |
49ccb087 | 382 | |
6fcca938 PB |
383 | GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git |
384 | export GITPERLLIB | |
eea42069 JH |
385 | test -d ../templates/blt || { |
386 | error "You haven't built things yet, have you?" | |
387 | } | |
e1970ce4 | 388 | |
56cf9806 EW |
389 | if ! test -x ../test-chmtime; then |
390 | echo >&2 'You need to build test-chmtime:' | |
391 | echo >&2 'Run "make test-chmtime" in the source (toplevel) directory' | |
392 | exit 1 | |
393 | fi | |
394 | ||
7cf7f54a JK |
395 | . ../GIT-BUILD-OPTIONS |
396 | ||
e1970ce4 JH |
397 | # Test repository |
398 | test=trash | |
399 | rm -fr "$test" | |
eedf8f97 CW |
400 | test_create_repo $test |
401 | cd "$test" | |
04ece593 JH |
402 | |
403 | this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$') | |
404 | for skp in $GIT_SKIP_TESTS | |
405 | do | |
406 | to_skip= | |
407 | for skp in $GIT_SKIP_TESTS | |
408 | do | |
409 | case "$this_test" in | |
410 | $skp) | |
411 | to_skip=t | |
412 | esac | |
413 | done | |
414 | case "$to_skip" in | |
415 | t) | |
55db1df0 PH |
416 | say_color skip >&3 "skipping test $this_test altogether" |
417 | say_color skip "skip all tests in $this_test" | |
04ece593 JH |
418 | test_done |
419 | esac | |
420 | done |