package net.jsunit;
import net.jsunit.model.Browser;
import net.jsunit.model.BrowserResult;
import net.jsunit.model.ResultType;
import java.util.logging.Logger;
public class TimeoutChecker extends Thread {
private static final Logger logger = Logger.getLogger("net.jsunit");
private final BrowserTestRunner runner;
private long launchTime;
private final Browser browser;
private boolean alive;
private long checkInterval;
private Process browserProcess;
public TimeoutChecker(Process browserProcess, Browser browser, long launchTime, BrowserTestRunner runner) {
this(browserProcess, browser, launchTime, runner, 100);
}
public TimeoutChecker(Process browserProcess, Browser browser, long launchTime, BrowserTestRunner runner, long checkInterval) {
this.browser = browser;
this.runner = runner;
this.launchTime = launchTime;
this.checkInterval = checkInterval;
this.browserProcess = browserProcess;
alive = true;
}
public void run() {
while (alive && runner.isWaitingForBrowser(browser)) {
if (waitedTooLong()) {
logger.warning("Browser " + browser.getDisplayName() + " timed out after " + runner.timeoutSeconds() + " seconds");
runner.accept(createTimedOutBrowserResult());
return;
}
// else if (!isBrowserProcessAlive()) {
// if (!runner.hasReceivedResultSince(launchTime)) {
// runner.logStatus("Browser " + browserFileName + " was shutdown externally");
// runner.accept(createExternallyShutdownBrowserResult());
// return;
// }
// }
else
try {
Thread.sleep(checkInterval);
} catch (InterruptedException e) {
}
}
}
private BrowserResult createTimedOutBrowserResult() {
BrowserResult result = createRawBrowserResult();
result._setResultType(ResultType.TIMED_OUT);
return result;
}
private BrowserResult createRawBrowserResult() {
BrowserResult result = new BrowserResult();
result.setBrowser(browser);
return result;
}
public void die() {
alive = false;
}
private boolean waitedTooLong() {
long secondsWaited = (System.currentTimeMillis() - launchTime) / 1000;
return secondsWaited > runner.timeoutSeconds();
}
}