From 6a06674efb82488a398fb5854af251f20e796f8c Mon Sep 17 00:00:00 2001 From: Jaikiran Pai Date: Sat, 11 Jan 2020 07:50:49 +0530 Subject: [PATCH] bz-63958 Correctly parse the forked mode launch definition in cases where a listener element is a sibling of either test or testclasses element --- WHATSNEW | 5 +++ .../taskdefs/optional/junitlauncher.xml | 19 +++++++++++ .../junitlauncher/StandaloneLauncher.java | 34 ++++++++++--------- .../confined/ListenerDefinition.java | 8 +++++ .../junitlauncher/JUnitLauncherTaskTest.java | 15 ++++++++ 5 files changed, 65 insertions(+), 16 deletions(-) diff --git a/WHATSNEW b/WHATSNEW index bd2d22fada..23b8e49d35 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -29,6 +29,11 @@ Fixed bugs: * Fixes a potential ConcurrentModificationException in XMLLogger. Bugzilla Report 63921 + * Fixes a bug in junitlauncher task in forked mode, where if a listener element + was used as a sibling element for either the test or testclasses element, + then the forked mode launch would fail. + Bugzilla Report 63958 + Other changes: -------------- diff --git a/src/etc/testcases/taskdefs/optional/junitlauncher.xml b/src/etc/testcases/taskdefs/optional/junitlauncher.xml index cb9a5418eb..f86ddc81cd 100644 --- a/src/etc/testcases/taskdefs/optional/junitlauncher.xml +++ b/src/etc/testcases/taskdefs/optional/junitlauncher.xml @@ -351,5 +351,24 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/StandaloneLauncher.java b/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/StandaloneLauncher.java index 3f9d99fa5f..9ff6cb8341 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/StandaloneLauncher.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/StandaloneLauncher.java @@ -156,24 +156,26 @@ private static ForkedLaunch parseLaunchDefinition(final Path pathToLaunchDefXml) if (printSummary != null) { forkedLaunch.setPrintSummary(Boolean.parseBoolean(printSummary)); } - reader.nextTag(); - reader.require(START_ELEMENT, null, null); - final String elementName = reader.getLocalName(); - switch (elementName) { - case LD_XML_ELM_TEST: { - forkedLaunch.addTests(Collections.singletonList(SingleTestClass.fromForkedRepresentation(reader))); - break; - } - case LD_XML_ELM_TEST_CLASSES: { - forkedLaunch.addTests(TestClasses.fromForkedRepresentation(reader)); - break; - } - case LD_XML_ELM_LISTENER: { - forkedLaunch.addListener(ListenerDefinition.fromForkedRepresentation(reader)); - break; + int nextTag = reader.nextTag(); + while (nextTag == START_ELEMENT) { + reader.require(START_ELEMENT, null, null); + final String elementName = reader.getLocalName(); + switch (elementName) { + case LD_XML_ELM_TEST: { + forkedLaunch.addTests(Collections.singletonList(SingleTestClass.fromForkedRepresentation(reader))); + break; + } + case LD_XML_ELM_TEST_CLASSES: { + forkedLaunch.addTests(TestClasses.fromForkedRepresentation(reader)); + break; + } + case LD_XML_ELM_LISTENER: { + forkedLaunch.addListener(ListenerDefinition.fromForkedRepresentation(reader)); + break; + } } + nextTag = reader.nextTag(); } - reader.nextTag(); reader.require(END_ELEMENT, null, LD_XML_ELM_LAUNCH_DEF); reader.next(); reader.require(END_DOCUMENT, null, null); diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/confined/ListenerDefinition.java b/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/confined/ListenerDefinition.java index 4a1009eb32..c600e60d4d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/confined/ListenerDefinition.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/confined/ListenerDefinition.java @@ -28,6 +28,7 @@ import static org.apache.tools.ant.taskdefs.optional.junitlauncher.confined.Constants.LD_XML_ATTR_CLASS_NAME; import static org.apache.tools.ant.taskdefs.optional.junitlauncher.confined.Constants.LD_XML_ATTR_LISTENER_RESULT_FILE; +import static org.apache.tools.ant.taskdefs.optional.junitlauncher.confined.Constants.LD_XML_ATTR_OUTPUT_DIRECTORY; import static org.apache.tools.ant.taskdefs.optional.junitlauncher.confined.Constants.LD_XML_ATTR_SEND_SYS_ERR; import static org.apache.tools.ant.taskdefs.optional.junitlauncher.confined.Constants.LD_XML_ATTR_SEND_SYS_OUT; import static org.apache.tools.ant.taskdefs.optional.junitlauncher.confined.Constants.LD_XML_ELM_LISTENER; @@ -156,6 +157,9 @@ void toForkedRepresentation(final XMLStreamWriter writer) throws XMLStreamExcept writer.writeAttribute(LD_XML_ATTR_CLASS_NAME, this.className); writer.writeAttribute(LD_XML_ATTR_SEND_SYS_ERR, Boolean.toString(this.sendSysErr)); writer.writeAttribute(LD_XML_ATTR_SEND_SYS_OUT, Boolean.toString(this.sendSysOut)); + if (this.outputDir != null) { + writer.writeAttribute(LD_XML_ATTR_OUTPUT_DIRECTORY, this.outputDir); + } if (this.resultFile != null) { writer.writeAttribute(LD_XML_ATTR_LISTENER_RESULT_FILE, this.resultFile); } @@ -175,6 +179,10 @@ public static ListenerDefinition fromForkedRepresentation(final XMLStreamReader if (sendSysOut != null) { listenerDef.setSendSysOut(Boolean.parseBoolean(sendSysOut)); } + final String outputDir = reader.getAttributeValue(null, LD_XML_ATTR_OUTPUT_DIRECTORY); + if (outputDir != null) { + listenerDef.setOutputDir(outputDir); + } final String resultFile = reader.getAttributeValue(null, LD_XML_ATTR_LISTENER_RESULT_FILE); if (resultFile != null) { listenerDef.setResultFile(resultFile); diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junitlauncher/JUnitLauncherTaskTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junitlauncher/JUnitLauncherTaskTest.java index 56596c56a1..1c36672227 100644 --- a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junitlauncher/JUnitLauncherTaskTest.java +++ b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junitlauncher/JUnitLauncherTaskTest.java @@ -465,6 +465,21 @@ public void testMethodWithTagFileSetFork() throws Exception { Files.deleteIfExists(tracker); } + + /** + * Tests that the forked test works fine when the {@code testclasses} element is used + * as a sibling of a {@code listener} element + */ + @Test + public void testBz63958() throws Exception { + final String targetName = "bz-63958"; + final Path trackerFile = setupTrackerProperty(targetName); + buildRule.executeTarget(targetName); + + Assert.assertTrue("ForkedTest#testSysProp was expected to succeed", verifySuccess(trackerFile, + ForkedTest.class.getName(), "testSysProp")); + } + private Path setupTrackerProperty(final String targetName) { final String filename = targetName + "-tracker.txt"; buildRule.getProject().setProperty(targetName + ".tracker", filename);