Events will now send a summary for each end of sequence. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271123 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -65,36 +65,19 @@ import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunEvent; | |||||
| */ | */ | ||||
| public abstract class BaseFormatter implements Formatter { | public abstract class BaseFormatter implements Formatter { | ||||
| /** number of errors */ | |||||
| private int errorCount; | |||||
| /** number of failures */ | |||||
| private int failureCount; | |||||
| /** number of runs (success + failure + error) */ | |||||
| private int runCount; | |||||
| public void init(Properties props) throws BuildException { | public void init(Properties props) throws BuildException { | ||||
| } | } | ||||
| protected void finalize() throws Throwable { | |||||
| super.finalize(); | |||||
| close(); | |||||
| } | |||||
| public void onTestStarted(TestRunEvent evt) { | public void onTestStarted(TestRunEvent evt) { | ||||
| runCount++; | |||||
| } | } | ||||
| public void onTestEnded(TestRunEvent evt) { | public void onTestEnded(TestRunEvent evt) { | ||||
| } | } | ||||
| public void onTestFailure(TestRunEvent evt) { | public void onTestFailure(TestRunEvent evt) { | ||||
| failureCount++; | |||||
| } | } | ||||
| public void onTestError(TestRunEvent evt) { | public void onTestError(TestRunEvent evt) { | ||||
| errorCount++; | |||||
| } | } | ||||
| public void onSuiteStarted(TestRunEvent evt) { | public void onSuiteStarted(TestRunEvent evt) { | ||||
| @@ -107,33 +90,9 @@ public abstract class BaseFormatter implements Formatter { | |||||
| } | } | ||||
| public void onRunEnded(TestRunEvent evt) { | public void onRunEnded(TestRunEvent evt) { | ||||
| finished(); | |||||
| } | } | ||||
| public void onRunStopped(TestRunEvent evt) { | public void onRunStopped(TestRunEvent evt) { | ||||
| finished(); | |||||
| } | |||||
| protected void finished() { | |||||
| close(); | |||||
| } | } | ||||
| /** @return the number of errors */ | |||||
| protected final int getErrorCount() { | |||||
| return errorCount; | |||||
| } | |||||
| /** @return the number of failures */ | |||||
| protected final int getFailureCount() { | |||||
| return failureCount; | |||||
| } | |||||
| /** @return the number of runs */ | |||||
| protected final int getRunCount() { | |||||
| return runCount; | |||||
| } | |||||
| /** helper method to flush and close the stream */ | |||||
| protected void close() { | |||||
| } | |||||
| } | } | ||||
| @@ -63,6 +63,7 @@ import java.util.Properties; | |||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.taskdefs.optional.rjunit.KeepAliveOutputStream; | import org.apache.tools.ant.taskdefs.optional.rjunit.KeepAliveOutputStream; | ||||
| import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunEvent; | |||||
| /** | /** | ||||
| * Base formatter providing default implementation to deal with | * Base formatter providing default implementation to deal with | ||||
| @@ -85,6 +86,11 @@ public class BaseStreamFormatter extends BaseFormatter { | |||||
| /** writer to output the data to */ | /** writer to output the data to */ | ||||
| private PrintWriter writer; | private PrintWriter writer; | ||||
| protected void finalize() throws Throwable { | |||||
| super.finalize(); | |||||
| close(); | |||||
| } | |||||
| public void init(Properties props) throws BuildException { | public void init(Properties props) throws BuildException { | ||||
| String file = props.getProperty(FILE_KEY); | String file = props.getProperty(FILE_KEY); | ||||
| OutputStream os = null; | OutputStream os = null; | ||||
| @@ -106,13 +112,17 @@ public class BaseStreamFormatter extends BaseFormatter { | |||||
| */ | */ | ||||
| protected void setOutput(OutputStream value) { | protected void setOutput(OutputStream value) { | ||||
| try { | try { | ||||
| writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(value, "UTF8")), true); | |||||
| // do not buffer but flush each line. | |||||
| writer = new PrintWriter(new OutputStreamWriter(value, "UTF8"), true); | |||||
| } catch (IOException e) { | } catch (IOException e) { | ||||
| // should not happen | // should not happen | ||||
| throw new BuildException(e); | throw new BuildException(e); | ||||
| } | } | ||||
| } | } | ||||
| public void onRunEnded(TestRunEvent evt) { | |||||
| close(); | |||||
| } | |||||
| protected void close() { | protected void close() { | ||||
| if (writer != null) { | if (writer != null) { | ||||
| @@ -1,6 +1,6 @@ | |||||
| # Summary formatter | # Summary formatter | ||||
| summary.finished.msg = TestSuite: \nTests run: {0, number, integer}, Failures: {1, number, integer}, Errors: {2, number, integer}, Time elapsed: {3, number, integer} sec\n | |||||
| suite.summary.msg = TestSuite: {0}\nTests run: {1, number, integer}, Failures: {2, number, integer}, Errors: {3, number, integer}, Time elapsed: {4, number, integer} sec | |||||
| run.summary.msg=Tests run: {0, number, integer}, Failures: {1, number, integer}, Errors: {2, number, integer}, Time elapsed: {3, number, integer} sec | |||||
| # Brief formatter | # Brief formatter | ||||
| brief.status-error.msg = TestCase: {0}\tCaused an ERROR\n{1}\n | brief.status-error.msg = TestCase: {0}\tCaused an ERROR\n{1}\n | ||||
| brief.status-failure.msg = TestCase: {0}\tFAILED\n{1}\n | brief.status-failure.msg = TestCase: {0}\tFAILED\n{1}\n | ||||
| @@ -55,6 +55,8 @@ package org.apache.tools.ant.taskdefs.optional.rjunit.formatter; | |||||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | import org.apache.avalon.excalibur.i18n.ResourceManager; | ||||
| import org.apache.avalon.excalibur.i18n.Resources; | import org.apache.avalon.excalibur.i18n.Resources; | ||||
| import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunEvent; | |||||
| import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestSummary; | |||||
| /** | /** | ||||
| * Display a summary message at the end of a testsuite stating | * Display a summary message at the end of a testsuite stating | ||||
| @@ -67,14 +69,24 @@ public class SummaryFormatter extends BaseStreamFormatter { | |||||
| private final static Resources RES = | private final static Resources RES = | ||||
| ResourceManager.getPackageResources(SummaryFormatter.class); | ResourceManager.getPackageResources(SummaryFormatter.class); | ||||
| protected void finished(long elapsedtime) { | |||||
| String msg = RES.getString("summary.finished.msg", | |||||
| new Integer(getRunCount()), | |||||
| new Integer(getFailureCount()), | |||||
| new Integer(getErrorCount()), | |||||
| new Long(elapsedtime / 1000)); | |||||
| public void onSuiteEnded(TestRunEvent evt) { | |||||
| TestSummary summary = evt.getSummary(); | |||||
| String msg = RES.getString("suite.summary.msg", | |||||
| evt.getName(), | |||||
| new Integer(summary.runCount()), | |||||
| new Integer(summary.failureCount()), | |||||
| new Integer(summary.errorCount()), | |||||
| new Long(summary.elapsedTime()/1000)); | |||||
| getWriter().println(msg); | getWriter().println(msg); | ||||
| close(); | |||||
| } | } | ||||
| public void onRunEnded(TestRunEvent evt) { | |||||
| TestSummary summary = evt.getSummary(); | |||||
| String msg = RES.getString("run.summary.msg", | |||||
| new Integer(summary.runCount()), | |||||
| new Integer(summary.failureCount()), | |||||
| new Integer(summary.errorCount()), | |||||
| new Long(summary.elapsedTime()/1000)); | |||||
| getWriter().println(msg); | |||||
| } | |||||
| } | } | ||||
| @@ -148,21 +148,19 @@ public class XMLFormatter extends BaseStreamFormatter { | |||||
| currentTest.setAttribute(ATTR_NAME, evt.getName()); | currentTest.setAttribute(ATTR_NAME, evt.getName()); | ||||
| rootElement.appendChild(currentTest); | rootElement.appendChild(currentTest); | ||||
| testElements.put(evt.getName(), currentTest); | testElements.put(evt.getName(), currentTest); | ||||
| super.onTestStarted(evt); | |||||
| removeEvent(evt); | |||||
| //removeEvent(evt); | |||||
| } | } | ||||
| public void onTestEnded(TestRunEvent evt) { | public void onTestEnded(TestRunEvent evt) { | ||||
| Element currentTest = (Element) testElements.get(evt); | |||||
| Element currentTest = (Element) testElements.get(evt.getName()); | |||||
| // with a TestSetup, startTest and endTest are not called. | // with a TestSetup, startTest and endTest are not called. | ||||
| if (currentTest == null) { | if (currentTest == null) { | ||||
| onTestStarted(evt); | onTestStarted(evt); | ||||
| currentTest = (Element) testElements.get(evt.getName()); | currentTest = (Element) testElements.get(evt.getName()); | ||||
| } | } | ||||
| TestRunEvent start = (TestRunEvent)testStarts.get(evt); | |||||
| TestRunEvent start = (TestRunEvent)testStarts.get(evt.getName()); | |||||
| float time = ((evt.getTimeStamp() - start.getTimeStamp()) / 1000.0f); | float time = ((evt.getTimeStamp() - start.getTimeStamp()) / 1000.0f); | ||||
| currentTest.setAttribute(ATTR_TIME, Float.toString(time)); | currentTest.setAttribute(ATTR_TIME, Float.toString(time)); | ||||
| super.onTestEnded(evt); | |||||
| removeEvent(evt); | removeEvent(evt); | ||||
| } | } | ||||
| @@ -179,7 +177,6 @@ public class XMLFormatter extends BaseStreamFormatter { | |||||
| nested.setAttribute(ATTR_TYPE, args[0]); | nested.setAttribute(ATTR_TYPE, args[0]); | ||||
| Text text = doc.createTextNode(evt.getStackTrace()); | Text text = doc.createTextNode(evt.getStackTrace()); | ||||
| nested.appendChild(text); | nested.appendChild(text); | ||||
| super.onTestFailure(evt); | |||||
| removeEvent(evt); | removeEvent(evt); | ||||
| } | } | ||||
| @@ -188,18 +185,6 @@ public class XMLFormatter extends BaseStreamFormatter { | |||||
| testElements.remove(evt.getName()); | testElements.remove(evt.getName()); | ||||
| } | } | ||||
| public void onRunStarted(TestRunEvent evt) { | |||||
| super.onRunStarted(evt); | |||||
| } | |||||
| public void onRunEnded(TestRunEvent evt) { | |||||
| super.onRunEnded(evt); | |||||
| } | |||||
| public void onRunStopped(TestRunEvent evt) { | |||||
| super.onRunStopped(evt); | |||||
| } | |||||
| protected void close() { | protected void close() { | ||||
| DOMElementWriter domWriter = new DOMElementWriter(); | DOMElementWriter domWriter = new DOMElementWriter(); | ||||
| // the underlying writer uses UTF8 encoding | // the underlying writer uses UTF8 encoding | ||||