[BTA tests] Allow passing strategy config once to Project instance

^KT-61860 In Progress
This commit is contained in:
Alexander.Likhachev
2024-03-05 22:24:57 +01:00
committed by Space Team
parent f634f9dacf
commit 99e13318dc
8 changed files with 31 additions and 26 deletions
@@ -43,6 +43,7 @@ abstract class AbstractModule(
final override val moduleName: String, final override val moduleName: String,
val moduleDirectory: Path, val moduleDirectory: Path,
val dependencies: List<Dependency>, val dependencies: List<Dependency>,
override val defaultStrategyConfig: CompilerExecutionStrategyConfiguration,
final override val additionalCompilationArguments: List<String> = emptyList(), final override val additionalCompilationArguments: List<String> = emptyList(),
) : Module { ) : Module {
override val sourcesDirectory: Path override val sourcesDirectory: Path
@@ -23,12 +23,14 @@ class JvmModule(
moduleName: String, moduleName: String,
moduleDirectory: Path, moduleDirectory: Path,
dependencies: List<Dependency>, dependencies: List<Dependency>,
defaultStrategyConfig: CompilerExecutionStrategyConfiguration,
additionalCompilationArguments: List<String> = emptyList(), additionalCompilationArguments: List<String> = emptyList(),
) : AbstractModule( ) : AbstractModule(
project, project,
moduleName, moduleName,
moduleDirectory, moduleDirectory,
dependencies, dependencies,
defaultStrategyConfig,
additionalCompilationArguments, additionalCompilationArguments,
) { ) {
override fun compileImpl( override fun compileImpl(
@@ -75,8 +77,8 @@ class JvmModule(
} }
override fun compileIncrementally( override fun compileIncrementally(
strategyConfig: CompilerExecutionStrategyConfiguration,
sourcesChanges: SourcesChanges, sourcesChanges: SourcesChanges,
strategyConfig: CompilerExecutionStrategyConfiguration,
forceOutput: LogLevel?, forceOutput: LogLevel?,
forceNonIncrementalCompilation: Boolean, forceNonIncrementalCompilation: Boolean,
compilationConfigAction: (JvmCompilationConfiguration) -> Unit, compilationConfigAction: (JvmCompilationConfiguration) -> Unit,
@@ -46,16 +46,18 @@ interface Module : Dependency {
*/ */
val icCachesDir: Path val icCachesDir: Path
val defaultStrategyConfig: CompilerExecutionStrategyConfiguration
fun compile( fun compile(
strategyConfig: CompilerExecutionStrategyConfiguration, strategyConfig: CompilerExecutionStrategyConfiguration = defaultStrategyConfig,
forceOutput: LogLevel? = null, forceOutput: LogLevel? = null,
compilationConfigAction: (JvmCompilationConfiguration) -> Unit = {}, compilationConfigAction: (JvmCompilationConfiguration) -> Unit = {},
assertions: context(Module) CompilationOutcome.() -> Unit = {}, assertions: context(Module) CompilationOutcome.() -> Unit = {},
): CompilationResult ): CompilationResult
fun compileIncrementally( fun compileIncrementally(
strategyConfig: CompilerExecutionStrategyConfiguration,
sourcesChanges: SourcesChanges, sourcesChanges: SourcesChanges,
strategyConfig: CompilerExecutionStrategyConfiguration = defaultStrategyConfig,
forceOutput: LogLevel? = null, forceOutput: LogLevel? = null,
forceNonIncrementalCompilation: Boolean = false, forceNonIncrementalCompilation: Boolean = false,
compilationConfigAction: (JvmCompilationConfiguration) -> Unit = {}, compilationConfigAction: (JvmCompilationConfiguration) -> Unit = {},
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.buildtools.api.tests.compilation.model package org.jetbrains.kotlin.buildtools.api.tests.compilation.model
import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration
import org.jetbrains.kotlin.buildtools.api.ProjectId import org.jetbrains.kotlin.buildtools.api.ProjectId
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths import java.nio.file.Paths
@@ -14,6 +15,7 @@ import kotlin.io.path.createDirectories
import kotlin.io.path.isDirectory import kotlin.io.path.isDirectory
class Project( class Project(
val defaultStrategyConfig: CompilerExecutionStrategyConfiguration,
val projectDirectory: Path, val projectDirectory: Path,
) { ) {
val projectId = ProjectId.ProjectUUID(UUID.randomUUID()) val projectId = ProjectId.ProjectUUID(UUID.randomUUID())
@@ -24,7 +26,7 @@ class Project(
additionalCompilationArguments: List<String> = emptyList(), additionalCompilationArguments: List<String> = emptyList(),
): Module { ): Module {
val moduleDirectory = projectDirectory.resolve(moduleName) val moduleDirectory = projectDirectory.resolve(moduleName)
val module = JvmModule(this, moduleName, moduleDirectory, dependencies, additionalCompilationArguments) val module = JvmModule(this, moduleName, moduleDirectory, dependencies, defaultStrategyConfig, additionalCompilationArguments)
module.sourcesDirectory.createDirectories() module.sourcesDirectory.createDirectories()
val templatePath = Paths.get("src/main/resources/modules/$moduleName") val templatePath = Paths.get("src/main/resources/modules/$moduleName")
assert(templatePath.isDirectory()) { assert(templatePath.isDirectory()) {
@@ -39,8 +41,8 @@ class Project(
} }
} }
fun BaseCompilationTest.project(action: Project.() -> Unit) { fun BaseCompilationTest.project(strategyConfig: CompilerExecutionStrategyConfiguration, action: Project.() -> Unit) {
Project(workingDirectory).apply { Project(strategyConfig, workingDirectory).apply {
action() action()
endCompilationRound() endCompilationRound()
} }
@@ -66,8 +66,8 @@ private class ScenarioModuleImpl(
assertions: context(Module) CompilationOutcome.() -> Unit, assertions: context(Module) CompilationOutcome.() -> Unit,
) { ) {
module.compileIncrementally( module.compileIncrementally(
strategyConfig,
sourcesChanges, sourcesChanges,
strategyConfig,
forceOutput, forceOutput,
compilationConfigAction = { compilationOptionsModifier?.invoke(it) }, compilationConfigAction = { compilationOptionsModifier?.invoke(it) },
incrementalCompilationConfigAction = { incrementalCompilationOptionsModifier?.invoke(it) }, incrementalCompilationConfigAction = { incrementalCompilationOptionsModifier?.invoke(it) },
@@ -91,14 +91,15 @@ private class ScenarioDsl(
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
): ScenarioModule { ): ScenarioModule {
val transformedDependencies = dependencies.map { (it as ScenarioModuleImpl).module } val transformedDependencies = dependencies.map { (it as ScenarioModuleImpl).module }
val module = project.module(moduleName, transformedDependencies, additionalCompilationArguments) val module =
project.module(moduleName, transformedDependencies, additionalCompilationArguments)
return GlobalCompiledProjectsCache.getProjectFromCache(module, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier) return GlobalCompiledProjectsCache.getProjectFromCache(module, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier)
?: GlobalCompiledProjectsCache.putProjectIntoCache(module, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier) ?: GlobalCompiledProjectsCache.putProjectIntoCache(module, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier)
} }
} }
fun BaseCompilationTest.scenario(strategyConfig: CompilerExecutionStrategyConfiguration, action: Scenario.() -> Unit) { fun BaseCompilationTest.scenario(strategyConfig: CompilerExecutionStrategyConfiguration, action: Scenario.() -> Unit) {
action(ScenarioDsl(Project(workingDirectory), strategyConfig)) action(ScenarioDsl(Project(strategyConfig, workingDirectory), strategyConfig))
} }
private data class GlobalCompiledProjectsCacheKey( private data class GlobalCompiledProjectsCacheKey(
@@ -135,8 +136,8 @@ private object GlobalCompiledProjectsCache {
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
): ScenarioModuleImpl { ): ScenarioModuleImpl {
module.compileIncrementally( module.compileIncrementally(
strategyConfig,
SourcesChanges.Unknown, SourcesChanges.Unknown,
strategyConfig,
compilationConfigAction = { compilationOptionsModifier?.invoke(it) }, compilationConfigAction = { compilationOptionsModifier?.invoke(it) },
incrementalCompilationConfigAction = { incrementalCompilationOptionsModifier?.invoke(it) } incrementalCompilationConfigAction = { incrementalCompilationOptionsModifier?.invoke(it) }
) )
@@ -20,14 +20,14 @@ class ExampleCompatibilityCompilationTest : BaseCompilationTest() {
@DisplayName("Sample compatibility compilation test that is run as part of each test suit") @DisplayName("Sample compatibility compilation test that is run as part of each test suit")
@TestMetadata("jvm-module-1") @TestMetadata("jvm-module-1")
fun testCompatibilityCompilation(strategyConfig: CompilerExecutionStrategyConfiguration) { fun testCompatibilityCompilation(strategyConfig: CompilerExecutionStrategyConfiguration) {
project { project(strategyConfig) {
val module1 = module("jvm-module-1") val module1 = module("jvm-module-1")
val module2 = module("jvm-module-2", listOf(module1)) val module2 = module("jvm-module-2", listOf(module1))
module1.compile(strategyConfig) { module1.compile {
assertOutputs("FooKt.class", "Bar.class", "BazKt.class") assertOutputs("FooKt.class", "Bar.class", "BazKt.class")
} }
module2.compile(strategyConfig) { module2.compile {
assertOutputs("AKt.class", "BKt.class") assertOutputs("AKt.class", "BKt.class")
} }
} }
@@ -23,16 +23,15 @@ class ExampleIncrementalCompilationTest : BaseCompilationTest() {
@DefaultStrategyAgnosticCompilationTest @DefaultStrategyAgnosticCompilationTest
@TestMetadata("jvm-module-1") @TestMetadata("jvm-module-1")
fun testSingleModule(strategyConfig: CompilerExecutionStrategyConfiguration) { fun testSingleModule(strategyConfig: CompilerExecutionStrategyConfiguration) {
project { project(strategyConfig) {
val module1 = module("jvm-module-1") val module1 = module("jvm-module-1")
module1.compileIncrementally(strategyConfig, SourcesChanges.Unknown) module1.compileIncrementally(SourcesChanges.Unknown)
val fooKt = module1.sourcesDirectory.resolve("foo.kt") val fooKt = module1.sourcesDirectory.resolve("foo.kt")
fooKt.writeText(fooKt.readText().replace("foo()", "foo(i: Int = 1)")) fooKt.writeText(fooKt.readText().replace("foo()", "foo(i: Int = 1)"))
module1.compileIncrementally( module1.compileIncrementally(
strategyConfig,
SourcesChanges.Known(modifiedFiles = listOf(fooKt.toFile()), removedFiles = emptyList()), SourcesChanges.Known(modifiedFiles = listOf(fooKt.toFile()), removedFiles = emptyList()),
) { ) {
assertCompiledSources("foo.kt", "bar.kt") assertCompiledSources("foo.kt", "bar.kt")
@@ -45,18 +44,17 @@ class ExampleIncrementalCompilationTest : BaseCompilationTest() {
@DefaultStrategyAgnosticCompilationTest @DefaultStrategyAgnosticCompilationTest
@TestMetadata("jvm-module-1") @TestMetadata("jvm-module-1")
fun testTwoModules(strategyConfig: CompilerExecutionStrategyConfiguration) { fun testTwoModules(strategyConfig: CompilerExecutionStrategyConfiguration) {
project { project(strategyConfig) {
val module1 = module("jvm-module-1") val module1 = module("jvm-module-1")
val module2 = module("jvm-module-2", listOf(module1)) val module2 = module("jvm-module-2", listOf(module1))
module1.compileIncrementally(strategyConfig, SourcesChanges.Unknown) module1.compileIncrementally(SourcesChanges.Unknown)
module2.compileIncrementally(strategyConfig, SourcesChanges.Unknown) module2.compileIncrementally(SourcesChanges.Unknown)
val barKt = module1.sourcesDirectory.resolve("bar.kt") val barKt = module1.sourcesDirectory.resolve("bar.kt")
barKt.writeText(barKt.readText().replace("bar()", "bar(i: Int = 1)")) barKt.writeText(barKt.readText().replace("bar()", "bar(i: Int = 1)"))
module1.compileIncrementally( module1.compileIncrementally(
strategyConfig,
SourcesChanges.Known(modifiedFiles = listOf(barKt.toFile()), removedFiles = emptyList()), SourcesChanges.Known(modifiedFiles = listOf(barKt.toFile()), removedFiles = emptyList()),
incrementalCompilationConfigAction = { incrementalCompilationConfigAction = {
it.keepIncrementalCompilationCachesInMemory(false) it.keepIncrementalCompilationCachesInMemory(false)
@@ -64,7 +62,6 @@ class ExampleIncrementalCompilationTest : BaseCompilationTest() {
) )
module2.compileIncrementally( module2.compileIncrementally(
strategyConfig,
SourcesChanges.Known(modifiedFiles = emptyList(), removedFiles = emptyList()) SourcesChanges.Known(modifiedFiles = emptyList(), removedFiles = emptyList())
) { ) {
assertCompiledSources("b.kt") assertCompiledSources("b.kt")
@@ -19,14 +19,14 @@ class ExampleNonIncrementalCompilationTest : BaseCompilationTest() {
@DisplayName("Sample non-incremental compilation test with two modules") @DisplayName("Sample non-incremental compilation test with two modules")
@DefaultStrategyAgnosticCompilationTest @DefaultStrategyAgnosticCompilationTest
fun myTest(strategyConfig: CompilerExecutionStrategyConfiguration) { fun myTest(strategyConfig: CompilerExecutionStrategyConfiguration) {
project { project(strategyConfig) {
val module1 = module("jvm-module-1") val module1 = module("jvm-module-1")
val module2 = module("jvm-module-2", listOf(module1)) val module2 = module("jvm-module-2", listOf(module1))
module1.compile(strategyConfig) { module1.compile {
assertOutputs("FooKt.class", "Bar.class", "BazKt.class") assertOutputs("FooKt.class", "Bar.class", "BazKt.class")
} }
module2.compile(strategyConfig) { module2.compile {
assertOutputs("AKt.class", "BKt.class") assertOutputs("AKt.class", "BKt.class")
} }
} }
@@ -35,12 +35,12 @@ class ExampleNonIncrementalCompilationTest : BaseCompilationTest() {
@DisplayName("Sample non-incremental compilation test with a single module and a compilation error") @DisplayName("Sample non-incremental compilation test with a single module and a compilation error")
@DefaultStrategyAgnosticCompilationTest @DefaultStrategyAgnosticCompilationTest
fun failedCompilationTest(strategyConfig: CompilerExecutionStrategyConfiguration) { fun failedCompilationTest(strategyConfig: CompilerExecutionStrategyConfiguration) {
project { project(strategyConfig) {
val module1 = module("jvm-module-1") val module1 = module("jvm-module-1")
module1.sourcesDirectory.resolve("bar.kt").writeText("aaaa") module1.sourcesDirectory.resolve("bar.kt").writeText("aaaa")
module1.compile(strategyConfig) { module1.compile {
expectFail() expectFail()
assertLogContainsPatterns(LogLevel.ERROR, ".*bar\\.kt:1:1 Syntax error: Expecting a top level declaration.*".toRegex()) assertLogContainsPatterns(LogLevel.ERROR, ".*bar\\.kt:1:1 Syntax error: Expecting a top level declaration.*".toRegex())
} }