@@ -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: | |||
-------------- | |||
@@ -351,5 +351,24 @@ | |||
</testclasses> | |||
</junitlauncher> | |||
</target> | |||
<target name="bz-63958"> | |||
<junitlauncher> | |||
<classpath refid="test.classpath"/> | |||
<testclasses> | |||
<listener classname="org.example.junitlauncher.Tracker" | |||
outputDir="${output.dir}" | |||
resultFile="${bz-63958.tracker}" | |||
if="bz-63958.tracker"/> | |||
<fileset dir="${build.classes.dir}"> | |||
<include name="**/ForkedTest.class"/> | |||
</fileset> | |||
<fork> | |||
<sysproperty key="junitlauncher.test.sysprop.one" value="forked"/> | |||
</fork> | |||
</testclasses> | |||
<listener type="legacy-plain" sendSysOut="true" /> | |||
</junitlauncher> | |||
</target> | |||
</project> | |||
@@ -156,24 +156,26 @@ public class StandaloneLauncher { | |||
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); | |||
@@ -28,6 +28,7 @@ import javax.xml.stream.XMLStreamWriter; | |||
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 @@ public class ListenerDefinition { | |||
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 class ListenerDefinition { | |||
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); | |||
@@ -465,6 +465,21 @@ public class JUnitLauncherTaskTest { | |||
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); | |||