You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by sb...@apache.org on 2002/02/03 22:14:56 UTC
cvs commit: jakarta-ant/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/formatter FilterStackFormatter.java Resources.properties XMLFormatter.java
sbailliez 02/02/03 13:14:56
Modified: proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/formatter
FilterStackFormatter.java Resources.properties
XMLFormatter.java
Log:
Make XMLFormatter working.
It is assumed that all results are sent sequentially
so that we can figure to what testsuite belong a test.
TestCase.toString() might be misleading since we cannot
guarantee the format. I need to do it myself in
the runner.
Revision Changes Path
1.2 +23 -2 jakarta-ant/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/formatter/FilterStackFormatter.java
Index: FilterStackFormatter.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/formatter/FilterStackFormatter.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- FilterStackFormatter.java 1 Feb 2002 23:53:22 -0000 1.1
+++ FilterStackFormatter.java 3 Feb 2002 21:14:56 -0000 1.2
@@ -92,6 +92,8 @@
"org.apache.tools.ant."
};
+ private final String[] filters = getFilters();
+
/**
* Creates a new <tt>FilterStackFormatter</tt>
* @param formatter the formatter to be filtered.
@@ -129,12 +131,31 @@
* @return <tt>true</tt> if the line is accepted, <tt>false</tt> if not.
*/
protected boolean accept(String line) {
- for (int i = 0; i < DEFAULT_TRACE_FILTERS.length; i++) {
- if (line.indexOf(DEFAULT_TRACE_FILTERS[i]) > 0) {
+ for (int i = 0; i < filters.length; i++) {
+ if (line.indexOf(filters[i]) > 0) {
return false;
}
}
return true;
+ }
+
+ /**
+ * @return the filters to use for this
+ */
+ protected static String[] getFilters(){
+ // @fixme hack for now, need something better.
+ // using configuration properties ?
+ String filters = System.getProperty("ant.rjunit.stacktrace.filters");
+ if (filters == null){
+ return DEFAULT_TRACE_FILTERS;
+ }
+ StringTokenizer st = new StringTokenizer(filters, ",");
+ String[] results = new String[ st.countTokens() ];
+ int i = 0;
+ while (st.hasMoreTokens()){
+ results[i++] = st.nextToken();
+ }
+ return results;
}
}
1.3 +3 -2 jakarta-ant/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/formatter/Resources.properties
Index: Resources.properties
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/formatter/Resources.properties,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Resources.properties 3 Feb 2002 13:23:52 -0000 1.2
+++ Resources.properties 3 Feb 2002 21:14:56 -0000 1.3
@@ -1,6 +1,7 @@
# Summary formatter
-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
+suite.summary.msg = TestSuite: {0}\nTests run: {1, number, integer}, Failures: {2, number, integer}, Errors: {3, number, integer}, Time elapsed: {4, number, integer}s\n
+run.summary.msg=Sullary Tests run: {0, number, integer}, Failures: {1, number, integer}, Errors: {2, number, integer}, Time elapsed: {3, number, integer}s
+
# Brief formatter
brief.status-error.msg = TestCase: {0}\tCaused an ERROR\n{1}\n
brief.status-failure.msg = TestCase: {0}\tFAILED\n{1}\n
1.3 +92 -31 jakarta-ant/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/formatter/XMLFormatter.java
Index: XMLFormatter.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/formatter/XMLFormatter.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- XMLFormatter.java 3 Feb 2002 13:23:52 -0000 1.2
+++ XMLFormatter.java 3 Feb 2002 21:14:56 -0000 1.3
@@ -53,8 +53,10 @@
*/
package org.apache.tools.ant.taskdefs.optional.rjunit.formatter;
-import java.util.Hashtable;
import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Properties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -62,15 +64,28 @@
import org.w3c.dom.Element;
import org.w3c.dom.Text;
-import org.apache.tools.ant.util.DOMElementWriter;
import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.optional.rjunit.JUnitHelper;
import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunEvent;
+import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestSummary;
+import org.apache.tools.ant.util.DOMElementWriter;
/**
* XML Formatter. Due to the nature of the XML we are forced to store
* everything in memory until it is finished. It might be resource
* intensive when running lots of testcases.
*
+ * <testsuites stop="true">
+ * <testsuite name="" time="">
+ * <testcase name="" time="">
+ * <error/>
+ * </testcase>
+ * <testcase name="" time="">
+ * <failure/>
+ * </testcase>
+ * </testsuite>
+ * </testsuites>
+ *
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
*/
public class XMLFormatter extends BaseStreamFormatter {
@@ -133,42 +148,93 @@
private Document doc = getDocumentBuilder().newDocument();
/** The wrapper for the whole testsuite. */
- private Element rootElement = doc.createElement(TESTSUITE);
+ private Element rootElement = doc.createElement(TESTSUITES);
+
+ private Element lastTestElement = null;
+ private TestRunEvent lastTestEvent = null;
+ private Element lastSuiteElement = null;
+
+ public void onSuiteStarted(TestRunEvent evt) {
+ String fullclassname = evt.getName();
+ int pos = fullclassname.lastIndexOf('.');
+
+ // a missing . might imply no package at all. Don't get fooled.
+ String pkgName = (pos == -1) ? "" : fullclassname.substring(0, pos);
+ String classname = (pos == -1) ? fullclassname : fullclassname.substring(pos + 1);
+
+ Element suite = doc.createElement(TESTSUITE);
+ suite.setAttribute(ATTR_NAME, classname);
+ suite.setAttribute(ATTR_PACKAGE, pkgName);
+ rootElement.appendChild(suite);
+ lastSuiteElement = suite;
+ }
+
+ public void onSuiteEnded(TestRunEvent evt) {
+ Element suite = lastSuiteElement;
+ TestSummary summary = evt.getSummary();
+ suite.setAttribute(ATTR_TIME, String.valueOf(summary.elapsedTime()/1000.0f));
+ suite.setAttribute(ATTR_TESTS, String.valueOf(summary.runCount()));
+ suite.setAttribute(ATTR_FAILURES, String.valueOf(summary.failureCount()));
+ suite.setAttribute(ATTR_ERRORS, String.valueOf(summary.errorCount()));
+ lastSuiteElement = null;
+ }
+
+ public void onRunEnded(TestRunEvent evt) {
+ // Output properties
+ Element propsElement = doc.createElement(PROPERTIES);
+ rootElement.appendChild(propsElement);
+ Properties props = evt.getProperties();
+ if (props != null) {
+ Enumeration e = props.propertyNames();
+ while (e.hasMoreElements()) {
+ String name = (String) e.nextElement();
+ Element propElement = doc.createElement(PROPERTY);
+ propElement.setAttribute(ATTR_NAME, name);
+ propElement.setAttribute(ATTR_VALUE, props.getProperty(name));
+ propsElement.appendChild(propElement);
+ }
+ }
+ close();
+ }
- /** Element for the current test. */
- private Hashtable testElements = new Hashtable();
+ public void onRunStarted(TestRunEvent evt) {
+ //
+ }
- /** Timing helper. */
- private Hashtable testStarts = new Hashtable();
+ public void onRunStopped(TestRunEvent evt) {
+ // add a stop attribute ?
+ onRunEnded(evt);
+ }
public void onTestStarted(TestRunEvent evt) {
- //@fixme, eh, a testname only can obviouslly be a duplicate...
- testStarts.put(evt.getName(), evt);
- Element currentTest = doc.createElement(TESTCASE);
- currentTest.setAttribute(ATTR_NAME, evt.getName());
- rootElement.appendChild(currentTest);
- testElements.put(evt.getName(), currentTest);
- //removeEvent(evt);
+ Element test = doc.createElement(TESTCASE);
+ String name = JUnitHelper.getTestName(evt.getName());
+ test.setAttribute(ATTR_NAME, name);
+ String suiteName = JUnitHelper.getSuiteName(evt.getName());
+ lastSuiteElement.appendChild(test);
+ lastTestElement = test;
+ lastTestEvent = evt;
}
public void onTestEnded(TestRunEvent evt) {
- Element currentTest = (Element) testElements.get(evt.getName());
// with a TestSetup, startTest and endTest are not called.
- if (currentTest == null) {
+ if (lastTestEvent == null) {
onTestStarted(evt);
- currentTest = (Element) testElements.get(evt.getName());
}
- TestRunEvent start = (TestRunEvent)testStarts.get(evt.getName());
- float time = ((evt.getTimeStamp() - start.getTimeStamp()) / 1000.0f);
- currentTest.setAttribute(ATTR_TIME, Float.toString(time));
- removeEvent(evt);
+ float time = (evt.getTimeStamp() - lastTestEvent.getTimeStamp()) / 1000.0f;
+ lastTestElement.setAttribute(ATTR_TIME, Float.toString(time));
+ lastTestElement = null;
+ lastTestEvent = null;
+ }
+
+ public void onTestError(TestRunEvent evt) {
+ onTestFailure(evt);
}
public void onTestFailure(TestRunEvent evt) {
String type = evt.getType() == TestRunEvent.TEST_FAILURE ? FAILURE : ERROR;
Element nested = doc.createElement(type);
- Element currentTest = (Element) testElements.get(evt.getName());
- currentTest.appendChild(nested);
+ lastTestElement.appendChild(nested);
String[] args = parseFirstLine(evt.getStackTrace());
if (args[1] != null && args[1].length() > 0) {
@@ -177,12 +243,7 @@
nested.setAttribute(ATTR_TYPE, args[0]);
Text text = doc.createTextNode(evt.getStackTrace());
nested.appendChild(text);
- removeEvent(evt);
- }
-
- protected void removeEvent(TestRunEvent evt){
- testStarts.remove(evt.getName());
- testElements.remove(evt.getName());
+ onTestEnded(evt);
}
protected void close() {
@@ -191,7 +252,7 @@
getWriter().println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
try {
domWriter.write(rootElement, getWriter(), 0, " ");
- } catch (IOException e){
+ } catch (IOException e) {
throw new BuildException(e);
} finally {
super.close();
@@ -212,7 +273,7 @@
return new String[]{trace, ""};
}
String line = trace.substring(0, pos);
- pos = line.indexOf(':');
+ pos = line.indexOf(": ");
if (pos != -1) {
String classname = line.substring(0, pos).trim();
String message = line.substring(pos + 1).trim();
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>