From: Mathieu Baudier Date: Sun, 18 Nov 2007 10:17:19 +0000 (+0000) Subject: Improve reporting X-Git-Tag: argeo-slc-2.1.7~3169 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=875f97b054c6e996fa2d03c299c83cc80d336b54;p=gpl%2Fargeo-slc.git Improve reporting git-svn-id: https://svn.argeo.org/slc/trunk@716 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.slc/.classpath b/org.argeo.slc/.classpath index 389d06896..46fd2f448 100644 --- a/org.argeo.slc/.classpath +++ b/org.argeo.slc/.classpath @@ -21,6 +21,7 @@ + diff --git a/org.argeo.slc/.settings/org.eclipse.jdt.core.prefs b/org.argeo.slc/.settings/org.eclipse.jdt.core.prefs index e1ac4b347..3a43ca756 100644 --- a/org.argeo.slc/.settings/org.eclipse.jdt.core.prefs +++ b/org.argeo.slc/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,13 @@ -#Sun Nov 11 11:22:17 CET 2007 +#Sun Nov 18 09:33:59 CET 2007 eclipse.preferences.version=1 +org.eclipse.jdt.core.builder.cleanOutputFolder=clean +org.eclipse.jdt.core.builder.duplicateResourceTask=warning +org.eclipse.jdt.core.builder.invalidClasspath=abort +org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore +org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,*.testsuite,*.deploy,*.location,*.execution,*.datapool,*.artifact,package.html,*.svg +org.eclipse.jdt.core.circularClasspath=error +org.eclipse.jdt.core.classpath.exclusionPatterns=enabled +org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -7,6 +15,9 @@ org.eclipse.jdt.core.compiler.compliance=1.5 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.maxProblemPerUnit=100 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.incompatibleJDKLevel=ignore +org.eclipse.jdt.core.incompleteClasspath=error diff --git a/org.argeo.slc/lib-src/commons-io-1.3.2-sources.jar b/org.argeo.slc/lib-src/commons-io-1.3.2-sources.jar new file mode 100644 index 000000000..b383cf381 Binary files /dev/null and b/org.argeo.slc/lib-src/commons-io-1.3.2-sources.jar differ diff --git a/org.argeo.slc/lib/commons-io-1.3.2.jar b/org.argeo.slc/lib/commons-io-1.3.2.jar new file mode 100644 index 000000000..865c9e41c Binary files /dev/null and b/org.argeo.slc/lib/commons-io-1.3.2.jar differ diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/taskdefs.properties b/org.argeo.slc/src/main/java/org/argeo/slc/ant/taskdefs.properties index 7ae6f6839..85e0743c8 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/ant/taskdefs.properties +++ b/org.argeo.slc/src/main/java/org/argeo/slc/ant/taskdefs.properties @@ -2,3 +2,4 @@ slc.test=org.argeo.slc.ant.test.SlcTestTask slc.deploy=org.argeo.slc.ant.deploy.SlcDeployTask slc.closeResult=org.argeo.slc.ant.test.SlcCloseTestResultTask +slc.report=org.argeo.slc.ant.test.SlcReportTask diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcCloseTestResultTask.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcCloseTestResultTask.java index 694bd5b4c..660928abe 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcCloseTestResultTask.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcCloseTestResultTask.java @@ -6,26 +6,15 @@ import org.argeo.slc.core.structure.StructureRegistry; import org.argeo.slc.core.test.TestReport; import org.argeo.slc.core.test.TestResult; -/** Ant tasks closing a given result, and optionally generating a report. */ +/** Ant tasks closing a given result. */ public class SlcCloseTestResultTask extends SAwareTask { private String result; - private String report; @Override public void executeActions(String mode) { if (!mode.equals(StructureRegistry.READ)) { TestResult testResult = (TestResult) getContext().getBean(result); testResult.close(); - - if (report != null) { - TestReport testReport = (TestReport) getContext().getBean( - report); - if (testReport instanceof StructureAware) { - ((StructureAware) testReport).notifyCurrentPath( - getRegistry(), null); - } - testReport.generateTestReport(testResult); - } } } @@ -34,9 +23,4 @@ public class SlcCloseTestResultTask extends SAwareTask { this.result = bean; } - /** Sets the bean name of the report to generate. */ - public void setReport(String report) { - this.report = report; - } - } diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcReportTask.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcReportTask.java new file mode 100644 index 000000000..75877625d --- /dev/null +++ b/org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcReportTask.java @@ -0,0 +1,40 @@ +package org.argeo.slc.ant.test; + +import org.argeo.slc.ant.structure.SAwareTask; +import org.argeo.slc.core.structure.StructureAware; +import org.argeo.slc.core.structure.StructureRegistry; +import org.argeo.slc.core.test.TestReport; +import org.argeo.slc.core.test.TestResult; + +/** Ant tasks generating a report. */ +public class SlcReportTask extends SAwareTask { + private String result; + private String report; + + @Override + public void executeActions(String mode) { + if (!mode.equals(StructureRegistry.READ)) { + TestResult testResult = null; + if (result != null) { + testResult = (TestResult) getContext().getBean(result); + } + TestReport testReport = (TestReport) getContext().getBean(report); + if (testReport instanceof StructureAware) { + ((StructureAware) testReport).notifyCurrentPath(getRegistry(), + null); + } + testReport.generateTestReport(testResult); + } + } + + /** Sets the bean name of the result to close. */ + public void setResult(String bean) { + this.result = bean; + } + + /** Sets the bean name of the report to generate. */ + public void setReport(String report) { + this.report = report; + } + +} diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/SimpleTestResult.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/SimpleTestResult.java index 88bf8b394..3f673305d 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/SimpleTestResult.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/SimpleTestResult.java @@ -1,15 +1,21 @@ package org.argeo.slc.core.test; +import java.util.Date; import java.util.List; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +/** + * Basic implementation of a test result containing only a list of result + * parts. + */ public class SimpleTestResult implements TestResult { private static Log log = LogFactory.getLog(SimpleTestResult.class); private TestResultId testResultId; + private Date closeDate; private List parts = new Vector(); public void addResultPart(TestResultPart part) { @@ -20,12 +26,14 @@ public class SimpleTestResult implements TestResult { public void close() { parts.clear(); + closeDate = new Date(); } public TestResultId getTestResultId() { return testResultId; } + /** Sets the test result id. */ public void setTestResultId(TestResultId testResultId) { this.testResultId = testResultId; } @@ -34,4 +42,8 @@ public class SimpleTestResult implements TestResult { return parts; } + public Date getCloseDate() { + return closeDate; + } + } diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/TestResult.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/TestResult.java index 5d6e3421f..860fe1caf 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/TestResult.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/TestResult.java @@ -1,5 +1,7 @@ package org.argeo.slc.core.test; +import java.util.Date; + /** The result of a test */ public interface TestResult { /** Gets the id of the related test result. */ @@ -13,4 +15,10 @@ public interface TestResult { * related resources (also closing listeners). */ public void close(); + + /** + * The date when this test result was closed. Can be null, which means the + * result is not closed. + */ + public Date getCloseDate(); } diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/TestResultListener.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/TestResultListener.java index 10b296448..0d774a71e 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/TestResultListener.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/TestResultListener.java @@ -7,5 +7,5 @@ public interface TestResultListener { TestResultPart testResultPart); /** Stops listening and release the related resources. */ - public void close(); + public void close(TestResult testResult); } diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/AsynchronousTreeTestResultListener.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/AsynchronousTreeTestResultListener.java index 3ac38de5d..c3bc793ef 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/AsynchronousTreeTestResultListener.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/AsynchronousTreeTestResultListener.java @@ -26,7 +26,7 @@ public abstract class AsynchronousTreeTestResultListener implements } /** Finish the remaining and destroy */ - public void close() { + public void close(TestResult testResult) { synchronized (partStructs) { // TODO: put a timeout while (partStructs.size() != 0) { @@ -39,6 +39,7 @@ public abstract class AsynchronousTreeTestResultListener implements thread = null; partStructs.notifyAll(); } + postClose((TreeTestResult)testResult); } public final void resultPartAdded(TestResult testResult, @@ -55,6 +56,14 @@ public abstract class AsynchronousTreeTestResultListener implements /** Called when a result part has been added. */ protected abstract void resultPartAdded(PartStruct partStruct); + /** + * Called at the end of close. Default implementation is empty. To be + * overridden. + */ + protected void postClose(TreeTestResult testResult) { + + } + public void run() { while (thread != null) { synchronized (partStructs) { diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/FullHtmlTreeReport.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/FullHtmlTreeReport.java deleted file mode 100644 index dd418477d..000000000 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/FullHtmlTreeReport.java +++ /dev/null @@ -1,183 +0,0 @@ -package org.argeo.slc.core.test.tree; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.List; - -import org.argeo.slc.core.SlcException; -import org.argeo.slc.core.structure.StructureAware; -import org.argeo.slc.core.structure.StructureElement; -import org.argeo.slc.core.structure.StructurePath; -import org.argeo.slc.core.structure.StructureRegistry; -import org.argeo.slc.core.structure.tree.TreeSPath; -import org.argeo.slc.core.test.SimpleResultPart; -import org.argeo.slc.core.test.TestReport; -import org.argeo.slc.core.test.TestResult; -import org.argeo.slc.core.test.TestResultPart; -import org.argeo.slc.dao.structure.tree.TreeSRegistryDao; -import org.argeo.slc.dao.test.TestResultDao; - -/** - * Basic implementation of TestReport generating static HTML pages. If a - * TestResultDao is passed, all the datas are dumped, otherwise - * only the passed TestResult. - */ -public class FullHtmlTreeReport implements TestReport, StructureAware { - private TestResultDao testResultDao; - private TreeSRegistryDao treeSRegistryDao; - private File reportDir; - - private StructureRegistry registry; - - public void generateTestReport(TestResult testResult) { - - if (testResultDao == null) { - TreeTestResult result = (TreeTestResult) testResult; - initRegistry(result.getResultParts().firstKey()); - generateResultPage(getResultFile(result), result); - } else { - if (reportDir.exists()) { - // clean - for (File file : reportDir.listFiles()) { - file.delete(); - } - } - reportDir.mkdirs(); - - StringBuffer index = new StringBuffer(""); - index - .append("
Results
\n\n"); - - List list = testResultDao.listTestResults(); - for (TestResult testRes : list) { - TreeTestResult result = (TreeTestResult) testRes; - initRegistry(result.getResultParts().firstKey()); - - File file = getResultFile(result); - index.append("\n"); - generateResultPage(file, result); - } - - index.append("
"); - index.append(result.getTestResultId()).append("
\n"); - - try { - FileWriter writer = new FileWriter(reportDir.getPath() - + File.separator + "index.html"); - writer.write(index.toString()); - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - } - } - - /** - * Generates a result page for one test result - * - * @param file - * file to which generate the HTML - * @param result - * the result to dump - */ - protected void generateResultPage(File file, TreeTestResult result) { - StringBuffer buf = new StringBuffer(""); - buf.append("\n"); - buf.append("
Result #").append(result.getTestResultId()) - .append("
\n"); - - buf.append("\n"); - - buf.append("

