Clover icon

jalviewX

  1. Project Clover database Wed Oct 31 2018 15:13:58 GMT
  2. Package jalview.bin

File CommandLineOperations.java

 

Coverage histogram

../../img/srcFileCovDistChart9.png
12% of files have more coverage

Code metrics

14
61
15
2
309
245
27
0.44
4.07
7.5
1.8

Classes

Class Line # Actions
CommandLineOperations 38 53 20 12
0.8421052784.2%
CommandLineOperations.Worker 68 8 7 0
1.0100%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
7    * Jalview is free software: you can redistribute it and/or
8    * modify it under the terms of the GNU General Public License
9    * as published by the Free Software Foundation, either version 3
10    * of the License, or (at your option) any later version.
11    *
12    * Jalview is distributed in the hope that it will be useful, but
13    * WITHOUT ANY WARRANTY; without even the implied warranty
14    * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15    * PURPOSE. See the GNU General Public License for more details.
16    *
17    * You should have received a copy of the GNU General Public License
18    * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19    * The Jalview Authors are detailed in the 'AUTHORS' file.
20    */
21    package jalview.bin;
22   
23    import jalview.gui.JvOptionPane;
24   
25    import java.io.BufferedReader;
26    import java.io.File;
27    import java.io.IOException;
28    import java.io.InputStreamReader;
29    import java.util.ArrayList;
30   
31    import org.testng.Assert;
32    import org.testng.FileAssert;
33    import org.testng.annotations.BeforeClass;
34    import org.testng.annotations.BeforeTest;
35    import org.testng.annotations.DataProvider;
36    import org.testng.annotations.Test;
37   
 
