Organize integration tests for incremental Kotlin compile

Refactor common code into new abstract class
IncrementalCompilationBaseIT to make the code cleaner and easier to
evolve.

Also add a few missing key scenarios for ABI and non-ABI changes in
Kotlin files, and make it consistent with the test for changes in Java
files.

Bug: KT-45777
Test: Updating them
This commit is contained in:
Hung Nguyen
2021-05-17 11:47:08 +01:00
committed by nataliya.valtman
parent f3c9bd16ee
commit df14deb5a0
3 changed files with 100 additions and 88 deletions
@@ -0,0 +1,45 @@
/*
* Copyright 2010-2021 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.gradle
import org.jetbrains.kotlin.gradle.util.getFileByName
import org.jetbrains.kotlin.gradle.util.getFilesByNames
import org.jetbrains.kotlin.gradle.util.modify
abstract class IncrementalCompilationBaseIT : BaseGradleIT() {
protected abstract fun defaultProject(): Project
protected fun doTest(
fileToModify: String,
modifyFileContents: (String) -> String,
expectedAffectedFileNames: Collection<String>,
) {
doTest(
{ it.projectDir.getFileByName(fileToModify).modify(modifyFileContents) },
expectedAffectedFileNames
)
}
protected fun doTest(
modifyProject: (Project) -> Unit,
expectedAffectedFileNames: Collection<String>,
) {
val project = defaultProject()
project.build("build") {
assertSuccessful()
}
modifyProject(project)
project.build("build") {
assertSuccessful()
val expectedAffectedFiles = project.projectDir.getFilesByNames(*expectedAffectedFileNames.toTypedArray())
val expectedAffectedFileRelativePaths = project.relativize(expectedAffectedFiles)
assertCompiledKotlinSources(expectedAffectedFileRelativePaths)
}
}
}
@@ -145,57 +145,48 @@ class IncrementalCompilationFirJvmMultiProjectIT : IncrementalCompilationJvmMult
}
}
abstract class BaseIncrementalCompilationMultiProjectIT : BaseGradleIT() {
abstract class BaseIncrementalCompilationMultiProjectIT : IncrementalCompilationBaseIT() {
override fun defaultBuildOptions(): BuildOptions =
super.defaultBuildOptions().copy(withDaemon = true, incremental = true)
protected abstract fun defaultProject(): Project
@Test
fun testMoveFunctionFromLib() {
val project = defaultProject()
project.build("build") {
assertSuccessful()
}
val barUseABKt = project.projectDir.getFileByName("barUseAB.kt")
val barInApp = File(project.projectDir, "app/src/main/kotlin/bar").apply { mkdirs() }
barUseABKt.copyTo(File(barInApp, barUseABKt.name))
barUseABKt.delete()
project.build("build") {
assertSuccessful()
val affectedSources = project.projectDir.getFilesByNames("fooCallUseAB.kt", "barUseAB.kt")
val relativePaths = project.relativize(affectedSources)
assertCompiledKotlinSources(relativePaths)
}
fun testAbiChangeInLib_changeMethodSignature() {
doTest(
"A.kt",
{ it.replace("fun a() {}", "fun a(): Int = 1") },
expectedAffectedFileNames = listOf("A.kt", "B.kt", "AA.kt", "AAA.kt", "BB.kt", "barUseA.kt", "fooUseA.kt")
)
}
@Test
fun testAddNewMethodToLib() {
val project = defaultProject()
project.build("build") {
assertSuccessful()
}
val aKt = project.projectDir.getFileByName("A.kt")
aKt.writeText(
"""
package bar
open class A {
fun a() {}
fun newA() {}
}
"""
fun testAbiChangeInLib_addNewMethod() {
doTest(
"A.kt",
{ it.replace("fun a() {}", "fun a() {}\nfun newA() {}") },
expectedAffectedFileNames = listOf("A.kt", "B.kt", "AA.kt", "AAA.kt", "BB.kt")
)
}
project.build("build") {
assertSuccessful()
val affectedSources = project.projectDir.getFilesByNames("A.kt", "B.kt", "AA.kt", "AAA.kt", "BB.kt")
val relativePaths = project.relativize(affectedSources)
assertCompiledKotlinSources(relativePaths)
}
@Test
fun testNonAbiChangeInLib_changeMethodBody() {
doTest(
"A.kt",
{ it.replace("fun a() {}", "fun a() { println() }") },
expectedAffectedFileNames = listOf("A.kt")
)
}
@Test
fun testMoveFunctionFromLibToApp() {
doTest(
{ project ->
val barUseABKt = project.projectDir.getFileByName("barUseAB.kt")
val barInApp = File(project.projectDir, "app/src/main/kotlin/bar").apply { mkdirs() }
barUseABKt.copyTo(File(barInApp, barUseABKt.name))
barUseABKt.delete()
},
expectedAffectedFileNames = listOf("fooCallUseAB.kt", "barUseAB.kt")
)
}
@Test
@@ -5,41 +5,38 @@
package org.jetbrains.kotlin.gradle
import org.jetbrains.kotlin.gradle.util.getFileByName
import org.jetbrains.kotlin.gradle.util.getFilesByNames
import org.jetbrains.kotlin.gradle.util.modify
import org.junit.Test
class IncrementalJavaChangeDefaultIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = null) {
@Test
override fun testModifySignatureTrackedJavaInLib() {
doTest(trackedJavaClass, changeSignature, expectedAffectedSources = listOf("TrackedJavaClassChild.kt", "useTrackedJavaClass.kt"))
override fun testAbiChangeInLib_changeMethodSignature_tracked() {
doTest(trackedJavaClass, changeSignature, expectedAffectedFileNames = listOf("TrackedJavaClassChild.kt", "useTrackedJavaClass.kt"))
}
@Test
override fun testModifyBodyTrackedJavaInLib() {
doTest(trackedJavaClass, changeBody, expectedAffectedSources = listOf())
override fun testNonAbiChangeInLib_changeMethodBody_tracked() {
doTest(trackedJavaClass, changeBody, expectedAffectedFileNames = listOf())
}
}
class IncrementalJavaChangePreciseIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = true) {
@Test
override fun testModifySignatureTrackedJavaInLib() {
doTest(trackedJavaClass, changeSignature, expectedAffectedSources = listOf("TrackedJavaClassChild.kt", "useTrackedJavaClass.kt"))
override fun testAbiChangeInLib_changeMethodSignature_tracked() {
doTest(trackedJavaClass, changeSignature, expectedAffectedFileNames = listOf("TrackedJavaClassChild.kt", "useTrackedJavaClass.kt"))
}
@Test
override fun testModifyBodyTrackedJavaInLib() {
doTest(trackedJavaClass, changeBody, expectedAffectedSources = listOf())
override fun testNonAbiChangeInLib_changeMethodBody_tracked() {
doTest(trackedJavaClass, changeBody, expectedAffectedFileNames = listOf())
}
}
open class IncrementalJavaChangeDisablePreciseIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = false) {
@Test
override fun testModifySignatureTrackedJavaInLib() {
override fun testAbiChangeInLib_changeMethodSignature_tracked() {
doTest(
trackedJavaClass, changeSignature,
expectedAffectedSources = listOf(
expectedAffectedFileNames = listOf(
"TrackedJavaClassChild.kt", "useTrackedJavaClass.kt", "useTrackedJavaClassFooMethodUsage.kt",
"useTrackedJavaClassSameModule.kt"
)
@@ -47,10 +44,10 @@ open class IncrementalJavaChangeDisablePreciseIT : IncrementalCompilationJavaCha
}
@Test
override fun testModifyBodyTrackedJavaInLib() {
override fun testNonAbiChangeInLib_changeMethodBody_tracked() {
doTest(
trackedJavaClass, changeBody,
expectedAffectedSources = listOf(
expectedAffectedFileNames = listOf(
"TrackedJavaClassChild.kt", "useTrackedJavaClass.kt", "useTrackedJavaClassFooMethodUsage.kt",
"useTrackedJavaClassSameModule.kt"
)
@@ -64,9 +61,11 @@ class IncrementalFirJavaChangeDisablePreciseIT : IncrementalJavaChangeDisablePre
}
}
abstract class IncrementalCompilationJavaChangesBase(val usePreciseJavaTracking: Boolean?) : BaseGradleIT() {
abstract class IncrementalCompilationJavaChangesBase(val usePreciseJavaTracking: Boolean?) : IncrementalCompilationBaseIT() {
override fun defaultProject() = Project("incrementalMultiproject")
override fun defaultBuildOptions(): BuildOptions =
super.defaultBuildOptions().copy(withDaemon = true, incremental = true)
super.defaultBuildOptions().copy(withDaemon = true, incremental = true, usePreciseJavaTracking = usePreciseJavaTracking)
protected val trackedJavaClass = "TrackedJavaClass.java"
private val javaClass = "JavaClass.java"
@@ -74,44 +73,21 @@ abstract class IncrementalCompilationJavaChangesBase(val usePreciseJavaTracking:
protected val changeSignature: (String) -> String = { it.replace("String getString", "Object getString") }
@Test
fun testModifySignatureJavaInLib() {
fun testAbiChangeInLib_changeMethodSignature() {
doTest(
javaClass, changeBody,
expectedAffectedSources = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
expectedAffectedFileNames = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
)
}
@Test
fun testModifyBodyJavaInLib() {
fun testNonAbiChangeInLib_changeMethodBody() {
doTest(
javaClass, changeBody,
expectedAffectedSources = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
expectedAffectedFileNames = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
)
}
abstract fun testModifySignatureTrackedJavaInLib()
abstract fun testModifyBodyTrackedJavaInLib()
protected fun doTest(
fileToModify: String,
transformFile: (String) -> String,
expectedAffectedSources: Collection<String>
) {
val project = Project("incrementalMultiproject")
val options = defaultBuildOptions().copy(usePreciseJavaTracking = usePreciseJavaTracking)
project.build("build", options = options) {
assertSuccessful()
}
val javaClassJava = project.projectDir.getFileByName(fileToModify)
javaClassJava.modify(transformFile)
project.build("build", options = options) {
assertSuccessful()
val affectedSources = project.projectDir.getFilesByNames(*expectedAffectedSources.toTypedArray())
val relativePaths = project.relativize(affectedSources)
assertCompiledKotlinSources(relativePaths)
}
}
abstract fun testAbiChangeInLib_changeMethodSignature_tracked()
abstract fun testNonAbiChangeInLib_changeMethodBody_tracked()
}