Clustal Omega web service wrapper and tester
[jabaws.git] / testsrc / compbio / runner / msa / ClustalOTester.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.msa;\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.ArrayList;\r
33 import java.util.Collections;\r
34 import java.util.List;\r
35 \r
36 import javax.xml.bind.JAXBException;\r
37 import javax.xml.bind.ValidationException;\r
38 \r
39 import org.ggf.drmaa.DrmaaException;\r
40 import org.ggf.drmaa.JobInfo;\r
41 import org.testng.annotations.Test;\r
42 \r
43 import compbio.data.sequence.FastaSequence;\r
44 import compbio.engine.AsyncExecutor;\r
45 import compbio.engine.Configurator;\r
46 import compbio.engine.FilePuller;\r
47 import compbio.engine.SyncExecutor;\r
48 import compbio.engine.client.ConfExecutable;\r
49 import compbio.engine.client.ConfiguredExecutable;\r
50 import compbio.engine.client.Executable;\r
51 import compbio.engine.client.Executable.ExecProvider;\r
52 import compbio.engine.client.RunConfiguration;\r
53 import compbio.engine.cluster.drmaa.ClusterUtil;\r
54 import compbio.engine.cluster.drmaa.JobRunner;\r
55 import compbio.engine.cluster.drmaa.StatisticManager;\r
56 import compbio.engine.conf.RunnerConfigMarshaller;\r
57 import compbio.engine.local.AsyncLocalRunner;\r
58 import compbio.engine.local.LocalExecutorService;\r
59 import compbio.engine.local.LocalRunner;\r
60 import compbio.metadata.AllTestSuit;\r
61 import compbio.metadata.ChunkHolder;\r
62 import compbio.metadata.JobExecutionException;\r
63 import compbio.metadata.JobStatus;\r
64 import compbio.metadata.JobSubmissionException;\r
65 import compbio.metadata.LimitsManager;\r
66 import compbio.metadata.PresetManager;\r
67 import compbio.metadata.ResultNotAvailableException;\r
68 import compbio.metadata.RunnerConfig;\r
69 import compbio.runner.OptionCombinator;\r
70 import compbio.runner.Util;\r
71 import compbio.util.FileWatcher;\r
72 import compbio.util.SysPrefs;\r
73 \r
74 public class ClustalOTester {\r
75 \r
76         static final String clustalConfigFile = AllTestSuit.TEST_DATA_PATH\r
77                         + "ClustaloParameters.xml";\r
78         public static String test_outfile = "TO1381.clustalo.out";\r
79         public static String cluster_test_outfile = "TO1381.clustalo.cluster.out";\r
80 \r
81         @Test(groups = {AllTestSuit.test_group_cluster,\r
82                         AllTestSuit.test_group_runner})\r
83         public void testRunOnCluster() {\r
84                 ClustalO clustal = new ClustalO();\r
85                 assertFalse(SysPrefs.isWindows,\r
86                                 "Cluster execution can only be in unix environment");\r
87                 clustal.setInput(AllTestSuit.test_input)\r
88                                 .setOutput(cluster_test_outfile);\r
89 \r
90                 try {\r
91 \r
92                         ConfiguredExecutable<ClustalO> confClustal = Configurator\r
93                                         .configureExecutable(clustal);\r
94                         JobRunner runner = JobRunner.getInstance(confClustal);\r
95                         // ClusterSession csession = JobRunner.getSession();\r
96                         assertNotNull(runner);\r
97                         runner.executeJob();\r
98                         // assertNotNull("JobId is null", jobId1);\r
99                         JobStatus status = runner.getJobStatus();\r
100                         assertTrue(status == JobStatus.PENDING\r
101                                         || status == JobStatus.RUNNING);\r
102                         JobInfo info = runner.getJobInfo();\r
103                         assertNotNull(info);\r
104                         StatisticManager sm = new StatisticManager(info);\r
105                         assertNotNull(sm);\r
106                         try {\r
107                                 String exits = sm.getExitStatus();\r
108                                 assertNotNull("Exit status is null", exits);\r
109                                 // cut 4 trailing zeros from the number\r
110                                 int exitsInt = ClusterUtil.CLUSTER_STAT_IN_SEC.parse(exits)\r
111                                                 .intValue();\r
112                                 assertEquals(0, exitsInt);\r
113                                 System.out.println(sm.getAllStats());\r
114 \r
115                         } catch (ParseException e) {\r
116                                 e.printStackTrace();\r
117                                 fail("Parse Exception: " + e.getMessage());\r
118                         }\r
119                         // At present the task directory could not be completely removed\r
120                         // @see JobRunner.cleanup()\r
121                         assertFalse(runner.cleanup(),\r
122                                         "Could not remove some files whilst cleaning up ");\r
123                         assertTrue(sm.hasExited());\r
124                         assertFalse(sm.wasAborted());\r
125                         assertFalse(sm.hasDump());\r
126                         assertFalse(sm.hasSignaled());\r
127 \r
128                 } catch (JobSubmissionException e) {\r
129                         e.printStackTrace();\r
130                         fail("DrmaaException caught:" + e.getMessage());\r
131                 } catch (JobExecutionException e) {\r
132                         e.printStackTrace();\r
133                         fail("DrmaaException caught:" + e.getMessage());\r
134                 } catch (DrmaaException e) {\r
135                         e.printStackTrace();\r
136                         fail("DrmaaException caught:" + e.getMessage());\r
137                 }\r
138         }\r
139 \r
140         @Test(groups = {AllTestSuit.test_group_runner})\r
141         public void testRunLocally() {\r
142                 ClustalO clustal = new ClustalO();\r
143                 clustal.setInput(AllTestSuit.test_input).setOutput(test_outfile);\r
144                 try {\r
145 \r
146                         // For local execution use relavive\r
147                         ConfiguredExecutable<ClustalO> confClustal = Configurator\r
148                                         .configureExecutable(clustal, Executable.ExecProvider.Local);\r
149                         LocalRunner lr = new LocalRunner(confClustal);\r
150                         lr.executeJob();\r
151                         confClustal = (ConfiguredExecutable<ClustalO>) lr.waitForResult();\r
152                         assertNotNull(confClustal.getResults());\r
153                 } catch (JobSubmissionException e) {\r
154                         e.printStackTrace();\r
155                         fail(e.getLocalizedMessage());\r
156                 } catch (JobExecutionException e) {\r
157                         e.printStackTrace();\r
158                         fail(e.getLocalizedMessage());\r
159                 } catch (ResultNotAvailableException e) {\r
160                         e.printStackTrace();\r
161                         fail(e.getLocalizedMessage());\r
162                 }\r
163         }\r
164 \r
165         @Test(groups = {AllTestSuit.test_group_runner})\r
166         public void testConfigurationLoading() {\r
167                 try {\r
168                         RunnerConfig<ClustalO> clustalConfig = ConfExecutable\r
169                                         .getRunnerOptions(ClustalO.class);\r
170                         assertNotNull(clustalConfig);\r
171                         assertTrue(clustalConfig.getArguments().size() > 0);\r
172 \r
173                         /* Unsupported\r
174                         PresetManager<ClustalO> clustalPresets = ConfExecutable\r
175                                         .getRunnerPresets(ClustalO.class);\r
176                         assertNotNull(clustalPresets);\r
177                         assertTrue(clustalPresets.getPresets().size() > 0);\r
178                         clustalPresets.validate(clustalConfig);\r
179                          */\r
180                         LimitsManager<ClustalO> clustalLimits = ConfExecutable\r
181                                         .getRunnerLimits(ClustalO.class);\r
182                         assertNotNull(clustalLimits);\r
183                         assertTrue(clustalLimits.getLimits().size() > 0);\r
184                         //clustalLimits.validate(clustalPresets);\r
185 \r
186                 } catch (FileNotFoundException e) {\r
187                         e.printStackTrace();\r
188                         fail(e.getLocalizedMessage());\r
189                 } catch (IOException e) {\r
190                         e.printStackTrace();\r
191                         fail(e.getLocalizedMessage());\r
192                 }\r
193         }\r
194 \r
195         @Test(groups = {AllTestSuit.test_group_runner})\r
196         public void testOptionsLocally() {\r
197                 try {\r
198 \r
199                         RunnerConfigMarshaller<ClustalO> clustalmarsh = new RunnerConfigMarshaller<ClustalO>(\r
200                                         RunnerConfig.class);\r
201 \r
202                         RunnerConfig<ClustalO> clustalConfig = clustalmarsh.read(\r
203                                         new FileInputStream(new File(clustalConfigFile)),\r
204                                         RunnerConfig.class);\r
205 \r
206                         OptionCombinator clustalOpc = new OptionCombinator(clustalConfig);\r
207                         List<String> options = clustalOpc.getOptionsAtRandom();\r
208                         for (int i = 0; i < options.size(); i++) {\r
209                                 System.out.println("Using options: " + options);\r
210                                 ClustalO clustal = new ClustalO();\r
211                                 clustal.setInput(AllTestSuit.test_input)\r
212                                                 .setOutput(test_outfile);\r
213 \r
214                                 // For local execution use relavive\r
215                                 ConfiguredExecutable<ClustalO> confClustal = Configurator\r
216                                                 .configureExecutable(clustal, ExecProvider.Local);\r
217 \r
218                                 // Add options to the executable\r
219                                 confClustal.addParameters(options);\r
220 \r
221                                 LocalRunner lr = new LocalRunner(confClustal);\r
222                                 lr.executeJob();\r
223                                 confClustal = (ConfiguredExecutable<ClustalO>) lr\r
224                                                 .waitForResult();\r
225                                 assertNotNull(confClustal.getResults());\r
226                                 Collections.shuffle(options);\r
227                         }\r
228 \r
229                 } catch (JobSubmissionException e) {\r
230                         e.printStackTrace();\r
231                         fail(e.getLocalizedMessage());\r
232                 } catch (JobExecutionException e) {\r
233                         e.printStackTrace();\r
234                         fail(e.getLocalizedMessage());\r
235                 } catch (JAXBException e) {\r
236                         e.printStackTrace();\r
237                         fail(e.getLocalizedMessage());\r
238                 } catch (ResultNotAvailableException e) {\r
239                         e.printStackTrace();\r
240                         fail(e.getLocalizedMessage());\r
241                 } catch (FileNotFoundException e) {\r
242                         e.printStackTrace();\r
243                         fail(e.getLocalizedMessage());\r
244                 }\r
245         }\r
246 \r
247         public static final void main(String[] args) throws JobSubmissionException,\r
248                         JobExecutionException, InterruptedException {\r
249                 ClustalO clustal = new ClustalO();\r
250                 clustal.setInput(AllTestSuit.test_input).setOutput(test_outfile);\r
251                 // For local execution use relavive\r
252                 ConfiguredExecutable<ClustalO> confClustal = Configurator\r
253                                 .configureExecutable(clustal);\r
254                 AsyncExecutor lr = new AsyncLocalRunner();\r
255                 lr.submitJob(confClustal);\r
256                 Thread.sleep(3000);\r
257                 LocalExecutorService.shutDown();\r
258         }\r
259 \r
260         @Test(groups = {AllTestSuit.test_group_runner})\r
261         public void testPersistance() {\r
262                 try {\r
263                         ClustalO clustal = new ClustalO();\r
264                         clustal.setError("errrr.txt").setInput(AllTestSuit.test_input)\r
265                                         .setOutput("outtt.txt");\r
266                         assertEquals(clustal.getInput(), AllTestSuit.test_input);\r
267                         assertEquals(clustal.getError(), "errrr.txt");\r
268                         assertEquals(clustal.getOutput(), "outtt.txt");\r
269                         ConfiguredExecutable<ClustalO> cClustal = Configurator\r
270                                         .configureExecutable(clustal, Executable.ExecProvider.Local);\r
271 \r
272                         SyncExecutor sexec = Configurator.getSyncEngine(cClustal);\r
273                         sexec.executeJob();\r
274                         cClustal = (ConfiguredExecutable<ClustalO>) sexec.waitForResult();\r
275                         assertNotNull(cClustal.getResults());\r
276                         // Save run configuration\r
277                         assertTrue(cClustal.saveRunConfiguration());\r
278 \r
279                         // See if loaded configuration is the same as saved\r
280                         RunConfiguration loadedRun = RunConfiguration\r
281                                         .load(new FileInputStream(new File(cClustal\r
282                                                         .getWorkDirectory(), RunConfiguration.rconfigFile)));\r
283                         assertTrue(((ConfExecutable<ClustalO>) cClustal)\r
284                                         .getRunConfiguration().equals(loadedRun));\r
285                         // Load run configuration as ConfExecutable\r
286                         ConfiguredExecutable<ClustalO> resurrectedCclustal = (ConfiguredExecutable<ClustalO>) cClustal\r
287                                         .loadRunConfiguration(new FileInputStream(new File(cClustal\r
288                                                         .getWorkDirectory(), RunConfiguration.rconfigFile)));\r
289                         assertNotNull(resurrectedCclustal);\r
290                         // See in details whether executables are the same\r
291                         assertEquals(resurrectedCclustal.getExecutable(), clustal);\r
292 \r
293                         // Finally rerun the job in the new task directory\r
294                         ConfiguredExecutable<ClustalO> resclustal = Configurator\r
295                                         .configureExecutable(resurrectedCclustal.getExecutable(),\r
296                                                         Executable.ExecProvider.Local);\r
297 \r
298                         sexec = Configurator.getSyncEngine(resclustal,\r
299                                         Executable.ExecProvider.Local);\r
300                         sexec.executeJob();\r
301                         cClustal = (ConfiguredExecutable<ClustalO>) sexec.waitForResult();\r
302                         assertNotNull(cClustal.getResults());\r
303 \r
304                 } catch (JobSubmissionException e) {\r
305                         e.printStackTrace();\r
306                         fail(e.getMessage());\r
307                 } catch (JobExecutionException e) {\r
308                         e.printStackTrace();\r
309                         fail(e.getMessage());\r
310                 } catch (FileNotFoundException e) {\r
311                         e.printStackTrace();\r
312                         fail(e.getMessage());\r
313                 } catch (IOException e) {\r
314                         e.printStackTrace();\r
315                         fail(e.getMessage());\r
316                 } catch (ResultNotAvailableException e) {\r
317                         e.printStackTrace();\r
318                         fail(e.getMessage());\r
319                 }\r
320         }\r
321 \r
322         @Test(groups = {AllTestSuit.test_group_runner})\r
323         public void readStatistics() {\r
324                 try {\r
325                         ClustalO clustal = new ClustalO().setInput(AllTestSuit.test_input)\r
326                                         .setOutput(test_outfile);\r
327                         ConfiguredExecutable<ClustalO> confClustal = Configurator\r
328                                         .configureExecutable(clustal, Executable.ExecProvider.Local);\r
329 \r
330                         AsyncExecutor sexec = Configurator.getAsyncEngine(confClustal);\r
331                         String jobId = sexec.submitJob(confClustal);\r
332                         FilePuller fw = FilePuller.newFilePuller(\r
333                                         confClustal.getWorkDirectory() + File.separator\r
334                                                         + ClustalW.getStatFile(),\r
335                                         FileWatcher.MIN_CHUNK_SIZE_BYTES);\r
336                         int count = 0;\r
337                         long position = 0;\r
338                         fw.waitForFile(4);\r
339                         while (!(sexec.getJobStatus(jobId) == JobStatus.FINISHED\r
340                                         || sexec.getJobStatus(jobId) == JobStatus.FAILED || sexec\r
341                                         .getJobStatus(jobId) == JobStatus.UNDEFINED)\r
342                                         || fw.hasMoreData()) {\r
343                                 ChunkHolder ch = fw.pull(position);\r
344                                 String chunk = ch.getChunk();\r
345                                 position = ch.getNextPosition();\r
346                                 System.out.print(chunk);\r
347                                 count++;\r
348                         }\r
349                         assertTrue(count > 1);\r
350                         ConfiguredExecutable<?> al = sexec.getResults(jobId);\r
351                         assertNotNull(al.getResults());\r
352                 } catch (JobSubmissionException e) {\r
353                         e.printStackTrace();\r
354                         fail(e.getMessage());\r
355                 } catch (ResultNotAvailableException e) {\r
356                         e.printStackTrace();\r
357                         fail(e.getMessage());\r
358                 } catch (IOException e) {\r
359                         e.printStackTrace();\r
360                         fail(e.getMessage());\r
361                 }\r
362         }\r
363 \r
364         @Test(groups = {AllTestSuit.test_group_cluster,\r
365                         AllTestSuit.test_group_runner})\r
366         public void readStatisticsClusterExecution() {\r
367                 try {\r
368                         ClustalO clustal = new ClustalO().setInput(AllTestSuit.test_input)\r
369                                         .setOutput(test_outfile);\r
370                         ConfiguredExecutable<ClustalO> confClustal = Configurator\r
371                                         .configureExecutable(clustal,\r
372                                                         Executable.ExecProvider.Cluster);\r
373 \r
374                         AsyncExecutor sexec = Configurator.getAsyncEngine(confClustal);\r
375                         String jobId = sexec.submitJob(confClustal);\r
376                         FilePuller fw = FilePuller.newFilePuller(\r
377                                         confClustal.getWorkDirectory() + File.separator\r
378                                                         + ClustalW.getStatFile(),\r
379                                         FileWatcher.MIN_CHUNK_SIZE_BYTES);\r
380                         int count = 0;\r
381                         long position = 0;\r
382                         fw.waitForFile(200);\r
383                         /*\r
384                          * Under certain circumstances DRMAA could report the status wrongly\r
385                          * thus this loop never ends TODO deal with this!\r
386                          */\r
387                         while (!(sexec.getJobStatus(jobId) == JobStatus.FINISHED || sexec\r
388                                         .getJobStatus(jobId) == JobStatus.FAILED)\r
389                                         || fw.hasMoreData()) {\r
390                                 ChunkHolder ch = fw.pull(position);\r
391                                 String chunk = ch.getChunk();\r
392                                 position = ch.getNextPosition();\r
393                                 System.out.print(chunk);\r
394                                 count++;\r
395                                 Thread.sleep(200);\r
396                                 if (sexec.getJobStatus(jobId) == JobStatus.UNDEFINED) {\r
397                                         System.out.println("DRMAA reported wrong status for job + "\r
398                                                         + jobId + " continue anyway!");\r
399                                         break;\r
400                                 }\r
401                         }\r
402                         assertTrue(count > 1);\r
403                         ConfiguredExecutable<?> al = sexec.getResults(jobId);\r
404                         assertNotNull(al.getResults());\r
405                 } catch (JobSubmissionException e) {\r
406                         e.printStackTrace();\r
407                         fail(e.getMessage());\r
408                 } catch (ResultNotAvailableException e) {\r
409                         e.printStackTrace();\r
410                         fail(e.getMessage());\r
411                 } catch (IOException e) {\r
412                         e.printStackTrace();\r
413                         fail(e.getMessage());\r
414                 } catch (InterruptedException e) {\r
415                         e.printStackTrace();\r
416                         fail(e.getMessage());\r
417                 }\r
418         }\r
419 }\r