From 53d42df76b13e683fa9b3f9a71733a4d0924918d Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Mon, 12 Feb 2024 23:37:23 +0100 Subject: [PATCH] [Gradle] Migrate MppCInteropDependencyTransformationIT to new test DSL ^KT-65528 In Progress --- .../MppCInteropDependencyTransformationIT.kt | 496 +++++++++++------- .../reportSourceSetCommonizerDependencies.kt | 54 +- .../p1/build.gradle.kts | 5 +- .../p2/build.gradle.kts | 6 - .../p1/build.gradle.kts | 5 +- .../p2/build.gradle.kts | 6 - .../p3/build.gradle.kts | 6 - 7 files changed, 309 insertions(+), 269 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppCInteropDependencyTransformationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppCInteropDependencyTransformationIT.kt index 968d4f9a796..db0fc1aada9 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppCInteropDependencyTransformationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppCInteropDependencyTransformationIT.kt @@ -5,12 +5,20 @@ package org.jetbrains.kotlin.gradle +import org.gradle.testkit.runner.BuildResult +import org.gradle.util.GradleVersion import org.jetbrains.kotlin.commonizer.CommonizerTarget +import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.util.WithSourceSetCommonizerDependencies import org.jetbrains.kotlin.gradle.util.reportSourceSetCommonizerDependencies import org.jetbrains.kotlin.konan.target.HostManager -import org.jetbrains.kotlin.konan.target.KonanTarget.* -import org.junit.Test +import org.jetbrains.kotlin.konan.target.KonanTarget +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.io.TempDir +import java.nio.file.Path +import kotlin.io.path.readText +import kotlin.io.path.writeText +import kotlin.test.assertTrue /** * Runs Tests on a Gradle project with three subprojects @@ -23,51 +31,82 @@ import org.junit.Test * - dependency-mode=project: In this case p2 will just declare a regular project dependency on p1 * - dependency-mode=repository: In this case p2 will rely on a previously published version of p1 */ -abstract class MppCInteropDependencyTransformationIT : BaseGradleIT() { - override val defaultGradleVersion: GradleVersionRequired = GradleVersionRequired.FOR_MPP_SUPPORT +@DisplayName("CInterop dependency transformation") +@NativeGradlePluginTests +class MppCInteropDependencyTransformationIT : KGPBaseTest() { - override fun defaultBuildOptions(): BuildOptions = super.defaultBuildOptions().run { - copy( - forceOutputToStdout = true, - parallelTasksInProject = true, - freeCommandLineArgs = freeCommandLineArgs + "-s" - ) + private val projectDependencyMode = "-PdependencyMode=project" + + private val repositoryDependencyMode = "-PdependencyMode=repository" + + private fun BuildResult.assertProjectDependencyMode() { + assertOutputContains("dependencyMode = 'project'") } - protected val projectDependencyOptions - get() = defaultBuildOptions().copy( - freeCommandLineArgs = defaultBuildOptions().freeCommandLineArgs + "-PdependencyMode=project" - ) + private fun BuildResult.assertRepositoryDependencyMode() { + assertOutputContains("dependencyMode = 'repository'") + } - protected val repositoryDependencyOptions - get() = defaultBuildOptions().copy( - freeCommandLineArgs = defaultBuildOptions().freeCommandLineArgs + "-PdependencyMode=repository" - ) + private fun BuildResult.assertNoCompileTasksExecuted() { + val compileTaskRegex = ".*[cC]ompile.*".toRegex() + val taskPaths = tasks.map { it.path } + assertTrue(taskPaths.none { it.contains(compileTaskRegex) }) + } - class ComplexProject : MppCInteropDependencyTransformationIT() { + private fun TestProject.publishP1ToBuildRepository() { + build(":p1:publishAllPublicationsToMavenRepository", repositoryDependencyMode) + } - private val project by lazy { Project("cinterop-MetadataDependencyTransformation") } + private val cinteropProjectName = "cinterop-MetadataDependencyTransformation" - @Test - fun `test - compile project - dependencyMode=project`() { - testCompileProject(projectDependencyOptions) { - assertProjectDependencyMode() - assertTasksExecuted(":p1:commonizeCInterop") - } + @DisplayName("Compile project with project mode") + @GradleTest + fun compileDependencyModeProject( + gradleVersion: GradleVersion, + @TempDir localRepo: Path, + ) { + testCompileProject( + gradleVersion, + projectDependencyMode, + localRepo, + ) { + assertProjectDependencyMode() + assertTasksExecuted(":p1:commonizeCInterop") } + } - @Test - fun `test - compile project - dependencyMode=repository`() { - publishP1ToBuildRepository() - testCompileProject(repositoryDependencyOptions) { - assertRepositoryDependencyMode() - } + @DisplayName("Compile project with repository mode") + @GradleTest + fun compileDependencyModeRepository( + gradleVersion: GradleVersion, + @TempDir localRepo: Path, + ) { + testCompileProject( + gradleVersion, + repositoryDependencyMode, + localRepo, + additionalBuildStep = { publishP1ToBuildRepository() } + ) { + assertRepositoryDependencyMode() } + } - private fun testCompileProject(options: BuildOptions, check: CompiledProject.() -> Unit = {}) { - project.build("compileAll", options = options) { + private fun testCompileProject( + gradleVersion: GradleVersion, + repositoryMode: String, + localRepo: Path, + additionalBuildStep: TestProject.() -> Unit = {}, + check: BuildResult.() -> Unit = {}, + ) { + project( + projectName = cinteropProjectName, + gradleVersion = gradleVersion, + localRepoDir = localRepo + ) { + additionalBuildStep() + + build("compileAll", repositoryMode) { check() - assertSuccessful() /* Assert p2 & p3 compiled metadata */ assertTasksExecuted(":p2:compileNativeMainKotlinMetadata") @@ -94,143 +133,210 @@ abstract class MppCInteropDependencyTransformationIT : BaseGradleIT() { assertTasksExecuted(":p3:compileTestKotlinLinuxX64") /* Configurations should not be resolved during configuration phase */ - assertNotContains("Configuration resolved before Task Graph is ready") + assertOutputDoesNotContain("Configuration resolved before Task Graph is ready") } } + } - @Test - fun `test - source set dependencies - dependencyMode=project`() { - reportSourceSetCommonizerDependencies(project, "p2", projectDependencyOptions) { + @DisplayName("Source set dependency in project mode") + @GradleTest + fun sourceSetDependencyProjectMode(gradleVersion: GradleVersion) { + project(cinteropProjectName, gradleVersion) { + reportSourceSetCommonizerDependencies( + subproject = "p2", + options = defaultBuildOptions.copy(freeArgs = listOf(projectDependencyMode)) + ) { it.assertProjectDependencyMode() it.assertTasksExecuted(":p2:transformNativeMainCInteropDependenciesMetadataForIde") - it.assertTasksNotExecuted(".*[cC]ompile.*") + it.assertNoCompileTasksExecuted() assertP2SourceSetDependencies() } - reportSourceSetCommonizerDependencies(project, "p3", projectDependencyOptions) { + reportSourceSetCommonizerDependencies( + subproject = "p3", + options = defaultBuildOptions.copy(freeArgs = listOf(projectDependencyMode)) + ) { it.assertProjectDependencyMode() it.assertTasksExecuted(":p3:transformNativeMainCInteropDependenciesMetadataForIde") - it.assertTasksNotExecuted(".*[cC]ompile.*") + it.assertNoCompileTasksExecuted() assertP3SourceSetDependencies() } } + } - @Test - fun `test - source set dependencies - dependencyMode=repository`() { + @DisplayName("Source set dependency in repository mode") + @GradleTest + fun sourceSetDependencyRepositoryMode( + gradleVersion: GradleVersion, + @TempDir localRepo: Path, + ) { + project(cinteropProjectName, gradleVersion, localRepoDir = localRepo) { publishP1ToBuildRepository() - reportSourceSetCommonizerDependencies(project, "p2", repositoryDependencyOptions) { + reportSourceSetCommonizerDependencies( + subproject = "p2", + options = defaultBuildOptions.copy(freeArgs = listOf(repositoryDependencyMode)) + ) { it.assertRepositoryDependencyMode() it.assertTasksExecuted(":p2:transformNativeMainCInteropDependenciesMetadataForIde") - it.assertTasksNotExecuted(".*[cC]ompile.*") + it.assertNoCompileTasksExecuted() assertP2SourceSetDependencies() } - reportSourceSetCommonizerDependencies(project, "p3", repositoryDependencyOptions) { + reportSourceSetCommonizerDependencies( + subproject = "p3", + options = defaultBuildOptions.copy(freeArgs = listOf(repositoryDependencyMode)) + ) { it.assertRepositoryDependencyMode() it.assertTasksExecuted(":p3:transformNativeMainCInteropDependenciesMetadataForIde") - it.assertTasksNotExecuted(".*[cC]ompile.*") + it.assertNoCompileTasksExecuted() assertP3SourceSetDependencies() } } + } - private fun WithSourceSetCommonizerDependencies.assertP2SourceSetDependencies() { - listOf("nativeMain", "nativeTest").forEach { sourceSetName -> - getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions().konanDataDir) + private fun WithSourceSetCommonizerDependencies.assertP2SourceSetDependencies() { + listOf("nativeMain", "nativeTest").forEach { sourceSetName -> + getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions.konanDataDir!!) + .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") + .assertTargetOnAllDependencies( + CommonizerTarget( + KonanTarget.LINUX_ARM64, + KonanTarget.LINUX_X64, + KonanTarget.IOS_ARM64, + KonanTarget.IOS_X64, + KonanTarget.MACOS_X64, + KonanTarget.MINGW_X64 + ) + ) + } + + if (HostManager.hostIsMac) { + listOf("appleAndLinuxMain", "appleAndLinuxTest").forEach { sourceSetName -> + getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions.konanDataDir!!) .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") .assertTargetOnAllDependencies( - CommonizerTarget(LINUX_ARM64, LINUX_X64, IOS_ARM64, IOS_X64, MACOS_X64, MINGW_X64) + CommonizerTarget( + KonanTarget.LINUX_ARM64, + KonanTarget.LINUX_X64, + KonanTarget.IOS_ARM64, + KonanTarget.IOS_X64, + KonanTarget.MACOS_X64 + ) ) } - if (HostManager.hostIsMac) { - listOf("appleAndLinuxMain", "appleAndLinuxTest").forEach { sourceSetName -> - getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions().konanDataDir) - .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") - .assertTargetOnAllDependencies(CommonizerTarget(LINUX_ARM64, LINUX_X64, IOS_ARM64, IOS_X64, MACOS_X64)) - } - - listOf("appleMain", "appleTest").forEach { sourceSetName -> - getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions().konanDataDir) - .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") - .assertTargetOnAllDependencies(CommonizerTarget(IOS_ARM64, IOS_X64, MACOS_X64)) - } - - listOf("iosMain", "iosTest").forEach { sourceSetName -> - getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions().konanDataDir) - .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") - .assertTargetOnAllDependencies(CommonizerTarget(IOS_ARM64, IOS_X64)) - } - } - - listOf("linuxMain", "linuxTest").forEach { sourceSetName -> - getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions().konanDataDir) - .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") - .assertTargetOnAllDependencies(CommonizerTarget(LINUX_ARM64, LINUX_X64)) - } - } - - private fun WithSourceSetCommonizerDependencies.assertP3SourceSetDependencies() { - /* - windowsAndLinuxMain / windowsAndLinuxTest will not have a 'perfect target match' in p1. - They will choose cinterops associated with 'nativeMain' - */ - listOf("nativeMain", "nativeTest", "windowsAndLinuxMain", "windowsAndLinuxTest").forEach { sourceSetName -> - getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions().konanDataDir) + listOf("appleMain", "appleTest").forEach { sourceSetName -> + getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions.konanDataDir!!) .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") .assertTargetOnAllDependencies( - CommonizerTarget(LINUX_ARM64, LINUX_X64, IOS_ARM64, IOS_X64, MACOS_X64, MINGW_X64) + CommonizerTarget( + KonanTarget.IOS_ARM64, + KonanTarget.IOS_X64, + KonanTarget.MACOS_X64 + ) ) } - if (HostManager.hostIsMac) { - listOf("appleAndLinuxMain", "appleAndLinuxTest").forEach { sourceSetName -> - getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions().konanDataDir) - .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") - .assertTargetOnAllDependencies(CommonizerTarget(LINUX_ARM64, LINUX_X64, IOS_ARM64, IOS_X64, MACOS_X64)) - } - - listOf("iosMain", "iosTest").forEach { sourceSetName -> - getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions().konanDataDir) - .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") - .assertTargetOnAllDependencies(CommonizerTarget(IOS_ARM64, IOS_X64)) - } + listOf("iosMain", "iosTest").forEach { sourceSetName -> + getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions.konanDataDir!!) + .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") + .assertTargetOnAllDependencies( + CommonizerTarget( + KonanTarget.IOS_ARM64, + KonanTarget.IOS_X64 + ) + ) } } - @Test - fun `test - transformation - UP-TO-DATE behaviour - on p3`() { + listOf("linuxMain", "linuxTest").forEach { sourceSetName -> + getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions.konanDataDir!!) + .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") + .assertTargetOnAllDependencies( + CommonizerTarget(KonanTarget.LINUX_ARM64, KonanTarget.LINUX_X64) + ) + } + } + + private fun WithSourceSetCommonizerDependencies.assertP3SourceSetDependencies() { + /* + windowsAndLinuxMain / windowsAndLinuxTest will not have a 'perfect target match' in p1. + They will choose cinterops associated with 'nativeMain' + */ + listOf("nativeMain", "nativeTest", "windowsAndLinuxMain", "windowsAndLinuxTest").forEach { sourceSetName -> + getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions.konanDataDir!!) + .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") + .assertTargetOnAllDependencies( + CommonizerTarget( + KonanTarget.LINUX_ARM64, + KonanTarget.LINUX_X64, + KonanTarget.IOS_ARM64, + KonanTarget.IOS_X64, + KonanTarget.MACOS_X64, + KonanTarget.MINGW_X64 + ) + ) + } + + if (HostManager.hostIsMac) { + listOf("appleAndLinuxMain", "appleAndLinuxTest").forEach { sourceSetName -> + getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions.konanDataDir!!) + .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") + .assertTargetOnAllDependencies( + CommonizerTarget( + KonanTarget.LINUX_ARM64, + KonanTarget.LINUX_X64, + KonanTarget.IOS_ARM64, + KonanTarget.IOS_X64, + KonanTarget.MACOS_X64, + ) + ) + } + + listOf("iosMain", "iosTest").forEach { sourceSetName -> + getCommonizerDependencies(sourceSetName).withoutNativeDistributionDependencies(defaultBuildOptions.konanDataDir!!) + .assertDependencyFilesMatches(".*cinterop-simple.*", ".*cinterop-withPosix.*") + .assertTargetOnAllDependencies(CommonizerTarget(KonanTarget.IOS_ARM64, KonanTarget.IOS_X64)) + } + } + } + + @DisplayName("UP-TO-DATE transformations for P3 subproject") + @GradleTest + fun transformationsUpToDateOnP3( + gradleVersion: GradleVersion, + @TempDir localRepo: Path, + ) { + project(cinteropProjectName, gradleVersion, localRepoDir = localRepo) { publishP1ToBuildRepository() - project.build(":p3:transformNativeMainCInteropDependenciesMetadata", options = repositoryDependencyOptions) { - assertSuccessful() + + build(":p3:transformNativeMainCInteropDependenciesMetadata", repositoryDependencyMode) { assertTasksExecuted(":p3:transformNativeMainCInteropDependenciesMetadata") } - project.build(":p3:transformNativeMainCInteropDependenciesMetadata", options = repositoryDependencyOptions) { - assertSuccessful() - assertTasksNotExecuted(":p3:transformNativeMainCInteropDependenciesMetadata") + build(":p3:transformNativeMainCInteropDependenciesMetadata", repositoryDependencyMode) { assertTasksUpToDate(":p3:transformNativeMainCInteropDependenciesMetadata") } - val p3BuildGradleKts = project.projectDir.resolve("p3/build.gradle.kts") + val p3BuildGradleKts = subProject("p3").buildGradleKts val p3BuildGradleKtsContent = p3BuildGradleKts.readText() // Remove dependency on p2 | Task should re-run - p3BuildGradleKts.writeText(p3BuildGradleKtsContent.replace("""implementation(project(":p2"))""", "")) - project.build(":p3:transformNativeMainCInteropDependenciesMetadata", options = repositoryDependencyOptions) { - assertSuccessful() + p3BuildGradleKts.writeText( + p3BuildGradleKtsContent.replace("""implementation(project(":p2"))""", "") + ) + build(":p3:transformNativeMainCInteropDependenciesMetadata", repositoryDependencyMode) { assertTasksExecuted(":p3:transformNativeMainCInteropDependenciesMetadata") } // Re-add dependency on p3 | Task should re-run for the next invocation p3BuildGradleKts.writeText(p3BuildGradleKtsContent) - project.build(":p3:transformNativeMainCInteropDependenciesMetadata", options = repositoryDependencyOptions) { - assertSuccessful() + build(":p3:transformNativeMainCInteropDependenciesMetadata", repositoryDependencyMode) { assertTasksExecuted(":p3:transformNativeMainCInteropDependenciesMetadata") } - project.build(":p3:transformNativeMainCInteropDependenciesMetadata", options = repositoryDependencyOptions) { - assertSuccessful() - assertTasksNotExecuted(":p3:transformNativeMainCInteropDependenciesMetadata") + + build(":p3:transformNativeMainCInteropDependenciesMetadata", repositoryDependencyMode) { assertTasksUpToDate(":p3:transformNativeMainCInteropDependenciesMetadata") } @@ -238,100 +344,98 @@ abstract class MppCInteropDependencyTransformationIT : BaseGradleIT() { p3BuildGradleKts.writeText( p3BuildGradleKtsContent.replace("""project(":p2")""", """"kotlin-multiplatform-projects:p1:1.0.0-SNAPSHOT"""") ) - project.build(":p3:transformNativeMainCInteropDependenciesMetadata", options = repositoryDependencyOptions) { - assertSuccessful() + build(":p3:transformNativeMainCInteropDependenciesMetadata", repositoryDependencyMode) { /* Same binaries to transform; but project(":p2") is excluded from Task Inputs now */ assertTasksExecuted(":p3:transformNativeMainCInteropDependenciesMetadata") } } + } - - @Test - fun `test - transformation - UP-TO-DATE behaviour - on removing and adding targets - on p2 - dependencyMode=repository`() { + @DisplayName("UP-TO-DATE transformations on adding/removing targets in repositories mode") + @GradleTest + fun upToDateTransformationsAddingRemovingTargetRepositoriesMode( + gradleVersion: GradleVersion, + @TempDir localRepo: Path, + ) { + project(cinteropProjectName, gradleVersion, localRepoDir = localRepo) { publishP1ToBuildRepository() - `test - transformation - UP-TO-DATE behaviour - on removing and adding targets - on p2`(repositoryDependencyOptions) - } - - @Test - fun `test - transformation - UP-TO-DATE behaviour - on removing and adding targets - on p2 - dependencyMode=project`() { - `test - transformation - UP-TO-DATE behaviour - on removing and adding targets - on p2`(projectDependencyOptions) - } - - private fun `test - transformation - UP-TO-DATE behaviour - on removing and adding targets - on p2`(options: BuildOptions) { - project.build(":p3:transformNativeMainCInteropDependenciesMetadata", options = options) { - assertSuccessful() - } - - project.build(":p3:transformNativeMainCInteropDependenciesMetadata", options = options) { - assertTasksUpToDate(":p3:transformNativeMainCInteropDependenciesMetadata") - } - } - - private fun publishP1ToBuildRepository() = project.publishP1ToBuildRepository() - } - - class KT50952 : MppCInteropDependencyTransformationIT() { - private val project by lazy { Project("cinterop-MetadataDependencyTransformation-kt-50952") } - - @Test - fun `test UP-TO-DATE - when changing consumer targets - dependencyMode=repository`() { - project.publishP1ToBuildRepository() - `test UP-TO-DATE - when changing consumer targets`(repositoryDependencyOptions) - } - - @Test - fun `test UP-TO-DATE - when changing consumer targets - dependencyMode=project`() { - `test UP-TO-DATE - when changing consumer targets`(projectDependencyOptions) - } - - private fun `test UP-TO-DATE - when changing consumer targets`(options: BuildOptions) { - project.build(":p2:transformCommonMainCInteropDependenciesMetadata", options = options) { - assertSuccessful() - } - - project.build(":p2:transformCommonMainCInteropDependenciesMetadata", options = options) { - assertSuccessful() - assertTasksNotExecuted(":p2:transformCommonMainCInteropDependenciesMetadata") - assertTasksUpToDate(":p2:transformCommonMainCInteropDependenciesMetadata") - } - - val optionsWithAdditionalTargetEnabled = options.withFreeCommandLineArgument("-Pp2.enableAdditionalTarget") - - project.build(":p2:transformCommonMainCInteropDependenciesMetadata", options = optionsWithAdditionalTargetEnabled) { - assertSuccessful() - assertTasksExecuted(":p2:transformCommonMainCInteropDependenciesMetadata") - } - - project.build(":p2:transformCommonMainCInteropDependenciesMetadata", options = optionsWithAdditionalTargetEnabled) { - assertSuccessful() - assertTasksNotExecuted(":p2:transformCommonMainCInteropDependenciesMetadata") - assertTasksUpToDate(":p2:transformCommonMainCInteropDependenciesMetadata") - } - - project.build(":p2:transformCommonMainCInteropDependenciesMetadata", options = options) { - assertSuccessful() - assertTasksExecuted(":p2:transformCommonMainCInteropDependenciesMetadata") - } - - project.build(":p2:transformCommonMainCInteropDependenciesMetadata", options = options) { - assertSuccessful() - assertTasksNotExecuted(":p2:transformCommonMainCInteropDependenciesMetadata") - assertTasksUpToDate(":p2:transformCommonMainCInteropDependenciesMetadata") - } + testUpToDateTransformationOnRemovingOrAddingTargets(repositoryDependencyMode) } } - protected fun CompiledProject.assertProjectDependencyMode() { - assertContains("dependencyMode = 'project'") + @DisplayName("UP-TO-DATE transformations on adding/removing targets in project mode") + @GradleTest + fun upToDateTransformationsAddingRemovingTargetRepositoriesMode(gradleVersion: GradleVersion) { + project(cinteropProjectName, gradleVersion) { + testUpToDateTransformationOnRemovingOrAddingTargets(projectDependencyMode) + } } - protected fun CompiledProject.assertRepositoryDependencyMode() { - assertContains("dependencyMode = 'repository'") + private fun TestProject.testUpToDateTransformationOnRemovingOrAddingTargets( + dependencyMode: String, + ) { + build(":p3:transformNativeMainCInteropDependenciesMetadata", dependencyMode) + + build(":p3:transformNativeMainCInteropDependenciesMetadata", dependencyMode) { + assertTasksUpToDate(":p3:transformNativeMainCInteropDependenciesMetadata") + } } - protected fun Project.publishP1ToBuildRepository() { - build(":p1:publishAllPublicationsToBuildRepository", options = repositoryDependencyOptions) { - assertSuccessful() + private val cinteropProjectNameForKt50952 = "cinterop-MetadataDependencyTransformation-kt-50952" + + @DisplayName("KT-50952: UP-TO-DATE on changing consumer targets in repository mode") + @GradleTest + fun kt50952UpToDateChangingConsumerTargetsRepositoryMode( + gradleVersion: GradleVersion, + @TempDir localRepo: Path, + ) { + project(cinteropProjectNameForKt50952, gradleVersion, localRepoDir = localRepo) { + publishP1ToBuildRepository() + testUpToDateOnChangingConsumerTargets(repositoryDependencyMode) + } + } + + @DisplayName("KT-50952: UP-TO-DATE on changing consumer targets in project mode") + @GradleTest + fun kt50952UpToDateChangingConsumerTargetsRepositoryMode(gradleVersion: GradleVersion) { + project(cinteropProjectNameForKt50952, gradleVersion) { + testUpToDateOnChangingConsumerTargets(projectDependencyMode) + } + } + + private fun TestProject.testUpToDateOnChangingConsumerTargets( + dependencyMode: String + ) { + build(":p2:transformCommonMainCInteropDependenciesMetadata", dependencyMode) + + build(":p2:transformCommonMainCInteropDependenciesMetadata", dependencyMode) { + assertTasksUpToDate(":p2:transformCommonMainCInteropDependenciesMetadata") + } + + val optionToEnableAdditionalTarget = "-Pp2.enableAdditionalTarget" + + build( + ":p2:transformCommonMainCInteropDependenciesMetadata", + optionToEnableAdditionalTarget, + dependencyMode + ) { + assertTasksExecuted(":p2:transformCommonMainCInteropDependenciesMetadata") + } + + build( + ":p2:transformCommonMainCInteropDependenciesMetadata", + optionToEnableAdditionalTarget, + dependencyMode + ) { + assertTasksUpToDate(":p2:transformCommonMainCInteropDependenciesMetadata") + } + + build(":p2:transformCommonMainCInteropDependenciesMetadata", dependencyMode) { + assertTasksExecuted(":p2:transformCommonMainCInteropDependenciesMetadata") + } + + build(":p2:transformCommonMainCInteropDependenciesMetadata", dependencyMode) { + assertTasksUpToDate(":p2:transformCommonMainCInteropDependenciesMetadata") } } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/reportSourceSetCommonizerDependencies.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/reportSourceSetCommonizerDependencies.kt index 4d1f060144f..9de1ccc58b4 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/reportSourceSetCommonizerDependencies.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/reportSourceSetCommonizerDependencies.kt @@ -11,7 +11,6 @@ import org.intellij.lang.annotations.RegExp import org.jetbrains.kotlin.commonizer.CommonizerTarget import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget import org.jetbrains.kotlin.commonizer.parseCommonizerTarget -import org.jetbrains.kotlin.gradle.BaseGradleIT import org.jetbrains.kotlin.gradle.testbase.BuildOptions import org.jetbrains.kotlin.gradle.testbase.TestProject import org.jetbrains.kotlin.gradle.testbase.build @@ -117,57 +116,16 @@ fun interface WithSourceSetCommonizerDependencies { fun getCommonizerDependencies(sourceSetName: String): SourceSetCommonizerDependencies } -fun BaseGradleIT.reportSourceSetCommonizerDependencies( - project: BaseGradleIT.Project, - subproject: String? = null, - options: BaseGradleIT.BuildOptions = defaultBuildOptions(), - test: WithSourceSetCommonizerDependencies.(compiledProject: BaseGradleIT.CompiledProject) -> Unit -) = with(project) { - - if (!projectDir.exists()) { - setupWorkingDir() - } - - gradleBuildScript(subproject).apply { - appendText("\n\n") - appendText(taskSourceCode) - appendText("\n\n") - } - - val taskName = buildString { - if (subproject != null) append(":$subproject") - append(":reportCommonizerSourceSetDependencies") - } - - build(taskName, options = options) { - assertSuccessful() - - val dependencyReports = output.lineSequence().filter { line -> line.contains("SourceSetCommonizerDependencyReport") }.toList() - - val withSourceSetCommonizerDependencies = WithSourceSetCommonizerDependencies { sourceSetName -> - val reportMarker = "Report[$sourceSetName]" - - val reportForSourceSet = dependencyReports.firstOrNull { line -> line.contains(reportMarker) } - ?: fail("Missing dependency report for $sourceSetName") - - val files = reportForSourceSet.split(reportMarker, limit = 2).last().split("|#+#|") - .map(String::trim).filter(String::isNotEmpty).map(::File) - - val dependencies = files.mapNotNull { file -> createSourceSetCommonizerDependencyOrNull(sourceSetName, file) }.toSet() - SourceSetCommonizerDependencies(sourceSetName, dependencies) - } - - withSourceSetCommonizerDependencies.test(this) - } -} - fun TestProject.reportSourceSetCommonizerDependencies( subproject: String? = null, options: BuildOptions = this.buildOptions, test: WithSourceSetCommonizerDependencies.(compiledProject: BuildResult) -> Unit, ) { - - buildGradleKts.appendText("\n\n$taskSourceCode\n\n") + if (subproject != null) { + subProject(subproject).buildGradleKts.appendText(taskSourceCode) + } else { + buildGradleKts.appendText(taskSourceCode) + } val taskName = buildString { if (subproject != null) append(":$subproject") @@ -213,6 +171,7 @@ private val File.parentsClosure: Set get() = this.linearClosure { it.paren private const val dollar = "\$" private val taskSourceCode = """ + tasks.register("reportCommonizerSourceSetDependencies") { kotlin.sourceSets.withType(org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet::class).all { inputs.files(configurations.getByName(intransitiveMetadataConfigurationName)) @@ -229,4 +188,5 @@ tasks.register("reportCommonizerSourceSetDependencies") { } } } + """.trimIndent() diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation-kt-50952/p1/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation-kt-50952/p1/build.gradle.kts index db0b5b79498..5ea775b7a0b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation-kt-50952/p1/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation-kt-50952/p1/build.gradle.kts @@ -11,10 +11,7 @@ version = "1.0.0-SNAPSHOT" publishing { repositories { - maven { - name = "build" - url = rootProject.buildDir.resolve("repo").toURI() - } + maven("") } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation-kt-50952/p2/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation-kt-50952/p2/build.gradle.kts index 6ebe7187f41..224b6030318 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation-kt-50952/p2/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation-kt-50952/p2/build.gradle.kts @@ -1,12 +1,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.konan.target.HostManager -repositories { - maven { - url = rootProject.buildDir.resolve("repo").toURI() - } -} - plugins { kotlin("multiplatform") } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p1/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p1/build.gradle.kts index 71c83992ebb..83da70b4440 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p1/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p1/build.gradle.kts @@ -19,10 +19,7 @@ version = "1.0.0-SNAPSHOT" publishing { repositories { - this.maven { - this.name = "build" - this.url = rootProject.buildDir.resolve("repo").toURI() - } + maven("") } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p2/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p2/build.gradle.kts index 17dffd3c978..5e5b6fdce5f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p2/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p2/build.gradle.kts @@ -9,12 +9,6 @@ class SourceSetHierarchyBuilder(private val node: KotlinSourceSet) { operator fun KotlinSourceSet.unaryMinus() = this.dependsOn(node) } -repositories { - maven { - url = rootProject.buildDir.resolve("repo").toURI() - } -} - plugins { kotlin("multiplatform") } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p3/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p3/build.gradle.kts index 5c9c3dd281d..178a0ffc2f6 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p3/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/cinterop-MetadataDependencyTransformation/p3/build.gradle.kts @@ -9,12 +9,6 @@ class SourceSetHierarchyBuilder(private val node: KotlinSourceSet) { operator fun KotlinSourceSet.unaryMinus() = this.dependsOn(node) } -repositories { - maven { - url = rootProject.buildDir.resolve("repo").toURI() - } -} - plugins { kotlin("multiplatform") }