]> git.ipfire.org Git - thirdparty/git.git/commitdiff
t7527: test status with untracked-cache and fsmonitor--daemon
authorJeff Hostetler <jeffhost@microsoft.com>
Fri, 25 Mar 2022 18:03:13 +0000 (18:03 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 25 Mar 2022 23:04:18 +0000 (16:04 -0700)
Create 2x2 test matrix with the untracked-cache and fsmonitor--daemon
features and a series of edits and verify that status output is
identical.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t7527-builtin-fsmonitor.sh

index 062e01c0dfc86b557262667f60c288091ffec006..bd0c952a11659cb10216aa318e83c968a0cc80cb 100755 (executable)
@@ -205,6 +205,8 @@ test_expect_success 'setup' '
        .gitignore
        expect*
        actual*
+       flush*
+       trace*
        EOF
 
        git -c core.fsmonitor=false add . &&
@@ -491,4 +493,117 @@ test_expect_success 'cleanup worktrees' '
        stop_daemon_delete_repo wt-base
 '
 
+# The next few tests perform arbitrary/contrived file operations and
+# confirm that status is correct.  That is, that the data (or lack of
+# data) from fsmonitor doesn't cause incorrect results.  And doesn't
+# cause incorrect results when the untracked-cache is enabled.
+
+test_lazy_prereq UNTRACKED_CACHE '
+       git update-index --test-untracked-cache
+'
+
+test_expect_success 'Matrix: setup for untracked-cache,fsmonitor matrix' '
+       test_unconfig core.fsmonitor &&
+       git update-index --no-fsmonitor &&
+       test_might_fail git fsmonitor--daemon stop
+'
+
+matrix_clean_up_repo () {
+       git reset --hard HEAD &&
+       git clean -fd
+}
+
+matrix_try () {
+       uc=$1 &&
+       fsm=$2 &&
+       fn=$3 &&
+
+       if test $uc = true && test $fsm = false
+       then
+               # The untracked-cache is buggy when FSMonitor is
+               # DISABLED, so skip the tests for this matrix
+               # combination.
+               #
+               # We've observed random, occasional test failures on
+               # Windows and MacOS when the UC is turned on and FSM
+               # is turned off.  These are rare, but they do happen
+               # indicating that it is probably a race condition within
+               # the untracked cache itself.
+               #
+               # It usually happens when a test does F/D trickery and
+               # then the NEXT test fails because of extra status
+               # output from stale UC data from the previous test.
+               #
+               # Since FSMonitor is not involved in the error, skip
+               # the tests for this matrix combination.
+               #
+               return 0
+       fi &&
+
+       test_expect_success "Matrix[uc:$uc][fsm:$fsm] $fn" '
+               matrix_clean_up_repo &&
+               $fn &&
+               if test $uc = false && test $fsm = false
+               then
+                       git status --porcelain=v1 >.git/expect.$fn
+               else
+                       git status --porcelain=v1 >.git/actual.$fn &&
+                       test_cmp .git/expect.$fn .git/actual.$fn
+               fi
+       '
+}
+
+uc_values="false"
+test_have_prereq UNTRACKED_CACHE && uc_values="false true"
+for uc_val in $uc_values
+do
+       if test $uc_val = false
+       then
+               test_expect_success "Matrix[uc:$uc_val] disable untracked cache" '
+                       git config core.untrackedcache false &&
+                       git update-index --no-untracked-cache
+               '
+       else
+               test_expect_success "Matrix[uc:$uc_val] enable untracked cache" '
+                       git config core.untrackedcache true &&
+                       git update-index --untracked-cache
+               '
+       fi
+
+       fsm_values="false true"
+       for fsm_val in $fsm_values
+       do
+               if test $fsm_val = false
+               then
+                       test_expect_success "Matrix[uc:$uc_val][fsm:$fsm_val] disable fsmonitor" '
+                               test_unconfig core.fsmonitor &&
+                               git update-index --no-fsmonitor &&
+                               test_might_fail git fsmonitor--daemon stop
+                       '
+               else
+                       test_expect_success "Matrix[uc:$uc_val][fsm:$fsm_val] enable fsmonitor" '
+                               git config core.fsmonitor true &&
+                               git fsmonitor--daemon start &&
+                               git update-index --fsmonitor
+                       '
+               fi
+
+               matrix_try $uc_val $fsm_val edit_files
+               matrix_try $uc_val $fsm_val delete_files
+               matrix_try $uc_val $fsm_val create_files
+               matrix_try $uc_val $fsm_val rename_files
+               matrix_try $uc_val $fsm_val file_to_directory
+               matrix_try $uc_val $fsm_val directory_to_file
+
+               if test $fsm_val = true
+               then
+                       test_expect_success "Matrix[uc:$uc_val][fsm:$fsm_val] disable fsmonitor at end" '
+                               test_unconfig core.fsmonitor &&
+                               git update-index --no-fsmonitor &&
+                               test_might_fail git fsmonitor--daemon stop
+                       '
+               fi
+       done
+done
+
 test_done