diff --git a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/LogStats.java b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/LogStats.java index 63ba6c4fc..db1a826c1 100644 --- a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/LogStats.java +++ b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/LogStats.java @@ -6,8 +6,6 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -19,18 +17,12 @@ import java.util.regex.Pattern; * Extract any summary information from the log file. */ public class LogStats { - private static final Pattern START_TIME_PATTERN = Pattern - .compile("(.*) Run started."); - private static final Pattern END_TIME_PATTERN = Pattern - .compile("(.*) Testing complete."); private static final Pattern SUITE_NAME_PATTERN = Pattern .compile("Running suite (.*)"); private static final Pattern ERROR_PATTERN = Pattern .compile("ERROR\\s+(.*)"); private static final Pattern WARNING_PATTERN = Pattern .compile("WARN\\s+(.*)"); - private static final SimpleDateFormat dateParser = new SimpleDateFormat( - "yyyy-MM-dd HH:mm:ss.SSS"); /** * Factory method. @@ -39,8 +31,6 @@ public class LogStats { return new LogStats(logFile); } - private long startTime; - private long endTime; private final List suiteNames = new ArrayList(); private final List errors = new ArrayList(); private final List warnings = new ArrayList(); @@ -53,27 +43,17 @@ public class LogStats { reader = new BufferedReader(new FileReader(logFile)); while (null != (line = reader.readLine())) { Matcher m; - m = START_TIME_PATTERN.matcher(line); + m = SUITE_NAME_PATTERN.matcher(line); if (m.matches()) { - startTime = parseTime(m.group(1)); + suiteNames.add(m.group(1)); } else { - m = END_TIME_PATTERN.matcher(line); + m = ERROR_PATTERN.matcher(line); if (m.matches()) { - endTime = parseTime(m.group(1)); + errors.add(m.group(1)); } else { - m = SUITE_NAME_PATTERN.matcher(line); + m = WARNING_PATTERN.matcher(line); if (m.matches()) { - suiteNames.add(m.group(1)); - } else { - m = ERROR_PATTERN.matcher(line); - if (m.matches()) { - errors.add(m.group(1)); - } else { - m = WARNING_PATTERN.matcher(line); - if (m.matches()) { - warnings.add(m.group(1)); - } - } + warnings.add(m.group(1)); } } } @@ -93,15 +73,6 @@ public class LogStats { } } - private long parseTime(String timeString) { - try { - return dateParser.parse(timeString).getTime(); - } catch (ParseException e) { - e.printStackTrace(); - return 0L; - } - } - public boolean hasErrors() { return !errors.isEmpty(); } @@ -118,16 +89,4 @@ public class LogStats { return Collections.unmodifiableCollection(warnings); } - public long getStartTime() { - return startTime; - } - - public long getEndTime() { - return endTime; - } - - public long getElapsedTime() { - return Math.abs(endTime - startTime); - } - } diff --git a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/SeleniumRunner.java b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/SeleniumRunner.java index e3a21c465..dca681bf9 100644 --- a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/SeleniumRunner.java +++ b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/SeleniumRunner.java @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.List; import edu.cornell.mannlib.vitro.utilities.testrunner.listener.Listener; +import edu.cornell.mannlib.vitro.utilities.testrunner.output.OutputManager; /** * Run the Selenium test suites. Provide the properties file and perhaps an diff --git a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputDataModel.java b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputDataModel.java new file mode 100644 index 000000000..3ac77e1a3 --- /dev/null +++ b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputDataModel.java @@ -0,0 +1,202 @@ +package edu.cornell.mannlib.vitro.utilities.testrunner.output; + +import java.io.File; +import java.io.IOException; +import java.util.Date; +import java.util.List; + +import edu.cornell.mannlib.vitro.utilities.testrunner.listener.Listener; + +public class OutputDataModel implements Listener { + private boolean runCompleted; + private long startTime; + private long endTime; + + // ---------------------------------------------------------------------- + // Listener methods that affect the data model + // ---------------------------------------------------------------------- + + @Override + public void runStarted() { + startTime = new Date().getTime(); + } + + @Override + public void runEndTime() { + endTime = new Date().getTime(); + } + + @Override + public void runStopped() { + runCompleted = true; + } + + // ---------------------------------------------------------------------- + // Accessor methods + // ---------------------------------------------------------------------- + + public boolean isRunCompleted() { + return runCompleted; + } + + public long getStartTime() { + return startTime; + } + + public long getEndTime() { + return endTime; + } + + public long getElapsedTime() { + if ((startTime == 0) || (endTime == 0)) { + return 0; + } else { + return endTime - startTime; + } + } + + // ---------------------------------------------------------------------- + // Listener methods that don't affect the data model + // ---------------------------------------------------------------------- + + @Override + public void suiteIgnored(File suite) { + } + + @Override + public void suiteAdded(File suite) { + } + + @Override + public void runFailed(Exception e) { + } + + @Override + public void cleanOutputStart(File outputDirectory) { + } + + @Override + public void cleanOutputFailed(File outputDirectory, IOException e) { + } + + @Override + public void cleanOutputStop(File outputDirectory) { + } + + @Override + public void webappStopping(String tomcatStopCommand) { + } + + @Override + public void webappStopFailed(int returnCode) { + } + + @Override + public void webappWaitingForStop(int tomcatStopDelay) { + } + + @Override + public void webappStopped() { + } + + @Override + public void dropDatabaseStarting(String statement) { + } + + @Override + public void dropDatabaseFailed(int returnCode) { + } + + @Override + public void dropDatabaseComplete() { + } + + @Override + public void loadDatabaseStarting(String statement) { + } + + @Override + public void loadDatabaseFailed(int returnCode) { + } + + @Override + public void loadDatabaseComplete() { + } + + @Override + public void webappStarting(String tomcatStartCommand) { + } + + @Override + public void webappStartFailed(int returnCode) { + } + + @Override + public void webappWaitingForStart(int tomcatStartDelay) { + } + + @Override + public void webappStarted() { + } + + @Override + public void subProcessStart(List command) { + } + + @Override + public void subProcessStartInBackground(List command) { + } + + @Override + public void subProcessStdout(String string) { + } + + @Override + public void subProcessErrout(String string) { + } + + @Override + public void subProcessStop(List command) { + } + + @Override + public void suiteStarted(File suiteDir) { + } + + @Override + public void suiteTestingStarted(File suiteDir) { + } + + @Override + public void suiteFailed(File suiteDir, int returnCode) { + } + + @Override + public void suiteFailed(File suiteDir, Exception e) { + } + + @Override + public void suiteTestingStopped(File suiteDir) { + } + + @Override + public void suiteStopped(File suiteDir) { + } + + @Override + public void cleanUploadStart(File uploadDirectory) { + } + + @Override + public void cleanUploadFailed(File uploadDirectory, IOException e) { + } + + @Override + public void cleanUploadStop(File uploadDirectory) { + } + + @Override + public void logWarning(String message) { + } + +} diff --git a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/OutputManager.java b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputManager.java similarity index 70% rename from utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/OutputManager.java rename to utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputManager.java index 7426306b0..44f87c44d 100644 --- a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/OutputManager.java +++ b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputManager.java @@ -1,6 +1,6 @@ /* $This file is distributed under the terms of the license in /doc/license.txt$ */ -package edu.cornell.mannlib.vitro.utilities.testrunner; +package edu.cornell.mannlib.vitro.utilities.testrunner.output; import java.io.File; import java.io.FileFilter; @@ -8,7 +8,11 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import edu.cornell.mannlib.vitro.utilities.testrunner.listener.Listener; +import edu.cornell.mannlib.vitro.utilities.testrunner.FileHelper; +import edu.cornell.mannlib.vitro.utilities.testrunner.LogStats; +import edu.cornell.mannlib.vitro.utilities.testrunner.SeleniumRunnerParameters; +import edu.cornell.mannlib.vitro.utilities.testrunner.Status; +import edu.cornell.mannlib.vitro.utilities.testrunner.SuiteStats; /** * Manages the contents of the output area. Removes old files prior to a run. @@ -16,11 +20,12 @@ import edu.cornell.mannlib.vitro.utilities.testrunner.listener.Listener; */ public class OutputManager { private final SeleniumRunnerParameters parms; - private final Listener listener; + private final OutputDataModel dataModel; public OutputManager(SeleniumRunnerParameters parms) { this.parms = parms; - this.listener = parms.getListener(); + this.dataModel = new OutputDataModel(); + parms.addListener(this.dataModel); } /** @@ -28,7 +33,7 @@ public class OutputManager { */ public void cleanOutputDirectory() throws IOException { File outputDirectory = parms.getOutputDirectory(); - listener.cleanOutputStart(outputDirectory); + parms.getListener().cleanOutputStart(outputDirectory); try { for (File file : outputDirectory.listFiles()) { @@ -48,10 +53,10 @@ public class OutputManager { } } } catch (IOException e) { - listener.cleanOutputFailed(outputDirectory, e); + parms.getListener().cleanOutputFailed(outputDirectory, e); throw e; } finally { - listener.cleanOutputStop(outputDirectory); + parms.getListener().cleanOutputStop(outputDirectory); } } @@ -72,7 +77,7 @@ public class OutputManager { } OutputSummaryFormatter formatter = new OutputSummaryFormatter(parms); - formatter.format(log, suites); + formatter.format(log, suites, dataModel); return formatter.figureOverallStatus(log, suites); } diff --git a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/OutputSummaryFormatter.java b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputSummaryFormatter.java similarity index 89% rename from utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/OutputSummaryFormatter.java rename to utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputSummaryFormatter.java index 62f76b6df..c6c8a5d9e 100644 --- a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/OutputSummaryFormatter.java +++ b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputSummaryFormatter.java @@ -1,6 +1,6 @@ /* $This file is distributed under the terms of the license in /doc/license.txt$ */ -package edu.cornell.mannlib.vitro.utilities.testrunner; +package edu.cornell.mannlib.vitro.utilities.testrunner.output; import java.io.File; import java.io.FileReader; @@ -13,6 +13,11 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import edu.cornell.mannlib.vitro.utilities.testrunner.FileHelper; +import edu.cornell.mannlib.vitro.utilities.testrunner.LogStats; +import edu.cornell.mannlib.vitro.utilities.testrunner.SeleniumRunnerParameters; +import edu.cornell.mannlib.vitro.utilities.testrunner.Status; +import edu.cornell.mannlib.vitro.utilities.testrunner.SuiteStats; import edu.cornell.mannlib.vitro.utilities.testrunner.SuiteStats.TestInfo; /** @@ -27,6 +32,7 @@ public class OutputSummaryFormatter { private LogStats log; private List suites; + private OutputDataModel dataModel; private Status runStatus; private List allTests = new ArrayList(); private int passingTestCount; @@ -41,9 +47,11 @@ public class OutputSummaryFormatter { * Create a summary HTML file from the info contained in this log file and * these suite outputs. */ - public void format(LogStats log, List suites) { + public void format(LogStats log, List suites, + OutputDataModel dataModel) { this.log = log; this.suites = suites; + this.dataModel = dataModel; this.runStatus = figureOverallStatus(log, suites); tallyTests(); @@ -134,7 +142,7 @@ public class OutputSummaryFormatter { } private void writeHeader(PrintWriter writer) { - String startString = formatDateTime(log.getStartTime()); + String startString = formatDateTime(dataModel.getStartTime()); writer.println(""); writer.println(""); @@ -159,9 +167,9 @@ public class OutputSummaryFormatter { String ignoreClass = this.ignoredTests.isEmpty() ? "" : Status.WARN .getHtmlClass(); - String start = formatDateTime(log.getStartTime()); - String end = formatDateTime(log.getEndTime()); - String elapsed = formatElapsedTime(log.getElapsedTime()); + String start = formatDateTime(dataModel.getStartTime()); + String end = formatDateTime(dataModel.getEndTime()); + String elapsed = formatElapsedTime(dataModel.getElapsedTime()); writer.println("
Summary
"); writer.println(); @@ -338,6 +346,10 @@ public class OutputSummaryFormatter { } private String formatElapsedTime(long elapsed) { + if (elapsed == 0) { + return "---"; + } + long elapsedSeconds = elapsed / 1000L; long seconds = elapsedSeconds % 60L; long elapsedMinutes = elapsedSeconds / 60L; @@ -357,6 +369,10 @@ public class OutputSummaryFormatter { } private String formatDateTime(long dateTime) { + if (dateTime == 0) { + return "---"; + } + return dateFormat.format(new Date(dateTime)); } diff --git a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/summary.css b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/summary.css similarity index 100% rename from utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/summary.css rename to utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/summary.css