Skip to content

Commit

Permalink
t7063: mtime-mangling instead of delays in untracked cache testing
Browse files Browse the repository at this point in the history
The untracked cache test uses an avoid_racy function to deal with
an mtime-resolution challenge in testing: If an untracked cache
entry's mtime falls in the same second as the mtime of the index
the untracked cache was stored in, then it cannot be trusted.

Explicitly delaying tests is a simple effective strategy to
avoid these issues, but should be avoided where possible.

Switch from a delay-based strategy to instead backdating
all file changes using test-tool chmtime, where that is an
option, to shave 9 seconds off the test run time.

Don't update test cases that delay for other reasons, for now at
least (4 seconds).

Signed-off-by: Tao Klerks <tao@klerks.biz>
  • Loading branch information
TaoK committed Mar 1, 2022
1 parent 7cdef0a commit 3e3c9c7
Showing 1 changed file with 15 additions and 12 deletions.
27 changes: 15 additions & 12 deletions t/t7063-status-untracked-cache.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ sync_mtime () {
find . -type d -exec ls -ld {} + >/dev/null
}

chmtime_worktree_root () {
# chmtime doesnt handle relative paths on windows, so need
# to "hardcode" a reference to the worktree folder name.
test-tool -C .. chmtime $1 worktree
}

avoid_racy() {
sleep 1
}
Expand Down Expand Up @@ -90,6 +96,9 @@ test_expect_success 'setup' '
cd worktree &&
mkdir done dtwo dthree &&
touch one two three done/one dtwo/two dthree/three &&
test-tool chmtime =-300 one two three done/one dtwo/two dthree/three &&
test-tool chmtime =-300 done dtwo dthree &&
chmtime_worktree_root =-300 &&
git add one two done/one &&
: >.git/info/exclude &&
git update-index --untracked-cache &&
Expand Down Expand Up @@ -142,7 +151,6 @@ two
EOF

test_expect_success 'status first time (empty cache)' '
avoid_racy &&
: >../trace.output &&
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
git status --porcelain >../actual &&
Expand All @@ -166,7 +174,6 @@ test_expect_success 'untracked cache after first status' '
'

test_expect_success 'status second time (fully populated cache)' '
avoid_racy &&
: >../trace.output &&
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
git status --porcelain >../actual &&
Expand All @@ -190,8 +197,8 @@ test_expect_success 'untracked cache after second status' '
'

test_expect_success 'modify in root directory, one dir invalidation' '
avoid_racy &&
: >four &&
test-tool chmtime =-240 four &&
: >../trace.output &&
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
git status --porcelain >../actual &&
Expand Down Expand Up @@ -241,7 +248,6 @@ EOF
'

test_expect_success 'new .gitignore invalidates recursively' '
avoid_racy &&
echo four >.gitignore &&
: >../trace.output &&
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
Expand Down Expand Up @@ -292,7 +298,6 @@ EOF
'

test_expect_success 'new info/exclude invalidates everything' '
avoid_racy &&
echo three >>.git/info/exclude &&
: >../trace.output &&
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
Expand Down Expand Up @@ -520,14 +525,14 @@ test_expect_success 'create/modify files, some of which are gitignored' '
echo three >done/three && # three is gitignored
echo four >done/four && # four is gitignored at a higher level
echo five >done/five && # five is not gitignored
echo test >base && #we need to ensure that the root dir is touched
rm base &&
test-tool chmtime =-180 done/two done/three done/four done/five done &&
# we need to ensure that the root dir is touched (in the past);
chmtime_worktree_root =-180 &&
sync_mtime
'

test_expect_success 'test sparse status with untracked cache' '
: >../trace.output &&
avoid_racy &&
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
git status --porcelain >../status.actual &&
iuc status --porcelain >../status.iuc &&
Expand Down Expand Up @@ -570,7 +575,6 @@ EOF
'

test_expect_success 'test sparse status again with untracked cache' '
avoid_racy &&
: >../trace.output &&
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
git status --porcelain >../status.actual &&
Expand All @@ -597,11 +601,11 @@ EOF
test_expect_success 'set up for test of subdir and sparse checkouts' '
mkdir done/sub &&
mkdir done/sub/sub &&
echo "sub" > done/sub/sub/file
echo "sub" > done/sub/sub/file &&
test-tool chmtime =-120 done/sub/sub/file done/sub/sub done/sub done
'

test_expect_success 'test sparse status with untracked cache and subdir' '
avoid_racy &&
: >../trace.output &&
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
git status --porcelain >../status.actual &&
Expand Down Expand Up @@ -651,7 +655,6 @@ EOF
'

test_expect_success 'test sparse status again with untracked cache and subdir' '
avoid_racy &&
: >../trace.output &&
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
git status --porcelain >../status.actual &&
Expand Down

0 comments on commit 3e3c9c7

Please sign in to comment.