From 9ce32e5a9e59bc1b07b64bcc8ce466c4c1aa2f97 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Mon, 7 Mar 2022 11:50:06 +0100 Subject: [PATCH] Migrate PluginsDslIT tests to new dsl ^KT-45745 In Progress --- .../jetbrains/kotlin/gradle/BaseGradleIT.kt | 71 ++++++++ .../jetbrains/kotlin/gradle/PluginsDslIT.kt | 166 +++++------------- .../pluginsDsl/allopenPluginsDsl/build.gradle | 6 +- .../allopenPluginsDsl/settings.gradle | 10 -- .../pluginsDsl/applyAllPlugins/build.gradle | 16 +- .../applyAllPlugins/settings.gradle | 10 -- .../applyToSubprojects/build.gradle | 2 +- .../applyToSubprojects/settings.gradle | 13 +- 8 files changed, 130 insertions(+), 164 deletions(-) delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/allopenPluginsDsl/settings.gradle delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyAllPlugins/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index 00fb4057871..8d62eae175e 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -29,6 +29,7 @@ import org.junit.runner.RunWith import java.io.File import java.nio.file.Files import java.util.regex.Pattern +import javax.xml.parsers.DocumentBuilderFactory import kotlin.io.path.isDirectory import kotlin.test.* @@ -1008,3 +1009,73 @@ Finished executing task ':$taskName'| fun BaseGradleIT.BuildOptions.withFreeCommandLineArgument(argument: String) = copy( freeCommandLineArgs = freeCommandLineArgs + argument ) + +private const val MAVEN_LOCAL_URL_PLACEHOLDER = "" +internal const val PLUGIN_MARKER_VERSION_PLACEHOLDER = "" + +internal fun BaseGradleIT.transformProjectWithPluginsDsl( + projectName: String, + wrapperVersion: GradleVersionRequired = defaultGradleVersion, + directoryPrefix: String? = null, + minLogLevel: LogLevel = LogLevel.DEBUG +): BaseGradleIT.Project { + + val result = Project(projectName, wrapperVersion, directoryPrefix, minLogLevel) + result.setupWorkingDir() + + val settingsGradle = File(result.projectDir, "settings.gradle").takeIf(File::exists) + settingsGradle?.modify { + it.replace(MAVEN_LOCAL_URL_PLACEHOLDER, MavenLocalUrlProvider.mavenLocalUrl) + } + + result.projectDir.walkTopDown() + .filter { + it.isFile && (it.name == "build.gradle" || it.name == "build.gradle.kts" || + it.name == "settings.gradle" || it.name == "settings.gradle.kts") + } + .forEach { buildGradle -> + buildGradle.modify(::transformBuildScriptWithPluginsDsl) + } + + return result +} + +internal fun transformBuildScriptWithPluginsDsl(buildScriptContent: String): String = + buildScriptContent.replace(PLUGIN_MARKER_VERSION_PLACEHOLDER, KOTLIN_VERSION) + +/** Copies the logic of Gradle [`mavenLocal()`](https://docs.gradle.org/3.4.1/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html#org.gradle.api.artifacts.dsl.RepositoryHandler:mavenLocal()) + */ +private object MavenLocalUrlProvider { + /** The URL that points to the Gradle's mavenLocal() repository. */ + val mavenLocalUrl by lazy { + val path = propertyMavenLocalRepoPath ?: homeSettingsLocalRepoPath ?: m2HomeSettingsLocalRepoPath ?: defaultM2RepoPath + File(path).toURI().toString() + } + + private val homeDir get() = File(System.getProperty("user.home")) + + private fun getLocalRepositoryFromXml(file: File): String? { + if (!file.isFile) + return null + + val xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file) + val localRepoNodes = xml.getElementsByTagName("localRepository") + + if (localRepoNodes.length == 0) + return null + + val content = localRepoNodes.item(0).textContent + + return content.replace("\\$\\{(.*?)\\}".toRegex()) { System.getProperty(it.groupValues[1]) ?: it.value } + } + + private val propertyMavenLocalRepoPath get() = System.getProperty("maven.repo.local") + + private val homeSettingsLocalRepoPath + get() = getLocalRepositoryFromXml(File(homeDir, ".m2/settings.xml")) + + private val m2HomeSettingsLocalRepoPath + get() = System.getProperty("M2_HOME")?.let { getLocalRepositoryFromXml(File(it, "conf/settings.xml")) } + + private val defaultM2RepoPath get() = File(homeDir, ".m2/repository").absolutePath +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/PluginsDslIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/PluginsDslIT.kt index 541c8d58ee6..35325fdf1ff 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/PluginsDslIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/PluginsDslIT.kt @@ -1,132 +1,58 @@ package org.jetbrains.kotlin.gradle -import org.gradle.api.logging.LogLevel -import org.jetbrains.kotlin.gradle.util.modify -import org.junit.Assert -import org.junit.Test -import java.io.File -import javax.xml.parsers.DocumentBuilderFactory +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.jetbrains.kotlin.test.util.JUnit4Assertions.assertTrue +import org.junit.jupiter.api.DisplayName -class PluginsDslIT : BaseGradleIT() { +@DisplayName("Plugins DSL is working correctly") +@OtherGradlePluginTests +class PluginsDslIT : KGPBaseTest() { - @Test - fun testAllopenWithPluginsDsl() { - val project = projectWithMavenLocalPlugins("allopenPluginsDsl") - project.build("build") { - assertSuccessful() - assertTasksExecuted(":compileKotlin") - } - } - - @Test - fun testApplyToSubprojects() { - val project = projectWithMavenLocalPlugins("applyToSubprojects") - project.build("build") { - assertSuccessful() - assertTasksExecuted(":subproject:compileKotlin") - } - } - - @Test - fun testApplyAllPlugins() { - val project = projectWithMavenLocalPlugins("applyAllPlugins") - - val kotlinPluginClasses = setOf( - "org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper", - "org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin", - "org.jetbrains.kotlin.allopen.gradle.AllOpenGradleSubplugin", - "org.jetbrains.kotlin.allopen.gradle.SpringGradleSubplugin", - "org.jetbrains.kotlin.noarg.gradle.NoArgGradleSubplugin", - "org.jetbrains.kotlin.noarg.gradle.KotlinJpaSubplugin" - ) - - project.build("build") { - assertSuccessful() - val appliedPlugins = "applied plugin class\\:(.*)".toRegex().findAll(output).map { it.groupValues[1] }.toSet() - kotlinPluginClasses.forEach { - Assert.assertTrue("Plugin class $it should be in applied plugins", it in appliedPlugins) + @DisplayName("Allopen plugin") + @GradleTest + fun testAllopenWithPluginsDsl(gradleVersion: GradleVersion) { + project("allopenPluginsDsl".withPrefix, gradleVersion) { + build("build") { + assertTasksExecuted(":compileKotlin") } } } - companion object { - private const val DIRECTORY_PREFIX = "pluginsDsl" - - private fun BaseGradleIT.projectWithMavenLocalPlugins( - projectName: String, - wrapperVersion: GradleVersionRequired = GradleVersionRequired.None, - directoryPrefix: String? = DIRECTORY_PREFIX, - minLogLevel: LogLevel = LogLevel.DEBUG - ): Project = transformProjectWithPluginsDsl(projectName, wrapperVersion, directoryPrefix, minLogLevel) - } -} - -private const val MAVEN_LOCAL_URL_PLACEHOLDER = "" -internal const val PLUGIN_MARKER_VERSION_PLACEHOLDER = "" - -internal fun BaseGradleIT.transformProjectWithPluginsDsl( - projectName: String, - wrapperVersion: GradleVersionRequired = defaultGradleVersion, - directoryPrefix: String? = null, - minLogLevel: LogLevel = LogLevel.DEBUG -): BaseGradleIT.Project { - - val result = Project(projectName, wrapperVersion, directoryPrefix, minLogLevel) - result.setupWorkingDir() - - val settingsGradle = File(result.projectDir, "settings.gradle").takeIf(File::exists) - settingsGradle?.modify { - it.replace(MAVEN_LOCAL_URL_PLACEHOLDER, MavenLocalUrlProvider.mavenLocalUrl) - } - - result.projectDir.walkTopDown() - .filter { - it.isFile && (it.name == "build.gradle" || it.name == "build.gradle.kts" || - it.name == "settings.gradle" || it.name == "settings.gradle.kts") + @DisplayName("Apply plugin to subproject from root project") + @GradleTest + fun testApplyToSubprojects(gradleVersion: GradleVersion) { + project("applyToSubprojects".withPrefix, gradleVersion) { + build("build") { + assertTasksExecuted(":subproject:compileKotlin") + } } - .forEach { buildGradle -> - buildGradle.modify(::transformBuildScriptWithPluginsDsl) + } + + @DisplayName("All Kotlin plugins are applied to project") + @GradleTest + fun testApplyAllPlugins(gradleVersion: GradleVersion) { + project("applyAllPlugins".withPrefix, gradleVersion) { + + val kotlinPluginClasses = setOf( + "org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper", + "org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin", + "org.jetbrains.kotlin.allopen.gradle.AllOpenGradleSubplugin", + "org.jetbrains.kotlin.allopen.gradle.SpringGradleSubplugin", + "org.jetbrains.kotlin.noarg.gradle.NoArgGradleSubplugin", + "org.jetbrains.kotlin.noarg.gradle.KotlinJpaSubplugin" + ) + + build("build") { + val appliedPlugins = "applied plugin class:(.*)".toRegex().findAll(output).map { it.groupValues[1] }.toSet() + kotlinPluginClasses.forEach { + assertTrue(it in appliedPlugins) { + "Plugin class $it should be in applied plugins" + } + } + } } + } - return result + private val String.withPrefix get() = "pluginsDsl/$this" } - -internal fun transformBuildScriptWithPluginsDsl(buildScriptContent: String): String = - buildScriptContent.replace(PLUGIN_MARKER_VERSION_PLACEHOLDER, KOTLIN_VERSION) - -/** Copies the logic of Gradle [`mavenLocal()`](https://docs.gradle.org/3.4.1/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html#org.gradle.api.artifacts.dsl.RepositoryHandler:mavenLocal()) - */ -private object MavenLocalUrlProvider { - /** The URL that points to the Gradle's mavenLocal() repository. */ - val mavenLocalUrl by lazy { - val path = propertyMavenLocalRepoPath ?: homeSettingsLocalRepoPath ?: m2HomeSettingsLocalRepoPath ?: defaultM2RepoPath - File(path).toURI().toString() - } - - private val homeDir get() = File(System.getProperty("user.home")) - - private fun getLocalRepositoryFromXml(file: File): String? { - if (!file.isFile) - return null - - val xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file) - val localRepoNodes = xml.getElementsByTagName("localRepository") - - if (localRepoNodes.length == 0) - return null - - val content = localRepoNodes.item(0).textContent - - return content.replace("\\$\\{(.*?)\\}".toRegex()) { System.getProperty(it.groupValues[1]) ?: it.value } - } - - private val propertyMavenLocalRepoPath get() = System.getProperty("maven.repo.local") - - private val homeSettingsLocalRepoPath - get() = getLocalRepositoryFromXml(File(homeDir, ".m2/settings.xml")) - - private val m2HomeSettingsLocalRepoPath - get() = System.getProperty("M2_HOME")?.let { getLocalRepositoryFromXml(File(it, "conf/settings.xml")) } - - private val defaultM2RepoPath get() = File(homeDir, ".m2/repository").absolutePath -} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/allopenPluginsDsl/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/allopenPluginsDsl/build.gradle index cc00b482251..589c31e1af6 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/allopenPluginsDsl/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/allopenPluginsDsl/build.gradle @@ -1,11 +1,11 @@ plugins { - id 'org.jetbrains.kotlin.jvm' version '' - id 'org.jetbrains.kotlin.plugin.allopen' version '' + id 'org.jetbrains.kotlin.jvm' + id 'org.jetbrains.kotlin.plugin.allopen' } repositories { - mavenCentral() mavenLocal() + mavenCentral() } allOpen { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/allopenPluginsDsl/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/allopenPluginsDsl/settings.gradle deleted file mode 100644 index 8e8c9dca8af..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/allopenPluginsDsl/settings.gradle +++ /dev/null @@ -1,10 +0,0 @@ -pluginManagement { - repositories { - maven { url '' } - gradlePluginPortal() - } - - plugins { - id "org.jetbrains.kotlin.test.fixes.android" version "$test_fixes_version" - } -} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyAllPlugins/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyAllPlugins/build.gradle index bdce63ca020..b68c8164126 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyAllPlugins/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyAllPlugins/build.gradle @@ -1,15 +1,15 @@ plugins { - id 'org.jetbrains.kotlin.jvm' version '' - id 'org.jetbrains.kotlin.kapt' version '' - id 'org.jetbrains.kotlin.plugin.allopen' version '' - id 'org.jetbrains.kotlin.plugin.spring' version '' - id 'org.jetbrains.kotlin.plugin.noarg' version '' - id 'org.jetbrains.kotlin.plugin.jpa' version '' + id 'org.jetbrains.kotlin.jvm' + id 'org.jetbrains.kotlin.kapt' + id 'org.jetbrains.kotlin.plugin.allopen' + id 'org.jetbrains.kotlin.plugin.spring' + id 'org.jetbrains.kotlin.plugin.noarg' + id 'org.jetbrains.kotlin.plugin.jpa' } repositories { - mavenCentral() mavenLocal() + mavenCentral() } dependencies { @@ -18,5 +18,5 @@ dependencies { } afterEvaluate { - plugins.forEach { println("applied plugin class:" + it.class.canonicalName) } + plugins.forEach { logger.info("applied plugin class:" + it.class.canonicalName) } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyAllPlugins/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyAllPlugins/settings.gradle deleted file mode 100644 index 8e8c9dca8af..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyAllPlugins/settings.gradle +++ /dev/null @@ -1,10 +0,0 @@ -pluginManagement { - repositories { - maven { url '' } - gradlePluginPortal() - } - - plugins { - id "org.jetbrains.kotlin.test.fixes.android" version "$test_fixes_version" - } -} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyToSubprojects/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyToSubprojects/build.gradle index 9c0807baf87..037254e2fa6 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyToSubprojects/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyToSubprojects/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.jetbrains.kotlin.jvm' version '' apply false + id 'org.jetbrains.kotlin.jvm' apply false } allprojects { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyToSubprojects/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyToSubprojects/settings.gradle index b3197b09d3d..d76027c717b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyToSubprojects/settings.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/pluginsDsl/applyToSubprojects/settings.gradle @@ -1,12 +1 @@ -pluginManagement { - repositories { - maven { url '' } - gradlePluginPortal() - } - - plugins { - id "org.jetbrains.kotlin.test.fixes.android" version "$test_fixes_version" - } -} - -include 'subproject' \ No newline at end of file +include 'subproject'