From df14deb5a0abf5bbc278734c121bb8c837fdaf3d Mon Sep 17 00:00:00 2001 From: Hung Nguyen Date: Mon, 17 May 2021 11:47:08 +0100 Subject: [PATCH] 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 --- .../gradle/IncrementalCompilationBaseIT.kt | 45 +++++++++++ .../IncrementalCompilationMultiProjectIT.kt | 75 ++++++++----------- .../kotlin/gradle/IncrementalJavaChangeIT.kt | 68 ++++++----------- 3 files changed, 100 insertions(+), 88 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationBaseIT.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationBaseIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationBaseIT.kt new file mode 100644 index 00000000000..5860c897d8f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationBaseIT.kt @@ -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, + ) { + doTest( + { it.projectDir.getFileByName(fileToModify).modify(modifyFileContents) }, + expectedAffectedFileNames + ) + } + + protected fun doTest( + modifyProject: (Project) -> Unit, + expectedAffectedFileNames: Collection, + ) { + 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) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt index cedb9b6cf0c..b3cfdbf9c6a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalJavaChangeIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalJavaChangeIT.kt index b49b1391de7..745f7e0aec7 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalJavaChangeIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalJavaChangeIT.kt @@ -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 - ) { - 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() }