Result #").append(result.getTestResultId()).append( - "

\n"); - - buf.append("\n"); - for (TreeSPath path : result.getResultParts().keySet()) { - buf.append("\n"); - buf.append("\n"); - } - buf.append("
"); - buf.append(path); - StructureElement element = registry.getElement(path); - if (registry != null) { - if (element != null) { - buf.append("
"); - buf.append(element.getDescription()); - buf.append(""); - } - } - buf.append("
"); - PartSubList subList = (PartSubList) result.getResultParts().get( - path); - buf.append("\n"); - for (TestResultPart part : subList.getParts()) { - SimpleResultPart sPart = (SimpleResultPart) part; - String color = "yellow"; - if (sPart.getStatus().equals(SimpleResultPart.PASSED)) { - color = "green"; - } else { - color = "red"; - } - buf.append("\n"); - } - buf.append("
"); - - buf.append(sPart.getMessage()); - buf.append("
\n"); - - buf.append("
\n"); - - buf.append(""); - buf.append(""); - - try { - FileWriter writer = new FileWriter(file); - writer.write(buf.toString()); - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * Generates a result file location based on the report dir and the id of - * the test result. - */ - protected File getResultFile(TreeTestResult result) { - return new File(reportDir.getPath() + File.separator - + result.getTestResultId() + ".html"); - } - - /** Sets the DAO to use to extract all data. */ - public void setTestResultDao(TestResultDao testResultDao) { - this.testResultDao = testResultDao; - } - - /** Sets the tree structure registry DAO.*/ - public void setTreeSRegistryDao(TreeSRegistryDao treeSRegistryDao) { - this.treeSRegistryDao = treeSRegistryDao; - } - - /** Sets the directory where to generate all the data. */ - public void setReportDir(File reportDir) { - this.reportDir = reportDir; - } - - private void initRegistry(TreeSPath path){ - if(treeSRegistryDao != null){ - registry = treeSRegistryDao.getTreeSRegistry(path); - } - if(registry==null){ - throw new SlcException("No structure registry available"); - } - } - - public void notifyCurrentPath(StructureRegistry registry, StructurePath path) { - this.registry = registry; - } - -} diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResult.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResult.java index fb1b0130c..dc0f3aa59 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResult.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResult.java @@ -1,5 +1,6 @@ package org.argeo.slc.core.test.tree; +import java.util.Date; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; @@ -32,6 +33,8 @@ public class TreeTestResult implements TestResult, StructureAware { private List listeners = new Vector(); private TreeSPath currentPath; + + private Date closeDate; private boolean isClosed = false; @@ -105,14 +108,16 @@ public class TreeTestResult implements TestResult, StructureAware { throw new SlcException("Test Result #" + getTestResultId() + " alredy closed."); } + closeDate = new Date(); synchronized (listeners) { for (TestResultListener listener : listeners) { - listener.close(); + listener.close(this); } listeners.clear(); } isClosed = true; + log.info("Test Result #" + getTestResultId() + " closed."); } @@ -134,4 +139,13 @@ public class TreeTestResult implements TestResult, StructureAware { this.registry = registry; } + public Date getCloseDate() { + return closeDate; + } + + /** Sets the close date (for ORM)*/ + public void setCloseDate(Date closeDate) { + this.closeDate = closeDate; + } + } diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultPersister.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultPersister.java index 062157429..29c73d2ff 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultPersister.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultPersister.java @@ -76,6 +76,20 @@ public class TreeTestResultPersister extends AsynchronousTreeTestResultListener } } + @Override + protected void postClose(TreeTestResult testResult) { + TreeTestResult persistedResult = (TreeTestResult) testResultDao + .getTestResult(testResult.getTestResultId()); + + if (persistedResult != null) { + persistedResult.setCloseDate(testResult.getCloseDate()); + testResultDao.update(persistedResult); + } + if (log.isDebugEnabled()) + log.debug("Closed result persister for result " + + testResult.getNumericResultId()); + } + private TreeSRegistry getOrCreateTreeSRegistry(TreeSPath path) { TreeSRegistry registry = treeSRegistryDao.getTreeSRegistry(path); if (registry == null) { diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/FullHtmlTreeReport.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/FullHtmlTreeReport.java new file mode 100644 index 000000000..076da8f86 --- /dev/null +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/FullHtmlTreeReport.java @@ -0,0 +1,138 @@ +package org.argeo.slc.core.test.tree.htmlreport; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.List; + +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.xml.FlatXmlDataSet; +import org.hsqldb.lib.FileUtil; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; + +import org.argeo.slc.core.SlcException; +import org.argeo.slc.core.structure.StructureAware; +import org.argeo.slc.core.structure.StructurePath; +import org.argeo.slc.core.structure.StructureRegistry; +import org.argeo.slc.core.structure.tree.TreeSPath; +import org.argeo.slc.core.test.TestReport; +import org.argeo.slc.core.test.TestResult; +import org.argeo.slc.core.test.tree.TreeTestResult; +import org.argeo.slc.dao.structure.tree.TreeSRegistryDao; +import org.argeo.slc.dao.test.TestResultDao; + +/** + * Basic implementation of TestReport generating static HTML pages. If a + * TestResultDao is passed, all the data is dumped, otherwise + * only the passed TestResult. + */ +public class FullHtmlTreeReport implements TestReport, StructureAware { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss"); + + private TestResultDao testResultDao; + private TreeSRegistryDao treeSRegistryDao; + private File reportDir; + + private StructureRegistry localRegistry; + + public void generateTestReport(TestResult testResult) { + + if (testResultDao == null) { + if (testResult == null) + throw new SlcException( + "Cannot generate report without DAO or result instance."); + + TreeTestResult result = (TreeTestResult) testResult; + ResultPage page = new ResultPage(this, result); + page.generate(getRegistry(result)); + } else { + if (reportDir.exists()) { + // clean + for (File file : reportDir.listFiles()) { + file.delete(); + } + } + reportDir.mkdirs(); + + resourceToFile("index.html"); + resourceToFile("style.css"); + + ResultsList index = new ResultsList(this); + List list = testResultDao.listTestResults(); + for (TestResult testRes : list) { + TreeTestResult result = (TreeTestResult) testRes; + + index.addTestResult(result); + ResultPage page = new ResultPage(this, result); + page.generate(getRegistry(result)); + } + index.close(); + } + } + + /** + * Generates a result file location based on the report dir and the id of + * the test result. + */ + protected File getResultFile(TreeTestResult result) { + return new File(reportDir.getPath() + File.separator + "slc-result-" + + result.getTestResultId() + ".html"); + } + + /** Sets the DAO to use to extract all data. */ + public void setTestResultDao(TestResultDao testResultDao) { + this.testResultDao = testResultDao; + } + + /** Sets the tree structure registry DAO. */ + public void setTreeSRegistryDao(TreeSRegistryDao treeSRegistryDao) { + this.treeSRegistryDao = treeSRegistryDao; + } + + /** Sets the directory where to generate all the data. */ + public void setReportDir(File reportDir) { + this.reportDir = reportDir; + } + + private StructureRegistry getRegistry(TreeTestResult result) { + StructureRegistry registry = null; + if (treeSRegistryDao != null) { + TreeSPath path = result.getResultParts().firstKey(); + registry = treeSRegistryDao.getTreeSRegistry(path); + } + if (registry == null) { + registry = localRegistry; + } + if (registry == null) { + throw new SlcException("No structure registry available"); + } + return registry; + } + + public void notifyCurrentPath(StructureRegistry registry, StructurePath path) { + this.localRegistry = registry; + } + + File getReportDir() { + return reportDir; + } + + private void resourceToFile(String resourceName) { + try { + File file = new File(getReportDir() + File.separator + resourceName); + InputStream in = FullHtmlTreeReport.class + .getResourceAsStream(resourceName); + FileOutputStream out = new FileOutputStream(file); + IOUtils.copy(in, out); + IOUtils.closeQuietly(in); + IOUtils.closeQuietly(out); + } catch (Exception e) { + throw new SlcException("Cannot load resource", e); + } + + } + +} diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/ResultPage.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/ResultPage.java new file mode 100644 index 000000000..c03a458e3 --- /dev/null +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/ResultPage.java @@ -0,0 +1,95 @@ +package org.argeo.slc.core.test.tree.htmlreport; + +import java.io.FileWriter; +import java.io.IOException; + +import org.argeo.slc.core.structure.StructureElement; +import org.argeo.slc.core.structure.StructureRegistry; +import org.argeo.slc.core.structure.tree.TreeSPath; +import org.argeo.slc.core.test.SimpleResultPart; +import org.argeo.slc.core.test.TestResultPart; +import org.argeo.slc.core.test.tree.PartSubList; +import org.argeo.slc.core.test.tree.TreeTestResult; + +class ResultPage { + private final FullHtmlTreeReport report; + private final TreeTestResult result; + + ResultPage(FullHtmlTreeReport report, TreeTestResult result) { + this.report = report; + this.result = result; + } + + /** + * Generates a result page for one test result + * + * @param file + * file to which generate the HTML + * @param result + * the result to dump + */ + protected void generate(StructureRegistry registry) { + StringBuffer buf = new StringBuffer(""); + buf.append("\n"); + buf.append("
"); + buf.append("Result #").append(result.getTestResultId()).append( + "\n"); + buf + .append(""); + buf.append("
\n"); + + buf.append("\n"); + + buf.append("

