Add JRonn runner, tester, methods to parse jronn output files.
[jabaws.git] / testsrc / compbio / runner / disorder / JronnTester.java
1 /* Copyright (c) 2009 Peter Troshin\r
2  *  \r
3  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0     \r
4  * \r
5  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
6  *  Apache License version 2 as published by the Apache Software Foundation\r
7  * \r
8  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
9  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
10  *  License for more details.\r
11  * \r
12  *  A copy of the license is in apache_license.txt. It is also available here:\r
13  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
14  * \r
15  * Any republication or derived work distributed in source code form\r
16  * must include this copyright and license notice.\r
17  */\r
18 \r
19 package compbio.runner.disorder;\r
20 \r
21 import static org.testng.Assert.assertEquals;\r
22 import static org.testng.Assert.assertFalse;\r
23 import static org.testng.Assert.assertNotNull;\r
24 import static org.testng.Assert.assertTrue;\r
25 import static org.testng.Assert.fail;\r
26 \r
27 import java.io.File;\r
28 import java.io.FileInputStream;\r
29 import java.io.FileNotFoundException;\r
30 import java.io.IOException;\r
31 import java.text.ParseException;\r
32 import java.util.List;\r
33 \r
34 import javax.xml.bind.ValidationException;\r
35 \r
36 import org.ggf.drmaa.DrmaaException;\r
37 import org.ggf.drmaa.JobInfo;\r
38 import org.testng.annotations.BeforeMethod;\r
39 import org.testng.annotations.Test;\r
40 \r
41 import compbio.data.sequence.AnnotatedSequence;\r
42 import compbio.engine.AsyncExecutor;\r
43 import compbio.engine.Configurator;\r
44 import compbio.engine.FilePuller;\r
45 import compbio.engine.SyncExecutor;\r
46 import compbio.engine.client.ConfExecutable;\r
47 import compbio.engine.client.ConfiguredExecutable;\r
48 import compbio.engine.client.Executable;\r
49 import compbio.engine.client.RunConfiguration;\r
50 import compbio.engine.cluster.drmaa.ClusterUtil;\r
51 import compbio.engine.cluster.drmaa.JobRunner;\r
52 import compbio.engine.cluster.drmaa.StatisticManager;\r
53 import compbio.engine.local.LocalRunner;\r
54 import compbio.metadata.AllTestSuit;\r
55 import compbio.metadata.ChunkHolder;\r
56 import compbio.metadata.JobExecutionException;\r
57 import compbio.metadata.JobStatus;\r
58 import compbio.metadata.JobSubmissionException;\r
59 import compbio.metadata.LimitsManager;\r
60 import compbio.metadata.PresetManager;\r
61 import compbio.metadata.ResultNotAvailableException;\r
62 import compbio.metadata.RunnerConfig;\r
63 import compbio.util.FileWatcher;\r
64 import compbio.util.SysPrefs;\r
65 \r
66 public class JronnTester {\r
67 \r
68     public static String test_outfile = "TO1381.jronn.out"; // "/homes/pvtroshin/TO1381.clustal.cluster.out\r
69 \r
70     private Jronn jronn;\r
71 \r
72     @BeforeMethod(alwaysRun = true)\r
73     void init() {\r
74         jronn = new Jronn();\r
75         jronn.setInput(AllTestSuit.test_input).setOutput(test_outfile);\r
76     }\r
77 \r
78     @Test(groups = { AllTestSuit.test_group_cluster,\r
79             AllTestSuit.test_group_runner })\r
80     public void testRunOnCluster() {\r
81         assertFalse(SysPrefs.isWindows,\r
82                 "Cluster execution can only be in unix environment");\r
83         try {\r
84             ConfiguredExecutable<Jronn> confJronn = Configurator\r
85                     .configureExecutable(jronn, Executable.ExecProvider.Cluster);\r
86             JobRunner runner = JobRunner.getInstance(confJronn);\r
87 \r
88             assertNotNull(runner, "Runner is NULL");\r
89             runner.executeJob();\r
90             // assertNotNull("JobId is null", jobId1);\r
91             JobStatus status = runner.getJobStatus();\r
92             assertTrue(status == JobStatus.PENDING\r
93                     || status == JobStatus.RUNNING,\r
94                     "Status of the process is wrong!");\r
95             JobInfo info = runner.getJobInfo();\r
96             assertNotNull(info, "JobInfo is null");\r
97             StatisticManager sm = new StatisticManager(info);\r
98             assertNotNull(sm, "Statictic manager is null");\r
99             try {\r
100 \r
101                 String exits = sm.getExitStatus();\r
102                 assertNotNull("Exit status is null", exits);\r
103                 // cut 4 trailing zeros from the number\r
104                 int exitsInt = ClusterUtil.CLUSTER_STAT_IN_SEC.parse(exits)\r
105                         .intValue();\r
106                 assertEquals(0, exitsInt);\r
107                 System.out.println(sm.getAllStats());\r
108 \r
109             } catch (ParseException e) {\r
110                 e.printStackTrace();\r
111                 fail("Parse Exception: " + e.getMessage());\r
112             }\r
113             assertFalse(runner.cleanup());\r
114             assertTrue(sm.hasExited());\r
115             assertFalse(sm.wasAborted());\r
116             assertFalse(sm.hasDump());\r
117             assertFalse(sm.hasSignaled());\r
118 \r
119         } catch (JobSubmissionException e) {\r
120             e.printStackTrace();\r
121             fail("DrmaaException caught:" + e.getMessage());\r
122         } catch (JobExecutionException e) {\r
123             e.printStackTrace();\r
124             fail("DrmaaException caught:" + e.getMessage());\r
125         } catch (DrmaaException e) {\r
126             e.printStackTrace();\r
127             fail("DrmaaException caught:" + e.getMessage());\r
128         }\r
129     }\r
130 \r
131     /**\r
132      * This tests fails from time to time depending on the cluster load or some\r
133      * other factors. Any client code has to adjust for this issue\r
134      */\r
135     @Test(enabled = false, groups = { AllTestSuit.test_group_cluster,\r
136             AllTestSuit.test_group_runner })\r
137     public void testRunOnClusterAsync() {\r
138         assertFalse(SysPrefs.isWindows,\r
139                 "Cluster execution can only be in unix environment");\r
140         try {\r
141             ConfiguredExecutable<Jronn> confJronn = Configurator\r
142                     .configureExecutable(jronn, Executable.ExecProvider.Cluster);\r
143             AsyncExecutor aengine = Configurator.getAsyncEngine(confJronn);\r
144             String jobId = aengine.submitJob(confJronn);\r
145             assertNotNull(jobId, "Runner is NULL");\r
146             // let drmaa to start\r
147             Thread.sleep(500);\r
148             JobStatus status = aengine.getJobStatus(jobId);\r
149             while (status != JobStatus.FINISHED\r
150                     || status != JobStatus.UNDEFINED) {\r
151                 System.out.println("Job Status: " + status);\r
152                 Thread.sleep(1000);\r
153                 status = aengine.getJobStatus(jobId);\r
154             }\r
155         } catch (JobSubmissionException e) {\r
156             e.printStackTrace();\r
157             fail("DrmaaException caught:" + e.getMessage());\r
158         } catch (InterruptedException e) {\r
159             e.printStackTrace();\r
160             fail(e.getMessage());\r
161         }\r
162     }\r
163 \r
164     @Test(groups = { AllTestSuit.test_group_runner })\r
165     public void testRunLocally() {\r
166         try {\r
167             ConfiguredExecutable<Jronn> confJronn = Configurator\r
168                     .configureExecutable(jronn, Executable.ExecProvider.Local);\r
169 \r
170             // For local execution use relative\r
171             LocalRunner lr = new LocalRunner(confJronn);\r
172             lr.executeJob();\r
173             ConfiguredExecutable<?> al1 = lr.waitForResult();\r
174             assertNotNull(al1.getResults());\r
175             List<AnnotatedSequence> al2 = confJronn.getResults();\r
176             assertNotNull(al2);\r
177             assertEquals(al2.size(), 3);\r
178             assertEquals(al1.getResults(), al2);\r
179         } catch (JobSubmissionException e) {\r
180             e.printStackTrace();\r
181             fail(e.getLocalizedMessage());\r
182         } catch (ResultNotAvailableException e) {\r
183             e.printStackTrace();\r
184             fail(e.getLocalizedMessage());\r
185         } catch (JobExecutionException e) {\r
186             e.printStackTrace();\r
187             fail(e.getLocalizedMessage());\r
188         }\r
189     }\r
190 \r
191     @Test(groups = { AllTestSuit.test_group_runner })\r
192     public void readStatistics() {\r
193         try {\r
194             ConfiguredExecutable<Jronn> confJronn = Configurator\r
195                     .configureExecutable(jronn, Executable.ExecProvider.Local);\r
196             // For local execution use relavive\r
197 \r
198             AsyncExecutor sexec = Configurator.getAsyncEngine(confJronn);\r
199             String jobId = sexec.submitJob(confJronn);\r
200             FilePuller fw = FilePuller.newFilePuller(confJronn\r
201                     .getWorkDirectory()\r
202                     + File.separator + Jronn.getStatFile(),\r
203                     FileWatcher.MIN_CHUNK_SIZE_BYTES);\r
204             int count = 0;\r
205             long position = 0;\r
206             fw.waitForFile(4);\r
207             while (!(sexec.getJobStatus(jobId) == JobStatus.FINISHED\r
208                     || sexec.getJobStatus(jobId) == JobStatus.FAILED || sexec\r
209                     .getJobStatus(jobId) == JobStatus.UNDEFINED)\r
210                     || fw.hasMoreData()) {\r
211                 ChunkHolder ch = fw.pull(position);\r
212                 String chunk = ch.getChunk();\r
213                 position = ch.getNextPosition();\r
214                 System.out.print(chunk);\r
215                 count++;\r
216             }\r
217             assertTrue(count > 1);\r
218             ConfiguredExecutable<?> al = sexec.getResults(jobId);\r
219             assertNotNull(al.getResults());\r
220         } catch (JobSubmissionException e) {\r
221             e.printStackTrace();\r
222             fail(e.getMessage());\r
223         } catch (ResultNotAvailableException e) {\r
224             e.printStackTrace();\r
225             fail(e.getMessage());\r
226         } catch (IOException e) {\r
227             e.printStackTrace();\r
228             fail(e.getMessage());\r
229         }\r
230     }\r
231 \r
232     @Test(groups = { AllTestSuit.test_group_runner })\r
233     public void testPersistance() {\r
234         try {\r
235             Jronn jronn = new Jronn();\r
236             jronn.setError("errrr.txt").setInput(AllTestSuit.test_input)\r
237                     .setOutput("outtt.txt");\r
238             assertEquals(jronn.getInput(), AllTestSuit.test_input);\r
239             assertEquals(jronn.getError(), "errrr.txt");\r
240             assertEquals(jronn.getOutput(), "outtt.txt");\r
241             ConfiguredExecutable<Jronn> cJronn = Configurator\r
242                     .configureExecutable(jronn, Executable.ExecProvider.Local);\r
243 \r
244             SyncExecutor sexec = Configurator.getSyncEngine(cJronn);\r
245             sexec.executeJob();\r
246             ConfiguredExecutable<?> al = sexec.waitForResult();\r
247             assertNotNull(al.getResults());\r
248             // Save run configuration\r
249             assertTrue(cJronn.saveRunConfiguration());\r
250 \r
251             // See if loaded configuration is the same as saved\r
252             RunConfiguration loadedRun = RunConfiguration\r
253                     .load(new FileInputStream(new File(cJronn\r
254                             .getWorkDirectory(), RunConfiguration.rconfigFile)));\r
255             assertEquals(\r
256                     ((ConfExecutable<Jronn>) cJronn).getRunConfiguration(),\r
257                     loadedRun);\r
258             // Load run configuration as ConfExecutable\r
259             ConfiguredExecutable<Jronn> resurrectedCMuscle = (ConfiguredExecutable<Jronn>) cJronn\r
260                     .loadRunConfiguration(new FileInputStream(new File(cJronn\r
261                             .getWorkDirectory(), RunConfiguration.rconfigFile)));\r
262             assertNotNull(resurrectedCMuscle);\r
263             assertEquals(resurrectedCMuscle.getExecutable().getInput(),\r
264                     AllTestSuit.test_input);\r
265             assertEquals(resurrectedCMuscle.getExecutable().getError(),\r
266                     "errrr.txt");\r
267             assertEquals(resurrectedCMuscle.getExecutable().getOutput(),\r
268                     "outtt.txt");\r
269             // See in details whether executables are the same\r
270             assertEquals(resurrectedCMuscle.getExecutable(), jronn);\r
271 \r
272             ConfiguredExecutable<Jronn> resJronn = Configurator\r
273                     .configureExecutable(resurrectedCMuscle.getExecutable(),\r
274                             Executable.ExecProvider.Local);\r
275 \r
276             sexec = Configurator.getSyncEngine(resJronn,\r
277                     Executable.ExecProvider.Local);\r
278             sexec.executeJob();\r
279             al = sexec.waitForResult();\r
280             assertNotNull(al);\r
281 \r
282         } catch (JobSubmissionException e) {\r
283             e.printStackTrace();\r
284             fail(e.getMessage());\r
285         } catch (JobExecutionException e) {\r
286             e.printStackTrace();\r
287             fail(e.getMessage());\r
288         } catch (FileNotFoundException e) {\r
289             e.printStackTrace();\r
290             fail(e.getMessage());\r
291         } catch (IOException e) {\r
292             e.printStackTrace();\r
293             fail(e.getMessage());\r
294         } catch (ResultNotAvailableException e) {\r
295             e.printStackTrace();\r
296             fail(e.getMessage());\r
297         }\r
298     }\r
299 \r
300     @Test(groups = { AllTestSuit.test_group_runner })\r
301     public void testConfigurationLoading() {\r
302         try {\r
303             RunnerConfig<Jronn> jronnConfig = ConfExecutable\r
304                     .getRunnerOptions(Jronn.class);\r
305             assertNotNull(jronnConfig);\r
306             assertTrue(jronnConfig.getArguments().size() > 0);\r
307 \r
308             PresetManager<Jronn> jronnPresets = ConfExecutable\r
309                     .getRunnerPresets(Jronn.class);\r
310             assertNotNull(jronnPresets);\r
311             assertTrue(jronnPresets.getPresets().size() > 0);\r
312             jronnPresets.validate(jronnConfig);\r
313 \r
314             LimitsManager<Jronn> jronnLimits = ConfExecutable\r
315                     .getRunnerLimits(Jronn.class);\r
316             assertNotNull(jronnLimits);\r
317             assertTrue(jronnLimits.getLimits().size() > 0);\r
318             jronnLimits.validate(jronnPresets);\r
319 \r
320         } catch (FileNotFoundException e) {\r
321             e.printStackTrace();\r
322             fail(e.getLocalizedMessage());\r
323         } catch (IOException e) {\r
324             e.printStackTrace();\r
325             fail(e.getLocalizedMessage());\r
326         } catch (ValidationException e) {\r
327             e.printStackTrace();\r
328             fail(e.getLocalizedMessage());\r
329         }\r
330     }\r
331 \r
332 }\r