Re: [PATCH 1/7] test-lib: remove test_external
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Mar 10, 2021, 02:22 UTC
- Message-ID
- <878s6viw8e.fsf@evledraar.gmail.com>
- In-Reply-To
- <xmqqsg53yg28.fsf@gitster.c.googlers.com>
On Wed, Mar 10 2021, Junio C Hamano wrote:
Show 21 quoted lines
> Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes: > >> Remove the test_external function(s) in favor of running the Perl >> tests with a test_expect_success. >> ... >> My motivation for this is to eliminate a special case where things >> that aren't test-lib.sh are going to produce TAP, for reasons that'll >> be clear in subsequent commits. > > Puzzled. > >> .../netrc/t-git-credential-netrc.sh | 7 +- >> t/README | 26 ------ >> t/t0202-gettext-perl.sh | 10 +-- >> t/t9700-perl-git.sh | 10 +-- >> t/test-lib-functions.sh | 89 +------------------ >> t/test-lib.sh | 42 ++++----- >> 6 files changed, 28 insertions(+), 156 deletions(-) > > Reducing the number of lines is always good, but is this essentially > losing what the commit that added test_external wanted to add?
Yes, I don't think streaming TAP from external sources is a problem worth solving in the first place.
Show 22 quoted lines
>> diff --git a/contrib/credential/netrc/t-git-credential-netrc.sh b/contrib/credential/netrc/t-git-credential-netrc.sh >> index 07227d02287..28118a9e194 100755 >> --- a/contrib/credential/netrc/t-git-credential-netrc.sh >> +++ b/contrib/credential/netrc/t-git-credential-netrc.sh >> @@ -20,13 +20,10 @@ >> 'set up test repository' \ >> 'git config --add gpg.program test.git-config-gpg' >> >> - # The external test will outputs its own plan >> - test_external_has_tap=1 >> - >> export PERL5LIB="$GITPERLLIB" >> - test_external \ >> - 'git-credential-netrc' \ >> + test_expect_success 'git-credential-netrc' ' >> perl "$GIT_BUILD_DIR"/contrib/credential/netrc/test.pl >> + ' >> >> test_done >> ) > > This is valid because we expect nobody runs this under tap?
No, because at this point we suppress the --verbose output under
HARNESS_ACTIVE (but see 6/7 later), and under non-verbose we now emit:
./t9700-perl-git.sh
ok 1 - set up test repository
ok 2 - use t9700/test.pl to test Git.pm
# passed all 2 test(s)
1..2So that the stdout from t9700/test.pl doesn't screw up the test output anymore.
Show 30 quoted lines
>> diff --git a/t/t0202-gettext-perl.sh b/t/t0202-gettext-perl.sh
>> index a29d166e007..06a93b36790 100755
>> --- a/t/t0202-gettext-perl.sh
>> +++ b/t/t0202-gettext-perl.sh
>> @@ -17,11 +17,9 @@ perl -MTest::More -e 0 2>/dev/null || {
>> test_done
>> }
>>
>> -# The external test will outputs its own plan
>> -test_external_has_tap=1
>> -
>> -test_external_without_stderr \
>> - 'Perl Git::I18N API' \
>> - perl "$TEST_DIRECTORY"/t0202/test.pl
>> +test_expect_success 'run t0202/test.pl to test Git::I18N.pm' '
>> + perl "$TEST_DIRECTORY"/t0202/test.pl 2>stderr &&
>> + test_must_be_empty stderr
>> +'
>
> So t0202/test.pl would still produce output that would confuse
> whoever is reading our output as TAP, and it is OK? If the
> redirection discards its standard output to /dev/null [*], I would
> sort-of understand how this may work (we would have let the perl
> script to emit 13 "ok" or "not ok" to our output, but now we discard
> that and write just one our own "ok" or "not ok", depending on what
> comes out to the standard error stream (e.g. "# Looks like you
> failed...").
>
> But that is not what is going on. We'll let these 13 "ok" or "not ok"
> come out from the perl script and then add another on our own.Yes, but just like we don't have stdout from any other program appear directly in the output of ./tXXXX*.sh the TAP doesn't get to our stderr either, i.e. our whole juggling around with FDs 1-4.
Show 31 quoted lines
>> diff --git a/t/t9700-perl-git.sh b/t/t9700-perl-git.sh >> index 102c133112c..574c57b17f1 100755 >> --- a/t/t9700-perl-git.sh >> +++ b/t/t9700-perl-git.sh >> @@ -50,11 +50,9 @@ test_expect_success \ > > git config --add test.pathmulti bar >> ' >> >> -# The external test will outputs its own plan >> -test_external_has_tap=1 >> - >> -test_external_without_stderr \ >> - 'Perl API' \ >> - perl "$TEST_DIRECTORY"/t9700/test.pl >> +test_expect_success 'use t9700/test.pl to test Git.pm' ' >> + perl "$TEST_DIRECTORY"/t9700/test.pl 2>stderr && >> + test_must_be_empty stderr >> +' > > Ditto. It seems that we are still letting the script, i.e. one of > the "things that aren't test-lib.sh" to produce TAP anyway. > > > [Footnote] > > * If we are truly somehow discarding these output that would be TAP > (13 tests in 0202 and uncounted in 9700) from being shown (by e.g. > redirecting output to /dev/null), it would be a regression for those > who debug breakage found by these tests. They used to be told which > one failed and how but now they don't. So I do not think that is a > useful way to go, either.
You still get the full TAP output under --verbose for debugging, we just
don't consume it as TAP anymore by "prove" etc, i.e. once we get to 6/7:
$ GIT_TEST_TEE_STARTED=true HARNESS_ACTIVE=t ./t9700-perl-git.sh --verbose --tee
[...]
ok 1 - set up test repository
## expecting success of 9700.2 'use t9700/test.pl to test Git.pm':
perl "$TEST_DIRECTORY"/t9700/test.pl 2>stderr &&
test_must_be_empty stderr
\ok 2 - use Git;
\ok 3 - open repository
\ok 4 - config scalar: string
\ok 5 - config array: string
\ok 6 - config scalar: nonexistent
\ok 7 - config array: nonexistent
[...]
\ok 44 - cat_blob(outside): size
\ok 45 - unquote unquoted path
\ok 46 - unquote simple quoted path
\ok 47 - unquote escape sequences
\1..47
ok 2 - use t9700/test.pl to test Git.pm
# passed all 2 test(s)
1..2Notice how it's escaped now.
So yes, we don't get the benefit of having e.g. prove/CI say that our 6th test failed anymore in this case.
I think that's a very small price to pay for the benefit of not having to monkeypatch Perl's TAP emitting in this case to do the back & forth munging to safe the TAP output I'm doing in 6/7, and only need to do in one place because I'd gotten rid of this special-case earlier.