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:
committed by
nataliya.valtman
parent
f3c9bd16ee
commit
df14deb5a0
+45
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
+33
-42
@@ -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
|
||||
|
||||
+22
-46
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user