[Daemon] Add test for KT-55322
This commit is contained in:
committed by
Space Team
parent
b8d1398bdb
commit
628f6e981d
+108
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.daemon
|
||||
|
||||
import org.jetbrains.kotlin.cli.common.CompilerSystemProperties
|
||||
import org.jetbrains.kotlin.daemon.client.CompileServiceSession
|
||||
import org.jetbrains.kotlin.daemon.client.DaemonReportingTargets
|
||||
import org.jetbrains.kotlin.daemon.client.KotlinCompilerClient
|
||||
import org.jetbrains.kotlin.daemon.common.CompileService
|
||||
import org.jetbrains.kotlin.daemon.common.CompilerId
|
||||
import org.jetbrains.kotlin.daemon.common.DaemonJVMOptions
|
||||
import org.jetbrains.kotlin.daemon.common.DaemonOptions
|
||||
import org.jetbrains.kotlin.integration.KotlinIntegrationTestBase
|
||||
import org.jetbrains.kotlin.test.util.KtTestUtil
|
||||
import org.jetbrains.kotlin.utils.KotlinPaths
|
||||
import org.junit.jupiter.api.AfterEach
|
||||
import org.junit.jupiter.api.io.TempDir
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
* Use this class as the base for tests that lease daemon sessions.
|
||||
*
|
||||
* It provides you with the [leaseSession] method that leases a session and registers it, so at the end of the test's execution
|
||||
* the daemon will be shut down.
|
||||
*
|
||||
* [LastSessionDaemonTest] is an example of such a test suit.
|
||||
*/
|
||||
abstract class BaseDaemonSessionTest {
|
||||
@TempDir
|
||||
lateinit var workingDirectory: File
|
||||
|
||||
private val compilerClassPath = KotlinIntegrationTestBase.getKotlinPaths().classPath(KotlinPaths.ClassPaths.Compiler)
|
||||
|
||||
private val compilerId by lazy(LazyThreadSafetyMode.NONE) { CompilerId.makeCompilerId(compilerClassPath) }
|
||||
|
||||
private val compileServices = mutableSetOf<CompileService>()
|
||||
|
||||
val outputDirectory
|
||||
get() = workingDirectory.resolve("output")
|
||||
|
||||
open val defaultDaemonOptions
|
||||
get() = DaemonOptions(
|
||||
File(workingDirectory, "daemon-files").absolutePath,
|
||||
shutdownDelayMilliseconds = 0,
|
||||
autoshutdownUnusedSeconds = 1,
|
||||
autoshutdownIdleSeconds = 1,
|
||||
)
|
||||
|
||||
open val defaultDaemonJvmOptions
|
||||
get() = DaemonJVMOptions(
|
||||
maxMemory = "384m"
|
||||
)
|
||||
|
||||
@AfterEach
|
||||
fun stopDaemons() {
|
||||
for (compileService in compileServices) {
|
||||
runCatching { compileService.shutdown() }
|
||||
}
|
||||
Thread.sleep(500) // wait a bit so that all the daemons are shut down
|
||||
}
|
||||
|
||||
fun getHelloAppBaseDir(): String = KtTestUtil.getTestDataPathBase() + "/integration/smoke/helloApp"
|
||||
|
||||
private fun DaemonJVMOptions.withLogFile(logFile: File) = copy(
|
||||
jvmParams = (jvmParams + "D${CompilerSystemProperties.COMPILE_DAEMON_LOG_PATH_PROPERTY.property}=\"${logFile.loggerCompatiblePath}\"").toMutableList()
|
||||
)
|
||||
|
||||
fun leaseSession(
|
||||
clientMarkerFile: File = workingDirectory.resolve("client.alive"),
|
||||
sessionMarkerFile: File = workingDirectory.resolve("session.alive"),
|
||||
jvmOptions: DaemonJVMOptions = defaultDaemonJvmOptions,
|
||||
daemonOptions: DaemonOptions = defaultDaemonOptions,
|
||||
logFile: File? = null,
|
||||
): CompileServiceSession {
|
||||
val actualJvmOptions = logFile?.let { jvmOptions.withLogFile(it) } ?: jvmOptions
|
||||
println("Leasing a session with $actualJvmOptions and $daemonOptions")
|
||||
clientMarkerFile.createNewFile()
|
||||
sessionMarkerFile.createNewFile()
|
||||
logFile?.createNewFile()
|
||||
return KotlinCompilerClient.connectAndLease(
|
||||
compilerId,
|
||||
clientMarkerFile,
|
||||
actualJvmOptions,
|
||||
daemonOptions,
|
||||
DaemonReportingTargets(out = System.err),
|
||||
autostart = true,
|
||||
leaseSession = true,
|
||||
sessionAliveFlagFile = sessionMarkerFile,
|
||||
)?.also { compileServices.add(it.compileService) } ?: error("failed to connect daemon")
|
||||
}
|
||||
}
|
||||
|
||||
fun File.assertLogFileContains(vararg substrings: String) {
|
||||
val text = readText()
|
||||
val notFound = substrings.filterNot { it in text }
|
||||
assert(notFound.isEmpty()) {
|
||||
"""
|
||||
|$this does not contain the following substrings:
|
||||
|${notFound.joinToString(System.lineSeparator())}
|
||||
|
|
||||
|The whole file content:
|
||||
|$text
|
||||
""".trimMargin()
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.daemon
|
||||
|
||||
import org.jetbrains.kotlin.daemon.client.KotlinCompilerClient
|
||||
import org.jetbrains.kotlin.daemon.common.CompileService
|
||||
import org.junit.jupiter.api.Disabled
|
||||
import org.junit.jupiter.api.DisplayName
|
||||
import org.junit.jupiter.api.Test
|
||||
import java.io.File
|
||||
import java.lang.Thread.sleep
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
@DisplayName("Compiler daemon operations test in the LastSession mode")
|
||||
class LastSessionDaemonTest : BaseDaemonSessionTest() {
|
||||
private val logFile
|
||||
get() = workingDirectory.resolve("daemon.log")
|
||||
|
||||
@DisplayName("Already leased session can perform compilation")
|
||||
@Test
|
||||
fun canCompileInLastSessionMode() {
|
||||
val (compileService, sessionId) = leaseSession(logFile = logFile)
|
||||
sleep(DAEMON_PERIODIC_CHECK_INTERVAL_MS + 1_000)
|
||||
logFile.assertLogFileContains("Some sessions are active, waiting for them to finish")
|
||||
val testMessageCollector = TestMessageCollector()
|
||||
val exitCode = KotlinCompilerClient.compile(
|
||||
compileService,
|
||||
sessionId,
|
||||
CompileService.TargetPlatform.JVM,
|
||||
arrayOf("-include-runtime", File(getHelloAppBaseDir(), "hello.kt").absolutePath, "-d", outputDirectory.absolutePath),
|
||||
testMessageCollector
|
||||
)
|
||||
assertEquals(0, exitCode)
|
||||
}
|
||||
|
||||
@Disabled("KT-55322")
|
||||
@DisplayName("can lease a session when the daemon in the LastSession state") // either by starting a new daemon or returning it to the Alive state
|
||||
@Test
|
||||
fun canLeaseNewSession() {
|
||||
leaseSession(logFile = logFile)
|
||||
sleep(DAEMON_PERIODIC_CHECK_INTERVAL_MS + 1_000)
|
||||
logFile.assertLogFileContains("Some sessions are active, waiting for them to finish")
|
||||
// trying to lease a session with the same config again
|
||||
leaseSession(logFile = logFile)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user