JAL-629 Small buglet with getting --seqid
[jalview.git] / build.gradle
index 23f3a7b..7ad6f99 100644 (file)
@@ -10,6 +10,10 @@ import org.gradle.plugins.ide.eclipse.model.Output
 import org.gradle.plugins.ide.eclipse.model.Library
 import java.security.MessageDigest
 import java.util.regex.Matcher
+import java.util.concurrent.Executors
+import java.util.concurrent.Future
+import java.util.concurrent.ScheduledExecutorService
+import java.util.concurrent.TimeUnit
 import groovy.transform.ExternalizeMethods
 import groovy.util.XmlParser
 import groovy.xml.XmlUtil
@@ -574,7 +578,10 @@ ext {
   eclipseBinary = string("")
   eclipseVersion = string("")
   eclipseDebug = false
-  
+
+  jalviewjsChromiumUserDir = "${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}"
+  jalviewjsChromiumProfileDir = "${ext.jalviewjsChromiumUserDir}/${jalviewjs_chromium_profile_name}"
+
   // ENDEXT
 }
 
@@ -4203,13 +4210,6 @@ task eclipseAutoBuildTask {
 }
 
 
-task jalviewjs {
-  group "JalviewJS"
-  description "Build the site"
-  dependsOn jalviewjsBuildSite
-}
-
-
 task jalviewjsCopyStderrLaunchFile(type: Copy) {
   from file(jalviewjs_stderr_launch)
   into jalviewjsSiteDir
@@ -4218,62 +4218,133 @@ task jalviewjsCopyStderrLaunchFile(type: Copy) {
   outputs.file jalviewjsStderrLaunchFilename
 }
 
+task cleanJalviewjsChromiumUserDir {
+  doFirst {
+    delete jalviewjsChromiumUserDir
+  }
+  outputs.dir jalviewjsChromiumUserDir
+  // always run when depended on
+  outputs.upToDateWhen { !file(jalviewjsChromiumUserDir).exists() }
+}
+
 task jalviewjsChromiumProfile {
-  def profileDir = "${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}/${jalviewjs_chromium_profile_name}"
-  def firstRun = file("${profileDir}/First Run")
+  dependsOn cleanJalviewjsChromiumUserDir
+  mustRunAfter cleanJalviewjsChromiumUserDir
+
+  def firstRun = file("${jalviewjsChromiumUserDir}/First Run")
 
   doFirst {
-    mkdir profileDir
+    mkdir jalviewjsChromiumProfileDir
     firstRun.text = ""
   }
-  
   outputs.file firstRun
 }
 
-task jalviewjsLaunchTest(type: Exec) {
+task jalviewjsLaunchTest {
   group "Test"
   description "Check JalviewJS opens in a browser"
   dependsOn jalviewjsBuildSite
   dependsOn jalviewjsCopyStderrLaunchFile
   dependsOn jalviewjsChromiumProfile
 
-  def chromiumBinary = jalviewjs_chromium_binary
+  def macOS = OperatingSystem.current().isMacOsX()
+  def chromiumBinary = macOS ? jalviewjs_macos_chromium_binary : jalviewjs_chromium_binary
   if (chromiumBinary.startsWith("~/")) {
     chromiumBinary = System.getProperty("user.home") + chromiumBinary.substring(1)
   }
   
+  def stdout
+  def stderr
   doFirst {
-    def exec = file(chromiumBinary)
-    if (!exec.exists()) {
-      throw new GradleException("Could not find chromium binary '${chromiumBinary}'. Cannot run task ${name}.")
+    def timeoutms = Integer.valueOf(jalviewjs_chromium_overall_timeout) * 1000
+    
+    def binary = file(chromiumBinary)
+    if (!binary.exists()) {
+      throw new StopExecutionException("Could not find chromium binary '${chromiumBinary}'. Cannot run task ${name}.")
+    }
+    stdout = new ByteArrayOutputStream()
+    stderr = new ByteArrayOutputStream()
+    def execStdout
+    def execStderr
+    if (jalviewjs_j2s_to_console.equals("true")) {
+      execStdout = new org.apache.tools.ant.util.TeeOutputStream(
+        stdout,
+        System.out)
+      execStderr = new org.apache.tools.ant.util.TeeOutputStream(
+        stderr,
+        System.err)
+    } else {
+      execStdout = stdout
+      execStderr = stderr
+    }
+    def execArgs = [
+      "--no-sandbox", // --no-sandbox IS USED BY THE THORIUM APPIMAGE ON THE BUILDSERVER
+      "--headless=new",
+      "--disable-gpu",
+      "--timeout=${timeoutms}",
+      "--virtual-time-budget=${timeoutms}",
+      "--user-data-dir=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}",
+      "--profile-directory=${jalviewjs_chromium_profile_name}",
+      "--allow-file-access-from-files",
+      "--enable-logging=stderr",
+      "file://${jalviewDirAbsolutePath}/${jalviewjsStderrLaunchFilename}"
+    ]
+    
+    if (true || macOS) {
+      ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
+      Future f1 = executor.submit(
+        () -> {
+          exec {
+            standardOutput = execStdout
+            errorOutput = execStderr
+            executable(chromiumBinary)
+            args(execArgs)
+            println "COMMAND: '"+commandLine.join(" ")+"'"
+          }
+          executor.shutdownNow()
+        }
+      )
+
+      def noChangeBytes = 0
+      def noChangeIterations = 0
+      executor.scheduleAtFixedRate(
+        () -> {
+          String stderrString = stderr.toString()
+          // shutdown the task if we have a success string
+          if (stderrString.contains(jalviewjs_desktop_init_string)) {
+            f1.cancel()
+            Thread.sleep(1000)
+            executor.shutdownNow()
+          }
+          // if no change in stderr for 10s then also end
+          if (noChangeIterations >= jalviewjs_chromium_idle_timeout) {
+            executor.shutdownNow()
+          }
+          if (stderrString.length() == noChangeBytes) {
+            noChangeIterations++
+          } else {
+            noChangeBytes = stderrString.length()
+            noChangeIterations = 0
+          }
+        },
+        1, 1, TimeUnit.SECONDS)
+
+      executor.schedule(new Runnable(){
+        public void run(){
+          f1.cancel()
+          executor.shutdownNow()
+        }
+      }, timeoutms, TimeUnit.MILLISECONDS)
+
+      executor.awaitTermination(timeoutms+10000, TimeUnit.MILLISECONDS)
+      executor.shutdownNow()
     }
-  }
 
-  executable(chromiumBinary)
-  args([
-    "--headless=new",
-    "--timeout=60000",
-    "--virtual-time-budget=60000",
-    "--user-data-dir=${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}",
-    "--profile-directory=${jalviewjs_chromium_profile_name}",
-    "--allow-file-access-from-files",
-    "--enable-logging=stderr",
-    jalviewjsStderrLaunchFilename
-  ])
-
-  /*
-  standardOutput = new ByteArrayOutputStream()
-  errorOutput = new ByteArrayOutputStream()
+  }
   
   doLast {
-    println("Chrome STDOUT: ")
-    println(standardOutput.toString())
-    println("Chrome STDERR: ")
-    println(errorOutput.toString())
-
     def found = false
-    def stderr = errorOutput.toString()
-    stderr.eachLine { line ->
+    stderr.toString().eachLine { line ->
       if (line.contains(jalviewjs_desktop_init_string)) {
         println("Found line '"+line+"'")
         found = true
@@ -4284,5 +4355,12 @@ task jalviewjsLaunchTest(type: Exec) {
       throw new GradleException("Could not find evidence of Desktop launch in JalviewJS.")
     }
   }
-  */
+}
+  
+
+task jalviewjs {
+  group "JalviewJS"
+  description "Build the JalviewJS site and run the launch test"
+  dependsOn jalviewjsBuildSite
+  dependsOn jalviewjsLaunchTest
 }