Merge branch 'features/1769_headless-mode-test' into develop
authortcofoegbu <tcnofoegbu@dundee.ac.uk>
Mon, 6 Jul 2015 16:01:28 +0000 (17:01 +0100)
committertcofoegbu <tcnofoegbu@dundee.ac.uk>
Mon, 6 Jul 2015 16:01:28 +0000 (17:01 +0100)
examples/biojsonschema.json [new file with mode: 0644]
src/jalview/bin/Jalview.java
src/jalview/gui/AlignExportSettings.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/ProgressBar.java
src/jalview/util/ImageMaker.java
test/jalview/bin/CommandLineOperations.java

diff --git a/examples/biojsonschema.json b/examples/biojsonschema.json
new file mode 100644 (file)
index 0000000..e6670d2
--- /dev/null
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","id":"http://jsonschema.net","type":"object","properties":{"seqs":{"id":"http://jsonschema.net/seqs","type":"array","items":{"id":"http://jsonschema.net/seqs/0","type":"object","properties":{"name":{"id":"http://jsonschema.net/seqs/0/name","type":"string","description":"Sequence name"},"start":{"id":"http://jsonschema.net/seqs/0/start","type":"integer","description":"Start residue position"},"svid":{"id":"http://jsonschema.net/seqs/0/svid","type":"string","description":"Serial version id for sequence object"},"end":{"id":"http://jsonschema.net/seqs/0/end","type":"integer","description":"End residue position"},"id":{"id":"http://jsonschema.net/seqs/0/id","type":"string","description":"Sequence unique identifier"},"seq":{"id":"http://jsonschema.net/seqs/0/seq","type":"string","description":"Sequence Residues"},"order":{"id":"http://jsonschema.net/seqs/0/order","type":"integer","description":"Sequence order in an alignment space"}},"required":["name","start","svid","end","id","seq"]},"required":["0"],"description":"Sequences in the Alignemnt","minItems":"1","maxItems":"*"},"appSettings":{"id":"http://jsonschema.net/appSettings","type":"object","properties":{"globalColorScheme":{"id":"http://jsonschema.net/appSettings/globalColorScheme","type":"string","description":"Global colour schem for the alignment"},"webStartUrl":{"id":"http://jsonschema.net/appSettings/webStartUrl","type":"string","description":"Jalview specific setting which points to a url for launching Jalview"},"application":{"id":"http://jsonschema.net/appSettings/application","type":"string","description":"Application which generated the Json"},"showSeqFeatures":{"id":"http://jsonschema.net/appSettings/showSeqFeatures","type":"string","description":"Determines if sequence features are visible or not"},"version":{"id":"http://jsonschema.net/appSettings/version","type":"string","description":"Verion of the application which generated the JSON"},"hiddenCols":{"id":"http://jsonschema.net/appSettings/hiddenCols","type":"string","description":"Delimited lists of hidden colums ranges i.e [2-3,5-5,11-23]"}},"description":"Application specific settings"},"seqGroups":{"id":"http://jsonschema.net/seqGroups","type":"array","items":[{"id":"http://jsonschema.net/seqGroups/0","type":"object","properties":{"displayText":{"id":"http://jsonschema.net/seqGroups/0/displayText","type":"boolean","description":"Determines if the texts of the group is displayed or not"},"startRes":{"id":"http://jsonschema.net/seqGroups/0/startRes","type":"integer","description":"Start residue position for a given group"},"groupName":{"id":"http://jsonschema.net/seqGroups/0/groupName","type":"string","description":"Group name"},"endRes":{"id":"http://jsonschema.net/seqGroups/0/endRes","type":"integer","description":"End residue position for a given group"},"colourText":{"id":"http://jsonschema.net/seqGroups/0/colourText","type":"boolean","description":"Determines if the Residues text for the group is coloured"},"seqsHash":{"id":"http://jsonschema.net/seqGroups/0/seqsHash","type":"array","items":[],"minItems":"0","maxItems":"*","description":"The id's of the sequences which belongs to the group"},"svid":{"id":"http://jsonschema.net/seqGroups/0/svid","type":"string","description":"Serial version id for a given group"},"showNonconserved":{"id":"http://jsonschema.net/seqGroups/0/showNonconserved","type":"boolean","description":"Determines if non conserved regions of a group is shown or not"},"colourScheme":{"id":"http://jsonschema.net/seqGroups/0/colourScheme","type":"string","description":"Colour Scheme for the sequence group"},"displayBoxes":{"id":"http://jsonschema.net/seqGroups/0/displayBoxes","type":"boolean","description":"Determines if the group border should be visible or not"}}}],"description":"Sequence groups in the Alignment","minItems":"0","maxItems":"*"},"alignAnnotation":{"id":"http://jsonschema.net/alignAnnotation","type":"array","items":{"id":"http://jsonschema.net/alignAnnotation/0","type":"object","properties":{"svid":{"id":"http://jsonschema.net/alignAnnotation/0/svid","type":"string","description":"Serial version id for the annotation object"},"annotations":{"id":"http://jsonschema.net/alignAnnotation/0/annotations","type":"array","items":[{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0","type":"object","properties":{"displayCharacter":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0/displayCharacter","type":"string","description":"Display character to denote the given annotation"},"value":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0/value","type":"integer","description":"Value of the annotation"},"secondaryStructure":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0/secondaryStructure","type":"string","description":"Secondary structure symbol for the given annotation"}}},{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1","type":"object","properties":{"displayCharacter":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1/displayCharacter","type":"string"},"value":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1/value","type":"integer"},"secondaryStructure":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1/secondaryStructure","type":"string"}}},{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2","type":"object","properties":{"displayCharacter":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2/displayCharacter","type":"string"},"value":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2/value","type":"integer"},"secondaryStructure":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2/secondaryStructure","type":"string"}}}]},"description":{"id":"http://jsonschema.net/alignAnnotation/0/description","type":"string","description":"Description of the Alignment Annotation"},"label":{"id":"http://jsonschema.net/alignAnnotation/0/label","type":"string","description":"Label for the Annotation"}}},"description":"Alignment Annotations","minItems":"0","maxItems":"*"},"svid":{"id":"http://jsonschema.net/svid","type":"string","description":"Serial version id"},"seqFeatures":{"id":"http://jsonschema.net/seqFeatures","type":"array","items":{"id":"http://jsonschema.net/seqFeatures/0","type":"object","properties":{"fillColor":{"id":"http://jsonschema.net/seqFeatures/0/fillColor","type":"string","description":"Fill colour"},"score":{"id":"http://jsonschema.net/seqFeatures/0/score","type":"integer","description":"Score"},"sequenceRef":{"id":"http://jsonschema.net/seqFeatures/0/sequenceRef","type":"string","description":"Reference to the Sequence in the alignement (More like a foreign key)"},"featureGroup":{"id":"http://jsonschema.net/seqFeatures/0/featureGroup","type":"string","description":"Feature Group"},"svid":{"id":"http://jsonschema.net/seqFeatures/0/svid","type":"string","description":"Serial version id for the SeqFeature object"},"description":{"id":"http://jsonschema.net/seqFeatures/0/description","type":"string","description":"Description of Feature"},"xStart":{"id":"http://jsonschema.net/seqFeatures/0/xStart","type":"integer","description":"Start residue position for the sequence feature"},"xEnd":{"id":"http://jsonschema.net/seqFeatures/0/xEnd","type":"integer","description":"End residue position for the sequence feature"},"type":{"id":"http://jsonschema.net/seqFeatures/0/type","type":"string","description":"The name of the SequenceFeature"}}},"minItems":"0","maxItems":"*","description":"Sequence Features within the alignment"}},"required":["seqs","appSettings","seqGroups","alignAnnotation","svid","seqFeatures"]}
\ No newline at end of file
index f4b38d4..f6d0099 100755 (executable)
@@ -225,10 +225,13 @@ public class Jalview
       desktop.checkForNews();
     }
 
