git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271036 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,170 +0,0 @@ | |||
/* | |||
* 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.junit; | |||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
import org.apache.avalon.excalibur.i18n.Resources; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Task; | |||
/** | |||
* The core JUnit task. | |||
* | |||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||
*/ | |||
public class JUnitTask extends Task { | |||
private final static Resources RES = | |||
ResourceManager.getPackageResources(JUnitTask.class); | |||
/** port to run the server on */ | |||
private int port = -1; | |||
/** timeout period in ms */ | |||
private long timeout = -1; | |||
/** client configuraiton element */ | |||
private ClientElement client = null; | |||
/** server configuration element */ | |||
private ServerElement server = null; | |||
// task implementation | |||
public void execute() throws BuildException { | |||
if (client == null && server == null) { | |||
throw new BuildException("Invalid state: need to be server, client or both"); | |||
} | |||
// 1) server and client | |||
if (server != null && client != null) { | |||
ServerWorker worker = new ServerWorker(); | |||
worker.start(); | |||
client.execute(); | |||
Exception caught = null; | |||
try { | |||
worker.join(); | |||
caught = worker.getException(); | |||
} catch (InterruptedException e){ | |||
caught = e; | |||
} | |||
if (caught != null){ | |||
throw new BuildException(caught); | |||
} | |||
return; | |||
} | |||
// 2) server only (waiting for client) | |||
if (server != null && client == null) { | |||
server.execute(); | |||
return; | |||
} | |||
// 3) client only (connecting to server) | |||
if (server == null && client != null) { | |||
client.execute(); | |||
return; | |||
} | |||
} | |||
// Ant bean accessors | |||
public void setPort(int port) { | |||
this.port = port; | |||
} | |||
public void setTimeout(long timeout) { | |||
this.timeout = timeout; | |||
} | |||
/** | |||
* create a new client in charge of running tests and sending | |||
* the results to the server that collect them. | |||
*/ | |||
public ClientElement createClient() { | |||
if (client == null) { | |||
client = new ClientElement(this); | |||
} | |||
return client; | |||
} | |||
/** | |||
* create a new client in charge of running tests and sending | |||
* the results to the server that collect them. | |||
*/ | |||
public ServerElement createServer() { | |||
if (server == null) { | |||
server = new ServerElement(this); | |||
} | |||
return server; | |||
} | |||
/** the worker to run the server on */ | |||
class ServerWorker extends Thread { | |||
private Exception caught = null; | |||
public void run() { | |||
try { | |||
server.execute(); | |||
} catch (Exception e) { | |||
caught = e; | |||
} | |||
} | |||
public Exception getException() { | |||
return caught; | |||
} | |||
} | |||
} |
@@ -167,7 +167,7 @@ public class XMLFormatter extends BaseStreamFormatter { | |||
} | |||
public void onTestFailure(TestRunEvent evt) { | |||
String type = evt == evt.getType() == TestRunEvent.TEST_FAILURE ? FAILURE : ERROR; | |||
String type = evt.getType() == TestRunEvent.TEST_FAILURE ? FAILURE : ERROR; | |||
Element nested = doc.createElement(type); | |||
Element currentTest = (Element) testElements.get(evt.getName()); | |||
currentTest.appendChild(nested); | |||
@@ -1,101 +0,0 @@ | |||
/* | |||
* 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.junit.remote; | |||
/** | |||
* A set of messages identifiers to be used for communication | |||
* between server/client(TestRunner). | |||
* | |||
* <i> | |||
* This code is based on the code from Erich Gamma made for the | |||
* JUnit plugin for <a href="http://www.eclipse.org">Eclipse</a> and is | |||
* merged with code originating from Ant 1.4.x. | |||
* </i> | |||
* | |||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||
*/ | |||
public interface MessageIds { | |||
int MSG_HEADER_LENGTH = 8; | |||
// messages send by TestRunServer | |||
String TRACE_START = "%TRACES "; | |||
String TRACE_END = "%TRACEE "; | |||
// a line printed on stdout | |||
String STDOUT_START = "%STDOUTS"; | |||
String STDOUT_END = "%STDOUTE"; | |||
// a line printed on stderr | |||
String STDERR_START = "%STDERRS"; | |||
String STDERR_END = "%STDERRE"; | |||
// JVM system properties used in the VM | |||
String PROPS_START = "%SYSPROS"; | |||
String PROPS_END = "%SYSPROE"; | |||
// test run started... | |||
String TEST_COUNT = "%TESTC "; | |||
// a test just started | |||
String TEST_START = "%TESTS "; | |||
// a test is finished | |||
String TEST_END = "%TESTE "; | |||
String TEST_ERROR = "%ERROR "; | |||
String TEST_FAILED = "%FAILED "; | |||
String TEST_ELAPSED_TIME = "%RUNTIME"; | |||
String TEST_STOPPED = "%TSTSTP "; | |||
// messages understood by the Server | |||
String TEST_STOP = ">STOP "; | |||
} |
@@ -1,243 +0,0 @@ | |||
/* | |||
* 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.junit.remote; | |||
import java.io.BufferedReader; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.io.InputStreamReader; | |||
import java.util.Properties; | |||
import java.util.Vector; | |||
import org.apache.tools.ant.taskdefs.optional.junit.TestRunListener; | |||
/** | |||
* Read and dispatch messages received via an input stream. | |||
* The inputstream should be the connection to the remote client. | |||
* <p> | |||
* All messages are dispatched to the registered listeners. | |||
* </p> | |||
* <i> | |||
* This code is based on the code from Erich Gamma made for the | |||
* JUnit plugin for <a href="http://www.eclipse.org">Eclipse</a> and is | |||
* merged with code originating from Ant 1.4.x. | |||
* </i> | |||
* | |||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||
*/ | |||
public class MessageReader { | |||
/** the set of registered listeners */ | |||
private Vector listeners = new Vector(); | |||
// communication states with client | |||
private boolean inReadTrace = false; | |||
private boolean inFailedMessage = false; | |||
private String failedTest; | |||
private String failedMessage; | |||
private String failedTrace; | |||
private int failureKind; | |||
private long elapsedTime; | |||
private Properties sysprops; | |||
public MessageReader() { | |||
} | |||
/** | |||
* Add a new listener. | |||
* @param listener a listener that will receive events from the client. | |||
*/ | |||
public void addListener(TestRunListener listener) { | |||
listeners.addElement(listener); | |||
} | |||
public void removeListener(TestRunListener listener) { | |||
listeners.removeElement(listener); | |||
} | |||
/** | |||
* Read a complete stream from a client, it will only return | |||
* once the connection is stopped. You'd better not reuse | |||
* an instance of this class since there are instance variables used | |||
* to keep track of the client state. | |||
* @param in the inputstream to the client. | |||
*/ | |||
public void process(InputStream in) throws IOException { | |||
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF8")); | |||
String line; | |||
while ((line = reader.readLine()) != null) { | |||
processMessage(line); | |||
} | |||
} | |||
/** | |||
* Process a message from the client and dispatch the | |||
* appropriate message to the listeners. | |||
*/ | |||
protected void processMessage(String message) { | |||
if (message == null) { | |||
return; | |||
} | |||
String arg = message.substring(MessageIds.MSG_HEADER_LENGTH); | |||
if (message.startsWith(MessageIds.TRACE_START)) { | |||
failedTrace = arg.substring(0, arg.indexOf(MessageIds.TRACE_END)); | |||
failedTrace = new String(Base64.decode(failedTrace.getBytes())); | |||
notifyTestFailed(failureKind, failedTest, failedTrace); | |||
return; | |||
} | |||
if (message.startsWith(MessageIds.TEST_COUNT)) { | |||
int count = Integer.parseInt(arg); | |||
notifyTestSuiteStarted(count); | |||
return; | |||
} | |||
if (message.startsWith(MessageIds.TEST_START)) { | |||
notifyTestStarted(arg); | |||
return; | |||
} | |||
if (message.startsWith(MessageIds.TEST_END)) { | |||
notifyTestEnded(arg); | |||
return; | |||
} | |||
if (message.startsWith(MessageIds.TEST_ERROR)) { | |||
failedTest = arg; | |||
failureKind = TestRunListener.STATUS_ERROR; | |||
return; | |||
} | |||
if (message.startsWith(MessageIds.TEST_FAILED)) { | |||
failedTest = arg; | |||
failureKind = TestRunListener.STATUS_FAILURE; | |||
return; | |||
} | |||
if (message.startsWith(MessageIds.TEST_ELAPSED_TIME)) { | |||
elapsedTime = Long.parseLong(arg); | |||
notifyTestSuiteEnded(elapsedTime); | |||
return; | |||
} | |||
if (message.startsWith(MessageIds.TEST_STOPPED)) { | |||
elapsedTime = Long.parseLong(arg); | |||
notifyTestSuiteStopped(elapsedTime); | |||
return; | |||
} | |||
if (message.startsWith(MessageIds.PROPS_START)) { | |||
try { | |||
byte[] bytes = arg.substring(0, arg.indexOf(MessageIds.PROPS_END)).getBytes(); | |||
bytes = Base64.decode(bytes); | |||
sysprops = (Properties) SocketUtil.deserialize(bytes); | |||
notifyTestSystemProperties(sysprops); | |||
} catch (Exception e) { | |||
// ignore now | |||
e.printStackTrace(); | |||
} | |||
} | |||
} | |||
protected void notifyTestStarted(String testname) { | |||
synchronized (listeners) { | |||
for (int i = 0; i < listeners.size(); i++) { | |||
((TestRunListener) listeners.elementAt(i)).onTestStarted(testname); | |||
} | |||
} | |||
} | |||
protected void notifyTestEnded(String testname) { | |||
synchronized (listeners) { | |||
for (int i = 0; i < listeners.size(); i++) { | |||
((TestRunListener) listeners.elementAt(i)).onTestEnded(testname); | |||
} | |||
} | |||
} | |||
protected void notifyTestFailed(int kind, String testname, String trace) { | |||
synchronized (listeners) { | |||
for (int i = 0; i < listeners.size(); i++) { | |||
((TestRunListener) listeners.elementAt(i)).onTestFailure(kind); | |||
} | |||
} | |||
} | |||
protected void notifyTestSuiteStarted(int count) { | |||
synchronized (listeners) { | |||
for (int i = 0; i < listeners.size(); i++) { | |||
((TestRunListener) listeners.elementAt(i)).onRunStarted(count); | |||
} | |||
} | |||
} | |||
protected void notifyTestSuiteEnded(long elapsedtime) { | |||
synchronized (listeners) { | |||
for (int i = 0; i < listeners.size(); i++) { | |||
((TestRunListener) listeners.elementAt(i)).onRunEnded(elapsedtime); | |||
} | |||
} | |||
} | |||
protected void notifyTestSuiteStopped(long elapsedtime) { | |||
synchronized (listeners) { | |||
for (int i = 0; i < listeners.size(); i++) { | |||
((TestRunListener) listeners.elementAt(i)).onRunStopped(elapsedtime); | |||
} | |||
} | |||
} | |||
protected void notifyTestSystemProperties(Properties props) { | |||
synchronized (listeners) { | |||
for (int i = 0; i < listeners.size(); i++) { | |||
((TestRunListener) listeners.elementAt(i)).onTestRunSystemProperties(props); | |||
} | |||
} | |||
} | |||
} |
@@ -1,152 +0,0 @@ | |||
/* | |||
* 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.junit.remote; | |||
import java.io.OutputStream; | |||
import java.io.PrintWriter; | |||
import org.apache.tools.ant.taskdefs.optional.junit.TestRunListener; | |||
/** | |||
* A wrapper that sends string messages to a given stream. | |||
* | |||
* <i> | |||
* This code is based on the code from Erich Gamma made for the | |||
* JUnit plugin for <a href="http://www.eclipse.org">Eclipse</a> and is | |||
* merged with code originating from Ant 1.4.x. | |||
* </i> | |||
* | |||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||
*/ | |||
public class MessageWriter implements MessageIds { | |||
private PrintWriter pw; | |||
public MessageWriter(OutputStream out) { | |||
this.pw = new PrintWriter(out, true); | |||
} | |||
protected void finalize() { | |||
close(); | |||
} | |||
public void close() { | |||
if (pw != null) { | |||
pw.close(); | |||
pw = null; | |||
} | |||
} | |||
public void sendMessage(String msg) { | |||
pw.println(msg); | |||
} | |||
// -------- notifier helper methods | |||
public void notifyTestRunStarted(int testCount) { | |||
sendMessage(MessageIds.TEST_COUNT + testCount); | |||
} | |||
public void notifyTestRunEnded(long elapsedTime) { | |||
sendMessage(MessageIds.TEST_ELAPSED_TIME + elapsedTime); | |||
} | |||
public void notifyTestRunStopped(long elapsedTime) { | |||
sendMessage(MessageIds.TEST_STOPPED + elapsedTime); | |||
} | |||
public void notifyTestStarted(String testName) { | |||
sendMessage(MessageIds.TEST_START + testName); | |||
} | |||
public void notifyTestEnded(String testName) { | |||
sendMessage(MessageIds.TEST_END + testName); | |||
} | |||
public void notifyTestFailed(int status, String testName, String trace) { | |||
if (status == TestRunListener.STATUS_FAILURE) { | |||
sendMessage(MessageIds.TEST_FAILED + testName); | |||
} else { | |||
sendMessage(MessageIds.TEST_ERROR + testName); | |||
} | |||
sendMessage(MessageIds.TRACE_START + new String(Base64.encode(trace.getBytes())) + MessageIds.TRACE_END); | |||
} | |||
public void notifyStdOutLine(String testname, String line) { | |||
sendMessage(MessageIds.STDOUT_START); | |||
sendMessage(line); | |||
sendMessage(MessageIds.STDOUT_END); | |||
} | |||
public void notifyStdErrLine(String testname, String line) { | |||
sendMessage(MessageIds.STDERR_START); | |||
sendMessage(line); | |||
sendMessage(MessageIds.STDERR_END); | |||
} | |||
public void notifySystemProperties() { | |||
try { | |||
StringBuffer msg = new StringBuffer(512); | |||
msg.append(MessageIds.PROPS_START); | |||
byte[] data = SocketUtil.serialize(System.getProperties()); | |||
msg.append(Base64.encode(data)); | |||
msg.append(MessageIds.PROPS_END); | |||
sendMessage(msg.toString()); | |||
} catch (Exception e) { | |||
// ignore | |||
e.printStackTrace(); | |||
} | |||
} | |||
} |