@@ -67,33 +67,33 @@ import java.io.*;
*/
public class ExecuteWatchdogTest extends TestCase {
private final static int TIME_OUT = 5000;
private final static int TIME_OUT = 5000;
private final static String TEST_CLASSPATH = getTestClassPath();
private final static String TEST_CLASSPATH = getTestClassPath();
private final static int CLOCK_ERROR=200;
private final static int TIME_OUT_TEST=TIME_OUT-CLOCK_ERROR;
private ExecuteWatchdog watchdog;
public ExecuteWatchdogTest(String name) {
super(name);
}
protected void setUp(){
watchdog = new ExecuteWatchdog(TIME_OUT);
}
/**
* Dangerous method to obtain the classpath for the test. This is
* severely tighted to the build.xml properties.
*/
private static String getTestClassPath(){
String classpath = System.getProperty("build.tests");
if (classpath == null) {
System.err.println("WARNING: 'build.tests' property is not available !");
classpath = System.getProperty("java.class.path");
}
private ExecuteWatchdog watchdog;
public ExecuteWatchdogTest(String name) {
super(name);
}
protected void setUp(){
watchdog = new ExecuteWatchdog(TIME_OUT);
}
/**
* Dangerous method to obtain the classpath for the test. This is
* severely tighted to the build.xml properties.
*/
private static String getTestClassPath(){
String classpath = System.getProperty("build.tests");
if (classpath == null) {
System.err.println("WARNING: 'build.tests' property is not available !");
classpath = System.getProperty("java.class.path");
}
// JDK 1.1 needs classes.zip in -classpath argument
if (Project.getJavaVersion() == Project.JAVA_1_1) {
@@ -103,108 +103,108 @@ public class ExecuteWatchdogTest extends TestCase {
+ File.separator + "classes.zip";
}
return classpath;
}
private Process getProcess(int timetorun) throws Exception {
String[] cmdArray = {
"java", "-classpath", TEST_CLASSPATH,
TimeProcess.class.getName(), String.valueOf(timetorun)
};
//System.out.println("Testing with classpath: " + System.getProperty("java.class.path"));
return Runtime.getRuntime().exec(cmdArray);
}
private String getErrorOutput(Process p) throws Exception {
BufferedReader err = new BufferedReader( new InputStreamReader(p.getErrorStream()) );
StringBuffer buf = new StringBuffer();
String line;
while ( (line = err.readLine()) != null){
buf.append(line);
}
return buf.toString();
}
private int waitForEnd(Process p) throws Exception {
int retcode = p.waitFor();
if (retcode != 0){
String err = getErrorOutput(p);
if (err.length() > 0){
System.err.println("ERROR:");
System.err.println(err);
}
}
return retcode;
}
public void testNoTimeOut() throws Exception {
Process process = getProcess(TIME_OUT/2);
watchdog.start(process);
int retCode = waitForEnd(process);
assertTrue("process should not have been killed", !watchdog.killedProcess());
assertEquals(0, retCode);
}
// test that the watchdog ends the process
public void testTimeOut() throws Exception {
Process process = getProcess(TIME_OUT*2);
long now = System.currentTimeMillis();
watchdog.start(process);
int retCode = process.waitFor();
long elapsed = System.currentTimeMillis() - now;
assertTrue("process should have been killed", watchdog.killedProcess());
// assertTrue("return code is invalid: " + retCode, retCode!=0);
assertTrue("elapse time of "+elapsed+" ms is less than timeout value of "+TIME_OUT_TEST+" ms", elapsed >= TIME_OUT_TEST);
assertTrue("elapse time of "+elapsed+" ms is greater than run value of "+(TIME_OUT*2)+" ms", elapsed < TIME_OUT*2);
}
// test a process that runs and failed
public void testFailed() throws Exception {
Process process = getProcess(-1); // process should abort
watchdog.start(process);
int retCode = process.waitFor();
assertTrue("process should not have been killed", !watchdog.killedProcess());
assertTrue("return code is invalid: " + retCode, retCode!=0);
}
public void testManualStop() throws Exception {
final Process process = getProcess(TIME_OUT*2);
watchdog.start(process);
// I assume that starting this takes less than TIME_OUT/2 ms...
Thread thread = new Thread(){
public void run(){
try {
process.waitFor();
} catch(InterruptedException e){
// not very nice but will do the job
fail("process interrupted in thread");
}
}
};
thread.start();
// wait for TIME_OUT/2, there should be about TIME_OUT/2 ms remaining before timeout
thread.join(TIME_OUT/2);
// now stop the watchdog.
watchdog.stop();
// wait for the thread to die, should be the end of the process
thread.join();
// process should be dead and well finished
assertEquals(0, process.exitValue());
assertTrue("process should not have been killed", !watchdog.killedProcess());
}
public static class TimeProcess {
public static void main(String[] args) throws Exception {
int time = Integer.parseInt(args[0]);
if (time < 1) {
throw new IllegalArgumentException("Invalid time: " + time);
}
Thread.sleep(time);
}
}
return classpath;
}
private Process getProcess(int timetorun) throws Exception {
String[] cmdArray = {
"java", "-classpath", TEST_CLASSPATH,
TimeProcess.class.getName(), String.valueOf(timetorun)
};
//System.out.println("Testing with classpath: " + System.getProperty("java.class.path"));
return Runtime.getRuntime().exec(cmdArray);
}
private String getErrorOutput(Process p) throws Exception {
BufferedReader err = new BufferedReader( new InputStreamReader(p.getErrorStream()) );
StringBuffer buf = new StringBuffer();
String line;
while ( (line = err.readLine()) != null){
buf.append(line);
}
return buf.toString();
}
private int waitForEnd(Process p) throws Exception {
int retcode = p.waitFor();
if (retcode != 0){
String err = getErrorOutput(p);
if (err.length() > 0){
System.err.println("ERROR:");
System.err.println(err);
}
}
return retcode;
}
public void testNoTimeOut() throws Exception {
Process process = getProcess(TIME_OUT/2);
watchdog.start(process);
int retCode = waitForEnd(process);
assertTrue("process should not have been killed", !watchdog.killedProcess());
assertEquals(0, retCode);
}
// test that the watchdog ends the process
public void testTimeOut() throws Exception {
Process process = getProcess(TIME_OUT*2);
long now = System.currentTimeMillis();
watchdog.start(process);
int retCode = process.waitFor();
long elapsed = System.currentTimeMillis() - now;
assertTrue("process should have been killed", watchdog.killedProcess());
// assertTrue("return code is invalid: " + retCode, retCode!=0);
assertTrue("elapse time of "+elapsed+" ms is less than timeout value of "+TIME_OUT_TEST+" ms", elapsed >= TIME_OUT_TEST);
assertTrue("elapse time of "+elapsed+" ms is greater than run value of "+(TIME_OUT*2)+" ms", elapsed < TIME_OUT*2);
}
// test a process that runs and failed
public void testFailed() throws Exception {
Process process = getProcess(-1); // process should abort
watchdog.start(process);
int retCode = process.waitFor();
assertTrue("process should not have been killed", !watchdog.killedProcess());
assertTrue("return code is invalid: " + retCode, retCode!=0);
}
public void testManualStop() throws Exception {
final Process process = getProcess(TIME_OUT*2);
watchdog.start(process);
// I assume that starting this takes less than TIME_OUT/2 ms...
Thread thread = new Thread(){
public void run(){
try {
process.waitFor();
} catch(InterruptedException e){
// not very nice but will do the job
fail("process interrupted in thread");
}
}
};
thread.start();
// wait for TIME_OUT/2, there should be about TIME_OUT/2 ms remaining before timeout
thread.join(TIME_OUT/2);
// now stop the watchdog.
watchdog.stop();
// wait for the thread to die, should be the end of the process
thread.join();
// process should be dead and well finished
assertEquals(0, process.exitValue());
assertTrue("process should not have been killed", !watchdog.killedProcess());
}
public static class TimeProcess {
public static void main(String[] args) throws Exception {
int time = Integer.parseInt(args[0]);
if (time < 1) {
throw new IllegalArgumentException("Invalid time: " + time);
}
Thread.sleep(time);
}
}
}