Merge branch 'tb/commit-graph-genv2-upgrade-fix' into maint
[git/debian.git] / t / t0000-basic.sh
blob17a268ccd1b014201e25c810ebade41f6f31aecf
1 #!/bin/sh
3 # Copyright (c) 2005 Junio C Hamano
6 test_description='Test the very basics part #1.
8 The rest of the test suite does not check the basic operation of git
9 plumbing commands to work very carefully. Their job is to concentrate
10 on tricky features that caused bugs in the past to detect regression.
12 This test runs very basic features, like registering things in cache,
13 writing tree, etc.
15 Note that this test *deliberately* hard-codes many expected object
16 IDs. When object ID computation changes, like in the previous case of
17 swapping compression and hashing order, the person who is making the
18 modification *should* take notice and update the test vectors here.
21 . ./test-lib.sh
22 . "$TEST_DIRECTORY"/lib-subtest.sh
24 try_local_xy () {
25 local x="local" y="alsolocal" &&
26 echo "$x $y"
29 # Check whether the shell supports the "local" keyword. "local" is not
30 # POSIX-standard, but it is very widely supported by POSIX-compliant
31 # shells, and we rely on it within Git's test framework.
33 # If your shell fails this test, the results of other tests may be
34 # unreliable. You may wish to report the problem to the Git mailing
35 # list <git@vger.kernel.org>, as it could cause us to reconsider
36 # relying on "local".
37 test_expect_success 'verify that the running shell supports "local"' '
38 x="notlocal" &&
39 y="alsonotlocal" &&
40 echo "local alsolocal" >expected1 &&
41 try_local_xy >actual1 &&
42 test_cmp expected1 actual1 &&
43 echo "notlocal alsonotlocal" >expected2 &&
44 echo "$x $y" >actual2 &&
45 test_cmp expected2 actual2
48 ################################################################
49 # git init has been done in an empty repository.
50 # make sure it is empty.
52 test_expect_success '.git/objects should be empty after git init in an empty repo' '
53 find .git/objects -type f -print >should-be-empty &&
54 test_line_count = 0 should-be-empty
57 # also it should have 2 subdirectories; no fan-out anymore, pack, and info.
58 # 3 is counting "objects" itself
59 test_expect_success '.git/objects should have 3 subdirectories' '
60 find .git/objects -type d -print >full-of-directories &&
61 test_line_count = 3 full-of-directories
64 ################################################################
65 # Test harness
66 test_expect_success 'success is reported like this' '
70 test_expect_success 'subtest: 3 passing tests' '
71 write_and_run_sub_test_lib_test full-pass <<-\EOF &&
72 for i in 1 2 3
74 test_expect_success "passing test #$i" "true"
75 done
76 test_done
77 EOF
78 check_sub_test_lib_test full-pass <<-\EOF
79 > ok 1 - passing test #1
80 > ok 2 - passing test #2
81 > ok 3 - passing test #3
82 > # passed all 3 test(s)
83 > 1..3
84 EOF
87 test_expect_success 'subtest: 2/3 tests passing' '
88 write_and_run_sub_test_lib_test_err partial-pass <<-\EOF &&
89 test_expect_success "passing test #1" "true"
90 test_expect_success "failing test #2" "false"
91 test_expect_success "passing test #3" "true"
92 test_done
93 EOF
94 check_sub_test_lib_test partial-pass <<-\EOF
95 > ok 1 - passing test #1
96 > not ok 2 - failing test #2
97 # false
98 > ok 3 - passing test #3
99 > # failed 1 among 3 test(s)
100 > 1..3
104 test_expect_success 'subtest: --immediate' '
105 run_sub_test_lib_test_err partial-pass \
106 --immediate &&
107 check_sub_test_lib_test_err partial-pass \
108 <<-\EOF_OUT 3<<-EOF_ERR
109 > ok 1 - passing test #1
110 > not ok 2 - failing test #2
111 > # false
112 > 1..2
113 EOF_OUT
114 EOF_ERR
117 test_expect_success 'subtest: a failing TODO test' '
118 write_and_run_sub_test_lib_test failing-todo <<-\EOF &&
119 test_expect_success "passing test" "true"
120 test_expect_failure "pretend we have a known breakage" "false"
121 test_done
123 check_sub_test_lib_test failing-todo <<-\EOF
124 > ok 1 - passing test
125 > not ok 2 - pretend we have a known breakage # TODO known breakage
126 > # still have 1 known breakage(s)
127 > # passed all remaining 1 test(s)
128 > 1..2
132 test_expect_success 'subtest: a passing TODO test' '
133 write_and_run_sub_test_lib_test passing-todo <<-\EOF &&
134 test_expect_failure "pretend we have fixed a known breakage" "true"
135 test_done
137 check_sub_test_lib_test passing-todo <<-\EOF
138 > ok 1 - pretend we have fixed a known breakage # TODO known breakage vanished
139 > # 1 known breakage(s) vanished; please update test(s)
140 > 1..1
144 test_expect_success 'subtest: 2 TODO tests, one passin' '
145 write_and_run_sub_test_lib_test partially-passing-todos <<-\EOF &&
146 test_expect_failure "pretend we have a known breakage" "false"
147 test_expect_success "pretend we have a passing test" "true"
148 test_expect_failure "pretend we have fixed another known breakage" "true"
149 test_done
151 check_sub_test_lib_test partially-passing-todos <<-\EOF
152 > not ok 1 - pretend we have a known breakage # TODO known breakage
153 > ok 2 - pretend we have a passing test
154 > ok 3 - pretend we have fixed another known breakage # TODO known breakage vanished
155 > # 1 known breakage(s) vanished; please update test(s)
156 > # still have 1 known breakage(s)
157 > # passed all remaining 1 test(s)
158 > 1..3
162 test_expect_success 'subtest: mixed results: pass, failure and a TODO test' '
163 write_and_run_sub_test_lib_test_err mixed-results1 <<-\EOF &&
164 test_expect_success "passing test" "true"
165 test_expect_success "failing test" "false"
166 test_expect_failure "pretend we have a known breakage" "false"
167 test_done
169 check_sub_test_lib_test mixed-results1 <<-\EOF
170 > ok 1 - passing test
171 > not ok 2 - failing test
172 > # false
173 > not ok 3 - pretend we have a known breakage # TODO known breakage
174 > # still have 1 known breakage(s)
175 > # failed 1 among remaining 2 test(s)
176 > 1..3
180 test_expect_success 'subtest: mixed results: a mixture of all possible results' '
181 write_and_run_sub_test_lib_test_err mixed-results2 <<-\EOF &&
182 test_expect_success "passing test" "true"
183 test_expect_success "passing test" "true"
184 test_expect_success "passing test" "true"
185 test_expect_success "passing test" "true"
186 test_expect_success "failing test" "false"
187 test_expect_success "failing test" "false"
188 test_expect_success "failing test" "false"
189 test_expect_failure "pretend we have a known breakage" "false"
190 test_expect_failure "pretend we have a known breakage" "false"
191 test_expect_failure "pretend we have fixed a known breakage" "true"
192 test_done
194 check_sub_test_lib_test mixed-results2 <<-\EOF
195 > ok 1 - passing test
196 > ok 2 - passing test
197 > ok 3 - passing test
198 > ok 4 - passing test
199 > not ok 5 - failing test
200 > # false
201 > not ok 6 - failing test
202 > # false
203 > not ok 7 - failing test
204 > # false
205 > not ok 8 - pretend we have a known breakage # TODO known breakage
206 > not ok 9 - pretend we have a known breakage # TODO known breakage
207 > ok 10 - pretend we have fixed a known breakage # TODO known breakage vanished
208 > # 1 known breakage(s) vanished; please update test(s)
209 > # still have 2 known breakage(s)
210 > # failed 3 among remaining 7 test(s)
211 > 1..10
215 test_expect_success 'subtest: --verbose option' '
216 write_and_run_sub_test_lib_test_err t1234-verbose --verbose <<-\EOF &&
217 test_expect_success "passing test" true
218 test_expect_success "test with output" "echo foo"
219 test_expect_success "failing test" false
220 test_done
222 mv t1234-verbose/out t1234-verbose/out+ &&
223 grep -v "^Initialized empty" t1234-verbose/out+ >t1234-verbose/out &&
224 check_sub_test_lib_test t1234-verbose <<-\EOF
225 > expecting success of 1234.1 '\''passing test'\'': true
226 > ok 1 - passing test
228 > expecting success of 1234.2 '\''test with output'\'': echo foo
229 > foo
230 > ok 2 - test with output
232 > expecting success of 1234.3 '\''failing test'\'': false
233 > not ok 3 - failing test
234 > # false
236 > # failed 1 among 3 test(s)
237 > 1..3
241 test_expect_success 'subtest: --verbose-only option' '
242 run_sub_test_lib_test_err \
243 t1234-verbose \
244 --verbose-only=2 &&
245 check_sub_test_lib_test t1234-verbose <<-\EOF
246 > ok 1 - passing test
248 > expecting success of 1234.2 '\''test with output'\'': echo foo
249 > foo
250 > ok 2 - test with output
252 > not ok 3 - failing test
253 > # false
254 > # failed 1 among 3 test(s)
255 > 1..3
259 test_expect_success 'subtest: skip one with GIT_SKIP_TESTS' '
261 run_sub_test_lib_test full-pass \
262 --skip="full.2" &&
263 check_sub_test_lib_test full-pass <<-\EOF
264 > ok 1 - passing test #1
265 > ok 2 # skip passing test #2 (GIT_SKIP_TESTS)
266 > ok 3 - passing test #3
267 > # passed all 3 test(s)
268 > 1..3
273 test_expect_success 'subtest: skip several with GIT_SKIP_TESTS' '
275 write_and_run_sub_test_lib_test git-skip-tests-several \
276 --skip="git.2 git.5" <<-\EOF &&
277 for i in 1 2 3 4 5 6
279 test_expect_success "passing test #$i" "true"
280 done
281 test_done
283 check_sub_test_lib_test git-skip-tests-several <<-\EOF
284 > ok 1 - passing test #1
285 > ok 2 # skip passing test #2 (GIT_SKIP_TESTS)
286 > ok 3 - passing test #3
287 > ok 4 - passing test #4
288 > ok 5 # skip passing test #5 (GIT_SKIP_TESTS)
289 > ok 6 - passing test #6
290 > # passed all 6 test(s)
291 > 1..6
296 test_expect_success 'subtest: sh pattern skipping with GIT_SKIP_TESTS' '
298 run_sub_test_lib_test git-skip-tests-several \
299 --skip="git.[2-5]" &&
300 check_sub_test_lib_test git-skip-tests-several <<-\EOF
301 > ok 1 - passing test #1
302 > ok 2 # skip passing test #2 (GIT_SKIP_TESTS)
303 > ok 3 # skip passing test #3 (GIT_SKIP_TESTS)
304 > ok 4 # skip passing test #4 (GIT_SKIP_TESTS)
305 > ok 5 # skip passing test #5 (GIT_SKIP_TESTS)
306 > ok 6 - passing test #6
307 > # passed all 6 test(s)
308 > 1..6
313 test_expect_success 'subtest: skip entire test suite with GIT_SKIP_TESTS' '
315 GIT_SKIP_TESTS="git" && export GIT_SKIP_TESTS &&
316 run_sub_test_lib_test git-skip-tests-several \
317 --skip="git" &&
318 check_sub_test_lib_test git-skip-tests-several <<-\EOF
319 > 1..0 # SKIP skip all tests in git
324 test_expect_success 'subtest: GIT_SKIP_TESTS does not skip unmatched suite' '
326 GIT_SKIP_TESTS="notgit" && export GIT_SKIP_TESTS &&
327 run_sub_test_lib_test full-pass \
328 --skip="notfull" &&
329 check_sub_test_lib_test full-pass <<-\EOF
330 > ok 1 - passing test #1
331 > ok 2 - passing test #2
332 > ok 3 - passing test #3
333 > # passed all 3 test(s)
334 > 1..3
339 test_expect_success 'subtest: --run basic' '
340 run_sub_test_lib_test git-skip-tests-several --run="1,3,5" &&
341 check_sub_test_lib_test git-skip-tests-several <<-\EOF
342 > ok 1 - passing test #1
343 > ok 2 # skip passing test #2 (--run)
344 > ok 3 - passing test #3
345 > ok 4 # skip passing test #4 (--run)
346 > ok 5 - passing test #5
347 > ok 6 # skip passing test #6 (--run)
348 > # passed all 6 test(s)
349 > 1..6
353 test_expect_success 'subtest: --run with a range' '
354 run_sub_test_lib_test git-skip-tests-several \
355 --run="1-3" &&
356 check_sub_test_lib_test git-skip-tests-several <<-\EOF
357 > ok 1 - passing test #1
358 > ok 2 - passing test #2
359 > ok 3 - passing test #3
360 > ok 4 # skip passing test #4 (--run)
361 > ok 5 # skip passing test #5 (--run)
362 > ok 6 # skip passing test #6 (--run)
363 > # passed all 6 test(s)
364 > 1..6
368 test_expect_success 'subtest: --run with two ranges' '
369 run_sub_test_lib_test git-skip-tests-several \
370 --run="1-2,5-6" &&
371 check_sub_test_lib_test git-skip-tests-several <<-\EOF
372 > ok 1 - passing test #1
373 > ok 2 - passing test #2
374 > ok 3 # skip passing test #3 (--run)
375 > ok 4 # skip passing test #4 (--run)
376 > ok 5 - passing test #5
377 > ok 6 - passing test #6
378 > # passed all 6 test(s)
379 > 1..6
383 test_expect_success 'subtest: --run with a left open range' '
384 run_sub_test_lib_test git-skip-tests-several \
385 --run="-3" &&
386 check_sub_test_lib_test git-skip-tests-several <<-\EOF
387 > ok 1 - passing test #1
388 > ok 2 - passing test #2
389 > ok 3 - passing test #3
390 > ok 4 # skip passing test #4 (--run)
391 > ok 5 # skip passing test #5 (--run)
392 > ok 6 # skip passing test #6 (--run)
393 > # passed all 6 test(s)
394 > 1..6
398 test_expect_success 'subtest: --run with a right open range' '
399 run_sub_test_lib_test git-skip-tests-several \
400 --run="4-" &&
401 check_sub_test_lib_test git-skip-tests-several <<-\EOF
402 > ok 1 # skip passing test #1 (--run)
403 > ok 2 # skip passing test #2 (--run)
404 > ok 3 # skip passing test #3 (--run)
405 > ok 4 - passing test #4
406 > ok 5 - passing test #5
407 > ok 6 - passing test #6
408 > # passed all 6 test(s)
409 > 1..6
413 test_expect_success 'subtest: --run with basic negation' '
414 run_sub_test_lib_test git-skip-tests-several \
415 --run="!3" &&
416 check_sub_test_lib_test git-skip-tests-several <<-\EOF
417 > ok 1 - passing test #1
418 > ok 2 - passing test #2
419 > ok 3 # skip passing test #3 (--run)
420 > ok 4 - passing test #4
421 > ok 5 - passing test #5
422 > ok 6 - passing test #6
423 > # passed all 6 test(s)
424 > 1..6
428 test_expect_success 'subtest: --run with two negations' '
429 run_sub_test_lib_test git-skip-tests-several \
430 --run="!3,!6" &&
431 check_sub_test_lib_test git-skip-tests-several <<-\EOF
432 > ok 1 - passing test #1
433 > ok 2 - passing test #2
434 > ok 3 # skip passing test #3 (--run)
435 > ok 4 - passing test #4
436 > ok 5 - passing test #5
437 > ok 6 # skip passing test #6 (--run)
438 > # passed all 6 test(s)
439 > 1..6
443 test_expect_success 'subtest: --run a range and negation' '
444 run_sub_test_lib_test git-skip-tests-several \
445 --run="-4,!2" &&
446 check_sub_test_lib_test git-skip-tests-several <<-\EOF
447 > ok 1 - passing test #1
448 > ok 2 # skip passing test #2 (--run)
449 > ok 3 - passing test #3
450 > ok 4 - passing test #4
451 > ok 5 # skip passing test #5 (--run)
452 > ok 6 # skip passing test #6 (--run)
453 > # passed all 6 test(s)
454 > 1..6
458 test_expect_success 'subtest: --run range negation' '
459 run_sub_test_lib_test git-skip-tests-several \
460 --run="!1-3" &&
461 check_sub_test_lib_test git-skip-tests-several <<-\EOF
462 > ok 1 # skip passing test #1 (--run)
463 > ok 2 # skip passing test #2 (--run)
464 > ok 3 # skip passing test #3 (--run)
465 > ok 4 - passing test #4
466 > ok 5 - passing test #5
467 > ok 6 - passing test #6
468 > # passed all 6 test(s)
469 > 1..6
473 test_expect_success 'subtest: --run include, exclude and include' '
474 run_sub_test_lib_test git-skip-tests-several \
475 --run="1-5,!1-3,2" &&
476 check_sub_test_lib_test git-skip-tests-several <<-\EOF
477 > ok 1 # skip passing test #1 (--run)
478 > ok 2 - passing test #2
479 > ok 3 # skip passing test #3 (--run)
480 > ok 4 - passing test #4
481 > ok 5 - passing test #5
482 > ok 6 # skip passing test #6 (--run)
483 > # passed all 6 test(s)
484 > 1..6
488 test_expect_success 'subtest: --run include, exclude and include, comma separated' '
489 run_sub_test_lib_test git-skip-tests-several \
490 --run=1-5,!1-3,2 &&
491 check_sub_test_lib_test git-skip-tests-several <<-\EOF
492 > ok 1 # skip passing test #1 (--run)
493 > ok 2 - passing test #2
494 > ok 3 # skip passing test #3 (--run)
495 > ok 4 - passing test #4
496 > ok 5 - passing test #5
497 > ok 6 # skip passing test #6 (--run)
498 > # passed all 6 test(s)
499 > 1..6
503 test_expect_success 'subtest: --run exclude and include' '
504 run_sub_test_lib_test git-skip-tests-several \
505 --run="!3-,5" &&
506 check_sub_test_lib_test git-skip-tests-several <<-\EOF
507 > ok 1 - passing test #1
508 > ok 2 - passing test #2
509 > ok 3 # skip passing test #3 (--run)
510 > ok 4 # skip passing test #4 (--run)
511 > ok 5 - passing test #5
512 > ok 6 # skip passing test #6 (--run)
513 > # passed all 6 test(s)
514 > 1..6
518 test_expect_success 'subtest: --run empty selectors' '
519 run_sub_test_lib_test git-skip-tests-several \
520 --run="1,,3,,,5" &&
521 check_sub_test_lib_test git-skip-tests-several <<-\EOF
522 > ok 1 - passing test #1
523 > ok 2 # skip passing test #2 (--run)
524 > ok 3 - passing test #3
525 > ok 4 # skip passing test #4 (--run)
526 > ok 5 - passing test #5
527 > ok 6 # skip passing test #6 (--run)
528 > # passed all 6 test(s)
529 > 1..6
533 test_expect_success 'subtest: --run substring selector' '
534 write_and_run_sub_test_lib_test run-substring-selector \
535 --run="relevant" <<-\EOF &&
536 test_expect_success "relevant test" "true"
537 for i in 1 2 3 4 5 6
539 test_expect_success "other test #$i" "true"
540 done
541 test_done
543 check_sub_test_lib_test run-substring-selector <<-\EOF
544 > ok 1 - relevant test
545 > ok 2 # skip other test #1 (--run)
546 > ok 3 # skip other test #2 (--run)
547 > ok 4 # skip other test #3 (--run)
548 > ok 5 # skip other test #4 (--run)
549 > ok 6 # skip other test #5 (--run)
550 > ok 7 # skip other test #6 (--run)
551 > # passed all 7 test(s)
552 > 1..7
556 test_expect_success 'subtest: --run keyword selection' '
557 write_and_run_sub_test_lib_test_err run-inv-range-start \
558 --run="a-5" <<-\EOF &&
559 test_expect_success "passing test #1" "true"
560 test_done
562 check_sub_test_lib_test_err run-inv-range-start \
563 <<-\EOF_OUT 3<<-EOF_ERR
564 > FATAL: Unexpected exit with code 1
565 EOF_OUT
566 > error: --run: invalid non-numeric in range start: ${SQ}a-5${SQ}
567 EOF_ERR
570 test_expect_success 'subtest: --run invalid range end' '
571 run_sub_test_lib_test_err run-inv-range-start \
572 --run="1-z" &&
573 check_sub_test_lib_test_err run-inv-range-start \
574 <<-\EOF_OUT 3<<-EOF_ERR
575 > FATAL: Unexpected exit with code 1
576 EOF_OUT
577 > error: --run: invalid non-numeric in range end: ${SQ}1-z${SQ}
578 EOF_ERR
581 test_expect_success 'subtest: tests respect prerequisites' '
582 write_and_run_sub_test_lib_test prereqs <<-\EOF &&
584 test_set_prereq HAVEIT
585 test_expect_success HAVEIT "prereq is satisfied" "true"
586 test_expect_success "have_prereq works" "
587 test_have_prereq HAVEIT
589 test_expect_success DONTHAVEIT "prereq not satisfied" "false"
591 test_set_prereq HAVETHIS
592 test_expect_success HAVETHIS,HAVEIT "multiple prereqs" "true"
593 test_expect_success HAVEIT,DONTHAVEIT "mixed prereqs (yes,no)" "false"
594 test_expect_success DONTHAVEIT,HAVEIT "mixed prereqs (no,yes)" "false"
596 test_done
599 check_sub_test_lib_test prereqs <<-\EOF
600 ok 1 - prereq is satisfied
601 ok 2 - have_prereq works
602 ok 3 # skip prereq not satisfied (missing DONTHAVEIT)
603 ok 4 - multiple prereqs
604 ok 5 # skip mixed prereqs (yes,no) (missing DONTHAVEIT of HAVEIT,DONTHAVEIT)
605 ok 6 # skip mixed prereqs (no,yes) (missing DONTHAVEIT of DONTHAVEIT,HAVEIT)
606 # passed all 6 test(s)
607 1..6
611 test_expect_success 'subtest: tests respect lazy prerequisites' '
612 write_and_run_sub_test_lib_test lazy-prereqs <<-\EOF &&
614 test_lazy_prereq LAZY_TRUE true
615 test_expect_success LAZY_TRUE "lazy prereq is satisifed" "true"
616 test_expect_success !LAZY_TRUE "negative lazy prereq" "false"
618 test_lazy_prereq LAZY_FALSE false
619 test_expect_success LAZY_FALSE "lazy prereq not satisfied" "false"
620 test_expect_success !LAZY_FALSE "negative false prereq" "true"
622 test_done
625 check_sub_test_lib_test lazy-prereqs <<-\EOF
626 ok 1 - lazy prereq is satisifed
627 ok 2 # skip negative lazy prereq (missing !LAZY_TRUE)
628 ok 3 # skip lazy prereq not satisfied (missing LAZY_FALSE)
629 ok 4 - negative false prereq
630 # passed all 4 test(s)
631 1..4
635 test_expect_success 'subtest: nested lazy prerequisites' '
636 write_and_run_sub_test_lib_test nested-lazy <<-\EOF &&
638 test_lazy_prereq NESTED_INNER "
639 >inner &&
640 rm -f outer
642 test_lazy_prereq NESTED_PREREQ "
643 >outer &&
644 test_have_prereq NESTED_INNER &&
645 echo can create new file in cwd >file &&
646 test_path_is_file outer &&
647 test_path_is_missing inner
649 test_expect_success NESTED_PREREQ "evaluate nested prereq" "true"
651 test_done
654 check_sub_test_lib_test nested-lazy <<-\EOF
655 ok 1 - evaluate nested prereq
656 # passed all 1 test(s)
657 1..1
661 test_expect_success 'subtest: lazy prereqs do not turn off tracing' '
662 write_and_run_sub_test_lib_test lazy-prereq-and-tracing \
663 -v -x <<-\EOF &&
664 test_lazy_prereq LAZY true
666 test_expect_success lazy "test_have_prereq LAZY && echo trace"
668 test_done
671 grep "echo trace" lazy-prereq-and-tracing/err
674 test_expect_success 'subtest: tests clean up after themselves' '
675 write_and_run_sub_test_lib_test cleanup <<-\EOF &&
676 clean=no
677 test_expect_success "do cleanup" "
678 test_when_finished clean=yes
680 test_expect_success "cleanup happened" "
681 test $clean = yes
683 test_done
686 check_sub_test_lib_test cleanup <<-\EOF
687 ok 1 - do cleanup
688 ok 2 - cleanup happened
689 # passed all 2 test(s)
690 1..2
694 test_expect_success 'subtest: tests clean up even on failures' '
695 write_and_run_sub_test_lib_test_err \
696 failing-cleanup <<-\EOF &&
697 test_expect_success "tests clean up even after a failure" "
698 touch clean-after-failure &&
699 test_when_finished rm clean-after-failure &&
700 (exit 1)
702 test_expect_success "failure to clean up causes the test to fail" "
703 test_when_finished \"(exit 2)\"
705 test_done
707 check_sub_test_lib_test failing-cleanup <<-\EOF
708 > not ok 1 - tests clean up even after a failure
709 > # Z
710 > # touch clean-after-failure &&
711 > # test_when_finished rm clean-after-failure &&
712 > # (exit 1)
713 > # Z
714 > not ok 2 - failure to clean up causes the test to fail
715 > # Z
716 > # test_when_finished "(exit 2)"
717 > # Z
718 > # failed 2 among 2 test(s)
719 > 1..2
723 test_expect_success 'subtest: test_atexit is run' '
724 write_and_run_sub_test_lib_test_err \
725 atexit-cleanup -i <<-\EOF &&
726 test_expect_success "tests clean up even after a failure" "
727 > ../../clean-atexit &&
728 test_atexit rm ../../clean-atexit &&
729 > ../../also-clean-atexit &&
730 test_atexit rm ../../also-clean-atexit &&
731 > ../../dont-clean-atexit &&
732 (exit 1)
734 test_done
736 test_path_is_file dont-clean-atexit &&
737 test_path_is_missing clean-atexit &&
738 test_path_is_missing also-clean-atexit
741 test_expect_success 'test_oid provides sane info by default' '
742 test_oid zero >actual &&
743 grep "^00*\$" actual &&
744 rawsz="$(test_oid rawsz)" &&
745 hexsz="$(test_oid hexsz)" &&
746 test "$hexsz" -eq $(wc -c <actual) &&
747 test $(( $rawsz * 2)) -eq "$hexsz"
750 test_expect_success 'test_oid can look up data for SHA-1' '
751 test_when_finished "test_detect_hash" &&
752 test_set_hash sha1 &&
753 test_oid zero >actual &&
754 grep "^00*\$" actual &&
755 rawsz="$(test_oid rawsz)" &&
756 hexsz="$(test_oid hexsz)" &&
757 test $(wc -c <actual) -eq 40 &&
758 test "$rawsz" -eq 20 &&
759 test "$hexsz" -eq 40
762 test_expect_success 'test_oid can look up data for SHA-256' '
763 test_when_finished "test_detect_hash" &&
764 test_set_hash sha256 &&
765 test_oid zero >actual &&
766 grep "^00*\$" actual &&
767 rawsz="$(test_oid rawsz)" &&
768 hexsz="$(test_oid hexsz)" &&
769 test $(wc -c <actual) -eq 64 &&
770 test "$rawsz" -eq 32 &&
771 test "$hexsz" -eq 64
774 test_expect_success 'test_oid can look up data for a specified algorithm' '
775 rawsz="$(test_oid --hash=sha1 rawsz)" &&
776 hexsz="$(test_oid --hash=sha1 hexsz)" &&
777 test "$rawsz" -eq 20 &&
778 test "$hexsz" -eq 40 &&
779 rawsz="$(test_oid --hash=sha256 rawsz)" &&
780 hexsz="$(test_oid --hash=sha256 hexsz)" &&
781 test "$rawsz" -eq 32 &&
782 test "$hexsz" -eq 64
785 test_expect_success 'test_bool_env' '
787 sane_unset envvar &&
789 test_bool_env envvar true &&
790 ! test_bool_env envvar false &&
792 envvar= &&
793 export envvar &&
794 ! test_bool_env envvar true &&
795 ! test_bool_env envvar false &&
797 envvar=true &&
798 test_bool_env envvar true &&
799 test_bool_env envvar false &&
801 envvar=false &&
802 ! test_bool_env envvar true &&
803 ! test_bool_env envvar false &&
805 envvar=invalid &&
806 # When encountering an invalid bool value, test_bool_env
807 # prints its error message to the original stderr of the
808 # test script, hence the redirection of fd 7, and aborts
809 # with "exit 1", hence the subshell.
810 ! ( test_bool_env envvar true ) 7>err &&
811 grep "error: test_bool_env requires bool values" err &&
813 envvar=true &&
814 ! ( test_bool_env envvar invalid ) 7>err &&
815 grep "error: test_bool_env requires bool values" err
819 ################################################################
820 # Basics of the basics
822 test_oid_cache <<\EOF
823 path0f sha1:f87290f8eb2cbbea7857214459a0739927eab154
824 path0f sha256:638106af7c38be056f3212cbd7ac65bc1bac74f420ca5a436ff006a9d025d17d
826 path0s sha1:15a98433ae33114b085f3eb3bb03b832b3180a01
827 path0s sha256:3a24cc53cf68edddac490bbf94a418a52932130541361f685df685e41dd6c363
829 path2f sha1:3feff949ed00a62d9f7af97c15cd8a30595e7ac7
830 path2f sha256:2a7f36571c6fdbaf0e3f62751a0b25a3f4c54d2d1137b3f4af9cb794bb498e5f
832 path2s sha1:d8ce161addc5173867a3c3c730924388daedbc38
833 path2s sha256:18fd611b787c2e938ddcc248fabe4d66a150f9364763e9ec133dd01d5bb7c65a
835 path2d sha1:58a09c23e2ca152193f2786e06986b7b6712bdbe
836 path2d sha256:00e4b32b96e7e3d65d79112dcbea53238a22715f896933a62b811377e2650c17
838 path3f sha1:0aa34cae68d0878578ad119c86ca2b5ed5b28376
839 path3f sha256:09f58616b951bd571b8cb9dc76d372fbb09ab99db2393f5ab3189d26c45099ad
841 path3s sha1:8599103969b43aff7e430efea79ca4636466794f
842 path3s sha256:fce1aed087c053306f3f74c32c1a838c662bbc4551a7ac2420f5d6eb061374d0
844 path3d sha1:21ae8269cacbe57ae09138dcc3a2887f904d02b3
845 path3d sha256:9b60497be959cb830bf3f0dc82bcc9ad9e925a24e480837ade46b2295e47efe1
847 subp3f sha1:00fb5908cb97c2564a9783c0c64087333b3b464f
848 subp3f sha256:a1a9e16998c988453f18313d10375ee1d0ddefe757e710dcae0d66aa1e0c58b3
850 subp3s sha1:6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c
851 subp3s sha256:81759d9f5e93c6546ecfcadb560c1ff057314b09f93fe8ec06e2d8610d34ef10
853 subp3d sha1:3c5e5399f3a333eddecce7a9b9465b63f65f51e2
854 subp3d sha256:76b4ef482d4fa1c754390344cf3851c7f883b27cf9bc999c6547928c46aeafb7
856 root sha1:087704a96baf1c2d1c869a8b084481e121c88b5b
857 root sha256:9481b52abab1b2ffeedbf9de63ce422b929f179c1b98ff7bee5f8f1bc0710751
859 simpletree sha1:7bb943559a305bdd6bdee2cef6e5df2413c3d30a
860 simpletree sha256:1710c07a6c86f9a3c7376364df04c47ee39e5a5e221fcdd84b743bc9bb7e2bc5
863 # updating a new file without --add should fail.
864 test_expect_success 'git update-index without --add should fail adding' '
865 test_must_fail git update-index should-be-empty
868 # and with --add it should succeed, even if it is empty (it used to fail).
869 test_expect_success 'git update-index with --add should succeed' '
870 git update-index --add should-be-empty
873 test_expect_success 'writing tree out with git write-tree' '
874 tree=$(git write-tree)
877 # we know the shape and contents of the tree and know the object ID for it.
878 test_expect_success 'validate object ID of a known tree' '
879 test "$tree" = "$(test_oid simpletree)"
882 # Removing paths.
883 test_expect_success 'git update-index without --remove should fail removing' '
884 rm -f should-be-empty full-of-directories &&
885 test_must_fail git update-index should-be-empty
888 test_expect_success 'git update-index with --remove should be able to remove' '
889 git update-index --remove should-be-empty
892 # Empty tree can be written with recent write-tree.
893 test_expect_success 'git write-tree should be able to write an empty tree' '
894 tree=$(git write-tree)
897 test_expect_success 'validate object ID of a known tree' '
898 test "$tree" = $EMPTY_TREE
901 # Various types of objects
903 test_expect_success 'adding various types of objects with git update-index --add' '
904 mkdir path2 path3 path3/subp3 &&
905 paths="path0 path2/file2 path3/file3 path3/subp3/file3" &&
907 for p in $paths
909 echo "hello $p" >$p || exit 1
910 test_ln_s_add "hello $p" ${p}sym || exit 1
911 done
912 ) &&
913 find path* ! -type d -print | xargs git update-index --add
916 # Show them and see that matches what we expect.
917 test_expect_success 'showing stage with git ls-files --stage' '
918 git ls-files --stage >current
921 test_expect_success 'validate git ls-files output for a known tree' '
922 cat >expected <<-EOF &&
923 100644 $(test_oid path0f) 0 path0
924 120000 $(test_oid path0s) 0 path0sym
925 100644 $(test_oid path2f) 0 path2/file2
926 120000 $(test_oid path2s) 0 path2/file2sym
927 100644 $(test_oid path3f) 0 path3/file3
928 120000 $(test_oid path3s) 0 path3/file3sym
929 100644 $(test_oid subp3f) 0 path3/subp3/file3
930 120000 $(test_oid subp3s) 0 path3/subp3/file3sym
932 test_cmp expected current
935 test_expect_success 'writing tree out with git write-tree' '
936 tree=$(git write-tree)
939 test_expect_success 'validate object ID for a known tree' '
940 test "$tree" = "$(test_oid root)"
943 test_expect_success 'showing tree with git ls-tree' '
944 git ls-tree $tree >current
947 test_expect_success 'git ls-tree output for a known tree' '
948 cat >expected <<-EOF &&
949 100644 blob $(test_oid path0f) path0
950 120000 blob $(test_oid path0s) path0sym
951 040000 tree $(test_oid path2d) path2
952 040000 tree $(test_oid path3d) path3
954 test_cmp expected current
957 # This changed in ls-tree pathspec change -- recursive does
958 # not show tree nodes anymore.
959 test_expect_success 'showing tree with git ls-tree -r' '
960 git ls-tree -r $tree >current
963 test_expect_success 'git ls-tree -r output for a known tree' '
964 cat >expected <<-EOF &&
965 100644 blob $(test_oid path0f) path0
966 120000 blob $(test_oid path0s) path0sym
967 100644 blob $(test_oid path2f) path2/file2
968 120000 blob $(test_oid path2s) path2/file2sym
969 100644 blob $(test_oid path3f) path3/file3
970 120000 blob $(test_oid path3s) path3/file3sym
971 100644 blob $(test_oid subp3f) path3/subp3/file3
972 120000 blob $(test_oid subp3s) path3/subp3/file3sym
974 test_cmp expected current
977 # But with -r -t we can have both.
978 test_expect_success 'showing tree with git ls-tree -r -t' '
979 git ls-tree -r -t $tree >current
982 test_expect_success 'git ls-tree -r output for a known tree' '
983 cat >expected <<-EOF &&
984 100644 blob $(test_oid path0f) path0
985 120000 blob $(test_oid path0s) path0sym
986 040000 tree $(test_oid path2d) path2
987 100644 blob $(test_oid path2f) path2/file2
988 120000 blob $(test_oid path2s) path2/file2sym
989 040000 tree $(test_oid path3d) path3
990 100644 blob $(test_oid path3f) path3/file3
991 120000 blob $(test_oid path3s) path3/file3sym
992 040000 tree $(test_oid subp3d) path3/subp3
993 100644 blob $(test_oid subp3f) path3/subp3/file3
994 120000 blob $(test_oid subp3s) path3/subp3/file3sym
996 test_cmp expected current
999 test_expect_success 'writing partial tree out with git write-tree --prefix' '
1000 ptree=$(git write-tree --prefix=path3)
1003 test_expect_success 'validate object ID for a known tree' '
1004 test "$ptree" = $(test_oid path3d)
1007 test_expect_success 'writing partial tree out with git write-tree --prefix' '
1008 ptree=$(git write-tree --prefix=path3/subp3)
1011 test_expect_success 'validate object ID for a known tree' '
1012 test "$ptree" = $(test_oid subp3d)
1015 test_expect_success 'put invalid objects into the index' '
1016 rm -f .git/index &&
1017 suffix=$(echo $ZERO_OID | sed -e "s/^.//") &&
1018 cat >badobjects <<-EOF &&
1019 100644 blob $(test_oid 001) dir/file1
1020 100644 blob $(test_oid 002) dir/file2
1021 100644 blob $(test_oid 003) dir/file3
1022 100644 blob $(test_oid 004) dir/file4
1023 100644 blob $(test_oid 005) dir/file5
1025 git update-index --index-info <badobjects
1028 test_expect_success 'writing this tree without --missing-ok' '
1029 test_must_fail git write-tree
1032 test_expect_success 'writing this tree with --missing-ok' '
1033 git write-tree --missing-ok
1037 ################################################################
1038 test_expect_success 'git read-tree followed by write-tree should be idempotent' '
1039 rm -f .git/index &&
1040 git read-tree $tree &&
1041 test_path_is_file .git/index &&
1042 newtree=$(git write-tree) &&
1043 test "$newtree" = "$tree"
1046 test_expect_success 'validate git diff-files output for a know cache/work tree state' '
1047 cat >expected <<EOF &&
1048 :100644 100644 $(test_oid path0f) $ZERO_OID M path0
1049 :120000 120000 $(test_oid path0s) $ZERO_OID M path0sym
1050 :100644 100644 $(test_oid path2f) $ZERO_OID M path2/file2
1051 :120000 120000 $(test_oid path2s) $ZERO_OID M path2/file2sym
1052 :100644 100644 $(test_oid path3f) $ZERO_OID M path3/file3
1053 :120000 120000 $(test_oid path3s) $ZERO_OID M path3/file3sym
1054 :100644 100644 $(test_oid subp3f) $ZERO_OID M path3/subp3/file3
1055 :120000 120000 $(test_oid subp3s) $ZERO_OID M path3/subp3/file3sym
1057 git diff-files >current &&
1058 test_cmp expected current
1061 test_expect_success 'git update-index --refresh should succeed' '
1062 git update-index --refresh
1065 test_expect_success 'no diff after checkout and git update-index --refresh' '
1066 git diff-files >current &&
1067 cmp -s current /dev/null
1070 ################################################################
1071 P=$(test_oid root)
1073 test_expect_success 'git commit-tree records the correct tree in a commit' '
1074 commit0=$(echo NO | git commit-tree $P) &&
1075 git show --pretty=raw $commit0 >out &&
1076 tree=$(sed -n -e "s/^tree //p" -e "/^author /q" out) &&
1077 test "z$tree" = "z$P"
1080 test_expect_success 'git commit-tree records the correct parent in a commit' '
1081 commit1=$(echo NO | git commit-tree $P -p $commit0) &&
1082 git show --pretty=raw $commit1 >out &&
1083 parent=$(sed -n -e "s/^parent //p" -e "/^author /q" out) &&
1084 test "z$commit0" = "z$parent"
1087 test_expect_success 'git commit-tree omits duplicated parent in a commit' '
1088 commit2=$(echo NO | git commit-tree $P -p $commit0 -p $commit0) &&
1089 git show --pretty=raw $commit2 >out &&
1090 cat >match.sed <<-\EOF &&
1091 s/^parent //p
1092 /^author /q
1094 parent=$(sed -n -f match.sed out | sort -u) &&
1095 test "z$commit0" = "z$parent" &&
1096 git show --pretty=raw $commit2 >out &&
1097 test_stdout_line_count = 1 sed -n -f match.sed out
1100 test_expect_success 'update-index D/F conflict' '
1101 mv path0 tmp &&
1102 mv path2 path0 &&
1103 mv tmp path2 &&
1104 git update-index --add --replace path2 path0/file2 &&
1105 git ls-files path0 >tmp &&
1106 numpath0=$(wc -l <tmp) &&
1107 test $numpath0 = 1
1110 test_expect_success 'very long name in the index handled sanely' '
1112 a=a && # 1
1113 a=$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a && # 16
1114 a=$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a && # 256
1115 a=$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a && # 4096
1116 a=${a}q &&
1118 >path4 &&
1119 git update-index --add path4 &&
1120 git ls-files -s path4 >tmp &&
1122 sed -e "s/ .*/ /" tmp |
1123 tr -d "\012" &&
1124 echo "$a"
1125 ) | git update-index --index-info &&
1126 git ls-files "a*" >tmp &&
1127 len=$(wc -c <tmp) &&
1128 test $len = 4098
1131 test_expect_success 'test_must_fail on a failing git command' '
1132 test_must_fail git notacommand
1135 test_expect_success 'test_must_fail on a failing git command with env' '
1136 test_must_fail env var1=a var2=b git notacommand
1139 test_expect_success 'test_must_fail rejects a non-git command' '
1140 ! test_must_fail grep ^$ notafile 2>err &&
1141 grep -F "test_must_fail: only '"'"'git'"'"' is allowed" err
1144 test_expect_success 'test_must_fail rejects a non-git command with env' '
1145 ! test_must_fail env var1=a var2=b grep ^$ notafile 2>err &&
1146 grep -F "test_must_fail: only '"'"'git'"'"' is allowed" err
1149 test_done