]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/AsynchronousTreeTestResultListener.java
Introduce end to end testing with logging of results
[gpl/argeo-slc.git] / org.argeo.slc / src / main / java / org / argeo / slc / core / test / tree / AsynchronousTreeTestResultListener.java
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
new file mode 100644 (file)
index 0000000..d6f0c93
--- /dev/null
@@ -0,0 +1,76 @@
+package org.argeo.slc.core.test.tree;\r
+\r
+import java.util.Vector;\r
+\r
+import org.argeo.slc.core.structure.tree.TreeSPath;\r
+import org.argeo.slc.core.test.TestResult;\r
+import org.argeo.slc.core.test.TestResultId;\r
+import org.argeo.slc.core.test.TestResultListener;\r
+import org.argeo.slc.core.test.TestResultPart;\r
+\r
+public abstract class AsynchronousTreeTestResultListener implements\r
+               TestResultListener, Runnable {\r
+       private Vector<PartStruct> partStructs = new Vector<PartStruct>();\r
+       private Thread thread;\r
+\r
+       public void init() {\r
+               thread = new Thread(this);\r
+               thread.start();\r
+       }\r
+\r
+       public void destroy() {\r
+               thread = null;\r
+               synchronized (partStructs) {\r
+                       partStructs.notifyAll();\r
+               }\r
+       }\r
+\r
+       public final void resultPartAdded(TestResult testResult,\r
+                       TestResultPart testResultPart) {\r
+               TreeTestResult result = (TreeTestResult) testResult;\r
+               synchronized (partStructs) {\r
+                       partStructs.add(new PartStruct(result.getCurrentPath(), result\r
+                                       .getTestResultId(), testResultPart, result));\r
+                       partStructs.notifyAll();\r
+               }\r
+       }\r
+\r
+       public void run() {\r
+               while (thread != null) {\r
+                       for (PartStruct partStruct : partStructs) {\r
+                               resultPartAdded(partStruct);\r
+                       }\r
+                       \r
+                       synchronized (partStructs) {\r
+                               partStructs.clear();\r
+                               while (partStructs.size() == 0) {\r
+                                       try {\r
+                                               partStructs.wait();\r
+                                       } catch (InterruptedException e) {\r
+                                               // silent\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       protected abstract void resultPartAdded(PartStruct partStruct);\r
+\r
+       protected static class PartStruct {\r
+               public final TreeSPath path;\r
+               public final TestResultId resultId;\r
+               public final TestResultPart part;\r
+               public final TreeTestResult result;\r
+\r
+               public PartStruct(TreeSPath path, TestResultId resultId,\r
+                               TestResultPart part, TreeTestResult result) {\r
+                       super();\r
+                       this.path = path;\r
+                       this.resultId = resultId;\r
+                       this.part = part;\r
+                       this.result = result;\r
+               }\r
+\r
+       }\r
+\r
+}\r