Tests: clean up and document submodule helpers

Factor out the commonalities from test_submodule_switch() and test_submodule_forced_switch() in lib-submodule-update.sh, and document their usage. This also makes explicit (through the KNOWN_FAILURE_FORCED_SWITCH_TESTS variable) the fact that, currently, all functionality tested using test_submodule_forced_switch() do not correctly handle the situation in which a submodule is replaced with an ordinary directory. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Tan committed Nov 7, 2017 at 10:45 UTC d3b5a4974d030262fb3d23e3be8a4cc997679b35
1 file changed +46 -205
t/lib-submodule-update.sh
+46 -205
@@ -306,9 +306,9 @@ test_submodule_content () {
306 # to protect the history!
307 #
308
309 -# Test that submodule contents are currently not updated when switching
310 -# between commits that change a submodule.
311 -test_submodule_switch () {
309 +# Internal function; use test_submodule_switch() or
310 +# test_submodule_forced_switch() instead.
311 +test_submodule_switch_common() {
312 command="$1"
313 ######################### Appearing submodule #########################
314 # Switching to a commit letting a submodule appear creates empty dir ...
@@ -332,7 +332,7 @@ test_submodule_switch () {
332 test_submodule_content sub1 origin/add_sub1
333 )
334 '
335 - # ... and doesn't care if it already exists ...
335 + # ... and doesn't care if it already exists.
336 test_expect_$RESULT "$command: added submodule leaves existing empty directory alone" '
337 prolog &&
338 reset_work_tree_to no_submodule &&
@@ -347,19 +347,6 @@ test_submodule_switch () {
347 test_submodule_content sub1 origin/add_sub1
348 )
349 '
350 - # ... unless there is an untracked file in its place.
351 - test_expect_success "$command: added submodule doesn't remove untracked unignored file with same name" '
352 - prolog &&
353 - reset_work_tree_to no_submodule &&
354 - (
355 - cd submodule_update &&
356 - git branch -t add_sub1 origin/add_sub1 &&
357 - >sub1 &&
358 - test_must_fail $command add_sub1 &&
359 - test_superproject_content origin/no_submodule &&
360 - test_must_be_empty sub1
361 - )
362 - '
350 # Replacing a tracked file with a submodule produces an empty
351 # directory ...
352 test_expect_$RESULT "$command: replace tracked file with submodule creates empty directory" '
@@ -441,6 +428,11 @@ test_submodule_switch () {
428 # submodule files with the newly checked out ones in the
429 # directory of the same name while it shouldn't.
430 RESULT="failure"
431 + elif test "$KNOWN_FAILURE_FORCED_SWITCH_TESTS" = 1
432 + then
433 + # All existing tests that use test_submodule_forced_switch()
434 + # require this.
435 + RESULT="failure"
436 else
437 RESULT="success"
438 fi
@@ -522,7 +514,6 @@ test_submodule_switch () {
514 test_submodule_content sub1 origin/modify_sub1
515 )
516 '
525 -
517 # Updating a submodule to an invalid sha1 doesn't update the
518 # submodule's work tree, subsequent update will fail
519 test_expect_$RESULT "$command: modified submodule does not update submodule work tree to invalid commit" '
@@ -555,42 +546,51 @@ test_submodule_switch () {
546 '
547 }
548
558 -# Test that submodule contents are currently not updated when switching
559 -# between commits that change a submodule, but throwing away local changes in
560 -# the superproject is allowed.
561 -test_submodule_forced_switch () {
549 +# Declares and invokes several tests that, in various situations, checks that
550 +# the provided transition function:
551 +# - succeeds in updating the worktree and index of a superproject to a target
552 +# commit, or fails atomically (depending on the test situation)
553 +# - if succeeds, the contents of submodule directories are unchanged
554 +# - if succeeds, once "git submodule update" is invoked, the contents of
555 +# submodule directories are updated
556 +#
557 +# Use as follows:
558 +#
559 +# my_func () {
560 +# target=$1
561 +# # Do something here that updates the worktree and index to match target,
562 +# # but not any submodule directories.
563 +# }
564 +# test_submodule_switch "my_func"
565 +test_submodule_switch () {
566 command="$1"
563 - ######################### Appearing submodule #########################
564 - # Switching to a commit letting a submodule appear creates empty dir ...
565 - test_expect_success "$command: added submodule creates empty directory" '
566 - prolog &&
567 - reset_work_tree_to no_submodule &&
568 - (
569 - cd submodule_update &&
570 - git branch -t add_sub1 origin/add_sub1 &&
571 - $command add_sub1 &&
572 - test_superproject_content origin/add_sub1 &&
573 - test_dir_is_empty sub1 &&
574 - git submodule update --init --recursive &&
575 - test_submodule_content sub1 origin/add_sub1
576 - )
577 - '
578 - # ... and doesn't care if it already exists ...
579 - test_expect_success "$command: added submodule leaves existing empty directory alone" '
567 + test_submodule_switch_common "$command"
568 +
569 + # An empty directory does not prevent the creation of a submodule of
570 + # the same name, but a file does.
571 + test_expect_success "$command: added submodule doesn't remove untracked unignored file with same name" '
572 prolog &&
573 reset_work_tree_to no_submodule &&
574 (
575 cd submodule_update &&
576 git branch -t add_sub1 origin/add_sub1 &&
585 - mkdir sub1 &&
586 - $command add_sub1 &&
587 - test_superproject_content origin/add_sub1 &&
588 - test_dir_is_empty sub1 &&
589 - git submodule update --init --recursive &&
590 - test_submodule_content sub1 origin/add_sub1
577 + >sub1 &&
578 + test_must_fail $command add_sub1 &&
579 + test_superproject_content origin/no_submodule &&
580 + test_must_be_empty sub1
581 )
582 '
593 - # ... unless there is an untracked file in its place.
583 +}
584 +
585 +# Same as test_submodule_switch(), except that throwing away local changes in
586 +# the superproject is allowed.
587 +test_submodule_forced_switch () {
588 + command="$1"
589 + KNOWN_FAILURE_FORCED_SWITCH_TESTS=1
590 + test_submodule_switch_common "$command"
591 +
592 + # When forced, a file in the superproject does not prevent creating a
593 + # submodule of the same name.
594 test_expect_success "$command: added submodule does remove untracked unignored file with same name when forced" '
595 prolog &&
596 reset_work_tree_to no_submodule &&
@@ -603,165 +603,6 @@ test_submodule_forced_switch () {
603 test_dir_is_empty sub1
604 )
605 '
606 - # Replacing a tracked file with a submodule produces an empty
607 - # directory ...
608 - test_expect_success "$command: replace tracked file with submodule creates empty directory" '
609 - prolog &&
610 - reset_work_tree_to replace_sub1_with_file &&
611 - (
612 - cd submodule_update &&
613 - git branch -t replace_file_with_sub1 origin/replace_file_with_sub1 &&
614 - $command replace_file_with_sub1 &&
615 - test_superproject_content origin/replace_file_with_sub1 &&
616 - test_dir_is_empty sub1 &&
617 - git submodule update --init --recursive &&
618 - test_submodule_content sub1 origin/replace_file_with_sub1
619 - )
620 - '
621 - # ... as does removing a directory with tracked files with a
622 - # submodule.
623 - test_expect_success "$command: replace directory with submodule" '
624 - prolog &&
625 - reset_work_tree_to replace_sub1_with_directory &&
626 - (
627 - cd submodule_update &&
628 - git branch -t replace_directory_with_sub1 origin/replace_directory_with_sub1 &&
629 - $command replace_directory_with_sub1 &&
630 - test_superproject_content origin/replace_directory_with_sub1 &&
631 - test_dir_is_empty sub1 &&
632 - git submodule update --init --recursive &&
633 - test_submodule_content sub1 origin/replace_directory_with_sub1
634 - )
635 - '
636 -
637 - ######################## Disappearing submodule #######################
638 - # Removing a submodule doesn't remove its work tree ...
639 - test_expect_success "$command: removed submodule leaves submodule directory and its contents in place" '
640 - prolog &&
641 - reset_work_tree_to add_sub1 &&
642 - (
643 - cd submodule_update &&
644 - git branch -t remove_sub1 origin/remove_sub1 &&
645 - $command remove_sub1 &&
646 - test_superproject_content origin/remove_sub1 &&
647 - test_submodule_content sub1 origin/add_sub1
648 - )
649 - '
650 - # ... especially when it contains a .git directory.
651 - test_expect_success "$command: removed submodule leaves submodule containing a .git directory alone" '
652 - prolog &&
653 - reset_work_tree_to add_sub1 &&
654 - (
655 - cd submodule_update &&
656 - git branch -t remove_sub1 origin/remove_sub1 &&
657 - replace_gitfile_with_git_dir sub1 &&
658 - $command remove_sub1 &&
659 - test_superproject_content origin/remove_sub1 &&
660 - test_git_directory_is_unchanged sub1 &&
661 - test_submodule_content sub1 origin/add_sub1
662 - )
663 - '
664 - # Replacing a submodule with files in a directory must fail as the
665 - # submodule work tree isn't removed ...
666 - test_expect_failure "$command: replace submodule with a directory must fail" '
667 - prolog &&
668 - reset_work_tree_to add_sub1 &&
669 - (
670 - cd submodule_update &&
671 - git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
672 - test_must_fail $command replace_sub1_with_directory &&
673 - test_superproject_content origin/add_sub1 &&
674 - test_submodule_content sub1 origin/add_sub1
675 - )
676 - '
677 - # ... especially when it contains a .git directory.
678 - test_expect_failure "$command: replace submodule containing a .git directory with a directory must fail" '
679 - prolog &&
680 - reset_work_tree_to add_sub1 &&
681 - (
682 - cd submodule_update &&
683 - git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
684 - replace_gitfile_with_git_dir sub1 &&
685 - test_must_fail $command replace_sub1_with_directory &&
686 - test_superproject_content origin/add_sub1 &&
687 - test_git_directory_is_unchanged sub1 &&
688 - test_submodule_content sub1 origin/add_sub1
689 - )
690 - '
691 - # Replacing it with a file must fail as it could throw away any local
692 - # work tree changes ...
693 - test_expect_failure "$command: replace submodule with a file must fail" '
694 - prolog &&
695 - reset_work_tree_to add_sub1 &&
696 - (
697 - cd submodule_update &&
698 - git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
699 - test_must_fail $command replace_sub1_with_file &&
700 - test_superproject_content origin/add_sub1 &&
701 - test_submodule_content sub1 origin/add_sub1
702 - )
703 - '
704 - # ... or even destroy unpushed parts of submodule history if that
705 - # still uses a .git directory.
706 - test_expect_failure "$command: replace submodule containing a .git directory with a file must fail" '
707 - prolog &&
708 - reset_work_tree_to add_sub1 &&
709 - (
710 - cd submodule_update &&
711 - git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
712 - replace_gitfile_with_git_dir sub1 &&
713 - test_must_fail $command replace_sub1_with_file &&
714 - test_superproject_content origin/add_sub1 &&
715 - test_git_directory_is_unchanged sub1 &&
716 - test_submodule_content sub1 origin/add_sub1
717 - )
718 - '
719 -
720 - ########################## Modified submodule #########################
721 - # Updating a submodule sha1 doesn't update the submodule's work tree
722 - test_expect_success "$command: modified submodule does not update submodule work tree" '
723 - prolog &&
724 - reset_work_tree_to add_sub1 &&
725 - (
726 - cd submodule_update &&
727 - git branch -t modify_sub1 origin/modify_sub1 &&
728 - $command modify_sub1 &&
729 - test_superproject_content origin/modify_sub1 &&
730 - test_submodule_content sub1 origin/add_sub1 &&
731 - git submodule update &&
732 - test_submodule_content sub1 origin/modify_sub1
733 - )
734 - '
735 - # Updating a submodule to an invalid sha1 doesn't update the
736 - # submodule's work tree, subsequent update will fail
737 - test_expect_success "$command: modified submodule does not update submodule work tree to invalid commit" '
738 - prolog &&
739 - reset_work_tree_to add_sub1 &&
740 - (
741 - cd submodule_update &&
742 - git branch -t invalid_sub1 origin/invalid_sub1 &&
743 - $command invalid_sub1 &&
744 - test_superproject_content origin/invalid_sub1 &&
745 - test_submodule_content sub1 origin/add_sub1 &&
746 - test_must_fail git submodule update &&
747 - test_submodule_content sub1 origin/add_sub1
748 - )
749 - '
750 - # Updating a submodule from an invalid sha1 doesn't update the
751 - # submodule's work tree, subsequent update will succeed
752 - test_expect_success "$command: modified submodule does not update submodule work tree from invalid commit" '
753 - prolog &&
754 - reset_work_tree_to invalid_sub1 &&
755 - (
756 - cd submodule_update &&
757 - git branch -t valid_sub1 origin/valid_sub1 &&
758 - $command valid_sub1 &&
759 - test_superproject_content origin/valid_sub1 &&
760 - test_dir_is_empty sub1 &&
761 - git submodule update --init --recursive &&
762 - test_submodule_content sub1 origin/valid_sub1
763 - )
764 - '
606 }
607
608 # Test that submodule contents are correctly updated when switching