Result #").append(result.getTestResultId()).append( + "

\n"); + + buf.append("\n"); + for (TreeSPath path : result.getResultParts().keySet()) { + buf.append("\n"); + buf.append("\n"); + } + buf.append("
"); + buf.append(path); + if (registry != null) { + StructureElement element = registry.getElement(path); + if (element != null) { + buf.append("
"); + buf.append(element.getDescription()); + buf.append(""); + } + } + buf.append("
"); + PartSubList subList = (PartSubList) result.getResultParts().get( + path); + buf.append("\n"); + for (TestResultPart part : subList.getParts()) { + SimpleResultPart sPart = (SimpleResultPart) part; + String color = "yellow"; + if (sPart.getStatus().equals(SimpleResultPart.PASSED)) { + color = "green"; + } else { + color = "red"; + } + buf.append("\n"); + } + buf.append("
"); + + buf.append(sPart.getMessage()); + buf.append("
\n"); + + buf.append("
\n"); + + buf.append(""); + buf.append(""); + + try { + FileWriter writer = new FileWriter(report.getResultFile(result)); + writer.write(buf.toString()); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/ResultsList.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/ResultsList.java new file mode 100644 index 000000000..e191f5fb4 --- /dev/null +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/ResultsList.java @@ -0,0 +1,63 @@ +package org.argeo.slc.core.test.tree.htmlreport; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Date; + +import org.argeo.slc.core.SlcException; +import org.argeo.slc.core.test.tree.TreeTestResult; + +class ResultsList { + private final FullHtmlTreeReport report; + private final StringBuffer buf = new StringBuffer(""); + + ResultsList(FullHtmlTreeReport report) { + this.report = report; + + buf.append("
Results
"); + buf.append("
"); + buf.append("Results\n"); + buf + .append(""); + buf.append("
\n"); + buf.append("\n"); + + buf.append("

