X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=build.gradle;h=7ad6f9965e560830bad4e1a2afa2f9cf72f4cf31;hb=refs%2Fheads%2Ffeatures%2Fr2_11_2_alphafold%2FJAL-629;hp=23f3a7bdfc9f96f4690f2115e55d5c434947e5c4;hpb=9ca56c016427b44f565994198707b403b23e21b9;p=jalview.git diff --git a/build.gradle b/build.gradle index 23f3a7b..7ad6f99 100644 --- a/build.gradle +++ b/build.gradle @@ -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 }