From 06d27a9efa847955c5bfc68ccc5b2632d4b1fe70 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 27 Jun 2017 11:56:30 +0200 Subject: [PATCH] Fix failing tests on TC on Windows by falling back to standard launcher ...in one more case Plus some minor test tweaks, diagnostics improvement and important comments --- .../kotlin/daemon/client/NativePlatformUtil.kt | 18 +++++++++++++++--- jps-plugin/jps-tests/jps-tests.iml | 1 + .../sourceSections/SourceSectionsTest.kt | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/NativePlatformUtil.kt b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/NativePlatformUtil.kt index 7119bc99e9d..317c470b342 100644 --- a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/NativePlatformUtil.kt +++ b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/NativePlatformUtil.kt @@ -20,9 +20,12 @@ import org.jetbrains.kotlin.daemon.common.DaemonReportCategory import java.io.IOException private class NativePlatformLauncherWrapper { + private val nativeLauncher: net.rubygrapefruit.platform.ProcessLauncher by lazy { + net.rubygrapefruit.platform.Native.get(net.rubygrapefruit.platform.ProcessLauncher::class.java) + } + fun launch(processBuilder: ProcessBuilder): Process = try { - val nativeLauncher = net.rubygrapefruit.platform.Native.get(net.rubygrapefruit.platform.ProcessLauncher::class.java) nativeLauncher.start(processBuilder) } catch (e: net.rubygrapefruit.platform.NativeException) { @@ -33,14 +36,23 @@ private class NativePlatformLauncherWrapper { fun launchProcessWithFallback(processBuilder: ProcessBuilder, reportingTargets: DaemonReportingTargets, reportingSource: String = "process launcher"): Process = try { + // A separate class to delay classloading until this point, where we can catch class loading errors in case then the native lib is not in the classpath NativePlatformLauncherWrapper().launch(processBuilder) } + catch (e: UnsatisfiedLinkError) { + reportingTargets.report(DaemonReportCategory.DEBUG, "Could not start process with native process launcher, falling back to ProcessBuilder#start ($e)", reportingSource) + null + } catch (e: IOException) { - reportingTargets.report(DaemonReportCategory.DEBUG, "Could not start process with native process launcher, falling back to ProcessBuilder#start (${e.cause})") + reportingTargets.report(DaemonReportCategory.DEBUG, "Could not start process with native process launcher, falling back to ProcessBuilder#start (${e.cause})", reportingSource) null } catch (e: NoClassDefFoundError) { - reportingTargets.report(DaemonReportCategory.DEBUG, "net.rubygrapefruit.platform library is not in the classpath, falling back to ProcessBuilder#start") + reportingTargets.report(DaemonReportCategory.DEBUG, "net.rubygrapefruit.platform library is not in the classpath, falling back to ProcessBuilder#start ($e)", reportingSource) + null + } + catch (e: ClassNotFoundException) { + reportingTargets.report(DaemonReportCategory.DEBUG, "net.rubygrapefruit.platform library is not in the classpath, falling back to ProcessBuilder#start ($e)", reportingSource) null } ?: processBuilder.start() diff --git a/jps-plugin/jps-tests/jps-tests.iml b/jps-plugin/jps-tests/jps-tests.iml index 4cec7e15e41..3363179a26b 100644 --- a/jps-plugin/jps-tests/jps-tests.iml +++ b/jps-plugin/jps-tests/jps-tests.iml @@ -20,5 +20,6 @@ + \ No newline at end of file diff --git a/plugins/source-sections/source-sections-compiler/tests/org/jetbrains/kotlin/sourceSections/SourceSectionsTest.kt b/plugins/source-sections/source-sections-compiler/tests/org/jetbrains/kotlin/sourceSections/SourceSectionsTest.kt index f4705bb43dc..ddfb1f5f0ed 100644 --- a/plugins/source-sections/source-sections-compiler/tests/org/jetbrains/kotlin/sourceSections/SourceSectionsTest.kt +++ b/plugins/source-sections/source-sections-compiler/tests/org/jetbrains/kotlin/sourceSections/SourceSectionsTest.kt @@ -59,7 +59,7 @@ class SourceSectionsTest : TestCaseWithTmpdir() { } val compilerClassPath = listOf(kotlinPaths.compilerPath) - val scriptRuntimeClassPath = listOf( kotlinPaths.runtimePath, kotlinPaths.scriptRuntimePath) + val scriptRuntimeClassPath = listOf( kotlinPaths.stdlibPath, kotlinPaths.scriptRuntimePath) val sourceSectionsPluginJar = File(kotlinPaths.libPath, "kotlin-source-sections-compiler-plugin.jar") val compilerId by lazy(LazyThreadSafetyMode.NONE) { CompilerId.makeCompilerId(compilerClassPath) } @@ -201,7 +201,7 @@ class SourceSectionsTest : TestCaseWithTmpdir() { val daemonWithSession = KotlinCompilerClient.connectAndLease(compilerId, aliveFile, daemonJVMOptions, daemonOptions, DaemonReportingTargets(messageCollector = messageCollector), autostart = true, leaseSession = true) - assertNotNull("failed to connect daemon", daemonWithSession) + assertNotNull("failed to connect daemon:\ncompiler id: $compilerId\ndaemon opts: $daemonOptions\njvm opts: $daemonJVMOptions\nalive file: $aliveFile\n", daemonWithSession) try {