package example.domain.web.webdriver; import example.jetty.WebServer; import org.apache.commons.lang.Validate; import java.net.ServerSocket; public class Application { private static Application instance; private WebServer server; private Browser browser; public static Browser open(String url) { return application().get(url); } private static Application application() { if (instance != null) { return instance; } try { int port = findFreePort(); instance = new Application(); instance.registerShutdownHook(); instance.startup(port); return instance; } catch (Exception e) { throw new RuntimeException("Application startup failed", e); } } private static int findFreePort() throws Exception { ServerSocket socket = new ServerSocket(0); int port = socket.getLocalPort(); socket.close(); return port; } private void registerShutdownHook() { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { public void run() { shutdown(); } })); } private void startup(int port) throws Exception { server = new WebServer(port).start(); browser = new Browser(port); } private Browser get(String url) { Validate.notNull(browser, "Application has not started succesfully. Please check earlier failed tests."); browser.get(url); return browser; } private void shutdown() { if (browser != null) { try { browser.stop(); } catch (Exception e) { // ignore } } if (server != null) { try { server.stop(); } catch (Exception e) { // ignore } } } }