@@ -12,6 +12,16 @@ Other changes: | |||
* javaversion condition now has a new "atmost" attribute. See the javaversion | |||
manual for more details | |||
* The "listener" nested element of the "junitlauncher" task now has a new | |||
"useLegacyReportingName" attribute which can be used to control the test | |||
identifiers names that get reported by the listener. See the junitlauncher | |||
manual for more details. | |||
Note that this change also introduces a new "setUseLegacyReportingName" method | |||
on the org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter | |||
interface. This will break backward compatibility with any of your custom | |||
result formatters which implemented this interface and such implementations | |||
are now expected to implement this new method. | |||
Changes from Ant 1.10.8 TO Ant 1.10.9 | |||
===================================== | |||
@@ -402,6 +402,14 @@ | |||
is <strong>not</strong> set</a>.</td> | |||
<td>No</td> | |||
</tr> | |||
<tr> | |||
<td>useLegacyReportingName</td> | |||
<td>Set to true, if the test identifiers reported by this listener should use legacy (JUnit4 | |||
style) names. Else set to false. Defaults to true. | |||
<p><em>Since Ant 1.10.10</em></p> | |||
</td> | |||
<td>No</td> | |||
</tr> | |||
</table> | |||
<h4>test</h4> | |||
@@ -161,7 +161,7 @@ | |||
<sysproperty key="junitlauncher.test.sysprop.one" value="forked"/> | |||
</fork> | |||
<listener type="legacy-xml" sendSysErr="true" sendSysOut="true"/> | |||
<listener type="legacy-xml" sendSysErr="true" sendSysOut="true" useLegacyReportingName="false"/> | |||
</test> | |||
</junitlauncher> | |||
</target> | |||
@@ -368,6 +368,7 @@ | |||
</fork> | |||
</testclasses> | |||
<listener type="legacy-plain" sendSysOut="true" /> | |||
<listener type="legacy-brief" sendSysOut="true" useLegacyReportingName="true"/> | |||
</junitlauncher> | |||
</target> | |||
</project> | |||
@@ -226,6 +226,7 @@ public class LauncherSupport { | |||
testRequest.closeUponCompletion(resultFormatter); | |||
// set the execution context | |||
resultFormatter.setContext(this.testExecutionContext); | |||
resultFormatter.setUseLegacyReportingName(formatterDefinition.isUseLegacyReportingName()); | |||
// set the destination output stream for writing out the formatted result | |||
final java.nio.file.Path resultOutputFile = getListenerOutputFile(testRequest, formatterDefinition); | |||
try { | |||
@@ -47,6 +47,7 @@ class LegacyPlainResultFormatter extends AbstractJUnitResultFormatter implements | |||
private final Map<TestIdentifier, Stats> testIds = new ConcurrentHashMap<>(); | |||
private TestPlan testPlan; | |||
private BufferedWriter writer; | |||
private boolean useLegacyReportingName = true; | |||
@Override | |||
public void testPlanExecutionStarted(final TestPlan testPlan) { | |||
@@ -111,7 +112,7 @@ class LegacyPlainResultFormatter extends AbstractJUnitResultFormatter implements | |||
if (testIdentifier.isTest()) { | |||
final StringBuilder sb = new StringBuilder(); | |||
sb.append("Test: "); | |||
sb.append(testIdentifier.getLegacyReportingName()); | |||
sb.append(this.useLegacyReportingName ? testIdentifier.getLegacyReportingName() : testIdentifier.getDisplayName()); | |||
sb.append(" took "); | |||
stats.appendElapsed(sb); | |||
sb.append(" SKIPPED"); | |||
@@ -175,7 +176,7 @@ class LegacyPlainResultFormatter extends AbstractJUnitResultFormatter implements | |||
if (testIdentifier.isTest() && shouldReportExecutionFinished(testIdentifier, testExecutionResult)) { | |||
final StringBuilder sb = new StringBuilder(); | |||
sb.append("Test: "); | |||
sb.append(testIdentifier.getLegacyReportingName()); | |||
sb.append(this.useLegacyReportingName ? testIdentifier.getLegacyReportingName() : testIdentifier.getDisplayName()); | |||
if (stats != null) { | |||
sb.append(" took "); | |||
stats.appendElapsed(sb); | |||
@@ -230,6 +231,11 @@ class LegacyPlainResultFormatter extends AbstractJUnitResultFormatter implements | |||
this.writer = new BufferedWriter(new OutputStreamWriter(this.outputStream, StandardCharsets.UTF_8)); | |||
} | |||
@Override | |||
public void setUseLegacyReportingName(final boolean useLegacyReportingName) { | |||
this.useLegacyReportingName = useLegacyReportingName; | |||
} | |||
protected boolean shouldReportExecutionFinished(final TestIdentifier testIdentifier, final TestExecutionResult testExecutionResult) { | |||
return true; | |||
} | |||
@@ -63,6 +63,7 @@ class LegacyXmlResultFormatter extends AbstractJUnitResultFormatter implements T | |||
private final AtomicLong numTestsFailed = new AtomicLong(0); | |||
private final AtomicLong numTestsSkipped = new AtomicLong(0); | |||
private final AtomicLong numTestsAborted = new AtomicLong(0); | |||
private boolean useLegacyReportingName = true; | |||
@Override | |||
@@ -141,6 +142,11 @@ class LegacyXmlResultFormatter extends AbstractJUnitResultFormatter implements T | |||
this.outputStream = os; | |||
} | |||
@Override | |||
public void setUseLegacyReportingName(final boolean useLegacyReportingName) { | |||
this.useLegacyReportingName = useLegacyReportingName; | |||
} | |||
private final class Stats { | |||
@SuppressWarnings("unused") | |||
private final TestIdentifier testIdentifier; | |||
@@ -252,7 +258,8 @@ class LegacyXmlResultFormatter extends AbstractJUnitResultFormatter implements T | |||
final String classname = (parentClassSource.get()).getClassName(); | |||
writer.writeStartElement(ELEM_TESTCASE); | |||
writer.writeAttribute(ATTR_CLASSNAME, classname); | |||
writer.writeAttribute(ATTR_NAME, testId.getLegacyReportingName()); | |||
writer.writeAttribute(ATTR_NAME, useLegacyReportingName ? testId.getLegacyReportingName() | |||
: testId.getDisplayName()); | |||
final Stats stats = entry.getValue(); | |||
writer.writeAttribute(ATTR_TIME, String.valueOf((stats.endedAt - stats.startedAt) / ONE_SECOND)); | |||
// skipped element if the test was skipped | |||
@@ -50,6 +50,17 @@ public interface TestResultFormatter extends TestExecutionListener, Closeable { | |||
*/ | |||
void setContext(TestExecutionContext context); | |||
/** | |||
* This method will be invoked by the {@code junitlauncher} to let the result formatter implementation | |||
* know whether or not to use JUnit 4 style, legacy reporting names for test identifiers that get | |||
* displayed in the test reports. Result formatter implementations are allowed to default to a specific | |||
* reporting style for test identifiers, if this method isn't invoked. | |||
* @param useLegacyReportingName {@code true} if legacy reporting name is to be used, {@code false} | |||
* otherwise. | |||
* @since Ant 1.10.10 | |||
*/ | |||
void setUseLegacyReportingName(boolean useLegacyReportingName); | |||
/** | |||
* This method will be invoked by the <code>junitlauncher</code>, <strong>regularly/multiple times</strong>, | |||
* as and when any content is generated on the standard output stream during the test execution. | |||
@@ -48,6 +48,7 @@ public final class Constants { | |||
public static final String LD_XML_ATTR_SEND_SYS_ERR = "sendSysErr"; | |||
public static final String LD_XML_ATTR_SEND_SYS_OUT = "sendSysOut"; | |||
public static final String LD_XML_ATTR_LISTENER_RESULT_FILE = "resultFile"; | |||
public static final String LD_XML_ATTR_LISTENER_USE_LEGACY_REPORTING_NAME = "useLegacyReportingName"; | |||
private Constants() { | |||
@@ -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_LISTENER_USE_LEGACY_REPORTING_NAME; | |||
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; | |||
@@ -51,6 +52,7 @@ public class ListenerDefinition { | |||
private boolean sendSysOut; | |||
private boolean sendSysErr; | |||
private String outputDir; | |||
private boolean useLegacyReportingName = true; | |||
public ListenerDefinition() { | |||
@@ -135,6 +137,26 @@ public class ListenerDefinition { | |||
return this.outputDir; | |||
} | |||
/** | |||
* | |||
* @return Returns {@code true} if legacy reporting name (JUnit 4 style) is to be used. | |||
* Else returns {@code false}. | |||
* @since Ant 1.10.10 | |||
*/ | |||
public boolean isUseLegacyReportingName() { | |||
return useLegacyReportingName; | |||
} | |||
/** | |||
* Set the test identifier reporting style | |||
* @param useLegacyReportingName {@code true} if legacy reporting name (JUnit 4 style) is to | |||
* be used. Else {@code false}. | |||
* @since Ant 1.10.10 | |||
*/ | |||
public void setUseLegacyReportingName(final boolean useLegacyReportingName) { | |||
this.useLegacyReportingName = useLegacyReportingName; | |||
} | |||
public boolean shouldUse(final Project project) { | |||
final PropertyHelper propertyHelper = PropertyHelper.getPropertyHelper(project); | |||
return propertyHelper.testIfCondition(this.ifProperty) && propertyHelper.testUnlessCondition(this.unlessProperty); | |||
@@ -157,6 +179,7 @@ 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)); | |||
writer.writeAttribute(LD_XML_ATTR_LISTENER_USE_LEGACY_REPORTING_NAME, Boolean.toString(this.useLegacyReportingName)); | |||
if (this.outputDir != null) { | |||
writer.writeAttribute(LD_XML_ATTR_OUTPUT_DIRECTORY, this.outputDir); | |||
} | |||
@@ -187,6 +210,11 @@ public class ListenerDefinition { | |||
if (resultFile != null) { | |||
listenerDef.setResultFile(resultFile); | |||
} | |||
final String useLegacyReportingName = reader.getAttributeValue(null, | |||
LD_XML_ATTR_LISTENER_USE_LEGACY_REPORTING_NAME); | |||
if (useLegacyReportingName != null) { | |||
listenerDef.setUseLegacyReportingName(Boolean.parseBoolean(useLegacyReportingName)); | |||
} | |||
reader.nextTag(); | |||
reader.require(XMLStreamConstants.END_ELEMENT, null, LD_XML_ELM_LISTENER); | |||
return listenerDef; | |||
@@ -73,6 +73,11 @@ public class Tracker implements TestResultFormatter { | |||
this.context = context; | |||
} | |||
@Override | |||
public void setUseLegacyReportingName(final boolean useLegacyReportingName) { | |||
// do nothing | |||
} | |||
@Override | |||
public void close() throws IOException { | |||
this.writer.flush(); | |||