# [PATCH 1/3] tests: do not negate test_path_exists

6 messages from 2023-05-16 to 2023-05-16. Participants: Junio C Hamano, Eric Sunshine.
Thread: https://gitlist.dev/t/59746

## Junio C Hamano, 2023-05-16 02:26

Subject: [PATCH 1/3] tests: do not negate test_path_exists
Message-ID: <20230516022646.648123-2-gitster@pobox.com>
URL: https://gitlist.dev/e/20230516022646.648123-2-gitster%40pobox.com
In-Reply-To: <20230516022646.648123-1-gitster@pobox.com>

```
As a way to assert the path 'foo' is missing, "! test_path_exists foo" a
poor way to do so, as the helper is designed to complain when 'foo' is
missing, but the intention of the author who used negated form was to
make sure it does not exist.  This does not help debugging the tests.

Use test_path_is_missing instead, which is a more appropriate helper.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/t4067-diff-partial-clone.sh | 4 ++--
 t/t4115-apply-symlink.sh      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/t/t4067-diff-partial-clone.sh b/t/t4067-diff-partial-clone.sh
index f60f5cbd65..7af3a08862 100755
--- a/t/t4067-diff-partial-clone.sh
+++ b/t/t4067-diff-partial-clone.sh
@@ -151,7 +151,7 @@ test_expect_success 'diff does not fetch anything if inexact rename detection is
 
 	# Ensure no fetches.
 	GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff --raw -M HEAD^ HEAD &&
-	! test_path_exists trace
+	test_path_is_missing trace
 '
 
 test_expect_success 'diff --break-rewrites fetches only if necessary, and batches blobs if it does' '
@@ -171,7 +171,7 @@ test_expect_success 'diff --break-rewrites fetches only if necessary, and batche
 
 	# Ensure no fetches.
 	GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff --raw -M HEAD^ HEAD &&
-	! test_path_exists trace &&
+	test_path_is_missing trace &&
 
 	# But with --break-rewrites, ensure that there is exactly 1 negotiation
 	# by checking that there is only 1 "done" line sent. ("done" marks the
diff --git a/t/t4115-apply-symlink.sh b/t/t4115-apply-symlink.sh
index e95e6d4e7d..a22a90d552 100755
--- a/t/t4115-apply-symlink.sh
+++ b/t/t4115-apply-symlink.sh
@@ -74,7 +74,7 @@ test_expect_success SYMLINKS 'symlink escape when creating new files' '
 	error: affected file ${SQ}renamed-symlink/create-me${SQ} is beyond a symbolic link
 	EOF
 	test_cmp expected_stderr stderr &&
-	! test_path_exists .git/create-me
+	test_path_is_missing .git/create-me
 '
 
 test_expect_success SYMLINKS 'symlink escape when modifying file' '
-- 
2.41.0-rc0


```

## Junio C Hamano, 2023-05-16 02:26

Subject: [PATCH 0/3] fix use of "! test_path_is_foo" in tests
Message-ID: <20230516022646.648123-1-gitster@pobox.com>
URL: https://gitlist.dev/e/20230516022646.648123-1-gitster%40pobox.com

```
During recent review of a topic, I noticed that there are a handful
of places where we misuse test_path_is_{file,directory} test helper
functions.  They are designed to be silent when the given path is
of the expected type, so

	! test_path_is_file foo

when you do not want 'foo' to be a file, while making the test pass,
does not help debugging when things go wrong.

These small patches touch the places where

	$ git grep -e '! test_path_' t/

shows hits, except for test_path_is_hidden that shares the same name
pattern but is not designed to help debugging like others.

Junio C Hamano (3):
  tests: do not negate test_path_exists
  t2021: do not negate test_path_is_dir
  test: do not negate test_path_is_* to assert absense

 t/lib-submodule-update.sh     | 2 +-
 t/t2021-checkout-overwrite.sh | 2 +-
 t/t4067-diff-partial-clone.sh | 4 ++--
 t/t4115-apply-symlink.sh      | 2 +-
 t/t5572-pull-submodule.sh     | 4 ++--
 5 files changed, 7 insertions(+), 7 deletions(-)

-- 
2.41.0-rc0


```

## Junio C Hamano, 2023-05-16 02:26

Subject: [PATCH 3/3] test: do not negate test_path_is_* to assert absense
Message-ID: <20230516022646.648123-4-gitster@pobox.com>
URL: https://gitlist.dev/e/20230516022646.648123-4-gitster%40pobox.com
In-Reply-To: <20230516022646.648123-1-gitster@pobox.com>

