From 4bb1727a6044f9e6a5c65a9032cef70ddc37ac38 Mon Sep 17 00:00:00 2001 From: jeb228 Date: Wed, 18 Aug 2010 20:43:31 +0000 Subject: [PATCH] NIHVIVO-222 Continue to convert the output data collection from scanning the log to using a Listener. --- .../testrunner/output/OutputDataModel.java | 33 ++++++-- .../testrunner/output/OutputManager.java | 11 ++- .../output/OutputSummaryFormatter.java | 84 ++++++++++++------- .../SuiteResults.java} | 33 ++++---- 4 files changed, 105 insertions(+), 56 deletions(-) rename utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/{SuiteStats.java => output/SuiteResults.java} (76%) 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 index 3ac77e1a3..3c98a3afb 100644 --- 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 @@ -1,16 +1,22 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + package edu.cornell.mannlib.vitro.utilities.testrunner.output; import java.io.File; import java.io.IOException; +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.listener.Listener; public class OutputDataModel implements Listener { private boolean runCompleted; private long startTime; private long endTime; + private final List suiteNames = new ArrayList(); + private final List ignoredSuiteNames = new ArrayList(); // ---------------------------------------------------------------------- // Listener methods that affect the data model @@ -31,6 +37,17 @@ public class OutputDataModel implements Listener { runCompleted = true; } + @Override + public void suiteIgnored(File suite) { + suiteNames.add(FileHelper.baseName(suite)); + ignoredSuiteNames.add(FileHelper.baseName(suite)); + } + + @Override + public void suiteAdded(File suite) { + suiteNames.add(FileHelper.baseName(suite)); + } + // ---------------------------------------------------------------------- // Accessor methods // ---------------------------------------------------------------------- @@ -55,18 +72,18 @@ public class OutputDataModel implements Listener { } } + public List getSuiteNames() { + return suiteNames; + } + + public List getIgnoredSuiteNames() { + return ignoredSuiteNames; + } + // ---------------------------------------------------------------------- // 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) { } diff --git a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputManager.java b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputManager.java index 44f87c44d..8d77d0fcc 100644 --- a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputManager.java +++ b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputManager.java @@ -5,14 +5,13 @@ package edu.cornell.mannlib.vitro.utilities.testrunner.output; import java.io.File; import java.io.FileFilter; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; 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. @@ -67,12 +66,12 @@ public class OutputManager { public Status summarizeOutput() { LogStats log = LogStats.parse(parms.getLogFile()); - List suites = new ArrayList(); + Map suites = new HashMap(); for (File outputFile : parms.getOutputDirectory().listFiles( new HtmlFileFilter())) { - SuiteStats suite = SuiteStats.parse(parms, outputFile); + SuiteResults suite = SuiteResults.parse(parms, outputFile); if (suite != null) { - suites.add(suite); + suites.put(suite.getName(), suite); } } diff --git a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputSummaryFormatter.java b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputSummaryFormatter.java index c6c8a5d9e..ea4aaf7c0 100644 --- a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputSummaryFormatter.java +++ b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/OutputSummaryFormatter.java @@ -12,13 +12,13 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; 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; +import edu.cornell.mannlib.vitro.utilities.testrunner.output.SuiteResults.TestResults; /** * Creates the summary HTML file. @@ -31,13 +31,17 @@ public class OutputSummaryFormatter { private final SeleniumRunnerParameters parms; private LogStats log; - private List suites; + private Map suites; private OutputDataModel dataModel; private Status runStatus; - private List allTests = new ArrayList(); + private List allTests = new ArrayList(); private int passingTestCount; - private List failingTests = new ArrayList(); - private List ignoredTests = new ArrayList(); + private List failingTests = new ArrayList(); + private List ignoredTests = new ArrayList(); + private List passingSuites = new ArrayList(); + private List failingSuites = new ArrayList(); + private List ignoredSuites = new ArrayList(); + private List remainingSuites = new ArrayList(); public OutputSummaryFormatter(SeleniumRunnerParameters parms) { this.parms = parms; @@ -47,13 +51,14 @@ 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, Map suites, OutputDataModel dataModel) { this.log = log; this.suites = suites; this.dataModel = dataModel; this.runStatus = figureOverallStatus(log, suites); tallyTests(); + tallySuites(); PrintWriter writer = null; try { @@ -105,13 +110,14 @@ public class OutputSummaryFormatter { /** * The overall status for the run is the worst status of any component. */ - public Status figureOverallStatus(LogStats log, List suites) { + public Status figureOverallStatus(LogStats log, + Map suites) { if (log.hasErrors()) { return Status.ERROR; } boolean hasWarnings = log.hasWarnings(); - for (SuiteStats s : suites) { + for (SuiteResults s : suites.values()) { if (s.getStatus() == Status.ERROR) { return Status.ERROR; } else if (s.getStatus() == Status.WARN) { @@ -127,8 +133,8 @@ public class OutputSummaryFormatter { } private void tallyTests() { - for (SuiteStats s : suites) { - for (TestInfo t : s.getTests()) { + for (SuiteResults s : suites.values()) { + for (TestResults t : s.getTests()) { this.allTests.add(t); if (t.getStatus() == Status.OK) { this.passingTestCount++; @@ -141,6 +147,25 @@ public class OutputSummaryFormatter { } } + private void tallySuites() { + List ignoredSuiteNames = dataModel.getIgnoredSuiteNames(); + + for (String name : dataModel.getSuiteNames()) { + if (ignoredSuiteNames.contains(name)) { + this.ignoredSuites.add(name); + } else if (!suites.containsKey(name)) { + this.remainingSuites.add(name); + } else { + SuiteResults s = suites.get(name); + if (s.getStatus() == Status.ERROR) { + this.failingSuites.add(name); + } else { + this.passingSuites.add(name); + } + } + } + } + private void writeHeader(PrintWriter writer) { String startString = formatDateTime(dataModel.getStartTime()); @@ -187,19 +212,22 @@ public class OutputSummaryFormatter { writer.println(" "); writer.println(" "); writer.println(" "); - writer.println(" "); - writer.println(" "); - writer.println(" "); - writer.println(" "); - writer.println(" "); + writer.println(" "); + writer.println(" "); + writer.println(" "); + writer.println(" "); + writer.println(" "); + if (!this.remainingSuites.isEmpty()) { + writer.println(" "); + } writer.println("
Suites" + this.suites.size() - + "
Total tests" - + this.allTests.size() + "
Passing tests" + this.passingTestCount - + "
Failing tests" + this.failingTests.size() - + "
Ignored tests" + this.ignoredTests.size() - + "
 SuitesTests
Total" + "" + + "
Passed" + this.passingSuites.size() + + "" + this.passingTestCount + "
Failed" + this.failingSuites.size() + + "" + this.failingTests.size() + "
Ignored" + this.ignoredSuites.size() + + "" + this.ignoredTests.size() + "
Remaining" + + this.remainingSuites.size() + "?
"); writer.println(" "); writer.println(" "); @@ -242,7 +270,7 @@ public class OutputSummaryFormatter { writer.println(" No tests failed." + ""); } else { - for (TestInfo t : failingTests) { + for (TestResults t : failingTests) { writer.println(" "); writer.println(" " + t.getSuiteName() + ""); writer.println(" No tests ignored." + ""); } else { - for (TestInfo t : ignoredTests) { + for (TestResults t : ignoredTests) { writer.println(" "); writer.println(" " + t.getSuiteName() + ""); writer.println(" "); - for (SuiteStats s : suites) { + for (SuiteResults s : suites.values()) { writer.println(" "); writer.println(" " @@ -303,7 +331,7 @@ public class OutputSummaryFormatter { writer.println(" "); writer.println(" \n"); - for (TestInfo t : allTests) { + for (TestResults t : allTests) { writer.println(" "); writer.println(" "); diff --git a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/SuiteStats.java b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/SuiteResults.java similarity index 76% rename from utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/SuiteStats.java rename to utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/SuiteResults.java index 98642e8d6..af663a481 100644 --- a/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/SuiteStats.java +++ b/utilities/testrunner/src/edu/cornell/mannlib/vitro/utilities/testrunner/output/SuiteResults.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.BufferedReader; import java.io.File; @@ -13,11 +13,16 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import edu.cornell.mannlib.vitro.utilities.testrunner.FileHelper; +import edu.cornell.mannlib.vitro.utilities.testrunner.IgnoredTests; +import edu.cornell.mannlib.vitro.utilities.testrunner.SeleniumRunnerParameters; +import edu.cornell.mannlib.vitro.utilities.testrunner.Status; + /** * Extract any summary information from an HTML output file, produced by a test * suite. */ -public class SuiteStats { +public class SuiteResults{ /** * If the file doesn't contain a line that includes this pattern, it is not * a suite output file. @@ -39,17 +44,17 @@ public class SuiteStats { /** * Parse the fields from this file and attempt to produce a - * {@link SuiteStats} object. If this is not an appropriate file, just + * {@link SuiteResults} object. If this is not an appropriate file, just * return null. */ - public static SuiteStats parse(SeleniumRunnerParameters parms, + public static SuiteResults parse(SeleniumRunnerParameters parms, File outputFile) { IgnoredTests ignoredTests = parms.getIgnoredTests(); boolean isSuiteOutputFile = false; Status status = Status.ERROR; - List tests = new ArrayList(); + List tests = new ArrayList(); String suiteName = FileHelper.baseName(outputFile); String outputLink = outputFile.getName(); @@ -82,13 +87,13 @@ public class SuiteStats { reasonForIgnoring = ""; } - tests.add(new TestInfo(testName, suiteName, testLink, + tests.add(new TestResults(testName, suiteName, testLink, testStatus, reasonForIgnoring)); } } status = Status.OK; - for (TestInfo t : tests) { + for (TestResults t : tests) { if (t.status == Status.ERROR) { status = Status.ERROR; } else if ((t.status == Status.WARN) && (status == Status.OK)) { @@ -97,7 +102,7 @@ public class SuiteStats { } if (isSuiteOutputFile) { - return new SuiteStats(suiteName, outputLink, tests, status); + return new SuiteResults(suiteName, outputLink, tests, status); } else { return null; } @@ -119,11 +124,11 @@ public class SuiteStats { private final String suiteName; private final String outputLink; - private final List tests; + private final List tests; private final Status status; - public SuiteStats(String suiteName, String outputLink, - List tests, Status status) { + public SuiteResults(String suiteName, String outputLink, + List tests, Status status) { this.suiteName = suiteName; this.outputLink = outputLink; this.tests = tests; @@ -142,18 +147,18 @@ public class SuiteStats { return outputLink; } - public Collection getTests() { + public Collection getTests() { return Collections.unmodifiableCollection(tests); } - public static class TestInfo { + public static class TestResults { private final String name; private final String suite; private final String outputLink; private final Status status; private final String reasonForIgnoring; - public TestInfo(String name, String suite, String outputLink, + public TestResults(String name, String suite, String outputLink, Status status, String reasonForIgnoring) { this.name = name; this.suite = suite;
Suite nameTest name
" + t.getSuiteName() + "