git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271354 13f79535-47bb-0310-9956-ffa450edef68master
@@ -69,13 +69,15 @@ public class BriefFormatter extends SummaryFormatter { | |||||
ResourceManager.getPackageResources(BriefFormatter.class); | ResourceManager.getPackageResources(BriefFormatter.class); | ||||
public void onTestFailure(TestRunEvent evt) { | public void onTestFailure(TestRunEvent evt) { | ||||
String msg = RES.getString("brief.status-failure.msg", evt.getName(), evt.getStackTrace()); | |||||
String msg = RES.getString("brief.status-failure.msg", evt.getName(), | |||||
evt.getError().getStackTrace()); | |||||
getWriter().println(msg); | getWriter().println(msg); | ||||
super.onTestFailure(evt); | super.onTestFailure(evt); | ||||
} | } | ||||
public void onTestError(TestRunEvent evt) { | public void onTestError(TestRunEvent evt) { | ||||
String msg = RES.getString("brief.status-error.msg", evt.getName(), evt.getStackTrace()); | |||||
String msg = RES.getString("brief.status-error.msg", evt.getName(), | |||||
evt.getError().getStackTrace()); | |||||
getWriter().println(msg); | getWriter().println(msg); | ||||
super.onTestError(evt); | super.onTestError(evt); | ||||
} | } | ||||
@@ -57,6 +57,7 @@ import java.util.StringTokenizer; | |||||
import org.apache.tools.ant.util.StringUtils; | import org.apache.tools.ant.util.StringUtils; | ||||
import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunEvent; | import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunEvent; | ||||
import org.apache.tools.ant.taskdefs.optional.rjunit.remote.ExceptionData; | |||||
/** | /** | ||||
* Filtered Formatter that strips out unwanted stack frames from the full | * Filtered Formatter that strips out unwanted stack frames from the full | ||||
@@ -103,17 +104,24 @@ public class FilterStackFormatter extends FilterFormatter { | |||||
} | } | ||||
public void onTestFailure(TestRunEvent evt) { | public void onTestFailure(TestRunEvent evt) { | ||||
String filteredTrace = filter(evt.getStackTrace()); | |||||
evt.setStackTrace(filteredTrace); | |||||
filterEvent(evt); | |||||
super.onTestFailure(evt); | super.onTestFailure(evt); | ||||
} | } | ||||
public void onTestError(TestRunEvent evt) { | public void onTestError(TestRunEvent evt) { | ||||
String filteredTrace = filter(evt.getStackTrace()); | |||||
evt.setStackTrace(filteredTrace); | |||||
filterEvent(evt); | |||||
super.onTestFailure(evt); | super.onTestFailure(evt); | ||||
} | } | ||||
protected void filterEvent(TestRunEvent evt){ | |||||
String filteredTrace = filter(evt.getError().getStackTrace()); | |||||
ExceptionData error = new ExceptionData( | |||||
evt.getError().getType(), | |||||
evt.getError().getMessage(), | |||||
filteredTrace); | |||||
evt.setError(error); | |||||
} | |||||
protected String filter(String trace){ | protected String filter(String trace){ | ||||
StringTokenizer st = new StringTokenizer(trace, "\r\n"); | StringTokenizer st = new StringTokenizer(trace, "\r\n"); | ||||
StringBuffer buf = new StringBuffer(trace.length()); | StringBuffer buf = new StringBuffer(trace.length()); | ||||
@@ -84,12 +84,12 @@ public class PlainFormatter extends BaseStreamFormatter { | |||||
public void onTestFailure(TestRunEvent evt) { | public void onTestFailure(TestRunEvent evt) { | ||||
getWriter().println(" failure: " + evt.getName()); | getWriter().println(" failure: " + evt.getName()); | ||||
getWriter().println(evt.getStackTrace()); | |||||
getWriter().println(evt.getError().getStackTrace()); | |||||
} | } | ||||
public void onTestError(TestRunEvent evt) { | public void onTestError(TestRunEvent evt) { | ||||
getWriter().println(" error: " + evt.getName()); | getWriter().println(" error: " + evt.getName()); | ||||
getWriter().println(evt.getStackTrace()); | |||||
getWriter().println(evt.getError().getStackTrace()); | |||||
} | } | ||||
public void onRunEnded(TestRunEvent evt) { | public void onRunEnded(TestRunEvent evt) { | ||||
@@ -57,6 +57,7 @@ import java.io.IOException; | |||||
import java.util.Enumeration; | import java.util.Enumeration; | ||||
import java.util.Hashtable; | import java.util.Hashtable; | ||||
import java.util.Properties; | import java.util.Properties; | ||||
import java.util.Date; | |||||
import javax.xml.parsers.DocumentBuilder; | import javax.xml.parsers.DocumentBuilder; | ||||
import javax.xml.parsers.DocumentBuilderFactory; | import javax.xml.parsers.DocumentBuilderFactory; | ||||
@@ -68,7 +69,10 @@ import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.taskdefs.optional.rjunit.JUnitHelper; | 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.TestRunEvent; | ||||
import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestSummary; | import org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestSummary; | ||||
import org.apache.tools.ant.taskdefs.optional.rjunit.remote.ExceptionData; | |||||
import org.apache.tools.ant.util.DOMElementWriter; | import org.apache.tools.ant.util.DOMElementWriter; | ||||
import org.apache.tools.ant.util.DateUtils; | |||||
import org.apache.tools.ant.util.StringUtils; | |||||
/** | /** | ||||
* XML Formatter. Due to the nature of the XML we are forced to store | * XML Formatter. Due to the nature of the XML we are forced to store | ||||
@@ -153,6 +157,7 @@ public class XMLFormatter extends BaseStreamFormatter { | |||||
private Element lastTestElement = null; | private Element lastTestElement = null; | ||||
private TestRunEvent lastTestEvent = null; | private TestRunEvent lastTestEvent = null; | ||||
private Element lastSuiteElement = null; | private Element lastSuiteElement = null; | ||||
private long programStart; | |||||
public void onSuiteStarted(TestRunEvent evt) { | public void onSuiteStarted(TestRunEvent evt) { | ||||
String fullclassname = evt.getName(); | String fullclassname = evt.getName(); | ||||
@@ -180,10 +185,12 @@ public class XMLFormatter extends BaseStreamFormatter { | |||||
} | } | ||||
public void onRunEnded(TestRunEvent evt) { | public void onRunEnded(TestRunEvent evt) { | ||||
final String elapsedTime = String.valueOf(evt.getTimeStamp() - programStart); | |||||
rootElement.setAttribute("elapsed_time", elapsedTime); | |||||
// Output properties | // Output properties | ||||
Element propsElement = doc.createElement(PROPERTIES); | |||||
final Element propsElement = doc.createElement(PROPERTIES); | |||||
rootElement.appendChild(propsElement); | rootElement.appendChild(propsElement); | ||||
Properties props = evt.getProperties(); | |||||
final Properties props = evt.getProperties(); | |||||
if (props != null) { | if (props != null) { | ||||
Enumeration e = props.propertyNames(); | Enumeration e = props.propertyNames(); | ||||
while (e.hasMoreElements()) { | while (e.hasMoreElements()) { | ||||
@@ -198,11 +205,13 @@ public class XMLFormatter extends BaseStreamFormatter { | |||||
} | } | ||||
public void onRunStarted(TestRunEvent evt) { | public void onRunStarted(TestRunEvent evt) { | ||||
// | |||||
programStart = evt.getTimeStamp(); | |||||
final String date = DateUtils.format(programStart, DateUtils.ISO8601_DATETIME_PATTERN); | |||||
rootElement.setAttribute("program_start", date); | |||||
} | } | ||||
public void onRunStopped(TestRunEvent evt) { | public void onRunStopped(TestRunEvent evt) { | ||||
// add a stop attribute ? | |||||
rootElement.setAttribute("stopped", "true"); | |||||
onRunEnded(evt); | onRunEnded(evt); | ||||
} | } | ||||
@@ -242,22 +251,21 @@ public class XMLFormatter extends BaseStreamFormatter { | |||||
String type = evt.getType() == TestRunEvent.TEST_FAILURE ? FAILURE : ERROR; | String type = evt.getType() == TestRunEvent.TEST_FAILURE ? FAILURE : ERROR; | ||||
Element nested = doc.createElement(type); | Element nested = doc.createElement(type); | ||||
lastTestElement.appendChild(nested); | lastTestElement.appendChild(nested); | ||||
String[] args = parseFirstLine(evt.getStackTrace()); | |||||
if (args[1] != null && args[1].length() > 0) { | |||||
nested.setAttribute(ATTR_MESSAGE, args[1]); | |||||
} | |||||
nested.setAttribute(ATTR_TYPE, args[0]); | |||||
Text text = doc.createTextNode(evt.getStackTrace()); | |||||
ExceptionData error = evt.getError(); | |||||
nested.setAttribute(ATTR_MESSAGE, error.getMessage()); | |||||
nested.setAttribute(ATTR_TYPE, error.getType()); | |||||
Text text = doc.createTextNode(error.getStackTrace()); | |||||
nested.appendChild(text); | nested.appendChild(text); | ||||
onTestEnded(evt); | onTestEnded(evt); | ||||
} | } | ||||
protected void close() { | protected void close() { | ||||
DOMElementWriter domWriter = new DOMElementWriter(); | |||||
// the underlying writer uses UTF8 encoding | // the underlying writer uses UTF8 encoding | ||||
getWriter().println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"); | |||||
getWriter().println("<?xml version='1.0' encoding='UTF-8' ?>"); | |||||
String now = DateUtils.format(new Date(), DateUtils.ISO8601_DATETIME_PATTERN); | |||||
rootElement.setAttribute("snapshot_created", now); | |||||
try { | try { | ||||
final DOMElementWriter domWriter = new DOMElementWriter(); | |||||
domWriter.write(rootElement, getWriter(), 0, " "); | domWriter.write(rootElement, getWriter(), 0, " "); | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
throw new BuildException(e); | throw new BuildException(e); | ||||
@@ -274,18 +282,4 @@ public class XMLFormatter extends BaseStreamFormatter { | |||||
} | } | ||||
} | } | ||||
protected static String[] parseFirstLine(String trace) { | |||||
int pos = trace.indexOf('\n'); | |||||
if (pos == -1) { | |||||
return new String[]{trace, ""}; | |||||
} | |||||
String line = trace.substring(0, pos); | |||||
pos = line.indexOf(": "); | |||||
if (pos != -1) { | |||||
String classname = line.substring(0, pos).trim(); | |||||
String message = line.substring(pos + 1).trim(); | |||||
return new String[]{classname, message}; | |||||
} | |||||
return new String[]{trace, ""}; | |||||
} | |||||
} | } |
@@ -53,142 +53,127 @@ | |||||
*/ | */ | ||||
package org.apache.tools.ant.taskdefs.optional.rjunit.remote; | package org.apache.tools.ant.taskdefs.optional.rjunit.remote; | ||||
import java.util.Vector; | |||||
import java.io.InputStream; | |||||
import java.io.IOException; | |||||
import java.io.BufferedReader; | |||||
import java.io.InputStreamReader; | |||||
import java.util.ArrayList; | |||||
import java.util.HashMap; | |||||
/** | /** | ||||
* Dispatch messages to appropriate listener methode based on event id. | |||||
* | * | ||||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | ||||
*/ | */ | ||||
public class EventDispatcher { | public class EventDispatcher { | ||||
private final static HashMap eventMap = new HashMap(3); | |||||
static { | |||||
registerDefaults(); | |||||
} | |||||
/** the set of registered listeners */ | /** the set of registered listeners */ | ||||
private Vector listeners = new Vector(); | |||||
private ArrayList listeners = new ArrayList(); | |||||
/** | |||||
/** | |||||
* Add a new listener. | * Add a new listener. | ||||
* @param listener a listener that will receive events from the client. | * @param listener a listener that will receive events from the client. | ||||
*/ | */ | ||||
public void addListener(TestRunListener listener) { | public void addListener(TestRunListener listener) { | ||||
listeners.addElement(listener); | |||||
listeners.add(listener); | |||||
} | } | ||||
public void removeListener(org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener listener) { | |||||
listeners.removeElement(listener); | |||||
public void removeListener(TestRunListener listener) { | |||||
listeners.remove(listener); | |||||
} | } | ||||
/** | |||||
/** | |||||
* Process a message from the client and dispatch the | * Process a message from the client and dispatch the | ||||
* appropriate message to the listeners. | * appropriate message to the listeners. | ||||
*/ | */ | ||||
public void dispatchEvent(TestRunEvent evt) { | public void dispatchEvent(TestRunEvent evt) { | ||||
// I hate switch/case but no need to design a complex | |||||
// system for limited events. | |||||
switch (evt.getType()){ | |||||
case TestRunEvent.RUN_STARTED: | |||||
fireRunStarted(evt); | |||||
break; | |||||
case TestRunEvent.RUN_ENDED: | |||||
fireRunEnded(evt); | |||||
break; | |||||
case TestRunEvent.RUN_STOPPED: | |||||
fireRunStopped(evt); | |||||
break; | |||||
case TestRunEvent.TEST_STARTED: | |||||
fireTestStarted(evt); | |||||
break; | |||||
case TestRunEvent.TEST_ERROR: | |||||
fireTestError(evt); | |||||
break; | |||||
case TestRunEvent.TEST_FAILURE: | |||||
fireTestFailure(evt); | |||||
break; | |||||
case TestRunEvent.TEST_ENDED: | |||||
fireTestEnded(evt); | |||||
break; | |||||
case TestRunEvent.SUITE_ENDED: | |||||
fireSuiteEnded(evt); | |||||
break; | |||||
case TestRunEvent.SUITE_STARTED: | |||||
fireSuiteStarted(evt); | |||||
break; | |||||
default: | |||||
// should not happen | |||||
final Integer type = new Integer(evt.getType()); | |||||
final EventAction action = (EventAction) eventMap.get(type); | |||||
if (action == null) { | |||||
return; | |||||
} | } | ||||
} | |||||
protected void fireRunStarted(TestRunEvent evt) { | |||||
synchronized (listeners) { | synchronized (listeners) { | ||||
for (int i = 0; i < listeners.size(); i++) { | |||||
((org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener) listeners.elementAt(i)).onRunStarted(evt); | |||||
final int count = listeners.size(); | |||||
for (int i = 0; i < count; i++) { | |||||
TestRunListener listener = (TestRunListener) listeners.get(i); | |||||
action.dispatch(listener, evt); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
protected void fireRunEnded(TestRunEvent evt) { | |||||
synchronized (listeners) { | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
((org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener) listeners.elementAt(i)).onRunEnded(evt); | |||||
} | |||||
private static void registerDefaults() { | |||||
registerAction(TestRunEvent.RUN_STARTED, new RunStartedAction()); | |||||
registerAction(TestRunEvent.RUN_ENDED, new RunEndedAction()); | |||||
registerAction(TestRunEvent.TEST_STARTED, new TestStartedAction()); | |||||
registerAction(TestRunEvent.TEST_ENDED, new TestEndedAction()); | |||||
registerAction(TestRunEvent.TEST_FAILURE, new TestFailureAction()); | |||||
registerAction(TestRunEvent.TEST_ERROR, new TestErrorAction()); | |||||
registerAction(TestRunEvent.SUITE_STARTED, new SuiteStartedAction()); | |||||
registerAction(TestRunEvent.SUITE_ENDED, new SuiteEndedAction()); | |||||
registerAction(TestRunEvent.RUN_STOPPED, new RunStoppedAction()); | |||||
} | |||||
private static void registerAction(int id, EventAction action){ | |||||
eventMap.put(new Integer(id), action); | |||||
} | |||||
public interface EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt); | |||||
} | |||||
private static class RunStartedAction implements EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt) { | |||||
listener.onRunStarted(evt); | |||||
} | } | ||||
} | } | ||||
protected void fireTestStarted(TestRunEvent evt) { | |||||
synchronized (listeners) { | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
((org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener) listeners.elementAt(i)).onTestStarted(evt); | |||||
} | |||||
private static class RunEndedAction implements EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt) { | |||||
listener.onRunEnded(evt); | |||||
} | } | ||||
} | } | ||||
protected void fireTestEnded(TestRunEvent evt) { | |||||
synchronized (listeners) { | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
((org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener) listeners.elementAt(i)).onTestEnded(evt); | |||||
} | |||||
private static class TestStartedAction implements EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt) { | |||||
listener.onTestStarted(evt); | |||||
} | } | ||||
} | } | ||||
protected void fireTestFailure(TestRunEvent evt) { | |||||
synchronized (listeners) { | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
((org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener) listeners.elementAt(i)).onTestFailure(evt); | |||||
} | |||||
private static class TestEndedAction implements EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt) { | |||||
listener.onTestEnded(evt); | |||||
} | } | ||||
} | } | ||||
protected void fireTestError(TestRunEvent evt) { | |||||
synchronized (listeners) { | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
((org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener) listeners.elementAt(i)).onTestError(evt); | |||||
} | |||||
private static class TestFailureAction implements EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt) { | |||||
listener.onTestFailure(evt); | |||||
} | } | ||||
} | } | ||||
protected void fireSuiteStarted(TestRunEvent evt) { | |||||
synchronized (listeners) { | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
((org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener) listeners.elementAt(i)).onSuiteStarted(evt); | |||||
} | |||||
private static class TestErrorAction implements EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt) { | |||||
listener.onTestError(evt); | |||||
} | } | ||||
} | } | ||||
protected void fireSuiteEnded(TestRunEvent evt) { | |||||
synchronized (listeners) { | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
((org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener) listeners.elementAt(i)).onSuiteEnded(evt); | |||||
} | |||||
private static class SuiteStartedAction implements EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt) { | |||||
listener.onSuiteStarted(evt); | |||||
} | } | ||||
} | } | ||||
protected void fireRunStopped(TestRunEvent evt) { | |||||
synchronized (listeners) { | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
((org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunListener) listeners.elementAt(i)).onRunStopped(evt); | |||||
} | |||||
private static class SuiteEndedAction implements EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt) { | |||||
listener.onSuiteEnded(evt); | |||||
} | |||||
} | |||||
private static class RunStoppedAction implements EventAction { | |||||
public void dispatch(TestRunListener listener, TestRunEvent evt) { | |||||
listener.onRunStopped(evt); | |||||
} | } | ||||
} | } | ||||
@@ -0,0 +1,133 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs.optional.rjunit.remote; | |||||
import java.io.Serializable; | |||||
import org.apache.tools.ant.util.StringUtils; | |||||
/** | |||||
* A wrapper around an exception since an exception stacktrace is | |||||
* not serializable. | |||||
* | |||||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
*/ | |||||
public class ExceptionData implements Serializable { | |||||
/** the stacktrace of the exception */ | |||||
private final String stacktrace; | |||||
/** the classname of an exception */ | |||||
private final String type; | |||||
/** the message associated to this exception */ | |||||
private final String message; | |||||
/** | |||||
* Create a new error. | |||||
* @param exception the exception to run as | |||||
*/ | |||||
public ExceptionData(Throwable exception) { | |||||
this(exception.getClass().getName(), | |||||
exception.getMessage(), | |||||
StringUtils.getStackTrace(exception)); | |||||
} | |||||
/** | |||||
* Create a new error. | |||||
* @param type the type of the error (ie classname). | |||||
* @param message the message associated to this error. | |||||
* @param stacktrace the full stacktrace of this error. | |||||
*/ | |||||
public ExceptionData(String type, String message, String stacktrace) { | |||||
this.stacktrace = stacktrace; | |||||
this.type = type; | |||||
this.message = message; | |||||
} | |||||
/** | |||||
* @return the type of the error (ie classname) | |||||
*/ | |||||
public String getType() { | |||||
return type; | |||||
} | |||||
/** | |||||
* @return the message associated to this error. | |||||
*/ | |||||
public String getMessage() { | |||||
return message; | |||||
} | |||||
/** | |||||
* @return the stacktrace for this error. | |||||
*/ | |||||
public String getStackTrace() { | |||||
return stacktrace; | |||||
} | |||||
public boolean equals(Object o){ | |||||
if ( o instanceof ExceptionData ){ | |||||
ExceptionData other = (ExceptionData)o; | |||||
return ( ( type == null ? other.type == null : type.equals(other.type) ) && | |||||
( message == null ? other.message == null : message.equals(other.message) ) && | |||||
( stacktrace == null ? other.stacktrace == null : stacktrace.equals(other.stacktrace) ) ); | |||||
} | |||||
return false; | |||||
} | |||||
public String toString() { | |||||
return (message != null) ? (type + ": " + message) : type; | |||||
} | |||||
} |
@@ -60,6 +60,7 @@ import java.io.ObjectInputStream; | |||||
import java.io.ObjectOutputStream; | import java.io.ObjectOutputStream; | ||||
/** | /** | ||||
* Read or write events to/from appropriate streams. | |||||
* | * | ||||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | ||||
*/ | */ | ||||
@@ -90,8 +91,12 @@ public class Messenger { | |||||
} | } | ||||
} | } | ||||
public TestRunEvent read() throws Exception { | |||||
return (TestRunEvent)((ObjectInputStream)in).readObject(); | |||||
public TestRunEvent read() { | |||||
try { | |||||
return (TestRunEvent)((ObjectInputStream)in).readObject(); | |||||
} catch (Exception e){ | |||||
return null; | |||||
} | |||||
} | } | ||||
public void writeEvent(TestRunEvent evt) throws IOException { | public void writeEvent(TestRunEvent evt) throws IOException { | ||||
@@ -91,7 +91,7 @@ public class TestRunEvent extends EventObject { | |||||
private String name; | private String name; | ||||
/** stacktrace for error or failure */ | /** stacktrace for error or failure */ | ||||
private String stacktrace; | |||||
private ExceptionData error; | |||||
/** properties for end of testrun */ | /** properties for end of testrun */ | ||||
private Properties props; | private Properties props; | ||||
@@ -122,7 +122,7 @@ public class TestRunEvent extends EventObject { | |||||
public TestRunEvent(Integer id, int type, String name, Throwable t){ | public TestRunEvent(Integer id, int type, String name, Throwable t){ | ||||
this(id, type, name); | this(id, type, name); | ||||
this.stacktrace = StringUtils.getStackTrace(t); | |||||
this.error = new ExceptionData(t); | |||||
} | } | ||||
public void setType(int type) { | public void setType(int type) { | ||||
@@ -133,8 +133,8 @@ public class TestRunEvent extends EventObject { | |||||
this.timestamp = timestamp; | this.timestamp = timestamp; | ||||
} | } | ||||
public void setStackTrace(String stacktrace) { | |||||
this.stacktrace = stacktrace; | |||||
public void setError(ExceptionData error) { | |||||
this.error = error; | |||||
} | } | ||||
public void setName(String name) { | public void setName(String name) { | ||||
@@ -161,8 +161,8 @@ public class TestRunEvent extends EventObject { | |||||
return result; | return result; | ||||
} | } | ||||
public String getStackTrace(){ | |||||
return stacktrace; | |||||
public ExceptionData getError(){ | |||||
return error; | |||||
} | } | ||||
public Properties getProperties(){ | public Properties getProperties(){ | ||||
@@ -175,7 +175,7 @@ public class TestRunEvent extends EventObject { | |||||
return ( (type == other.type) && | return ( (type == other.type) && | ||||
(timestamp == other.timestamp) && | (timestamp == other.timestamp) && | ||||
( name == null ? other.name == null : name.equals(other.name) ) && | ( name == null ? other.name == null : name.equals(other.name) ) && | ||||
( stacktrace == null ? other.stacktrace == null : stacktrace.equals(other.stacktrace) ) && | |||||
( error == null ? other.error == null : error.equals(other.error) ) && | |||||
( props == null ? other.props == null : props.equals(other.props) ) && | ( props == null ? other.props == null : props.equals(other.props) ) && | ||||
( result == null ? other.result == null : result.equals(other.result) ) ); | ( result == null ? other.result == null : result.equals(other.result) ) ); | ||||
} | } | ||||