JPS: fix testJpsDaemonIC

1. Checking for COMPILE_DAEMON_CUSTOM_RUN_FILES_PATH_FOR_TESTS was moved to COMPILE_DAEMON_DEFAULT_RUN_DIR_PATH.

Looks like COMPILE_DAEMON_CUSTOM_RUN_FILES_PATH_FOR_TESTS was introduced incorrectly in 220fab0d3f.
Checking of this property was added in DaemonOptions.runFilesPathOrDefault, while DaemonOptions.runFilesPath was internally used in runFilesPathOrDefault and in many other places.
For example DaemonOptions.runFilesPath used to pass this option to daemon server.
So daemon was started with runFilesPath that ignores COMPILE_DAEMON_CUSTOM_RUN_FILES_PATH_FOR_TESTS.

2. JpsKotlinCompilerRunner._jpsCompileServiceSession was leaked between tests.

Fixed by extracting @TestOnly releaseCompileServiceSession() and calling it in tests tearDown()

3. The result of compileWithDaemon was ignored in compileWithDaemonOrFallback.

So, the fallback was never called, and the FAIL_ON_FALLBACK_PROPERTY was actually was never worked.
This was fixed. Also the message was improved to make it easier to find the original fail cause.
This commit is contained in:
Sergey Rostov
2018-11-22 14:54:01 +03:00
parent c06b000e8d
commit 0c39358b5f
3 changed files with 21 additions and 13 deletions
@@ -52,7 +52,8 @@ val COMPILE_DAEMON_IS_READY_MESSAGE = "Kotlin compile daemon is ready"
val COMPILE_DAEMON_CUSTOM_RUN_FILES_PATH_FOR_TESTS: String = "kotlin.daemon.custom.run.files.path.for.tests" val COMPILE_DAEMON_CUSTOM_RUN_FILES_PATH_FOR_TESTS: String = "kotlin.daemon.custom.run.files.path.for.tests"
val COMPILE_DAEMON_DEFAULT_RUN_DIR_PATH: String get() = val COMPILE_DAEMON_DEFAULT_RUN_DIR_PATH: String get() =
FileSystem.getRuntimeStateFilesPath("kotlin", "daemon") System.getProperty(COMPILE_DAEMON_CUSTOM_RUN_FILES_PATH_FOR_TESTS)
?: FileSystem.getRuntimeStateFilesPath("kotlin", "daemon")
val CLASSPATH_ID_DIGEST = "MD5" val CLASSPATH_ID_DIGEST = "MD5"
@@ -226,9 +227,7 @@ data class DaemonOptions(
// TODO: consider implementing generic approach to it or may be replace getters with ones returning default if necessary // TODO: consider implementing generic approach to it or may be replace getters with ones returning default if necessary
val DaemonOptions.runFilesPathOrDefault: String val DaemonOptions.runFilesPathOrDefault: String
get() = System.getProperty(COMPILE_DAEMON_CUSTOM_RUN_FILES_PATH_FOR_TESTS) get() = if (runFilesPath.isBlank()) COMPILE_DAEMON_DEFAULT_RUN_DIR_PATH else runFilesPath
?: runFilesPath.takeUnless { it.isBlank() }
?: COMPILE_DAEMON_DEFAULT_RUN_DIR_PATH
fun Iterable<String>.distinctStringsDigest(): ByteArray = fun Iterable<String>.distinctStringsDigest(): ByteArray =
MessageDigest.getInstance(CLASSPATH_ID_DIGEST) MessageDigest.getInstance(CLASSPATH_ID_DIGEST)
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.jps.build
import org.jetbrains.jps.builders.JpsBuildTestCase import org.jetbrains.jps.builders.JpsBuildTestCase
import org.jetbrains.jps.model.library.JpsLibrary import org.jetbrains.jps.model.library.JpsLibrary
import org.jetbrains.kotlin.compilerRunner.JpsKotlinCompilerRunner
abstract class BaseKotlinJpsBuildTestCase : JpsBuildTestCase() { abstract class BaseKotlinJpsBuildTestCase : JpsBuildTestCase() {
@Throws(Exception::class) @Throws(Exception::class)
@@ -32,6 +33,7 @@ abstract class BaseKotlinJpsBuildTestCase : JpsBuildTestCase() {
super.tearDown() super.tearDown()
myModel = null myModel = null
myBuildParams.clear() myBuildParams.clear()
JpsKotlinCompilerRunner.releaseCompileServiceSession()
} }
private val libraries = mutableMapOf<String, JpsLibrary>() private val libraries = mutableMapOf<String, JpsLibrary>()
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.compilerRunner package org.jetbrains.kotlin.compilerRunner
import com.intellij.util.xmlb.XmlSerializerUtil import com.intellij.util.xmlb.XmlSerializerUtil
import org.jetbrains.annotations.TestOnly
import org.jetbrains.jps.api.GlobalOptions import org.jetbrains.jps.api.GlobalOptions
import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY
@@ -52,16 +53,22 @@ class JpsKotlinCompilerRunner {
@Volatile @Volatile
private var _jpsCompileServiceSession: CompileServiceSession? = null private var _jpsCompileServiceSession: CompileServiceSession? = null
@TestOnly
fun releaseCompileServiceSession() {
_jpsCompileServiceSession?.let {
try {
it.compileService.releaseCompileSession(it.sessionId)
} catch (_: Throwable) {
}
}
_jpsCompileServiceSession = null
}
@Synchronized @Synchronized
private fun getOrCreateDaemonConnection(newConnection: () -> CompileServiceSession?): CompileServiceSession? { private fun getOrCreateDaemonConnection(newConnection: () -> CompileServiceSession?): CompileServiceSession? {
// TODO: consider adding state "ping" to the daemon interface // TODO: consider adding state "ping" to the daemon interface
if (_jpsCompileServiceSession == null || _jpsCompileServiceSession!!.compileService.getDaemonOptions() !is CompileService.CallResult.Good<DaemonOptions>) { if (_jpsCompileServiceSession == null || _jpsCompileServiceSession!!.compileService.getDaemonOptions() !is CompileService.CallResult.Good<DaemonOptions>) {
_jpsCompileServiceSession?.let { releaseCompileServiceSession()
try {
it.compileService.releaseCompileSession(it.sessionId)
} catch (_: Throwable) {
}
}
_jpsCompileServiceSession = newConnection() _jpsCompileServiceSession = newConnection()
} }
@@ -180,7 +187,7 @@ class JpsKotlinCompilerRunner {
compilerClassName: String, compilerClassName: String,
compilerArgs: CommonCompilerArguments, compilerArgs: CommonCompilerArguments,
environment: JpsCompilerEnvironment environment: JpsCompilerEnvironment
) { ): Int? {
val targetPlatform = when (compilerClassName) { val targetPlatform = when (compilerClassName) {
KotlinCompilerClass.JVM -> CompileService.TargetPlatform.JVM KotlinCompilerClass.JVM -> CompileService.TargetPlatform.JVM
KotlinCompilerClass.JS -> CompileService.TargetPlatform.JS KotlinCompilerClass.JS -> CompileService.TargetPlatform.JS
@@ -196,7 +203,7 @@ class JpsKotlinCompilerRunner {
reportSeverity(verbose), reportSeverity(verbose),
requestedCompilationResults = emptyArray() requestedCompilationResults = emptyArray()
) )
doWithDaemon(environment) { sessionId, daemon -> return doWithDaemon(environment) { sessionId, daemon ->
environment.withProgressReporter { progress -> environment.withProgressReporter { progress ->
progress.compilationStarted() progress.compilationStarted()
daemon.compile( daemon.compile(
@@ -265,7 +272,7 @@ class JpsKotlinCompilerRunner {
environment: JpsCompilerEnvironment environment: JpsCompilerEnvironment
) { ) {
if ("true" == System.getProperty("kotlin.jps.tests") && "true" == System.getProperty(FAIL_ON_FALLBACK_PROPERTY)) { if ("true" == System.getProperty("kotlin.jps.tests") && "true" == System.getProperty(FAIL_ON_FALLBACK_PROPERTY)) {
error("Fallback strategy is disabled in tests!") error("Cannot compile with Daemon, see logs bellow. Fallback strategy is disabled in tests")
} }
// otherwise fallback to in-process // otherwise fallback to in-process