]> git.ipfire.org Git - thirdparty/git.git/commitdiff
tests: fix --write-junit-xml with subshells
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Wed, 12 Feb 2020 11:27:55 +0000 (11:27 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 12 Feb 2020 17:19:42 +0000 (09:19 -0800)
In t0000, more precisely in its `test_bool_env` test case, there are two
subshells that are supposed to fail. To be even _more_ precise, they
fail by calling the `error` function, and that is okay, because it is in
a subshell, and it is expected that those two subshell invocations fail.

However, the `error` function also tries to finalize the JUnit XML (if
that XML was asked for, via `--write-junit-xml`. As a consequence, the
XML is edited to add a `time` attribute for the `testsuite` tag. And
since there are two expected `error` calls in addition to the final
`test_done`, the `finalize_junit_xml` function is called three times and
naturally the `time` attribute is added _three times_.

Azure Pipelines is not happy with that, complaining thusly:

 ##[warning]Failed to read D:\a\1\s\t\out\TEST-t0000-basic.xml. Error : 'time' is a duplicate attribute name. Line 2, position 82..

One possible way to address this would be to unset `write_junit_xml` in
the `test_bool_env` test case.

But that would be fragile, as other `error` calls in subshells could be
introduced.

So let's just modify `finalize_junit_xml` to remove any `time` attribute
before adding the authoritative one.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/test-lib.sh

index e06fa02a0eec2409ac78054d1ce30f9c3cf465b1..18065f5689160e280903a3e7254c0316ca862760 100644 (file)
@@ -1079,7 +1079,8 @@ finalize_junit_xml () {
 
                # adjust the overall time
                junit_time=$(test-tool date getnanos $junit_suite_start)
-               sed "s/<testsuite [^>]*/& time=\"$junit_time\"/" \
+               sed -e "s/\(<testsuite.*\) time=\"[^\"]*\"/\1/" \
+                       -e "s/<testsuite [^>]*/& time=\"$junit_time\"/" \
                        <"$junit_xml_path" >"$junit_xml_path.new"
                mv "$junit_xml_path.new" "$junit_xml_path"