diff options
author | Benjamin Jones <bjones@galois.com> | 2012-12-04 14:31:01 -0800 |
---|---|---|
committer | Benjamin Jones <bjones@galois.com> | 2012-12-04 14:31:01 -0800 |
commit | 40a8f890484a4bee9244de7417ca3e9d47d63220 (patch) | |
tree | cc953bd705cbd274aa0e19882ed19cf75b5d1a44 | |
parent | 2f77a07a9e51339ee0962cfb7d06a0620c32ff9e (diff) |
refactored BatchRunner to delay WebDriver creation until after the webcrawl
4 files changed, 93 insertions, 78 deletions
diff --git a/headless/src/main/java/com/galois/fiveui/BatchRunner.java b/headless/src/main/java/com/galois/fiveui/BatchRunner.java index 1bacf4f..fb955c7 100644 --- a/headless/src/main/java/com/galois/fiveui/BatchRunner.java +++ b/headless/src/main/java/com/galois/fiveui/BatchRunner.java @@ -47,9 +47,9 @@ import org.apache.log4j.Logger; // System.out.* is old fashioned */ public class BatchRunner { - private final WebDriver _driver; - private final JavascriptExecutor _exe; - private final String _root; // FiveUI root directory + private WebDriver _driver; + private JavascriptExecutor _exe; + private String _root; // FiveUI root directory // Hard coded JS files, relative to the FiveUI root directory. private static final String DATA_DIR = "contexts/data/"; @@ -68,21 +68,18 @@ public class BatchRunner { private static Logger logger = Logger.getLogger("com.galois.fiveui.BatchRunner"); - /** - * BatchRunner constructor, stores the given WebDriver. - * - * TODO DRY - * - * @param driver the WebDriver object to run tests with - */ - public BatchRunner(WebDriver driver) { - logger.debug("initializing BatchRunner ..."); - _driver = driver; - _exe = (JavascriptExecutor) _driver; - _root = Drivers.getRootPath(); + private void registerDriver(WebDriver driver) { + logger.debug("registering new webdriver..."); + this._driver = driver; + this._exe = (JavascriptExecutor) driver; + this._root = Drivers.getRootPath(); logger.debug("root path for webdriver is " + _root); } - + + public BatchRunner() { + logger.debug("initializing BatchRunner ..."); + } + /** * Run a headless run description, returning the raw results: 'PASS' if * no inconsistencies were found, 'ERROR' for each inconsistency found, @@ -110,6 +107,9 @@ public class BatchRunner { logger.debug("setting seed URL for crawl: " + seedUrl); urls = null; + /************** + * Gather URLs + **************/ if (params.isNone()) { urls = ImmutableList.of(seedUrl); @@ -147,27 +147,34 @@ public class BatchRunner { } } - // run ruleset on each discovered URL - for (String url: urls) { - logger.info("loading " + url + " for ruleset run ..."); - loadURL(url); // set state of the WebDriver (blocking) - try { - logger.info("running ruleset \"" + rs.getName() + "\""); - rawResults = runRule(rs); // run the ruleset, collect results - builder.addAll(rawResults); - } catch (Exception e) { - String errStr = "exception during runRule: " + rs.getName() + "\n"; - errStr += e.toString(); - builder.add(Result.exception(_driver, errStr)); - logger.error(errStr); - } - try { - logger.debug("being polite for " + politeness + " millis..."); - Thread.sleep(politeness); - } catch (InterruptedException e) { - e.printStackTrace(); + /*********************** + * Drive the browser(s) + ***********************/ + + for (WebDriver driver: getDrivers()) { + registerDriver(driver); + for (String url: urls) { + logger.info("loading " + url + " for ruleset run ..."); + loadURL(url); // set state of the WebDriver (blocking) + try { + logger.info("running ruleset \"" + rs.getName() + "\""); + rawResults = runRule(rs); // run the ruleset, collect results + builder.addAll(rawResults); + } catch (Exception e) { + String errStr = "exception during runRule: " + rs.getName() + "\n"; + errStr += e.toString(); + builder.add(Result.exception(_driver, errStr)); + logger.error(errStr); + } + try { + logger.debug("being polite for " + politeness + " millis..."); + Thread.sleep(politeness); + } catch (InterruptedException e) { + e.printStackTrace(); + } } - } + driver.quit(); + } } return builder.build(); } @@ -262,6 +269,21 @@ public class BatchRunner { } /** + * Build a list of webdrivers with which to run each ruleset. + * + * @return list of initialized WebDriver objects + */ + private static ImmutableList<WebDriver> getDrivers() { + logger.debug("building webdrivers ..."); + ImmutableList<WebDriver> r = ImmutableList.<WebDriver>of( + Drivers.buildFFDriver() + // , Drivers.buildChromeDriver() + ); + logger.debug("built: " + r.toString()); + return r; + } + + /** * Sets the state of the WebDriver by loading a given URL. * * @param url URL to load diff --git a/headless/src/main/java/com/galois/fiveui/HeadlessRunner.java b/headless/src/main/java/com/galois/fiveui/HeadlessRunner.java index 53b3c2c..2f3fb53 100644 --- a/headless/src/main/java/com/galois/fiveui/HeadlessRunner.java +++ b/headless/src/main/java/com/galois/fiveui/HeadlessRunner.java @@ -20,10 +20,7 @@ package com.galois.fiveui; import java.io.IOException; import java.net.URISyntaxException; -import org.openqa.selenium.WebDriver; - import com.galois.fiveui.Result; -import com.galois.fiveui.drivers.Drivers; import com.google.common.collect.ImmutableList; import org.apache.log4j.Level; @@ -74,8 +71,13 @@ public class HeadlessRunner { logLevel = Level.DEBUG; BasicConfigurator.configure(); + + // com.galois.fiveui.* loggers get logLevel + Logger fiveuiLogger = Logger.getLogger("com.galois.fiveui"); + fiveuiLogger.setLevel(logLevel); + // root logger gets ERROR level (and hence all 3rd party libraries do too) Logger rootLogger = Logger.getRootLogger(); - rootLogger.setLevel(logLevel); + rootLogger.setLevel(Level.ERROR); // Process the command line arguments if (0 == args.length) { @@ -86,37 +88,21 @@ public class HeadlessRunner { for (int i = 0; i < args.length; i++) { String runDescFileName = args[i]; logger.debug("parsing headless run description: " + args[i]); - HeadlessRunDescription descr = HeadlessRunDescription.parse(runDescFileName); - for (WebDriver driver : getDrivers()) { - logger.debug("invoking headless run..."); - BatchRunner runner = new BatchRunner(driver); - ImmutableList<Result> results = runner.runHeadless(descr); - logger.debug("runHeadless returned " + results.size() + " results"); - System.out.println("\n=========================\n"); - System.out.println( " RESULTS \n"); - System.out.println( "=========================\n\n"); - for (Result result : results) { - System.out.println(result.toString()); // TODO add support for file output - } - driver.quit(); + HeadlessRunDescription descr = HeadlessRunDescription.parse(runDescFileName); + logger.debug("invoking headless run..."); + BatchRunner runner = new BatchRunner(); + ImmutableList<Result> results = runner.runHeadless(descr); + logger.debug("runHeadless returned " + results.size() + " results"); + System.out.println("\n=========================\n"); + System.out.println( " RESULTS\n"); + System.out.println( "=========================\n\n"); + for (Result result : results) { + System.out.println(result.toString()); // TODO add support for file output } } } - /** - * Build a list of webdrivers with which to run each ruleset. - * - * @return list of initialized WebDriver objects - */ - private static ImmutableList<WebDriver> getDrivers() { - logger.debug("building webdrivers ..."); - ImmutableList<WebDriver> r = ImmutableList.<WebDriver>of( - Drivers.buildFFDriver() - // , Drivers.buildChromeDriver() - ); - logger.debug("built: " + r.toString()); - return r; - } + private static void printHelp() { System.out.println( diff --git a/headless/src/test/java/com/galois/fiveui/BatchExecutorTest.java b/headless/src/test/java/com/galois/fiveui/BatchExecutorTest.java index 00e9b46..9cc82f6 100644 --- a/headless/src/test/java/com/galois/fiveui/BatchExecutorTest.java +++ b/headless/src/test/java/com/galois/fiveui/BatchExecutorTest.java @@ -30,12 +30,9 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; -import org.openqa.selenium.WebDriver; - import com.galois.fiveui.BatchRunner; import com.galois.fiveui.HeadlessRunDescription; import com.galois.fiveui.Result; -import com.galois.fiveui.drivers.Drivers; import com.google.common.collect.ImmutableList; import junit.framework.Assert; @@ -115,19 +112,16 @@ public class BatchExecutorTest { * @param fn filename of a .json file containing a headless run description */ private static void testHeadlessRun(String fn) { - WebDriver driver = Drivers.buildFFDriver(); // initialize the webdriver boolean flag = true; try { HeadlessRunDescription descr = HeadlessRunDescription.parse(fn); - BatchRunner runner = new BatchRunner(driver); // setup the batch runner - ImmutableList<Result> results = runner.runHeadless(descr); // excecute the run - logger.info(results.toString()); // print out results + BatchRunner runner = new BatchRunner(); + ImmutableList<Result> results = runner.runHeadless(descr); + logger.info(results.toString()); } catch (Exception e) { logger.error("testHeadlessRun: exception caught while running a headless run description"); flag = false; - } finally { - driver.quit(); - } + } Assert.assertTrue(flag); } diff --git a/headless/src/test/java/com/galois/fiveui/HeadlessTest.java b/headless/src/test/java/com/galois/fiveui/HeadlessTest.java index e0e3239..c33d86c 100644 --- a/headless/src/test/java/com/galois/fiveui/HeadlessTest.java +++ b/headless/src/test/java/com/galois/fiveui/HeadlessTest.java @@ -7,6 +7,10 @@ import java.io.IOException; import junit.framework.Assert; +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.junit.BeforeClass; import org.junit.Test; import com.galois.fiveui.HeadlessAtom; @@ -21,7 +25,16 @@ import com.google.common.collect.ImmutableList; */ public class HeadlessTest { private static final String RUN_DESCRIPTION_DIR = "src/test/resources/runDescriptions/"; - + private static Logger logger = Logger.getLogger("com.galois.fiveui.HeadlessTest"); + + @BeforeClass + public static void beforeClass() { + BasicConfigurator.configure(); + Logger root = Logger.getRootLogger(); + root.setLevel(Level.ERROR); + logger.setLevel(Level.DEBUG); + logger.debug("running headless tests..."); + } /** * Test method for {@link com.galois.com.galois.fiveui.HeadlessRunDescription}, parses * 'src/test/resources/runDescriptions/headlessSample0.json'. |