package net.jsunit;
import net.jsunit.configuration.Configuration;
import net.jsunit.model.Browser;
import net.jsunit.model.TestRunResult;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class TestRunManager {
private BrowserTestRunner testRunner;
private TestRunResult testRunResult;
private final String overrideUrl;
private List<Browser> browsers;
public static void main(String[] args) throws Exception {
JsUnitStandardServer server = new JsUnitStandardServer(Configuration.resolve(args), true);
int port = Integer.parseInt(args[args.length - 1]);
if (noLogging(args))
shutOffAllLogging();
server.addBrowserTestRunListener(new TestRunNotifierServer(server, port));
server.start();
TestRunManager manager = new TestRunManager(server);
manager.runTests();
if (server.isAlive())
server.dispose();
}
private static void shutOffAllLogging() {
Logger.getLogger("net.jsunit").setLevel(Level.OFF);
Logger.getLogger("org.mortbay").setLevel(Level.OFF);
Logger.getLogger("com.opensymphony").setLevel(Level.OFF);
}
private static boolean noLogging(String[] arguments) {
for (String string : arguments)
if (string.equals("-noLogging"))
return true;
return false;
}
public TestRunManager(BrowserTestRunner testRunner) {
this(testRunner, null);
}
public TestRunManager(BrowserTestRunner testRunner, String overrideUrl) {
this.testRunner = testRunner;
this.overrideUrl = overrideUrl;
browsers = testRunner.getBrowsers();
}
public void runTests() {
initializeTestRunResult();
testRunner.logStatus("Starting Test Run");
testRunner.startTestRun();
try {
for (Browser browser : browsers) {
BrowserLaunchSpecification launchSpec = new BrowserLaunchSpecification(browser, overrideUrl);
long launchTime = testRunner.launchBrowserTestRun(launchSpec);
waitForResultToBeSubmitted(browser, launchTime);
if (testRunner.isAlive())
testRunResult.addBrowserResult(testRunner.lastResult());
else
return;
}
} finally {
testRunner.finishTestRun();
}
testRunner.logStatus("Test Run Completed");
}
private void initializeTestRunResult() {
testRunResult = new TestRunResult();
testRunResult.initializeProperties();
}
private void waitForResultToBeSubmitted(Browser browser, long launchTime) {
testRunner.logStatus("Waiting for " + browser.getFileName() + " to submit result");
long secondsWaited = 0;
while (testRunner.isAlive() && !testRunner.hasReceivedResultSince(launchTime)) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
secondsWaited++;
if (secondsWaited > (testRunner.timeoutSeconds()) + 3)
throw new RuntimeException("Server not responding");
}
}
public TestRunResult getTestRunResult() {
return testRunResult;
}
public void limitToBrowserWithId(int chosenBrowserId) throws InvalidBrowserIdException {
Browser chosenBrowser = null;
for (Browser browser : browsers) {
if (browser.hasId(chosenBrowserId))
chosenBrowser = browser;
}
if (chosenBrowser == null)
throw new InvalidBrowserIdException(chosenBrowserId);
browsers = Arrays.asList(chosenBrowser);
}
}