]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.tests.modelled.ui/src/org/simantics/tests/modelled/ui/STSTestSuiteModel.java
Merge "List the unsatisfied dependencies in CanvasContext"
[simantics/platform.git] / bundles / org.simantics.tests.modelled.ui / src / org / simantics / tests / modelled / ui / STSTestSuiteModel.java
1 package org.simantics.tests.modelled.ui;\r
2 \r
3 import java.io.BufferedReader;\r
4 import java.io.StringReader;\r
5 import java.util.ArrayList;\r
6 import java.util.Collection;\r
7 import java.util.Collections;\r
8 import java.util.List;\r
9 import java.util.regex.Pattern;\r
10 import java.util.regex.PatternSyntaxException;\r
11 \r
12 import org.eclipse.swt.graphics.Image;\r
13 import org.simantics.Simantics;\r
14 import org.simantics.databoard.Bindings;\r
15 import org.simantics.db.ReadGraph;\r
16 import org.simantics.db.Resource;\r
17 import org.simantics.db.common.request.ReadRequest;\r
18 import org.simantics.db.exception.DatabaseException;\r
19 import org.simantics.layer0.Layer0;\r
20 import org.simantics.scl.compiler.commands.CommandSession;\r
21 import org.simantics.scl.compiler.commands.TestScriptExecutor;\r
22 import org.simantics.scl.compiler.module.Module;\r
23 import org.simantics.scl.compiler.module.coverage.CombinedCoverage;\r
24 import org.simantics.scl.compiler.module.coverage.CoverageBuilder;\r
25 import org.simantics.scl.compiler.module.coverage.CoverageUtils;\r
26 import org.simantics.scl.compiler.module.options.ModuleCompilationOptions;\r
27 import org.simantics.scl.compiler.module.options.ModuleCompilationOptionsAdvisor;\r
28 import org.simantics.scl.compiler.module.repository.ModuleRepository;\r
29 import org.simantics.scl.compiler.runtime.RuntimeModule;\r
30 import org.simantics.scl.osgi.SCLOsgi;\r
31 import org.simantics.scl.runtime.reporting.AbstractSCLReportingHandler;\r
32 import org.simantics.tests.modelled.ontology.TestsResource;\r
33 import org.simantics.utils.strings.AlphanumComparator;\r
34 \r
35 public class STSTestSuiteModel {\r
36 \r
37     static class STSTest {\r
38         \r
39         private final Resource test;\r
40         private final STSSuite parent;\r
41         private final String definition;\r
42         private final String name;\r
43         private boolean executed = false;\r
44         private long duration;\r
45         private boolean failed = false;\r
46         private boolean isRunning = false;\r
47         private List<String> output = new ArrayList<>();\r
48         private CombinedCoverage coverage;\r
49         private int priority;\r
50         \r
51         public STSTest(Resource test, STSSuite parent, String definition, String name, int executionPrioprity) {\r
52             this.test = test;\r
53             this.parent = parent;\r
54             this.definition = definition;\r
55             this.name = name;\r
56             this.priority = executionPrioprity;\r
57         }\r
58         \r
59         public String getName() {\r
60             return name;\r
61         }\r
62         \r
63         public String getLabel() {\r
64             StringBuilder sb = new StringBuilder();\r
65             sb.append(name);\r
66             if (executed || failed)\r
67                 sb.append(" (").append(duration).append(" ms)");\r
68             return sb.toString();\r
69         }\r
70         \r
71         public String getDefinition() {\r
72             return definition;\r
73         }\r
74 \r
75         public STSSuite getParent() {\r
76             return parent;\r
77         }\r
78 \r
79         public void execute(CommandSession session) {\r
80             isRunning = true;\r
81             \r
82             TestScriptExecutor executor = new TestScriptExecutor(session, new BufferedReader(new StringReader(definition)), new AbstractSCLReportingHandler() {\r
83                 \r
84                 @Override\r
85                 public void print(String text) {\r
86                     appendOutput(text + "\n");\r
87                 }\r
88                 \r
89                 @Override\r
90                 public void printCommand(String command) {\r
91                     appendOutput("> " + command + "\n");\r
92                 }\r
93                 \r
94                 @Override\r
95                 public void printError(String error) {\r
96                     appendOutput(error + "\n");\r
97                 }\r
98             });\r
99             long start = System.currentTimeMillis();\r
100             try {\r
101                 if (parent != null)\r
102                     parent.startedCount++;\r
103                 executor.execute();\r
104                 executed = true;\r
105             } catch (Throwable t) {\r
106                 t.printStackTrace();\r
107                 if (parent != null)\r
108                     parent.failureCount++;\r
109                 failed = true;\r
110             } finally {\r
111                 isRunning = false;\r
112                 long end = System.currentTimeMillis();\r
113                 duration = end - start;\r
114             }\r
115 \r
116         }\r
117 \r
118         protected void appendOutput(String text) {\r
119             output.add(text);\r
120         }\r
121 \r
122         public List<String> getOutput() {\r
123             return output;\r
124         }\r
125 \r
126         public void setCoverage(CombinedCoverage coverage) {\r
127             this.coverage = coverage;\r
128         }\r
129         \r
130         public CombinedCoverage getCoverage() {\r
131             return coverage;\r
132         }\r
133         \r
134         @Override\r
135         public String toString() {\r
136             return name + " [priority=" + priority + ", executed=" + executed + ", duration=" + duration + "]";\r
137         }\r
138     }\r
139 \r
140     static class STSSuite {\r
141         \r
142         private List<Pattern> moduleNameFilterPatterns = new ArrayList<>();\r
143         private final Resource suite;\r
144         private final String name;\r
145         private STSTest[] children;\r
146         private int startedCount;\r
147         private int errorCount;\r
148         private int failureCount;\r
149         private CoverageBuilder coverageBuilder;\r
150         \r
151         public STSSuite(Resource suite, String name, String moduleNameFilter) {\r
152             this.suite = suite;\r
153             this.name = name;\r
154             for (String s : moduleNameFilter.split(",")) {\r
155                 try {\r
156                     s = s.trim().replaceAll("\\*", "\\\\w*").toLowerCase();\r
157                     moduleNameFilterPatterns.add(Pattern.compile(s));\r
158                 } catch (PatternSyntaxException e) {\r
159                     e.printStackTrace();\r
160                 }\r
161             }\r
162         }\r
163 \r
164         public void children(STSTest[] children) {\r
165             this.children = children;\r
166         }\r
167 \r
168         public STSTest[] getChildren() {\r
169             return children;\r
170         }\r
171 \r
172         public String getName() {\r
173             return name;\r
174         }\r
175 \r
176         public String getLabel() {\r
177             StringBuilder sb = new StringBuilder();\r
178             sb.append(name);\r
179             long totalTime = 0; \r
180             if (children != null) {\r
181                 for (STSTest test : children) {\r
182                     if (test.executed || test.failed) {\r
183                         totalTime += test.duration;\r
184                     }\r
185                 }\r
186             }\r
187             if (totalTime != 0)\r
188                 sb.append(" (").append(totalTime).append(" ms)");\r
189             return sb.toString();\r
190         }\r
191 \r
192         public boolean isRunning() {\r
193             boolean running = false;\r
194             if (children != null) {\r
195                 for (STSTest test: children) {\r
196                     if (test.isRunning) {\r
197                         running = true;\r
198                         break;\r
199                     }\r
200                 }\r
201             }\r
202             return running;\r
203         }\r
204 \r
205         public boolean executed() {\r
206             boolean executed = true;\r
207             if (children != null) {\r
208                 for (STSTest test: children) {\r
209                     if (!test.executed) {\r
210                         executed = false;\r
211                         break;\r
212                     }\r
213                 }\r
214             }\r
215             return executed;\r
216         }\r
217 \r
218         public boolean failed() {\r
219             boolean failed = false;\r
220             if (children != null) {\r
221                 for (STSTest test: children) {\r
222                     if (test.failed) {\r
223                         failed = true;\r
224                         break;\r
225                     }\r
226                 }\r
227             }\r
228             return failed;\r
229         }\r
230         \r
231         public void addCoverage(List<Module> modules) {\r
232             if (coverageBuilder == null) {\r
233                 coverageBuilder = new CoverageBuilder();\r
234             }\r
235             for (Module module : modules)\r
236                 coverageBuilder.addCoverage(module, true);\r
237         }\r
238 \r
239         public CombinedCoverage getCoverage() {\r
240             if (coverageBuilder == null)\r
241                 return null;\r
242             return coverageBuilder.getCoverage();\r
243         }\r
244     }\r
245 \r
246     \r
247     private STSSuite suite;\r
248     private STSTest test;\r
249     private final List<STSExecutionListener> listeners = new ArrayList<>();\r
250     \r
251     public STSTestSuiteModel() {\r
252     }\r
253     \r
254     public void addListener(STSExecutionListener listener) {\r
255         listeners.add(listener);\r
256     }\r
257     \r
258     public void removeListener(STSExecutionListener listener) {\r
259         listeners.remove(listener);\r
260     }\r
261 \r
262     public Object[] getElements() {\r
263         if (suite != null)\r
264             return new Object[] {suite};\r
265         else if (test != null)\r
266             return new Object[] {test};\r
267         else return null;\r
268     }\r
269 \r
270     public void execute() {\r
271         \r
272         ModuleRepository repo = new ModuleRepository(SCLOsgi.SOURCE_REPOSITORY);\r
273         if (suite != null) {\r
274             repo.setAdvisor(new ModuleCompilationOptionsAdvisor() {\r
275                 \r
276                 @Override\r
277                 public ModuleCompilationOptions getOptions(String moduleName) {\r
278                     boolean coverage = false;\r
279                     for (Pattern p : suite.moduleNameFilterPatterns) {\r
280                         if (p.matcher(moduleName.toLowerCase()).find()) {\r
281                             coverage = true;\r
282                             break;\r
283                         }\r
284                     }\r
285                     return new ModuleCompilationOptions(coverage);\r
286                 }\r
287             });\r
288         }\r
289         CommandSession session = new CommandSession(repo, null);\r
290         if (suite != null) {\r
291             executeSuite(session);\r
292         } else if (test != null) {\r
293             executeTest(session);\r
294         }\r
295     }\r
296     \r
297     private void testExecuted() {\r
298         listeners.forEach(listener -> {\r
299             listener.testExecuted();\r
300         });\r
301     }\r
302     \r
303     private void executeSuite(CommandSession session) {\r
304         \r
305         for (STSTest test : suite.getChildren()) {\r
306             test.execute(session);\r
307             \r
308             Collection<RuntimeModule> runtimeModules = session.getRuntimeEnvironment().getRuntimeModules();\r
309             List<Module> modules = new ArrayList<>(runtimeModules.size());\r
310             for (RuntimeModule module : runtimeModules) {\r
311                 for (Pattern p : suite.moduleNameFilterPatterns) {\r
312                     if (p.matcher(module.getModule().getName().toLowerCase()).find()) {\r
313                         modules.add(module.getModule());\r
314                     }\r
315                 }\r
316             }\r
317             test.setCoverage(CoverageUtils.getCoverage(modules));\r
318             suite.addCoverage(modules);\r
319             \r
320             CoverageUtils.resetCoverage(modules);\r
321             \r
322             testExecuted();\r
323         }\r
324 \r
325     }\r
326     \r
327     private void executeTest(CommandSession session) {\r
328         \r
329         test.execute(session);\r
330         testExecuted();\r
331         \r
332         Collection<RuntimeModule> runtimeModules = session.getRuntimeEnvironment().getRuntimeModules();\r
333         List<Module> modules = new ArrayList<>(runtimeModules.size());\r
334         for (RuntimeModule module : runtimeModules) {\r
335             modules.add(module.getModule());\r
336         }\r
337         test.setCoverage(CoverageUtils.getCoverage(modules));\r
338         \r
339         CoverageUtils.resetCoverage(modules);\r
340 \r
341     }\r
342     \r
343 \r
344     public boolean hasChildren(Object element) {\r
345         if (element instanceof STSTest) {\r
346             return false;\r
347         } else if (element instanceof STSSuite) {\r
348             STSSuite suite = (STSSuite) element;\r
349             return (suite.getChildren() != null ? suite.getChildren().length > 0 : false);\r
350         } else {\r
351             throw new IllegalArgumentException(element.toString());\r
352         }\r
353     }\r
354 \r
355     public Object getParent(Object element) {\r
356         if (element instanceof STSTest) {\r
357             return ((STSTest) element).getParent();\r
358         } else if (element instanceof STSSuite) {\r
359             return null;\r
360         } else {\r
361             throw new IllegalArgumentException(element.toString());\r
362         }\r
363     }\r
364 \r
365     public Object[] getChildren(Object parentElement) {\r
366         if (parentElement instanceof STSTest) {\r
367             return null;\r
368         } else if (parentElement instanceof STSSuite) {\r
369             STSSuite suite = (STSSuite) parentElement;\r
370             return suite.getChildren();\r
371         } else {\r
372             throw new IllegalArgumentException(parentElement.toString());\r
373         }\r
374     }\r
375 \r
376     public String getText(Object element) {\r
377         if (element instanceof STSTest)\r
378             return ((STSTest)element).getLabel();\r
379         else if (element instanceof STSSuite)\r
380             return ((STSSuite)element).getLabel();\r
381         else\r
382             throw new IllegalArgumentException(element.toString());\r
383     }\r
384 \r
385     public Image getImage(Object element) {\r
386         if (element instanceof STSSuite) {\r
387             STSSuite suite = (STSSuite) element;\r
388             if (suite.isRunning())\r
389                 return STSTestSuiteProvider.suiteRunningIcon;\r
390             else if (suite.executed())\r
391                 return STSTestSuiteProvider.suiteOkIcon;\r
392             else if (suite.failed())\r
393                 return STSTestSuiteProvider.suiteFailIcon;\r
394             else\r
395                 return STSTestSuiteProvider.suiteIcon;\r
396         } else if (element instanceof STSTest) {\r
397             STSTest test = (STSTest) element;\r
398             if (test.isRunning)\r
399                 return STSTestSuiteProvider.testRunningIcon;\r
400             else if (test.executed)\r
401                 return STSTestSuiteProvider.testOkIcon;\r
402             else if (test.failed)\r
403                 return STSTestSuiteProvider.testFailIcon;\r
404             else\r
405                 return STSTestSuiteProvider.testIcon;\r
406         }\r
407         return null;\r
408     }\r
409 \r
410     public void updateInput(Resource root) {\r
411         suite = null;\r
412         test = null;\r
413         try {\r
414             Simantics.getSession().syncRequest(new ReadRequest() {\r
415                 \r
416                 @Override\r
417                 public void run(ReadGraph graph) throws DatabaseException {\r
418                     Layer0 L0 = Layer0.getInstance(graph);\r
419                     TestsResource TESTS = TestsResource.getInstance(graph);\r
420                     if (graph.isInstanceOf(root, TESTS.STSTest)) {\r
421                         String testName = graph.getRelatedValue2(root, L0.HasName, Bindings.STRING);\r
422                         String definition = graph.getRelatedValue2(root, TESTS.STSTest_definition, Bindings.STRING);\r
423                         Integer executionPrioprity = graph.getRelatedValue2(root, TESTS.STSTest_executionPriority, Bindings.INTEGER);\r
424                         test = new STSTest(root, null, definition, testName, executionPrioprity);\r
425                     } else if (graph.isInstanceOf(root, TESTS.STSSuite)) {\r
426                         String suiteName = graph.getRelatedValue2(root, L0.HasName, Bindings.STRING);\r
427                         String moduleNameFilter = graph.getPossibleRelatedValue2(root, TESTS.STSSuite_moduleNameFilter, Bindings.STRING);\r
428                         suite = new STSSuite(root, suiteName, moduleNameFilter);\r
429                         List<STSTest> tests = new ArrayList<>();\r
430                         for (Resource test : graph.getObjects(root, L0.ConsistsOf)) {\r
431                             String testName = graph.getRelatedValue2(test, L0.HasName, Bindings.STRING);\r
432                             String definition = graph.getRelatedValue2(test, TESTS.STSTest_definition, Bindings.STRING);\r
433                             Integer executionPrioprity = graph.getRelatedValue2(test, TESTS.STSTest_executionPriority, Bindings.INTEGER);\r
434                             tests.add(new STSTest(test, suite, definition, testName, executionPrioprity));\r
435                         }\r
436                         Collections.sort(tests, (o1, o2) -> {\r
437                             if (o1.priority < o2.priority)\r
438                                 return -1;\r
439                             else if (o1.priority > o2.priority)\r
440                                 return 1;\r
441                             else return AlphanumComparator.COMPARATOR.compare(o1.name, o2.name);\r
442                         });\r
443                         suite.children(tests.toArray(new STSTest[tests.size()]));\r
444                     } else {\r
445                         throw new IllegalArgumentException(root.toString());\r
446                     }\r
447                 }\r
448             });\r
449         } catch (DatabaseException e) {\r
450             e.printStackTrace();\r
451         }\r
452     }\r
453 \r
454     public List<String> getOutput(Object element) {\r
455         if (element instanceof STSTest) {\r
456             STSTest test = (STSTest) element;\r
457             return test.getOutput();\r
458         }\r
459         return Collections.emptyList();\r
460     }\r
461 \r
462     public int getStartedCount() {\r
463         if (suite != null)\r
464             return suite.startedCount;\r
465         else\r
466             return 0;\r
467     }\r
468 \r
469     public int getIgnoredCount() {\r
470         return 0;\r
471     }\r
472 \r
473     public int getTotalCount() {\r
474         if (suite != null && suite.getChildren() != null)\r
475             return suite.getChildren().length;\r
476         else if (test != null)\r
477             return 1;\r
478         else\r
479             return 0;\r
480     }\r
481 \r
482     public int getErrorCount() {\r
483         if (suite != null)\r
484             return suite.errorCount;\r
485         return 0;\r
486     }\r
487 \r
488     public int getFailureCount() {\r
489         if (suite != null)\r
490             return suite.failureCount;\r
491         return 0;\r
492     }\r
493 \r
494     public int getAssumptionFailureCount() {\r
495         return 0;\r
496     }\r
497 \r
498     public boolean isStopped() {\r
499         if (suite != null)\r
500             return !suite.isRunning();\r
501         else\r
502             return test.isRunning;\r
503     }\r
504 }\r
505 \r