From a1b26c95b0dab6a46ae8faa19de018e2c6129b46 Mon Sep 17 00:00:00 2001 From: Alex Balik Date: Mon, 24 Jun 2024 20:32:41 +0000 Subject: [PATCH 1/2] Escape invalid XML chars in testCase and testSuite names --- .../contrib_rules_jvm/junit5/TestCaseXmlRenderer.java | 2 +- .../contrib_rules_jvm/junit5/TestSuiteXmlRenderer.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestCaseXmlRenderer.java b/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestCaseXmlRenderer.java index d868c448..01a6dc91 100644 --- a/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestCaseXmlRenderer.java +++ b/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestCaseXmlRenderer.java @@ -47,7 +47,7 @@ public void toXml(XMLStreamWriter xml, TestData test) throws XMLStreamException } xml.writeStartElement("testcase"); - xml.writeAttribute("name", name); + xml.writeAttribute("name", escapeIllegalCharacters(name)); xml.writeAttribute("classname", LegacyReportingUtils.getClassName(testPlan, id)); /* @Nullable */ Duration maybeDuration = test.getDuration(); diff --git a/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestSuiteXmlRenderer.java b/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestSuiteXmlRenderer.java index 95c5b738..a1263852 100644 --- a/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestSuiteXmlRenderer.java +++ b/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestSuiteXmlRenderer.java @@ -1,5 +1,6 @@ package com.github.bazel_contrib.contrib_rules_jvm.junit5; +import static com.github.bazel_contrib.contrib_rules_jvm.junit5.SafeXml.escapeIllegalCharacters; import static com.github.bazel_contrib.contrib_rules_jvm.junit5.SafeXml.writeTextElement; import java.util.Collection; @@ -19,7 +20,7 @@ public void toXml(XMLStreamWriter xml, TestData suite, Collection test throws XMLStreamException { xml.writeStartElement("testsuite"); - xml.writeAttribute("name", suite.getId().getLegacyReportingName()); + xml.writeAttribute("name", escapeIllegalCharacters(suite.getId().getLegacyReportingName())); xml.writeAttribute("tests", String.valueOf(tests.size())); int errors = 0; From 4c3d6e43ac44eb46818cbc8055e61925ac00d2b3 Mon Sep 17 00:00:00 2001 From: Alex Balik Date: Mon, 24 Jun 2024 21:30:07 +0000 Subject: [PATCH 2/2] Add unit tests --- .../junit5/BazelJUnitOuputListenerTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/java/test/com/github/bazel_contrib/contrib_rules_jvm/junit5/BazelJUnitOuputListenerTest.java b/java/test/com/github/bazel_contrib/contrib_rules_jvm/junit5/BazelJUnitOuputListenerTest.java index 8020ff7b..820c517e 100644 --- a/java/test/com/github/bazel_contrib/contrib_rules_jvm/junit5/BazelJUnitOuputListenerTest.java +++ b/java/test/com/github/bazel_contrib/contrib_rules_jvm/junit5/BazelJUnitOuputListenerTest.java @@ -263,6 +263,38 @@ public void ensureOutputsAreProperlyEscaped() { assertEquals("Also bad!", text); } + @Test + public void ensureTestCaseNamesAreProperlyEscaped() { + var testDescriptor = new StubbedTestDescriptor(createId("Weird\bname")); + var identifier = TestIdentifier.from(testDescriptor); + + var testCaseData = new TestData(identifier); + testCaseData.mark(TestExecutionResult.successful()); + + Document xml = generateTestXml(Mockito.mock(TestPlan.class), testCaseData); + + Node item = xml.getElementsByTagName("testcase").item(0); + String testName = item.getAttributes().getNamedItem("name").getNodeValue(); + + assertEquals("[engine:mocked]/[class:ExampleTest]/[method:Weirdname", testName); + } + + @Test + public void ensureTestSuiteNamesAreProperlyEscaped() { + var testDescriptor = new StubbedTestDescriptor(createId("Weird\bname")); + var identifier = TestIdentifier.from(testDescriptor); + + var testSuiteData = new TestData(identifier); + testSuiteData.mark(TestExecutionResult.successful()); + + Document xml = generateTestXml(Mockito.mock(TestPlan.class), testSuiteData, List.of()); + + Node item = xml.getElementsByTagName("testsuite").item(0); + String testName = item.getAttributes().getNamedItem("name").getNodeValue(); + + assertEquals("[engine:mocked]/[class:ExampleTest]/[method:Weirdname()]", testName); + } + private Document generateTestXml(TestPlan testPlan, TestData testCase) { return generateDocument(xml -> new TestCaseXmlRenderer(testPlan).toXml(xml, testCase)); }