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 =
|
override fun defaultBuildOptions(): BuildOptions =
|
||||||
super.defaultBuildOptions().copy(withDaemon = true, incremental = true)
|
super.defaultBuildOptions().copy(withDaemon = true, incremental = true)
|
||||||
|
|
||||||
protected abstract fun defaultProject(): Project
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testMoveFunctionFromLib() {
|
fun testAbiChangeInLib_changeMethodSignature() {
|
||||||
val project = defaultProject()
|
doTest(
|
||||||
project.build("build") {
|
"A.kt",
|
||||||
assertSuccessful()
|
{ it.replace("fun a() {}", "fun a(): Int = 1") },
|
||||||
}
|
expectedAffectedFileNames = listOf("A.kt", "B.kt", "AA.kt", "AAA.kt", "BB.kt", "barUseA.kt", "fooUseA.kt")
|
||||||
|
)
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testAddNewMethodToLib() {
|
fun testAbiChangeInLib_addNewMethod() {
|
||||||
val project = defaultProject()
|
doTest(
|
||||||
project.build("build") {
|
"A.kt",
|
||||||
assertSuccessful()
|
{ it.replace("fun a() {}", "fun a() {}\nfun newA() {}") },
|
||||||
}
|
expectedAffectedFileNames = listOf("A.kt", "B.kt", "AA.kt", "AAA.kt", "BB.kt")
|
||||||
|
|
||||||
val aKt = project.projectDir.getFileByName("A.kt")
|
|
||||||
aKt.writeText(
|
|
||||||
"""
|
|
||||||
package bar
|
|
||||||
|
|
||||||
open class A {
|
|
||||||
fun a() {}
|
|
||||||
fun newA() {}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
project.build("build") {
|
@Test
|
||||||
assertSuccessful()
|
fun testNonAbiChangeInLib_changeMethodBody() {
|
||||||
val affectedSources = project.projectDir.getFilesByNames("A.kt", "B.kt", "AA.kt", "AAA.kt", "BB.kt")
|
doTest(
|
||||||
val relativePaths = project.relativize(affectedSources)
|
"A.kt",
|
||||||
assertCompiledKotlinSources(relativePaths)
|
{ 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
|
@Test
|
||||||
|
|||||||
+22
-46
@@ -5,41 +5,38 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle
|
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
|
import org.junit.Test
|
||||||
|
|
||||||
class IncrementalJavaChangeDefaultIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = null) {
|
class IncrementalJavaChangeDefaultIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = null) {
|
||||||
@Test
|
@Test
|
||||||
override fun testModifySignatureTrackedJavaInLib() {
|
override fun testAbiChangeInLib_changeMethodSignature_tracked() {
|
||||||
doTest(trackedJavaClass, changeSignature, expectedAffectedSources = listOf("TrackedJavaClassChild.kt", "useTrackedJavaClass.kt"))
|
doTest(trackedJavaClass, changeSignature, expectedAffectedFileNames = listOf("TrackedJavaClassChild.kt", "useTrackedJavaClass.kt"))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
override fun testModifyBodyTrackedJavaInLib() {
|
override fun testNonAbiChangeInLib_changeMethodBody_tracked() {
|
||||||
doTest(trackedJavaClass, changeBody, expectedAffectedSources = listOf())
|
doTest(trackedJavaClass, changeBody, expectedAffectedFileNames = listOf())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class IncrementalJavaChangePreciseIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = true) {
|
class IncrementalJavaChangePreciseIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = true) {
|
||||||
@Test
|
@Test
|
||||||
override fun testModifySignatureTrackedJavaInLib() {
|
override fun testAbiChangeInLib_changeMethodSignature_tracked() {
|
||||||
doTest(trackedJavaClass, changeSignature, expectedAffectedSources = listOf("TrackedJavaClassChild.kt", "useTrackedJavaClass.kt"))
|
doTest(trackedJavaClass, changeSignature, expectedAffectedFileNames = listOf("TrackedJavaClassChild.kt", "useTrackedJavaClass.kt"))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
override fun testModifyBodyTrackedJavaInLib() {
|
override fun testNonAbiChangeInLib_changeMethodBody_tracked() {
|
||||||
doTest(trackedJavaClass, changeBody, expectedAffectedSources = listOf())
|
doTest(trackedJavaClass, changeBody, expectedAffectedFileNames = listOf())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class IncrementalJavaChangeDisablePreciseIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = false) {
|
open class IncrementalJavaChangeDisablePreciseIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = false) {
|
||||||
@Test
|
@Test
|
||||||
override fun testModifySignatureTrackedJavaInLib() {
|
override fun testAbiChangeInLib_changeMethodSignature_tracked() {
|
||||||
doTest(
|
doTest(
|
||||||
trackedJavaClass, changeSignature,
|
trackedJavaClass, changeSignature,
|
||||||
expectedAffectedSources = listOf(
|
expectedAffectedFileNames = listOf(
|
||||||
"TrackedJavaClassChild.kt", "useTrackedJavaClass.kt", "useTrackedJavaClassFooMethodUsage.kt",
|
"TrackedJavaClassChild.kt", "useTrackedJavaClass.kt", "useTrackedJavaClassFooMethodUsage.kt",
|
||||||
"useTrackedJavaClassSameModule.kt"
|
"useTrackedJavaClassSameModule.kt"
|
||||||
)
|
)
|
||||||
@@ -47,10 +44,10 @@ open class IncrementalJavaChangeDisablePreciseIT : IncrementalCompilationJavaCha
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
override fun testModifyBodyTrackedJavaInLib() {
|
override fun testNonAbiChangeInLib_changeMethodBody_tracked() {
|
||||||
doTest(
|
doTest(
|
||||||
trackedJavaClass, changeBody,
|
trackedJavaClass, changeBody,
|
||||||
expectedAffectedSources = listOf(
|
expectedAffectedFileNames = listOf(
|
||||||
"TrackedJavaClassChild.kt", "useTrackedJavaClass.kt", "useTrackedJavaClassFooMethodUsage.kt",
|
"TrackedJavaClassChild.kt", "useTrackedJavaClass.kt", "useTrackedJavaClassFooMethodUsage.kt",
|
||||||
"useTrackedJavaClassSameModule.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 =
|
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"
|
protected val trackedJavaClass = "TrackedJavaClass.java"
|
||||||
private val javaClass = "JavaClass.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") }
|
protected val changeSignature: (String) -> String = { it.replace("String getString", "Object getString") }
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testModifySignatureJavaInLib() {
|
fun testAbiChangeInLib_changeMethodSignature() {
|
||||||
doTest(
|
doTest(
|
||||||
javaClass, changeBody,
|
javaClass, changeBody,
|
||||||
expectedAffectedSources = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
|
expectedAffectedFileNames = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testModifyBodyJavaInLib() {
|
fun testNonAbiChangeInLib_changeMethodBody() {
|
||||||
doTest(
|
doTest(
|
||||||
javaClass, changeBody,
|
javaClass, changeBody,
|
||||||
expectedAffectedSources = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
|
expectedAffectedFileNames = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract fun testModifySignatureTrackedJavaInLib()
|
abstract fun testAbiChangeInLib_changeMethodSignature_tracked()
|
||||||
abstract fun testModifyBodyTrackedJavaInLib()
|
abstract fun testNonAbiChangeInLib_changeMethodBody_tracked()
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user