Results

\n"); + buf.append("\n"); + } + + void addTestResult(TreeTestResult result) { + buf.append("\n"); + // Date + buf.append("\n"); + // Id and link + buf.append("\n"); + + buf.append("\n"); + } + + void close() { + buf.append("
"); + Date closeDate = result.getCloseDate(); + if(closeDate == null){ + throw new SlcException("No close date"); + } + buf.append(report.sdf.format(closeDate)); + buf.append(""); + buf.append(result.getTestResultId()).append("
\n"); + + try { + FileWriter writer = new FileWriter(report.getReportDir().getPath() + + File.separator + "slc-resultsList.html"); + writer.write(buf.toString()); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + +} diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/index.html b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/index.html new file mode 100644 index 000000000..ca5836d19 --- /dev/null +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/index.html @@ -0,0 +1,17 @@ + + + +SLC test results + + + + + + + <h2>Frame Alert</h2> + <p>This document is designed to be viewed using the frames feature. + If you see this message, you are using a non-frame-capable web client. + </p> + + + diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/style.css b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/style.css new file mode 100644 index 000000000..d7e7730bc --- /dev/null +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/style.css @@ -0,0 +1,151 @@ +/* Generic Selectors */ +body { + font-family: sans-serif; + font-size: 12px; + color: black; + background-color: white; +} + +li { + list-style-type: none; +} + +h1 { + font-family: sans-serif; + font-size: 16px; + font-weight: bold; + color: #000000; + padding: 0px 0px 5px 0px; + margin: 0px; +} + +h2 { + font-family: sans-serif; + font-size: 14px; + font-weight: bold; + color: #000000; + padding: 5px 0px 5px 0px; + margin: 0px; + margin-top: 5px; +} + +table,form { + margin: 0px; +} + +img { + border: none; +} + +div { + font-size: 100%; +} + +tr.list:hover { + background-color: lightgrey; +} + +td.list { + border-top: 1px solid lighgrey; + padding: 2px 20px 2px 2px; + padding-right: 15px; +} + +th { + font-size: 12px; + padding: 2px 20px 2px 2px; + vertical-align: top; + text-align: left; +} + +td { + font-size: 12px; + padding: 1px; + vertical-align: middle; + text-align: left; +} + +/**************** Navigation ****************/ +td.nav1 { + padding: 5px 0px 0px 0px; + font-size: 12px; + font-weight: bold; +} + +td.nav2 { + padding: 0px 0px 0px 5px; + font-size: 12px; +} + +/**************** Forms ****************/ +input.submit { + border: solid 1px grey; + background-color: lightgrey; + align: right; +} + +input.submit:hover { + border: solid 1px #3399FF; + background-color: white; + color: #3399FF; +} + +input.std { + border: solid 1px lightgrey; + padding: 1px; + margin: 2px; +} + +.formError { + color: red; + padding: 1px; + margin: 2px; + font-weight: bold; +} + +/**************** Pseudo classes ****************/ +a:link { + color: #0066CC; + text-decoration: none; +} + +a:visited { + color: #0066CC; + text-decoration: none; +} + +a:hover { + color: #3399FF; + text-decoration: none; +} + +/************************* ID's *************************/ +#main { + position: absolute; + margin-left: 180px; + padding-top: 65px; +} + +#navigation { + position: absolute; + width: 150px; + height: 800px; + border-right: 1px solid #0066CC; + font-weight: normal; + margin-top: 60px; + margin-left: 10px; +} + +#banner { + position: absolute; + width: 400px; + height: 50px; +} + +#upperRight { + position: absolute; + top: 0; + right: 0; + margin-top: 20px; + margin-right: 10px; +} \ No newline at end of file diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/hibernate/test/tree/TreeTestResult.hbm.xml b/org.argeo.slc/src/main/java/org/argeo/slc/hibernate/test/tree/TreeTestResult.hbm.xml index f01505bfa..5b7bcb38d 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/hibernate/test/tree/TreeTestResult.hbm.xml +++ b/org.argeo.slc/src/main/java/org/argeo/slc/hibernate/test/tree/TreeTestResult.hbm.xml @@ -8,6 +8,9 @@ + + diff --git a/org.argeo.slc/src/test/java/org/argeo/slc/example/junit/TestAntBuild.java b/org.argeo.slc/src/test/java/org/argeo/slc/example/junit/TestAntBuild.java index a3ca0e530..10c215979 100644 --- a/org.argeo.slc/src/test/java/org/argeo/slc/example/junit/TestAntBuild.java +++ b/org.argeo.slc/src/test/java/org/argeo/slc/example/junit/TestAntBuild.java @@ -68,10 +68,11 @@ public class TestAntBuild extends TestCase { TestStatus.FAILED, "Compare eu-reform-expected.txt with eu-reform-reached.txt"); - assertTrue(new File("src/test/slc/work/results/report/index.html") - .exists()); - assertTrue(new File("src/test/slc/work/results/report/1.html").exists()); - assertTrue(new File("src/test/slc/work/results/report/2.html").exists()); + String reportDirPath = "src/test/slc/work/results/report/"; + assertTrue(new File(reportDirPath + "index.html").exists()); + assertTrue(new File(reportDirPath + "slc-resultsList.html").exists()); + assertTrue(new File(reportDirPath + "slc-result-1.html").exists()); + assertTrue(new File(reportDirPath + "slc-result-2.html").exists()); } private void assertPart(TreeTestResult testResult, String pathStr, diff --git a/org.argeo.slc/src/test/java/org/argeo/slc/hibernate/test/tree/TreeTestResultDaoHibernateTest.java b/org.argeo.slc/src/test/java/org/argeo/slc/hibernate/test/tree/TreeTestResultDaoHibernateTest.java index 1e7fcf716..939d154fc 100644 --- a/org.argeo.slc/src/test/java/org/argeo/slc/hibernate/test/tree/TreeTestResultDaoHibernateTest.java +++ b/org.argeo.slc/src/test/java/org/argeo/slc/hibernate/test/tree/TreeTestResultDaoHibernateTest.java @@ -1,5 +1,7 @@ package org.argeo.slc.hibernate.test.tree; +import java.util.Date; + import org.argeo.slc.core.structure.tree.TreeSPath; import org.argeo.slc.core.test.NumericTRId; import org.argeo.slc.core.test.SimpleResultPart; @@ -41,6 +43,9 @@ public class TreeTestResultDaoHibernateTest extends SpringBasedTestCase { treeTestResult.notifyCurrentPath(null, path); treeTestResult.addResultPart(partPassed); treeTestResult.addResultPart(partFailed); + + Date closeDate = new Date(); + treeTestResult.setCloseDate(closeDate); testResultDao.create(treeTestResult); @@ -57,7 +62,7 @@ public class TreeTestResultDaoHibernateTest extends SpringBasedTestCase { assertEquals(TestStatus.FAILED, (int)part1.getStatus()); assertEquals(msgFailed,part1.getMessage()); - + assertEquals(closeDate, treeTestResult2.getCloseDate()); } @Override diff --git a/org.argeo.slc/src/test/slc/conf/log4j.properties b/org.argeo.slc/src/test/slc/conf/log4j.properties index 603ef8fdf..551c14c6f 100644 --- a/org.argeo.slc/src/test/slc/conf/log4j.properties +++ b/org.argeo.slc/src/test/slc/conf/log4j.properties @@ -3,7 +3,7 @@ log4j.rootLogger=INFO, console ## Levels # Slc -log4j.logger.org.argeo.slc=INFO +log4j.logger.org.argeo.slc=DEBUG # Spring log4j.logger.org.springframework=INFO # Hibernate diff --git a/org.argeo.slc/src/test/slc/conf/slc.xml b/org.argeo.slc/src/test/slc/conf/slc.xml index ab92fe8b1..14bdfd72a 100644 --- a/org.argeo.slc/src/test/slc/conf/slc.xml +++ b/org.argeo.slc/src/test/slc/conf/slc.xml @@ -44,29 +44,25 @@ - + + init-method="init" scope="prototype"> + init-method="init" scope="prototype"> + class="org.argeo.slc.core.test.tree.htmlreport.FullHtmlTreeReport"> A Test project - - + + +