| @@ -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(); | |||