Improve error logging and reporting
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 21 Nov 2007 08:08:45 +0000 (08:08 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 21 Nov 2007 08:08:45 +0000 (08:08 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@728 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/AsynchronousTreeTestResultListener.java
org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultLogger.java
org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/ResultPage.java
org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/style.css
org.argeo.slc/src/main/java/org/argeo/slc/hibernate/test/SimpleResultPart.hbm.xml
org.argeo.slc/src/test/java/org/argeo/slc/example/junit/TestAntBuild.java
org.argeo.slc/src/test/slc/conf/testDatas.xml
org.argeo.slc/src/test/slc/root/Category1/SubCategory2/build.xml

index 0773e409ff3f9b08759f99c9c81e92d11fc9cc78..c22c1102972cc02be8edd9aa684a90fa783c1345 100644 (file)
@@ -19,10 +19,22 @@ public abstract class AsynchronousTreeTestResultListener implements
        private Vector<PartStruct> partStructs = new Vector<PartStruct>();\r
        private Thread thread;\r
 \r
+       private Boolean synchronous = false;\r
+       \r
+       protected AsynchronousTreeTestResultListener(){\r
+               this(false);\r
+       }\r
+\r
+       protected AsynchronousTreeTestResultListener(Boolean synchronousByDefault){\r
+               synchronous = synchronousByDefault;\r
+       }\r
+\r
        /** Starts the underlying thread. */\r
        public void init() {\r
-               thread = new Thread(this);\r
-               thread.start();\r
+               if (!synchronous) {\r
+                       thread = new Thread(this);\r
+                       thread.start();\r
+               }\r
        }\r
 \r
        /** Finish the remaining and destroy */\r
@@ -47,11 +59,16 @@ public abstract class AsynchronousTreeTestResultListener implements
        public final void resultPartAdded(TestResult testResult,\r
                        TestResultPart testResultPart) {\r
                TreeTestResult result = (TreeTestResult) testResult;\r
-               synchronized (partStructs) {\r
-                       partStructs.add(new PartStruct(result.getCurrentPath(),\r
-                                       (NumericTRId) result.getTestResultId(), testResultPart,\r
-                                       result));\r
-                       partStructs.notifyAll();\r
+               PartStruct partStruct = new PartStruct(result.getCurrentPath(),\r
+                               (NumericTRId) result.getTestResultId(), testResultPart, result);\r
+\r
+               if (!synchronous) {\r
+                       synchronized (partStructs) {\r
+                               partStructs.add(partStruct);\r
+                               partStructs.notifyAll();\r
+                       }\r
+               } else {\r
+                       resultPartAdded(partStruct);\r
                }\r
        }\r
 \r
@@ -109,4 +126,12 @@ public abstract class AsynchronousTreeTestResultListener implements
 \r
        }\r
 \r
+       public Boolean getSynchronous() {\r
+               return synchronous;\r
+       }\r
+\r
+       public void setSynchronous(Boolean synchronous) {\r
+               this.synchronous = synchronous;\r
+       }\r
+\r
 }\r
index 0e2d28825c7e8ec12095220b94753f223af38066..c09c18ac323923f7c7b1822845c8dc0c88cdb31d 100644 (file)
@@ -3,6 +3,10 @@ package org.argeo.slc.core.test.tree;
 import org.apache.commons.logging.Log;\r
 import org.apache.commons.logging.LogFactory;\r
 \r
+import org.argeo.slc.core.test.SimpleResultPart;\r
+import org.argeo.slc.core.test.TestResultPart;\r
+import org.argeo.slc.core.test.TestStatus;\r
+\r
 /**\r
  * Listener logging tree-based test results to the underlying logging system.\r
  * \r
@@ -12,11 +16,25 @@ import org.apache.commons.logging.LogFactory;
 public class TreeTestResultLogger extends AsynchronousTreeTestResultListener {\r
 \r
        private static Log log = LogFactory.getLog(TreeTestResultLogger.class);\r
+       \r
+       public TreeTestResultLogger() {\r
+               super(true);\r
+       }\r
 \r
        @Override\r
        protected void resultPartAdded(PartStruct partStruct) {\r
-               log.info(partStruct.part + " - " + partStruct.resultId + ":"\r
-                               + partStruct.path);\r
+               TestResultPart part = partStruct.part;\r
+               String msg = partStruct.part + " - " + partStruct.resultId + ":"\r
+                               + partStruct.path;\r
+               if (part.getStatus().equals(TestStatus.PASSED)) {\r
+                       log.info(msg);\r
+               } else if (part.getStatus().equals(TestStatus.FAILED)) {\r
+                       log.warn(msg);\r
+               } else if (part.getStatus().equals(TestStatus.ERROR)) {\r
+                       log.error(msg, ((SimpleResultPart) part).getException());\r
+               } else {\r
+                       log.error("Unknow test status: " + msg);\r
+               }\r
        }\r
 \r
 }\r
index dbf047568c507abec12baed58b5835a4399a16a0..22fa7a39c879f7f0d546f17f367116a32b31b656 100644 (file)
@@ -1,11 +1,14 @@
 package org.argeo.slc.core.test.tree.htmlreport;\r
 \r
 import java.io.IOException;\r
+import java.io.PrintWriter;\r
+import java.io.StringWriter;\r
 import java.util.Date;\r
 import java.util.SortedMap;\r
 import java.util.TreeMap;\r
 \r
 import org.apache.commons.io.FileUtils;\r
+import org.apache.commons.io.IOUtils;\r
 import org.apache.commons.logging.Log;\r
 import org.apache.commons.logging.LogFactory;\r
 \r
@@ -140,7 +143,7 @@ class ResultPage {
                        for (TestResultPart part : subList.getParts()) {\r
                                SimpleResultPart sPart = (SimpleResultPart) part;\r
                                String clss = "";\r
-                               if (sPart.getStatus().equals(SimpleResultPart.PASSED)) {\r
+                               if (sPart.getStatus().equals(TestStatus.PASSED)) {\r
                                        clss = "passed";\r
                                } else {\r
                                        clss = "failed";\r
@@ -151,6 +154,20 @@ class ResultPage {
                                buf.append("<td class=\"").append(clss).append("\">");\r
 \r
                                buf.append(sPart.getMessage());\r
+                               if (sPart.getStatus().equals(TestStatus.ERROR)) {\r
+                                       buf\r
+                                                       .append("<p><b>An unexpected error prevented the test to run properly.</b>");\r
+                                       Throwable exception = sPart.getException();\r
+                                       if (exception != null) {\r
+                                               StringWriter writer = new StringWriter();\r
+                                               exception.printStackTrace(new PrintWriter(writer));\r
+                                               buf.append("<br/><pre>");\r
+                                               buf.append(writer.toString());\r
+                                               buf.append("</pre>");\r
+                                               IOUtils.closeQuietly(writer);\r
+                                       }\r
+                                       buf.append("</p>");\r
+                               }\r
                                buf.append("</td>");\r
                                buf.append("</tr>\n");\r
 \r
index f2c3a717658674cf8a7b7e940abb14518a337c29..134c6b55d39b60bc665bdb3fb49d2b42879191aa 100644 (file)
@@ -38,7 +38,7 @@ th {
 td {\r
        font-size: 12px;\r
        padding: 1px;\r
-       vertical-align: middle;\r
+       vertical-align: top;\r
        text-align: left;\r
 }\r
 \r
index f1fc40794244d75bcb9282901ba1641d61dc2bf1..7b9fd7952386a46642d33189a1e3b60f5377608b 100644 (file)
@@ -9,5 +9,6 @@
                </id>\r
                <property name="status" column="STATUS" not-null="true" />\r
                <property name="message" column="MESSAGE" not-null="true" />\r
+               <property name="exception" column="EXCEPTION" not-null="false" />\r
        </class>\r
 </hibernate-mapping>
\ No newline at end of file
index 10c215979e47b19d72e2a19e2c5e94960eff33ca..8fa1219e8b66d1868753d9d3d4386ef1c32e9449 100644 (file)
@@ -55,6 +55,9 @@ public class TestAntBuild extends TestCase {
                                "/root/Category1/SubCategory2/testSimple/slc.test0", 1,\r
                                TestStatus.FAILED,\r
                                "Compare nato-expected.txt with nato-reached.txt");\r
+               assertPart(testResult1,\r
+                               "/root/Category1/SubCategory2/testError/slc.test0", 0,\r
+                               TestStatus.ERROR, "Execute example appli");\r
 \r
                numericTRId.setValue(2l);\r
                TreeTestResult testResult2 = (TreeTestResult) testResultDao\r
index 13963f30b3061a5b7ffa180f6cd90e6ee233cb2f..b0e7eeeedb63a7cfda35d50578245c5ca36b89d4 100644 (file)
                        value="${slc.workDir}/data/expected/un-expected.txt" />\r
        </bean>\r
        \r
+       <bean id="testData.un.bad"\r
+               class="org.argeo.slc.example.ExampleTestData" scope="prototype">\r
+               <property name="inputFile"\r
+                       value="${slc.workDir}/data/input/un-inXXX.txt" />\r
+               <property name="reachedFile"\r
+                       value="${slc.workDir}/data/reached/un-reachedXXX.txt" />\r
+               <property name="expectedFile"\r
+                       value="${slc.workDir}/data/expected/un-expectedXXX.txt" />\r
+       </bean>\r
+       \r
        <bean id="testData.eu-reform"\r
                class="org.argeo.slc.example.ExampleTestData" scope="prototype">\r
                <property name="inputFile"\r
index 03c77f1d6cb04c519abacec2b5dd212382a08bfd..b773212cdadcf5c22f5f8ba1e63c55b77ec8142f 100644 (file)
@@ -1,7 +1,7 @@
 <project default="test" name="testProject">\r
        <description>A Test project</description>\r
 \r
-       <target name="test" depends="testSimple,testComplex">\r
+       <target name="test" depends="testSimple,testComplex,testError">\r
                <slc.closeResult result="testResult" />\r
                <slc.closeResult result="testResult2" />\r
                <slc.report report="report" />\r
                </slc.test>\r
        </target>\r
 \r
+       <target name="testError" description="A crashing test">\r
+               <slc.test description="UN crashing">\r
+                       <testDefinition bean="simpleExampleTestDef" />\r
+                       <testData bean="testData.un.bad" />\r
+               </slc.test>\r
+       </target>\r
+\r
 </project>
\ No newline at end of file