```
These tests use "! test_path_is_dir" or "! test_path_is_file" to
ensure that the path is not recursively checked out or "submodule
update" did not touch the working tree.

Use "test_path_is_missing" to assert that the path does not exist,
instead of negating test_path_is_* helpers; they are designed to be
loud in wrong occasions.  Besides, negating "test_path_is_dir" would
mean we would be happy if a file exists there, which is not the case
for these tests.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/lib-submodule-update.sh | 2 +-
 t/t5572-pull-submodule.sh | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/t/lib-submodule-update.sh b/t/lib-submodule-update.sh
index dee14992c5..9acb0d5d19 100644
--- a/t/lib-submodule-update.sh
+++ b/t/lib-submodule-update.sh
@@ -802,7 +802,7 @@ test_submodule_recursing_with_args_common () {
 			git branch -t no_submodule origin/no_submodule &&
 			$command no_submodule &&
 			test_superproject_content origin/no_submodule &&
-			! test_path_is_dir sub1 &&
+			test_path_is_missing sub1 &&
 			test_must_fail git config -f .git/modules/sub1/config core.worktree &&
 			test_must_fail git config -f .git/modules/sub1/modules/sub2/config core.worktree
 		)
diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh
index 09097eff3f..4e917bf87d 100755
--- a/t/t5572-pull-submodule.sh
+++ b/t/t5572-pull-submodule.sh
@@ -121,7 +121,7 @@ test_expect_success "fetch.recurseSubmodules option triggers recursive fetch (bu
 	sub_oid=$(git -C child rev-parse HEAD) &&
 	git -C super/sub cat-file -e $sub_oid &&
 	# Check that the submodule worktree did not update
-	! test_path_is_file super/sub/merge_strategy_5.t
+	test_path_is_missing super/sub/merge_strategy_5.t
 '
 
 test_expect_success "fetch.recurseSubmodules takes precedence over submodule.recurse" '
@@ -134,7 +134,7 @@ test_expect_success "fetch.recurseSubmodules takes precedence over submodule.rec
 	sub_oid=$(git -C child rev-parse HEAD) &&
 	git -C super/sub cat-file -e $sub_oid &&
 	# Check that the submodule worktree did not update
-	! test_path_is_file super/sub/merge_strategy_6.t
+	test_path_is_missing super/sub/merge_strategy_6.t
 '
 
 test_expect_success 'pull --rebase --recurse-submodules (remote superproject submodule changes, local submodule changes)' '
-- 
2.41.0-rc0


```

## Junio C Hamano, 2023-05-16 02:26

Subject: [PATCH 2/3] t2021: do not negate test_path_is_dir
Message-ID: <20230516022646.648123-3-gitster@pobox.com>
URL: https://gitlist.dev/e/20230516022646.648123-3-gitster%40pobox.com
In-Reply-To: <20230516022646.648123-1-gitster@pobox.com>

```
In this test, a path (some_dir) that is originally a directory is to
be removed and then to be replaced with a file of the same name.
The expectation is that the path becomes a file at the end.
However, "!  test_path_is_dir some_dir" is used to catch a breakage
that leaves the path as a directory.

But as with all the "test_path_is..." helpers, this use of the
helper makes it loud when the expectation (i.e. it is a directory)
is met, and otherwise is silent when it is not---this does not help
debugging.

Be more explicit and state that we expect the path to become a file.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/t2021-checkout-overwrite.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/t/t2021-checkout-overwrite.sh b/t/t2021-checkout-overwrite.sh
index 034f62c13c..ecfacf0f7f 100755
--- a/t/t2021-checkout-overwrite.sh
+++ b/t/t2021-checkout-overwrite.sh
@@ -77,7 +77,7 @@ test_expect_success 'checkout --overwrite-ignore should succeed if only ignored
 	echo autogenerated information >some_dir/ignore &&
 	echo ignore >.git/info/exclude &&
 	git checkout --overwrite-ignore df_conflict &&
-	! test_path_is_dir some_dir
+	test_path_is_file some_dir
 '
 
 test_done
-- 
2.41.0-rc0


```

## Eric Sunshine, 2023-05-16 02:53

Subject: Re: [PATCH 1/3] tests: do not negate test_path_exists
Message-ID: <CAPig+cRwPUJZdov7eAZbZ1qji9qj_Oh5RQ8bpLWsXW9J+QnvPA@mail.gmail.com>
URL: https://gitlist.dev/e/CAPig%2BcRwPUJZdov7eAZbZ1qji9qj_Oh5RQ8bpLWsXW9J%2BQnvPA%40mail.gmail.com
In-Reply-To: <20230516022646.648123-2-gitster@pobox.com>

```
On Mon, May 15, 2023 at 10:37 PM Junio C Hamano <gitster@pobox.com> wrote:
> As a way to assert the path 'foo' is missing, "! test_path_exists foo" a
> poor way to do so, as the helper is designed to complain when 'foo' is
> missing, but the intention of the author who used negated form was to
> make sure it does not exist.  This does not help debugging the tests.

s/a poor/is &/

> Use test_path_is_missing instead, which is a more appropriate helper.
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>

```

## Junio C Hamano, 2023-05-16 16:10

Subject: Re: [PATCH 1/3] tests: do not negate test_path_exists
Message-ID: <xmqqzg64uuid.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqqzg64uuid.fsf%40gitster.g
In-Reply-To: <CAPig+cRwPUJZdov7eAZbZ1qji9qj_Oh5RQ8bpLWsXW9J+QnvPA@mail.gmail.com>

```
Eric Sunshine <sunshine@sunshineco.com> writes:

> On Mon, May 15, 2023 at 10:37 PM Junio C Hamano <gitster@pobox.com> wrote:
>> As a way to assert the path 'foo' is missing, "! test_path_exists foo" a
>> poor way to do so, as the helper is designed to complain when 'foo' is
>> missing, but the intention of the author who used negated form was to
>> make sure it does not exist.  This does not help debugging the tests.
>
> s/a poor/is &/

Thanks.

>
>> Use test_path_is_missing instead, which is a more appropriate helper.
>>
>> Signed-off-by: Junio C Hamano <gitster@pobox.com>

```
