From 25fb641da7f46465a97694ced2b6db0bf1893f78 Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Fri, 13 Jan 2023 03:08:21 +0100 Subject: [PATCH] [Gradle, MPP] Slightly rework testAndroidMultiplatformPublicationAGPCompatibility Each AGP version has its own compatible Gradle versions range. This commit adds additional version requirements for tests to respect AGP limitations #KT-52998 In Progress --- .../gradle/android/KotlinAndroidMppIT.kt | 49 +++++++++++++------ .../kotlin/gradle/testbase/TestVersions.kt | 2 +- .../kotlin/gradle/util/AGPVersion.kt | 4 +- .../build.gradle.kts | 2 +- .../plainAndroidConsumer/build.gradle.kts | 2 +- .../producer/build.gradle.kts | 2 +- 6 files changed, 39 insertions(+), 22 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/KotlinAndroidMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/KotlinAndroidMppIT.kt index 0f0b0eb56e8..0e3a6a0c965 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/KotlinAndroidMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/KotlinAndroidMppIT.kt @@ -12,8 +12,10 @@ import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask import org.jetbrains.kotlin.gradle.util.AGPVersion import org.jetbrains.kotlin.gradle.util.testResolveAllConfigurations import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.io.TempDir import java.io.File import java.nio.file.Files +import java.nio.file.Path import java.util.zip.ZipFile import kotlin.io.path.appendText import kotlin.io.path.extension @@ -817,48 +819,63 @@ class KotlinAndroidMppIT : KGPBaseTest() { gradleVersion: GradleVersion, agpVersion: String, jdkVersion: JdkVersions.ProvidedJdk, + @TempDir tempDir: Path ) { project( "new-mpp-android-agp-compatibility", gradleVersion, buildOptions = defaultBuildOptions.copy(androidVersion = agpVersion), - buildJdk = jdkVersion.location + buildJdk = jdkVersion.location, + localRepoDir = tempDir ) { /* Publish a producer library with the current version of AGP */ build(":producer:publishAllPublicationsToBuildDirRepository") { /* Check expected publication layout */ - assertDirectoryInProjectExists("build/repo/com/example/producer-android") - assertDirectoryInProjectExists("build/repo/com/example/producer-android-debug") - assertDirectoryInProjectExists("build/repo/com/example/producer-jvm") + assertDirectoryExists(tempDir.resolve("com/example/producer-android")) + assertDirectoryExists(tempDir.resolve("com/example/producer-android-debug")) + assertDirectoryExists(tempDir.resolve("com/example/producer-jvm")) } + } - val checkedConsumerAGPVersions = AGPVersion.testedVersions - .filter { version -> version >= AGPVersion.fromString(TestVersions.AGP.AGP_42) } - .filter { version -> version < AGPVersion.fromString(TestVersions.AGP.MAX_SUPPORTED) } - .map { it.toString() } + val checkedConsumerAGPVersions = AGPVersion.testedVersions + .filter { version -> version >= AGPVersion.fromString(TestVersions.AGP.AGP_42) } + .filter { version -> version < AGPVersion.fromString(TestVersions.AGP.MAX_SUPPORTED) } + .map { it.toString() } - checkedConsumerAGPVersions.forEach { consumerAgpVersion -> - println("Testing compatibility for AGP consumer version $consumerAgpVersion (Producer: $agpVersion)") - val buildOptions = buildOptions.copy( + checkedConsumerAGPVersions.forEach { consumerAgpVersion -> + val agpTestVersion = TestVersions.AgpCompatibilityMatrix.values().find { it.version == consumerAgpVersion } + ?: fail("AGP version $consumerAgpVersion is not defined in TestVersions.AGP!") + val consumerGradleVersion = when { + gradleVersion < agpTestVersion.minSupportedGradleVersion -> agpTestVersion.minSupportedGradleVersion + gradleVersion > agpTestVersion.maxSupportedGradleVersion -> agpTestVersion.maxSupportedGradleVersion + else -> gradleVersion + } + println("Testing compatibility for AGP consumer version $consumerAgpVersion on Gradle ${consumerGradleVersion.version} (Producer: $agpVersion)") + project( + "new-mpp-android-agp-compatibility", + consumerGradleVersion, + buildOptions = defaultBuildOptions.copy( androidVersion = consumerAgpVersion, // Workaround for a deprecation warning from AGP // Relying on FileTrees for ignoring empty directories when using @SkipWhenEmpty has been deprecated. warningMode = if (AGPVersion.fromString(consumerAgpVersion) <= AGPVersion.v7_1_0) WarningMode.None else WarningMode.Fail, - ) - + ), + buildJdk = jdkVersion.location, + localRepoDir = tempDir + ) { /* Project: multiplatformAndroidConsumer is a mpp project with jvm and android targets. This project depends on the previous publication as 'commonMainImplementation' dependency */ - build(":multiplatformAndroidConsumer:assemble", buildOptions = buildOptions) + build(":multiplatformAndroidConsumer:assemble") /* Project: plainAndroidConsumer only uses the 'kotlin("android")' plugin This project depends on the previous publication as 'implementation' dependency */ - build(":plainAndroidConsumer:assemble", buildOptions = buildOptions) - println("Successfully tested compatibility for AGP consumer version $consumerAgpVersion (Producer: $agpVersion)") + build(":plainAndroidConsumer:assemble") } + println("Successfully tested compatibility for AGP consumer version $consumerAgpVersion on Gradle ${consumerGradleVersion.version} (Producer: $agpVersion)") } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/TestVersions.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/TestVersions.kt index 0aca90f3164..927e04deb11 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/TestVersions.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/TestVersions.kt @@ -41,7 +41,7 @@ interface TestVersions { const val AGP_42 = "4.2.2" const val AGP_70 = "7.0.4" const val AGP_71 = "7.1.3" - const val AGP_72 = "7.2.1" + const val AGP_72 = "7.2.2" const val AGP_73 = "7.3.0" const val AGP_74 = "7.4.0-rc03" const val AGP_80 = "8.0.0-alpha11" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/AGPVersion.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/AGPVersion.kt index 4736b4500fe..452d620356a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/AGPVersion.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/AGPVersion.kt @@ -21,10 +21,10 @@ class AGPVersion private constructor(private val versionNumber: VersionNumber) { val v4_1_0 = fromString("4.1.3") val v4_2_0 = fromString("4.2.2") val v7_0_0 = fromString("7.0.4") - val v7_1_0 = fromString("7.1.2") + val v7_1_0 = fromString("7.1.3") val v7_2_2 = fromString("7.2.2") val v7_3_0 = fromString("7.3.0") - val v7_4_0 = fromString("7.4.0-beta05") + val v7_4_0 = fromString("7.4.0-rc03") val testedVersions = listOf(v4_1_0, v4_2_0, v7_0_0, v7_1_0, v7_2_2, v7_3_0, v7_4_0) } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/build.gradle.kts index fd259a8ba93..5465beeaed6 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } repositories { - maven(rootProject.buildDir.resolve("repo")) + maven("") mavenCentral() } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/build.gradle.kts index 5d8a1e91936..918d6bda99a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/build.gradle.kts @@ -8,7 +8,7 @@ android { } repositories { - maven(rootProject.buildDir.resolve("repo")) + maven("") mavenCentral() } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/build.gradle.kts index 3d1d64d0a8d..66342187ef5 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/build.gradle.kts @@ -11,7 +11,7 @@ version = "1.0.0-SNAPSHOT" publishing { repositories { - maven(rootProject.buildDir.resolve("repo")) { + maven("") { name = "buildDir" } }