-    BioJsHTMLOutput.updateBioJS();
+    if (!isHeadlessMode())
+    {
+      BioJsHTMLOutput.updateBioJS();
+    }
 
     String file = null, protocol = null, format = null, data = null;
-    jalview.io.FileLoader fileLoader = new jalview.io.FileLoader();
+    jalview.io.FileLoader fileLoader = new jalview.io.FileLoader(!headless);
     Vector getFeatures = null; // vector of das source nicknames to fetch
     // features from
     // loading is done.
@@ -518,8 +521,10 @@ public class Jalview
           }
           else if (format.equalsIgnoreCase("eps"))
           {
-            System.out.println("Creating EPS file: " + file);
-            af.createEPS(new java.io.File(file));
+            File outputFile = new java.io.File(file);
+            System.out.println("Creating EPS file: "
+                    + outputFile.getAbsolutePath());
+            af.createEPS(outputFile);
             continue;
           }
 
index 40128af..49bb64a 100644 (file)
@@ -1,6 +1,7 @@
 package jalview.gui;
 
 import jalview.api.AlignExportSettingI;
+import jalview.bin.Jalview;
 import jalview.jbgui.GAlignExportSettings;
 
 import java.awt.event.ActionEvent;
@@ -23,7 +24,7 @@ public class AlignExportSettings extends GAlignExportSettings implements
           String alignFileFormat)
   {
     super(hasHiddenSeq, hasHiddenCols, alignFileFormat);
-    if (isShowDialog())
+    if (!Jalview.isHeadlessMode() && isShowDialog())
     {
       JOptionPane pane = new JOptionPane(null, JOptionPane.DEFAULT_OPTION,
               JOptionPane.DEFAULT_OPTION, null, new Object[]
index aa41ca9..68d7397 100644 (file)
@@ -37,6 +37,7 @@ import jalview.api.SplitContainerI;
 import jalview.api.ViewStyleI;
 import jalview.api.analysis.ScoreModelI;
 import jalview.bin.Cache;
+import jalview.bin.Jalview;
 import jalview.commands.CommandI;
 import jalview.commands.EditCommand;
 import jalview.commands.EditCommand.Action;
@@ -335,7 +336,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   void init()
   {
-    progressBar = new ProgressBar(this.statusPanel, this.statusBar);
+    if (!Jalview.isHeadlessMode())
+    {
+      progressBar = new ProgressBar(this.statusPanel, this.statusBar);
+    }
 
     avc = new jalview.controller.AlignViewController(this, viewport,
             alignPanel);
@@ -1135,8 +1139,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         warningMessage("Cannot save file " + fileName + " using format "
                 + format, "Alignment output format not supported");
-        saveAs_actionPerformed(null);
-        // JBPNote need to have a raise_gui flag here
+        if (!Jalview.isHeadlessMode())
+        {
+          saveAs_actionPerformed(null);
+        }
         return false;
       }
 
index 5307f26..c7db535 100644 (file)
@@ -1,5 +1,7 @@
 package jalview.gui;
 
+import jalview.util.MessageManager;
+
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.GridLayout;
@@ -14,8 +16,6 @@ import javax.swing.JPanel;
 import javax.swing.JProgressBar;
 import javax.swing.SwingUtilities;
 
-import jalview.util.MessageManager;
-
 /**
  * A class to manage multiple progress bars embedded in a JPanel.
  */
index 100ecf5..8abe965 100755 (executable)
@@ -20,6 +20,7 @@
  */
 package jalview.util;
 
+import jalview.bin.Jalview;
 import jalview.gui.EPSOptions;
 import jalview.gui.SVGOptions;
 import jalview.io.JalviewFileChooser;
@@ -259,6 +260,10 @@ public class ImageMaker
 
   static JalviewFileChooser getPNGChooser()
   {
+    if (Jalview.isHeadlessMode())
+  {
+      return null;
+    }
     return new jalview.io.JalviewFileChooser(
             jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
             { "png" }, new String[]
@@ -267,6 +272,10 @@ public class ImageMaker
 
   static JalviewFileChooser getEPSChooser()
   {
+    if (Jalview.isHeadlessMode())
+    {
+      return null;
+    }
     return new jalview.io.JalviewFileChooser(
             jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
             { "eps" }, new String[]
@@ -275,6 +284,10 @@ public class ImageMaker
 
   static JalviewFileChooser getSVGChooser()
   {
+    if (Jalview.isHeadlessMode())
+  {
+      return null;
+    }
     return new jalview.io.JalviewFileChooser(
             jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
             { "svg" }, new String[]
index d9d3bb3..05ada31 100644 (file)
@@ -26,9 +26,11 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 
 import org.testng.Assert;
-import org.testng.AssertJUnit;
+import org.testng.FileAssert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 public class CommandLineOperations
@@ -81,7 +83,7 @@ public class CommandLineOperations
     String _cmd = "java "
             + (withAwt ? "-Djava.awt.headless=true" : "")
             + " -Djava.ext.dirs=./lib -classpath ./classes jalview.bin.Jalview ";
-    System.out.println("###############Jalview CMD: " + _cmd + cmd);
+    System.out.println("############ Testing Jalview CMD: " + _cmd + cmd);
     Process ls2_proc = Runtime.getRuntime().exec(_cmd + cmd);
     BufferedReader outputReader = new BufferedReader(new InputStreamReader(
             ls2_proc.getInputStream()));
@@ -91,81 +93,125 @@ public class CommandLineOperations
     Worker worker = new Worker(ls2_proc);
     worker.start();
     worker.join(timeout);
-    System.out.println("Output:  ");
-    String ln = null;
-    while ((ln = outputReader.readLine()) != null)
+    // System.out.println("Output:  ");
+    // String ln = null;
+    // while ((ln = outputReader.readLine()) != null)
+    // {
+    // System.out.println(ln);
+    // }
+    //
+    // System.out.println("Error:  ");
+    // while ((ln = errorReader.readLine()) != null)
+    // {
+    // System.out.println(ln);
+    // }
+    return worker;
+  }
+
+  @BeforeTest
+  public void initialize()
+  {
+    new CommandLineOperations();
+  }
+
+  @Test(dataProvider = "headlessModeOutputParams")
+  public void testHeadlessModeOutputs(String harg, String type,
+          String fileName, boolean withAWT, int expectedMinFileSize)
+  {
+    String cmd = harg + type + " " + fileName;
+    // System.out.println(">>>>>>>>>>>>>>>> Command : " + cmd);
+    File file = new File(fileName);
+    Worker worker = null;
+    try
     {
-      System.out.println(ln);
+      worker = jalviewDesktopRunner(withAWT, cmd, 9000);
+    } catch (InterruptedException e)
+    {
+      e.printStackTrace();
+    } catch (IOException e)
+    {
+      e.printStackTrace();
     }
 
-    System.out.println("Error:  ");
-    while ((ln = errorReader.readLine()) != null)
+    FileAssert.assertFile(file, "Didn't create an output" + type
+            + " file.[" + harg + "]");
+    FileAssert.assertMinLength(new File(fileName), expectedMinFileSize);
+    if (worker != null && worker.exit == null)
     {
-      System.out.println(ln);
+      worker.interrupt();
+      Thread.currentThread().interrupt();
+      worker.process.destroy();
+      Assert.fail("Jalview did not exit after  "
+              + type
+              + " generation (try running test again to verify - timeout at 9000ms). ["
+              + harg + "]");
     }
-    return worker;
+    new File(fileName).delete();
   }
 
-  @Test
-  public void testHeadlessModeEPS() throws Exception
+  @DataProvider(name = "headlessModeOutputParams")
+  public static Object[][] headlessModeOutput()
   {
-    String[] headlessArgs = new String[]
-    { "nodisplay", "headless", "nogui" };
-    for (String _harg : headlessArgs)
+    return new Object[][]
     {
-      boolean _switch = false, withAwt = false;
-      do
-      {
-        if (_switch)
-        {
-          withAwt = true;
-        }
-        _switch = true;
-        String jalview_input = "examples/uniref50.fa";
-        String jalview_output = "test_uniref50_out.eps";
-        String cmd = "" + _harg + " -open " + jalview_input + " -eps "
-                + jalview_output;
-        String harg = _harg
-                + (withAwt ? "-Djava.awt.headless=true"
-                        : " NO AWT.HEADLESS");
-        System.out.println("Testing with Headless argument: '" + harg
-                + "'\n");
-        Worker worker = jalviewDesktopRunner(withAwt, cmd, 9000);
-        AssertJUnit.assertTrue("Didn't create an output EPS file.[" + harg
-                + "]", new File("test_uniref50_out.eps").exists());
-        AssertJUnit.assertTrue(
-                "Didn't create an EPS file with any content[" + harg + "]",
-                new File("test_uniref50_out.eps").length() > 4096);
-        if (worker.exit == null)
-        {
-          worker.interrupt();
-          Thread.currentThread().interrupt();
-          worker.process.destroy();
-          Assert.fail("Jalview did not exit after EPS generation (try running test again to verify - timeout at 9000ms). ["
-                  + harg + "]");
-        }
-      } while (!withAwt);
-    }
+        { "nodisplay -open examples/uniref50.fa", " -eps",
+            "test_uniref50_out.eps", true, 4096 },
+        { "nodisplay -open examples/uniref50.fa", " -eps",
+            "test_uniref50_out.eps", false, 4096 },
+        { "headless -open examples/uniref50.fa", " -eps",
+            "test_uniref50_out.eps", true, 4096 },
+        { "headless -open examples/uniref50.fa", " -eps",
+            "test_uniref50_out.eps", false, 4096 },
+        { "nogui -open examples/uniref50.fa", " -eps",
+            "test_uniref50_out.eps", true, 4096 },
+        { "nogui -open examples/uniref50.fa", " -eps",
+            "test_uniref50_out.eps", false, 4096 },
+        { "headless -open examples/uniref50.fa", " -svg",
+            "test_uniref50_out.svg", true, 4096 },
+        { "headless -open examples/uniref50.fa", " -svg",
+            "test_uniref50_out.svg", false, 4096 },
+        { "headless -open examples/uniref50.fa", " -png",
+            "test_uniref50_out.png", true, 4096 },
+        { "headless -open examples/uniref50.fa", " -png",
+            "test_uniref50_out.png", false, 4096 },
+        { "headless -open examples/uniref50.fa", " -html",
+            "test_uniref50_out.html", true, 4096 },
+        { "headless -open examples/uniref50.fa", " -html",
+            "test_uniref50_out.html", false, 4096 },
+        { "headless -open examples/uniref50.fa", " -fasta",
+            "test_uniref50_out.mfa", true, 2096 },
+        { "headless -open examples/uniref50.fa", " -fasta",
+            "test_uniref50_out.mfa", false, 2096 },
+        { "headless -open examples/uniref50.fa", " -clustal",
+            "test_uniref50_out.aln", true, 2096 },
+        { "headless -open examples/uniref50.fa", " -clustal",
+            "test_uniref50_out.aln", false, 2096 },
+        { "headless -open examples/uniref50.fa", " -msf",
+            "test_uniref50_out.msf", true, 2096 },
+        { "headless -open examples/uniref50.fa", " -msf",
+            "test_uniref50_out.msf", false, 2096 },
+        { "headless -open examples/uniref50.fa", " -pileup",
+            "test_uniref50_out.aln", true, 2096 },
+        { "headless -open examples/uniref50.fa", " -pileup",
+            "test_uniref50_out.aln", false, 2096 },
+        { "headless -open examples/uniref50.fa", " -pir",
+            "test_uniref50_out.pir", true, 2096 },
+        { "headless -open examples/uniref50.fa", " -pir",
+            "test_uniref50_out.pir", false, 2096 },
+        { "headless -open examples/uniref50.fa", " -pfam",
+            "test_uniref50_out.pfam", true, 2096 },
+        { "headless -open examples/uniref50.fa", " -pfam",
+            "test_uniref50_out.pfam", false, 2096 },
+        { "headless -open examples/uniref50.fa", " -blc",
+            "test_uniref50_out.blc", true, 2096 },
+        { "headless -open examples/uniref50.fa", " -blc",
+            "test_uniref50_out.blc", false, 2096 },
+        { "headless -open examples/uniref50.fa", " -jalview",
+            "test_uniref50_out.jvp", true, 2096 },
+        { "headless -open examples/uniref50.fa", " -jalview",
+            "test_uniref50_out.jvp", false, 2096 },
+    };
   }
-  // @Test
-  // public void testJalview2XMLDataset() throws Exception
-  // {
-  // String jalview_input = "examples/uniref50.fa";
-  // String jalview_output = "test_uniref50_out.eps";
-  // String cmd = ""+" -open "+ jalview_input + " -eps " + jalview_output;
-  // //String harg = _harg+(withAwt ?
-  // "-Djava.awt.headless=true":" NO AWT.HEADLESS");
-  // System.out.println("Testing with Headless argument: '"+harg+"'\n");
-  // Worker worker = jalviewDesktopRunner(withAwt, cmd, 9000);
-  // assertTrue("Didn't create an output EPS file.["+harg+"]", new
-  // File("test_uniref50_out.eps").exists());
-  // assertTrue("Didn't create an EPS file with any content["+harg+"]", new
-  // File("test_uniref50_out.eps").length()>4096);
-  // if (worker.exit == null){
-  // worker.interrupt();
-  // Thread.currentThread().interrupt();
-  // worker.process.destroy();
-  // fail("Jalview did not exit after EPS generation (try running test again to verify - timeout at 9000ms). ["+harg+"]");
-  // }
-  // }
+
+
 }