t5526: introduce test helper to assert on fetches

Tests in t/t5526-fetch-submodules.sh are unnecessarily noisy: * The tests have extra logic in order to reproduce the expected stderr literally, but not all of these details (e.g. the head of the remote-tracking branch before the fetch) are relevant to the test. * The expect.err file is constructed by the add_upstream_commit() helper as input into test_cmp, but most tests fetch a different combination of repos from expect.err. This results in noisy tests that modify parts of that expect.err to generate the expected output. To address both of these issues, introduce a verify_fetch_result() helper to t/t5526-fetch-submodules.sh that asserts on the output of "git fetch --recurse-submodules" and handles the ordering of expect.err. As a result, the tests no longer construct expect.err manually. Tests still consider the old head of the remote-tracking branch ("$head1"), but that will be fixed in a later commit. Signed-off-by: Glen Choo <chooglen@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Glen Choo committed Mar 7, 2022 at 16:14 UTC f3117dfdd1a0e586066bb8963b43324f5dee9f90
1 file changed +84 -55
t/t5526-fetch-submodules.sh
+84 -55
@@ -10,6 +10,10 @@ export GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB
10
11 pwd=$(pwd)
12
13 +# For each submodule in the test setup, this creates a commit and writes
14 +# a file that contains the expected err if that new commit were fetched.
15 +# These output files get concatenated in the right order by
16 +# verify_fetch_result().
17 add_upstream_commit() {
18 (
19 cd submodule &&
@@ -19,9 +23,9 @@ add_upstream_commit() {
23 git add subfile &&
24 git commit -m new subfile &&
25 head2=$(git rev-parse --short HEAD) &&
22 - echo "Fetching submodule submodule" > ../expect.err &&
23 - echo "From $pwd/submodule" >> ../expect.err &&
24 - echo " $head1..$head2 sub -> origin/sub" >> ../expect.err
26 + echo "Fetching submodule submodule" > ../expect.err.sub &&
27 + echo "From $pwd/submodule" >> ../expect.err.sub &&
28 + echo " $head1..$head2 sub -> origin/sub" >> ../expect.err.sub
29 ) &&
30 (
31 cd deepsubmodule &&
@@ -31,12 +35,36 @@ add_upstream_commit() {
35 git add deepsubfile &&
36 git commit -m new deepsubfile &&
37 head2=$(git rev-parse --short HEAD) &&
34 - echo "Fetching submodule submodule/subdir/deepsubmodule" >> ../expect.err
35 - echo "From $pwd/deepsubmodule" >> ../expect.err &&
36 - echo " $head1..$head2 deep -> origin/deep" >> ../expect.err
38 + echo "Fetching submodule submodule/subdir/deepsubmodule" > ../expect.err.deep
39 + echo "From $pwd/deepsubmodule" >> ../expect.err.deep &&
40 + echo " $head1..$head2 deep -> origin/deep" >> ../expect.err.deep
41 )
42 }
43
44 +# Verifies that the expected repositories were fetched. This is done by
45 +# concatenating the files expect.err.[super|sub|deep] in the correct
46 +# order and comparing it to the actual stderr.
47 +#
48 +# If a repo should not be fetched in the test, its corresponding
49 +# expect.err file should be rm-ed.
50 +verify_fetch_result () {
51 + ACTUAL_ERR=$1 &&
52 + rm -f expect.err.combined &&
53 + if test -f expect.err.super
54 + then
55 + cat expect.err.super >>expect.err.combined
56 + fi &&
57 + if test -f expect.err.sub
58 + then
59 + cat expect.err.sub >>expect.err.combined
60 + fi &&
61 + if test -f expect.err.deep
62 + then
63 + cat expect.err.deep >>expect.err.combined
64 + fi &&
65 + test_cmp expect.err.combined $ACTUAL_ERR
66 +}
67 +
68 test_expect_success setup '
69 mkdir deepsubmodule &&
70 (
@@ -74,7 +102,7 @@ test_expect_success "fetch --recurse-submodules recurses into submodules" '
102 git fetch --recurse-submodules >../actual.out 2>../actual.err
103 ) &&
104 test_must_be_empty actual.out &&
77 - test_cmp expect.err actual.err
105 + verify_fetch_result actual.err
106 '
107
108 test_expect_success "submodule.recurse option triggers recursive fetch" '
@@ -84,7 +112,7 @@ test_expect_success "submodule.recurse option triggers recursive fetch" '
112 git -c submodule.recurse fetch >../actual.out 2>../actual.err
113 ) &&
114 test_must_be_empty actual.out &&
87 - test_cmp expect.err actual.err
115 + verify_fetch_result actual.err
116 '
117
118 test_expect_success "fetch --recurse-submodules -j2 has the same output behaviour" '
@@ -94,7 +122,7 @@ test_expect_success "fetch --recurse-submodules -j2 has the same output behaviou
122 GIT_TRACE="$TRASH_DIRECTORY/trace.out" git fetch --recurse-submodules -j2 2>../actual.err
123 ) &&
124 test_must_be_empty actual.out &&
97 - test_cmp expect.err actual.err &&
125 + verify_fetch_result actual.err &&
126 grep "2 tasks" trace.out
127 '
128
@@ -124,7 +152,7 @@ test_expect_success "using fetchRecurseSubmodules=true in .gitmodules recurses i
152 git fetch >../actual.out 2>../actual.err
153 ) &&
154 test_must_be_empty actual.out &&
127 - test_cmp expect.err actual.err
155 + verify_fetch_result actual.err
156 '
157
158 test_expect_success "--no-recurse-submodules overrides .gitmodules config" '
@@ -155,7 +183,7 @@ test_expect_success "--recurse-submodules overrides fetchRecurseSubmodules setti
183 git config --unset submodule.submodule.fetchRecurseSubmodules
184 ) &&
185 test_must_be_empty actual.out &&
158 - test_cmp expect.err actual.err
186 + verify_fetch_result actual.err
187 '
188
189 test_expect_success "--quiet propagates to submodules" '
@@ -183,7 +211,7 @@ test_expect_success "--dry-run propagates to submodules" '
211 git fetch --recurse-submodules --dry-run >../actual.out 2>../actual.err
212 ) &&
213 test_must_be_empty actual.out &&
186 - test_cmp expect.err actual.err
214 + verify_fetch_result actual.err
215 '
216
217 test_expect_success "Without --dry-run propagates to submodules" '
@@ -192,7 +220,7 @@ test_expect_success "Without --dry-run propagates to submodules" '
220 git fetch --recurse-submodules >../actual.out 2>../actual.err
221 ) &&
222 test_must_be_empty actual.out &&
195 - test_cmp expect.err actual.err
223 + verify_fetch_result actual.err
224 '
225
226 test_expect_success "recurseSubmodules=true propagates into submodules" '
@@ -203,7 +231,7 @@ test_expect_success "recurseSubmodules=true propagates into submodules" '
231 git fetch >../actual.out 2>../actual.err
232 ) &&
233 test_must_be_empty actual.out &&
206 - test_cmp expect.err actual.err
234 + verify_fetch_result actual.err
235 '
236
237 test_expect_success "--recurse-submodules overrides config in submodule" '
@@ -217,7 +245,7 @@ test_expect_success "--recurse-submodules overrides config in submodule" '
245 git fetch --recurse-submodules >../actual.out 2>../actual.err
246 ) &&
247 test_must_be_empty actual.out &&
220 - test_cmp expect.err actual.err
248 + verify_fetch_result actual.err
249 '
250
251 test_expect_success "--no-recurse-submodules overrides config setting" '
@@ -250,14 +278,14 @@ test_expect_success "Recursion stops when no new submodule commits are fetched"
278 git add submodule &&
279 git commit -m "new submodule" &&
280 head2=$(git rev-parse --short HEAD) &&
253 - echo "From $pwd/." > expect.err.sub &&
254 - echo " $head1..$head2 super -> origin/super" >>expect.err.sub &&
255 - head -3 expect.err >> expect.err.sub &&
281 + echo "From $pwd/." > expect.err.super &&
282 + echo " $head1..$head2 super -> origin/super" >>expect.err.super &&
283 + rm expect.err.deep &&
284 (
285 cd downstream &&
286 git fetch >../actual.out 2>../actual.err
287 ) &&
260 - test_cmp expect.err.sub actual.err &&
288 + verify_fetch_result actual.err &&
289 test_must_be_empty actual.out
290 '
291
@@ -268,14 +296,16 @@ test_expect_success "Recursion doesn't happen when new superproject commits don'
296 git add file &&
297 git commit -m "new file" &&
298 head2=$(git rev-parse --short HEAD) &&
271 - echo "From $pwd/." > expect.err.file &&
272 - echo " $head1..$head2 super -> origin/super" >> expect.err.file &&
299 + echo "From $pwd/." > expect.err.super &&
300 + echo " $head1..$head2 super -> origin/super" >> expect.err.super &&
301 + rm expect.err.sub &&
302 + rm expect.err.deep &&
303 (
304 cd downstream &&
305 git fetch >../actual.out 2>../actual.err
306 ) &&
307 test_must_be_empty actual.out &&
278 - test_cmp expect.err.file actual.err
308 + verify_fetch_result actual.err
309 '
310
311 test_expect_success "Recursion picks up config in submodule" '
@@ -292,9 +322,8 @@ test_expect_success "Recursion picks up config in submodule" '
322 git add submodule &&
323 git commit -m "new submodule" &&
324 head2=$(git rev-parse --short HEAD) &&
295 - echo "From $pwd/." > expect.err.sub &&
296 - echo " $head1..$head2 super -> origin/super" >> expect.err.sub &&
297 - cat expect.err >> expect.err.sub &&
325 + echo "From $pwd/." > expect.err.super &&
326 + echo " $head1..$head2 super -> origin/super" >> expect.err.super &&
327 (
328 cd downstream &&
329 git fetch >../actual.out 2>../actual.err &&
@@ -303,7 +332,7 @@ test_expect_success "Recursion picks up config in submodule" '
332 git config --unset fetch.recurseSubmodules
333 )
334 ) &&
306 - test_cmp expect.err.sub actual.err &&
335 + verify_fetch_result actual.err &&
336 test_must_be_empty actual.out
337 '
338
@@ -328,15 +357,13 @@ test_expect_success "Recursion picks up all submodules when necessary" '
357 git add submodule &&
358 git commit -m "new submodule" &&
359 head2=$(git rev-parse --short HEAD) &&
331 - echo "From $pwd/." > expect.err.2 &&
332 - echo " $head1..$head2 super -> origin/super" >> expect.err.2 &&
333 - cat expect.err.sub >> expect.err.2 &&
334 - tail -3 expect.err >> expect.err.2 &&
360 + echo "From $pwd/." > expect.err.super &&
361 + echo " $head1..$head2 super -> origin/super" >> expect.err.super &&
362 (
363 cd downstream &&
364 git fetch >../actual.out 2>../actual.err
365 ) &&
339 - test_cmp expect.err.2 actual.err &&
366 + verify_fetch_result actual.err &&
367 test_must_be_empty actual.out
368 '
369
@@ -372,11 +399,8 @@ test_expect_success "'--recurse-submodules=on-demand' recurses as deep as necess
399 git add submodule &&
400 git commit -m "new submodule" &&
401 head2=$(git rev-parse --short HEAD) &&
375 - tail -3 expect.err > expect.err.deepsub &&
376 - echo "From $pwd/." > expect.err &&
377 - echo " $head1..$head2 super -> origin/super" >>expect.err &&
378 - cat expect.err.sub >> expect.err &&
379 - cat expect.err.deepsub >> expect.err &&
402 + echo "From $pwd/." > expect.err.super &&
403 + echo " $head1..$head2 super -> origin/super" >>expect.err.super &&
404 (
405 cd downstream &&
406 git config fetch.recurseSubmodules false &&
@@ -392,7 +416,7 @@ test_expect_success "'--recurse-submodules=on-demand' recurses as deep as necess
416 )
417 ) &&
418 test_must_be_empty actual.out &&
395 - test_cmp expect.err actual.err
419 + verify_fetch_result actual.err
420 '
421
422 test_expect_success "'--recurse-submodules=on-demand' stops when no new submodule commits are found in the superproject (and ignores config)" '
@@ -402,14 +426,16 @@ test_expect_success "'--recurse-submodules=on-demand' stops when no new submodul
426 git add file &&
427 git commit -m "new file" &&
428 head2=$(git rev-parse --short HEAD) &&
405 - echo "From $pwd/." > expect.err.file &&
406 - echo " $head1..$head2 super -> origin/super" >> expect.err.file &&
429 + echo "From $pwd/." > expect.err.super &&
430 + echo " $head1..$head2 super -> origin/super" >> expect.err.super &&
431 + rm expect.err.sub &&
432 + rm expect.err.deep &&
433 (
434 cd downstream &&
435 git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err
436 ) &&
437 test_must_be_empty actual.out &&
412 - test_cmp expect.err.file actual.err
438 + verify_fetch_result actual.err
439 '
440
441 test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config" '
@@ -423,9 +449,9 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config
449 git add submodule &&
450 git commit -m "new submodule" &&
451 head2=$(git rev-parse --short HEAD) &&
426 - echo "From $pwd/." > expect.err.2 &&
427 - echo " $head1..$head2 super -> origin/super" >>expect.err.2 &&
428 - head -3 expect.err >> expect.err.2 &&
452 + echo "From $pwd/." > expect.err.super &&
453 + echo " $head1..$head2 super -> origin/super" >>expect.err.super &&
454 + rm expect.err.deep &&
455 (
456 cd downstream &&
457 git config fetch.recurseSubmodules on-demand &&
@@ -437,7 +463,7 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config
463 git config --unset fetch.recurseSubmodules
464 ) &&
465 test_must_be_empty actual.out &&
440 - test_cmp expect.err.2 actual.err
466 + verify_fetch_result actual.err
467 '
468
469 test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' overrides fetch.recurseSubmodules" '
@@ -451,9 +477,9 @@ test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' override
477 git add submodule &&
478 git commit -m "new submodule" &&
479 head2=$(git rev-parse --short HEAD) &&
454 - echo "From $pwd/." > expect.err.2 &&
455 - echo " $head1..$head2 super -> origin/super" >>expect.err.2 &&
456 - head -3 expect.err >> expect.err.2 &&
480 + echo "From $pwd/." > expect.err.super &&
481 + echo " $head1..$head2 super -> origin/super" >>expect.err.super &&
482 + rm expect.err.deep &&
483 (
484 cd downstream &&
485 git config submodule.submodule.fetchRecurseSubmodules on-demand &&
@@ -465,7 +491,7 @@ test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' override
491 git config --unset submodule.submodule.fetchRecurseSubmodules
492 ) &&
493 test_must_be_empty actual.out &&
468 - test_cmp expect.err.2 actual.err
494 + verify_fetch_result actual.err
495 '
496
497 test_expect_success "don't fetch submodule when newly recorded commits are already present" '
@@ -477,14 +503,17 @@ test_expect_success "don't fetch submodule when newly recorded commits are alrea
503 git add submodule &&
504 git commit -m "submodule rewound" &&
505 head2=$(git rev-parse --short HEAD) &&
480 - echo "From $pwd/." > expect.err &&
481 - echo " $head1..$head2 super -> origin/super" >> expect.err &&
506 + echo "From $pwd/." > expect.err.super &&
507 + echo " $head1..$head2 super -> origin/super" >> expect.err.super &&
508 + rm expect.err.sub &&
509 + # This file does not exist, but rm -f for readability
510 + rm -f expect.err.deep &&
511 (
512 cd downstream &&
513 git fetch >../actual.out 2>../actual.err
514 ) &&
515 test_must_be_empty actual.out &&
487 - test_cmp expect.err actual.err &&
516 + verify_fetch_result actual.err &&
517 (
518 cd submodule &&
519 git checkout -q sub
@@ -502,9 +531,9 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' works also without .git
531 git rm .gitmodules &&
532 git commit -m "new submodule without .gitmodules" &&
533 head2=$(git rev-parse --short HEAD) &&
505 - echo "From $pwd/." >expect.err.2 &&
506 - echo " $head1..$head2 super -> origin/super" >>expect.err.2 &&
507 - head -3 expect.err >>expect.err.2 &&
534 + echo "From $pwd/." >expect.err.super &&
535 + echo " $head1..$head2 super -> origin/super" >>expect.err.super &&
536 + rm expect.err.deep &&
537 (
538 cd downstream &&
539 rm .gitmodules &&
@@ -520,7 +549,7 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' works also without .git
549 git reset --hard
550 ) &&
551 test_must_be_empty actual.out &&
523 - test_cmp expect.err.2 actual.err &&
552 + verify_fetch_result actual.err &&
553 git checkout HEAD^ -- .gitmodules &&
554 git add .gitmodules &&
555 git commit -m "new submodule restored .gitmodules"