38    public class CommandLineOperations
39    {
40   
 
41  1 toggle @BeforeClass(alwaysRun = true)
42    public void setUpJvOptionPane()
43    {
44  1 JvOptionPane.setInteractiveMode(false);
45  1 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
46    }
47   
48    private static final int TEST_TIMEOUT = 4500; // Note longer timeout needed on
49    // full test run than on
50    // individual tests
51   
52    private static final int SETUP_TIMEOUT = 9000;
53   
54    private static final int MINFILESIZE_SMALL = 2096;
55   
56    private static final int MINFILESIZE_BIG = 4096;
57   
58    private ArrayList<String> successfulCMDs = new ArrayList<String>();
59   
60    /***
61    * from
62    * http://stackoverflow.com/questions/808276/how-to-add-a-timeout-value-when
63    * -using-javas-runtime-exec
64    *
65    * @author jimp
66    *
67    */
 
68    private static class Worker extends Thread
69    {
70    private final Process process;
71   
72    private BufferedReader outputReader;
73   
74    private BufferedReader errorReader;
75   
76    private Integer exit;
77   
 
78  18 toggle private Worker(Process process)
79    {
80  18 this.process = process;
81    }
82   
 
83  18 toggle @Override
84    public void run()
85    {
86  18 try
87    {
88  18 exit = process.waitFor();
89    } catch (InterruptedException ignore)
90    {
91  1 return;
92    }
93    }
94   
 
95  18 toggle public BufferedReader getOutputReader()
96    {
97  18 return outputReader;
98    }
99   
 
100  18 toggle public void setOutputReader(BufferedReader outputReader)
101    {
102  18 this.outputReader = outputReader;
103    }
104   
 
105  6 toggle public BufferedReader getErrorReader()
106    {
107  6 return errorReader;
108    }
109   
 
110  18 toggle public void setErrorReader(BufferedReader errorReader)
111    {
112  18 this.errorReader = errorReader;
113    }
114    }
115   
 
116  18 toggle private Worker jalviewDesktopRunner(boolean withAwt, String cmd,
117    int timeout)
118    {
119  18 String _cmd = "java "
120  18 + (withAwt ? "-Djava.awt.headless=true" : "")
121    + " -Djava.ext.dirs=./lib -classpath ./classes jalview.bin.Jalview ";
122  18 System.out.println("CMD [" + cmd + "]");
123  18 Process ls2_proc = null;
124  18 Worker worker = null;
125  18 try
126    {
127  18 ls2_proc = Runtime.getRuntime().exec(_cmd + cmd);
128    } catch (IOException e1)
129    {
130  0 e1.printStackTrace();
131    }
132  18 if (ls2_proc != null)
133    {
134  18 BufferedReader outputReader = new BufferedReader(
135    new InputStreamReader(ls2_proc.getInputStream()));
136  18 BufferedReader errorReader = new BufferedReader(
137    new InputStreamReader(ls2_proc.getErrorStream()));
138  18 worker = new Worker(ls2_proc);
139  18 worker.start();
140  18 try
141    {
142  18 worker.join(timeout);
143    } catch (InterruptedException e)
144    {
145    // e.printStackTrace();
146    }
147  18 worker.setOutputReader(outputReader);
148  18 worker.setErrorReader(errorReader);
149    }
150  18 return worker;
151    }
152   
 
153  1 toggle @BeforeTest(alwaysRun = true)
154    public void initialize()
155    {
156  1 new CommandLineOperations();
157    }
158   
 
159  1 toggle @BeforeTest(alwaysRun = true)
160    public void setUpForHeadlessCommandLineInputOperations()
161    throws IOException
162    {
163  1 String cmds = "nodisplay -open examples/uniref50.fa -sortbytree -props FILE -colour zappo "
164    + "-jabaws http://www.compbio.dundee.ac.uk/jabaws -nosortbytree -dasserver nickname=www.test.com "
165    + "-features examples/testdata/plantfdx.features -annotations examples/testdata/plantfdx.annotations -tree examples/testdata/uniref50_test_tree";
166  1 Worker worker = jalviewDesktopRunner(true, cmds, SETUP_TIMEOUT);
167  1 String ln = null;
168  ? while ((ln = worker.getOutputReader().readLine()) != null)
169    {
170  17 System.out.println(ln);
171  17 successfulCMDs.add(ln);
172    }
173    }
174   
 
175  1 toggle @BeforeTest(alwaysRun = true)
176    public void setUpForCommandLineInputOperations() throws IOException
177    {
178  1 String cmds = "-open examples/uniref50.fa -noquestionnaire -nousagestats";
179  1 Worker worker = jalviewDesktopRunner(false, cmds, SETUP_TIMEOUT);
180  1 String ln = null;
181  1 int count = 0;
182  ? while ((ln = worker.getErrorReader().readLine()) != null)
183    {
184  6 System.out.println(ln);
185  6 successfulCMDs.add(ln);
186  6 if (++count > 5)
187    {
188  1 break;
189    }
190    }
191  1 if (worker != null && worker.exit == null)
192    {
193  1 worker.interrupt();
194  1 Thread.currentThread().interrupt();
195  1 worker.process.destroy();
196    }
197    }
198   
 
199  12 toggle @Test(groups = { "Functional" }, dataProvider = "allInputOpearationsData")
200    public void testAllInputOperations(String expectedString,
201    String failureMsg)
202    {
203  12 Assert.assertTrue(successfulCMDs.contains(expectedString), failureMsg);
204    }
205   
 
206  16 toggle @Test(
207    groups = { "Functional" },
208    dataProvider = "headlessModeOutputOperationsData")
209    public void testHeadlessModeOutputOperations(String harg, String type,
210    String fileName, boolean withAWT, int expectedMinFileSize,
211    int timeout)
212    {
213  16 String cmd = harg + type + " " + fileName;
214    // System.out.println(">>>>>>>>>>>>>>>> Command : " + cmd);
215  16 File file = new File(fileName);
216  16 Worker worker = jalviewDesktopRunner(withAWT, cmd, timeout);
217   
218  16 FileAssert.assertFile(file, "Didn't create an output" + type
219    + " file.[" + harg + "]");
220  16 FileAssert.assertMinLength(new File(fileName), expectedMinFileSize);
221  16 if (worker != null && worker.exit == null)
222    {
223  0 worker.interrupt();
224  0 Thread.currentThread().interrupt();
225  0 worker.process.destroy();
226  0 Assert.fail("Jalview did not exit after "
227    + type
228    + " generation (try running test again to verify - timeout at "
229    + SETUP_TIMEOUT + "ms). ["
230    + harg + "]");
231    }
232  16 new File(fileName).delete();
233    }
234   
 
235  1 toggle @DataProvider(name = "allInputOpearationsData")
236    public Object[][] getHeadlessModeInputParams()
237    {
238  1 return new Object[][] {
239    // headless mode input operations
240    { "CMD [-color zappo] executed successfully!",
241    "Failed command : -color zappo" },
242    { "CMD [-props FILE] executed successfully!",
243    "Failed command : -props File" },
244    { "CMD [-sortbytree] executed successfully!",
245    "Failed command : -sortbytree" },
246    {
247    "CMD [-jabaws http://www.compbio.dundee.ac.uk/jabaws] executed successfully!",
248    "Failed command : -jabaws http://www.compbio.dundee.ac.uk/jabaws" },
249    { "CMD [-open examples/uniref50.fa] executed successfully!",
250    "Failed command : -open examples/uniref50.fa" },
251    { "CMD [-nosortbytree] executed successfully!",
252    "Failed command : -nosortbytree" },
253    { "CMD [-dasserver nickname=www.test.com] executed successfully!",
254    "Failed command : -dasserver nickname=www.test.com" },
255    {
256    "CMD [-features examples/testdata/plantfdx.features] executed successfully!",
257    "Failed command : -features examples/testdata/plantfdx.features" },
258    {
259    "CMD [-annotations examples/testdata/plantfdx.annotations] executed successfully!",
260    "Failed command : -annotations examples/testdata/plantfdx.annotations" },
261    {
262    "CMD [-tree examples/testdata/uniref50_test_tree] executed successfully!",
263    "Failed command : -tree examples/testdata/uniref50_test_tree" },
264    // non headless mode input operations
265    { "CMD [-nousagestats] executed successfully!",
266    "Failed command : -nousagestats" },
267    { "CMD [-noquestionnaire] executed successfully!",
268    "Failed command : -noquestionnaire nickname=www.test.com" } };
269   
270    }
271   
 
272  1 toggle @DataProvider(name = "headlessModeOutputOperationsData")
273    public static Object[][] getHeadlessModeOutputParams()
274    {
275  1 return new Object[][] {
276    { "nodisplay -open examples/uniref50.fa", " -eps",
277    "test_uniref50_out.eps", true, MINFILESIZE_BIG, TEST_TIMEOUT },
278    { "nodisplay -open examples/uniref50.fa", " -eps",
279    "test_uniref50_out.eps", false, MINFILESIZE_BIG, TEST_TIMEOUT },
280    { "nogui -open examples/uniref50.fa", " -eps",
281    "test_uniref50_out.eps", true, MINFILESIZE_BIG, TEST_TIMEOUT },
282    { "nogui -open examples/uniref50.fa", " -eps",
283    "test_uniref50_out.eps", false, MINFILESIZE_BIG, TEST_TIMEOUT },
284    { "headless -open examples/uniref50.fa", " -eps",
285    "test_uniref50_out.eps", true, MINFILESIZE_BIG, TEST_TIMEOUT },
286    { "headless -open examples/uniref50.fa", " -svg",
287    "test_uniref50_out.svg", false, MINFILESIZE_BIG, TEST_TIMEOUT },
288    { "headless -open examples/uniref50.fa", " -png",
289    "test_uniref50_out.png", true, MINFILESIZE_BIG, TEST_TIMEOUT },
290    { "headless -open examples/uniref50.fa", " -html",
291    "test_uniref50_out.html", true, MINFILESIZE_BIG, TEST_TIMEOUT },
292    { "headless -open examples/uniref50.fa", " -fasta",
293    "test_uniref50_out.mfa", true, MINFILESIZE_SMALL, TEST_TIMEOUT },
294    { "headless -open examples/uniref50.fa", " -clustal",
295    "test_uniref50_out.aln", true, MINFILESIZE_SMALL, TEST_TIMEOUT },
296    { "headless -open examples/uniref50.fa", " -msf",
297    "test_uniref50_out.msf", true, MINFILESIZE_SMALL, TEST_TIMEOUT },
298    { "headless -open examples/uniref50.fa", " -pileup",
299    "test_uniref50_out.aln", true, MINFILESIZE_SMALL, TEST_TIMEOUT },
300    { "headless -open examples/uniref50.fa", " -pir",
301    "test_uniref50_out.pir", true, MINFILESIZE_SMALL, TEST_TIMEOUT },
302    { "headless -open examples/uniref50.fa", " -pfam",
303    "test_uniref50_out.pfam", true, MINFILESIZE_SMALL, TEST_TIMEOUT },
304    { "headless -open examples/uniref50.fa", " -blc",
305    "test_uniref50_out.blc", true, MINFILESIZE_SMALL, TEST_TIMEOUT },
306    { "headless -open examples/uniref50.fa", " -jalview",
307    "test_uniref50_out.jvp", true, MINFILESIZE_SMALL, TEST_TIMEOUT }, };
308    }
309    }