t7527: test status with untracked-cache and fsmonitor--daemon

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>

Jeff Hostetler committed Mar 25, 2022 at 18:03 UTC a3dfe97f418762ccf1d0601c5cce40c77046d4fc
1 file changed +115
t/t7527-builtin-fsmonitor.sh
+115
@@ -205,6 +205,8 @@ test_expect_success 'setup' '
205 .gitignore
206 expect*
207 actual*
208 + flush*
209 + trace*
210 EOF
211
212 git -c core.fsmonitor=false add . &&
@@ -491,4 +493,117 @@ test_expect_success 'cleanup worktrees' '
493 stop_daemon_delete_repo wt-base
494 '
495
496 +# The next few tests perform arbitrary/contrived file operations and
497 +# confirm that status is correct. That is, that the data (or lack of
498 +# data) from fsmonitor doesn't cause incorrect results. And doesn't
499 +# cause incorrect results when the untracked-cache is enabled.
500 +
501 +test_lazy_prereq UNTRACKED_CACHE '
502 + git update-index --test-untracked-cache
503 +'
504 +
505 +test_expect_success 'Matrix: setup for untracked-cache,fsmonitor matrix' '
506 + test_unconfig core.fsmonitor &&
507 + git update-index --no-fsmonitor &&
508 + test_might_fail git fsmonitor--daemon stop
509 +'
510 +
511 +matrix_clean_up_repo () {
512 + git reset --hard HEAD &&
513 + git clean -fd
514 +}
515 +
516 +matrix_try () {
517 + uc=$1 &&
518 + fsm=$2 &&
519 + fn=$3 &&
520 +
521 + if test $uc = true && test $fsm = false
522 + then
523 + # The untracked-cache is buggy when FSMonitor is
524 + # DISABLED, so skip the tests for this matrix
525 + # combination.
526 + #
527 + # We've observed random, occasional test failures on
528 + # Windows and MacOS when the UC is turned on and FSM
529 + # is turned off. These are rare, but they do happen
530 + # indicating that it is probably a race condition within
531 + # the untracked cache itself.
532 + #
533 + # It usually happens when a test does F/D trickery and
534 + # then the NEXT test fails because of extra status
535 + # output from stale UC data from the previous test.
536 + #
537 + # Since FSMonitor is not involved in the error, skip
538 + # the tests for this matrix combination.
539 + #
540 + return 0
541 + fi &&
542 +
543 + test_expect_success "Matrix[uc:$uc][fsm:$fsm] $fn" '
544 + matrix_clean_up_repo &&
545 + $fn &&
546 + if test $uc = false && test $fsm = false
547 + then
548 + git status --porcelain=v1 >.git/expect.$fn
549 + else
550 + git status --porcelain=v1 >.git/actual.$fn &&
551 + test_cmp .git/expect.$fn .git/actual.$fn
552 + fi
553 + '
554 +}
555 +
556 +uc_values="false"
557 +test_have_prereq UNTRACKED_CACHE && uc_values="false true"
558 +for uc_val in $uc_values
559 +do
560 + if test $uc_val = false
561 + then
562 + test_expect_success "Matrix[uc:$uc_val] disable untracked cache" '
563 + git config core.untrackedcache false &&
564 + git update-index --no-untracked-cache
565 + '
566 + else
567 + test_expect_success "Matrix[uc:$uc_val] enable untracked cache" '
568 + git config core.untrackedcache true &&
569 + git update-index --untracked-cache
570 + '
571 + fi
572 +
573 + fsm_values="false true"
574 + for fsm_val in $fsm_values
575 + do
576 + if test $fsm_val = false
577 + then
578 + test_expect_success "Matrix[uc:$uc_val][fsm:$fsm_val] disable fsmonitor" '
579 + test_unconfig core.fsmonitor &&
580 + git update-index --no-fsmonitor &&
581 + test_might_fail git fsmonitor--daemon stop
582 + '
583 + else
584 + test_expect_success "Matrix[uc:$uc_val][fsm:$fsm_val] enable fsmonitor" '
585 + git config core.fsmonitor true &&
586 + git fsmonitor--daemon start &&
587 + git update-index --fsmonitor
588 + '
589 + fi
590 +
591 + matrix_try $uc_val $fsm_val edit_files
592 + matrix_try $uc_val $fsm_val delete_files
593 + matrix_try $uc_val $fsm_val create_files
594 + matrix_try $uc_val $fsm_val rename_files
595 + matrix_try $uc_val $fsm_val file_to_directory
596 + matrix_try $uc_val $fsm_val directory_to_file
597 +
598 + if test $fsm_val = true
599 + then
600 + test_expect_success "Matrix[uc:$uc_val][fsm:$fsm_val] disable fsmonitor at end" '
601 + test_unconfig core.fsmonitor &&
602 + git update-index --no-fsmonitor &&
603 + test_might_fail git fsmonitor--daemon stop
604 + '
605 + fi
606 + done
607 +done
608 +
609 test_done