[BTA tests] Move GlobalCompiledProjectsCache to a separate file

^KT-61860 In Progress
This commit is contained in:
Alexander.Likhachev
2024-03-05 22:35:56 +01:00
committed by Space Team
parent 99e13318dc
commit 4facf5ffbc
2 changed files with 78 additions and 59 deletions
@@ -0,0 +1,74 @@
/*
* Copyright 2010-2024 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.buildtools.api.tests.compilation.scenario
import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration
import org.jetbrains.kotlin.buildtools.api.SourcesChanges
import org.jetbrains.kotlin.buildtools.api.jvm.IncrementalJvmCompilationConfiguration
import org.jetbrains.kotlin.buildtools.api.jvm.JvmCompilationConfiguration
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.DependencyScenarioDslCacheKey
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.Module
import java.nio.file.Files
import java.nio.file.Path
import java.util.*
import kotlin.io.path.copyToRecursively
import kotlin.io.path.isRegularFile
import kotlin.io.path.relativeTo
import kotlin.io.path.walk
private data class GlobalCompiledProjectsCacheKey(
val moduleKey: DependencyScenarioDslCacheKey,
val compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
val incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
)
internal object GlobalCompiledProjectsCache {
private val globalTempDirectory = Files.createTempDirectory("compiled-test-projects-cache").apply {
toFile().deleteOnExit()
}
private val compiledProjectsCache = mutableMapOf<GlobalCompiledProjectsCacheKey, Pair<MutableSet<String>, Path>>()
fun getProjectFromCache(
module: Module,
strategyConfig: CompilerExecutionStrategyConfiguration,
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
): ScenarioModuleImpl? {
val (initialOutputs, cachedBuildDirPath) = compiledProjectsCache[GlobalCompiledProjectsCacheKey(
module.scenarioDslCacheKey,
compilationOptionsModifier,
incrementalCompilationOptionsModifier
)] ?: return null
cachedBuildDirPath.copyToRecursively(module.buildDirectory, followLinks = false, overwrite = true)
return ScenarioModuleImpl(module, initialOutputs, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier)
}
fun putProjectIntoCache(
module: Module,
strategyConfig: CompilerExecutionStrategyConfiguration,
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
): ScenarioModuleImpl {
module.compileIncrementally(
SourcesChanges.Unknown,
strategyConfig,
compilationConfigAction = { compilationOptionsModifier?.invoke(it) },
incrementalCompilationConfigAction = { incrementalCompilationOptionsModifier?.invoke(it) }
)
val initialOutputs = mutableSetOf<String>()
for (file in module.outputDirectory.walk()) {
if (!file.isRegularFile()) continue
initialOutputs.add(file.relativeTo(module.outputDirectory).toString())
}
val moduleCacheDirectory = globalTempDirectory.resolve(UUID.randomUUID().toString())
module.buildDirectory.copyToRecursively(moduleCacheDirectory, followLinks = false, overwrite = false)
compiledProjectsCache[GlobalCompiledProjectsCacheKey(
module.scenarioDslCacheKey,
compilationOptionsModifier,
incrementalCompilationOptionsModifier
)] = Pair(initialOutputs, moduleCacheDirectory)
return ScenarioModuleImpl(module, initialOutputs, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier)
}
}
@@ -16,9 +16,9 @@ import java.nio.file.Path
import java.util.*
import kotlin.io.path.*
private class ScenarioModuleImpl(
val module: Module,
val outputs: MutableSet<String>,
internal class ScenarioModuleImpl(
internal val module: Module,
private val outputs: MutableSet<String>,
private val strategyConfig: CompilerExecutionStrategyConfiguration,
private val compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
private val incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
@@ -59,7 +59,7 @@ private class ScenarioModuleImpl(
)
}
var sourcesChanges = SourcesChanges.Known(emptyList(), emptyList())
private var sourcesChanges = SourcesChanges.Known(emptyList(), emptyList())
override fun compile(
forceOutput: LogLevel?,
@@ -100,59 +100,4 @@ private class ScenarioDsl(
fun BaseCompilationTest.scenario(strategyConfig: CompilerExecutionStrategyConfiguration, action: Scenario.() -> Unit) {
action(ScenarioDsl(Project(strategyConfig, workingDirectory), strategyConfig))
}
private data class GlobalCompiledProjectsCacheKey(
val moduleKey: DependencyScenarioDslCacheKey,
val compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
val incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
)
private object GlobalCompiledProjectsCache {
private val globalTempDirectory = Files.createTempDirectory("compiled-test-projects-cache").apply {
toFile().deleteOnExit()
}
private val compiledProjectsCache = mutableMapOf<GlobalCompiledProjectsCacheKey, Pair<MutableSet<String>, Path>>()
fun getProjectFromCache(
module: Module,
strategyConfig: CompilerExecutionStrategyConfiguration,
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
): ScenarioModuleImpl? {
val (initialOutputs, cachedBuildDirPath) = compiledProjectsCache[GlobalCompiledProjectsCacheKey(
module.scenarioDslCacheKey,
compilationOptionsModifier,
incrementalCompilationOptionsModifier
)] ?: return null
cachedBuildDirPath.copyToRecursively(module.buildDirectory, followLinks = false, overwrite = true)
return ScenarioModuleImpl(module, initialOutputs, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier)
}
fun putProjectIntoCache(
module: Module,
strategyConfig: CompilerExecutionStrategyConfiguration,
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
): ScenarioModuleImpl {
module.compileIncrementally(
SourcesChanges.Unknown,
strategyConfig,
compilationConfigAction = { compilationOptionsModifier?.invoke(it) },
incrementalCompilationConfigAction = { incrementalCompilationOptionsModifier?.invoke(it) }
)
val initialOutputs = mutableSetOf<String>()
for (file in module.outputDirectory.walk()) {
if (!file.isRegularFile()) continue
initialOutputs.add(file.relativeTo(module.outputDirectory).toString())
}
val moduleCacheDirectory = globalTempDirectory.resolve(UUID.randomUUID().toString())
module.buildDirectory.copyToRecursively(moduleCacheDirectory, followLinks = false, overwrite = false)
compiledProjectsCache[GlobalCompiledProjectsCacheKey(
module.scenarioDslCacheKey,
compilationOptionsModifier,
incrementalCompilationOptionsModifier
)] = Pair(initialOutputs, moduleCacheDirectory)
return ScenarioModuleImpl(module, initialOutputs, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier)
}
}