From 95018a9de0bd7ef0c1158ad678c57ab28e98dd1f Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Fri, 19 Nov 2021 13:59:40 +0100 Subject: [PATCH] [MPP] [Android] implement testAndroidMultiplatformPublicationAGPCompatibility This test publishes a Multiplatform/Android library locally with a given AGP version (7.1-*+) and tests the compatibility with older AGP consumer versions. Two projects will be tested: multiplatformAndroidConsumer: kotlin("multiplatform") + android target depending on the previous publication as 'commonMainImplementation' dependency plainAndroidConsumer: kotlin("android") depending on the previous publication as 'implementation' dependency. Both projects will test the 'assemble' umbrella task to ensure, compatibility with the given publication. ^KT-49798 implicitly covered as well --- .../AbstractKotlinAndroidGradleTests.kt | 45 +++++++++++++++++++ .../jetbrains/kotlin/gradle/BaseGradleIT.kt | 5 ++- .../kotlin/gradle/util/AGPVersion.kt | 2 + .../build.gradle.kts | 11 +++++ .../gradle.properties | 4 ++ .../build.gradle.kts | 21 +++++++++ .../MultiplatformAndroidConsumerCommonMain.kt | 7 +++ .../src/main/AndroidManifest.xml | 1 + .../java/MultiplatformAndroidConsumerMain.kt | 7 +++ .../plainAndroidConsumer/build.gradle.kts | 18 ++++++++ .../src/main/AndroidManifest.xml | 1 + .../src/main/java/PlainAndroidConsumer.kt | 7 +++ .../producer/build.gradle.kts | 27 +++++++++++ .../commonMain/kotlin/ProducerCommonMain.kt | 1 + .../producer/src/main/AndroidManifest.xml | 1 + .../settings.gradle.kts | 28 ++++++++++++ 16 files changed, 184 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/commonMain/kotlin/MultiplatformAndroidConsumerCommonMain.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/main/AndroidManifest.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/main/java/MultiplatformAndroidConsumerMain.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/src/main/AndroidManifest.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/src/main/java/PlainAndroidConsumer.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/src/commonMain/kotlin/ProducerCommonMain.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/src/main/AndroidManifest.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/settings.gradle.kts diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt index 0c93f3c9e56..621f021aa3a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt @@ -536,6 +536,51 @@ open class KotlinAndroid71GradleIT : KotlinAndroid70GradleIT() { } } } + + @Test + fun testAndroidMultiplatformPublicationAGPCompatibility() = with(Project("new-mpp-android-agp-compatibility")) { + /* Publish producer library with current version of AGP */ + build(":producer:publishAllPublicationsToBuildDirRepository") { + assertSuccessful() + + /* Check expected publication layout */ + assertFileExists("build/repo/com/example/producer-android") + assertFileExists("build/repo/com/example/producer-android-debug") + assertFileExists("build/repo/com/example/producer-jvm") + } + + val checkedConsumerAGPVersions = AGPVersion.testedVersions + // Special version added for testing KT-49798 + .plus(AGPVersion.fromString("7.1.0-beta02")) + .filter { version -> version >= AGPVersion.v4_2_0 } + + checkedConsumerAGPVersions.forEach { agpVersion -> + + this.setupWorkingDir() + println("Testing compatibility for AGP consumer version $agpVersion") + val buildOptions = defaultBuildOptions().copy(androidGradlePluginVersion = agpVersion) + + /* + Project: multiplatformAndroidConsumer is a mpp project with jvm and android targets. + This project depends on the previous publication as 'commonMainImplementation' dependency + */ + build(":multiplatformAndroidConsumer:assemble", options = buildOptions) { + assertSuccessful( + "multiplatformAndroidConsumer build failed with consumer agpVersion $agpVersion (Producer: $androidGradlePluginVersion)" + ) + } + + /* + Project: plainAndroidConsumer only uses the 'kotlin("android")' plugin + This project depends on the previous publication as 'implementation' dependency + */ + build(":plainAndroidConsumer:assemble", options = buildOptions) { + assertSuccessful( + "plainAndroidConsumer build failed with consumer agpVersion $agpVersion (Producer: $androidGradlePluginVersion)" + ) + } + } + } } open class KotlinAndroid34GradleIT : KotlinAndroid3GradleIT() { 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 d78bc357582..8608b4ee37f 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 @@ -455,11 +455,12 @@ abstract class BaseGradleIT { return model } - fun CompiledProject.assertSuccessful() { + fun CompiledProject.assertSuccessful(message: String? = null) { if (resultCode == 0) return val errors = "(?m)^.*\\[ERROR] \\[\\S+] (.*)$".toRegex().findAll(output) val errorMessage = buildString { + if (message != null) appendLine(message) appendLine("Gradle build failed") appendLine() if (errors.any()) { @@ -979,4 +980,4 @@ Finished executing task ':$taskName'| fun BaseGradleIT.BuildOptions.withFreeCommandLineArgument(argument: String) = copy( freeCommandLineArgs = freeCommandLineArgs + argument -) \ No newline at end of file +) 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 1e32fbe1a74..78e1b59ee9a 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 @@ -24,5 +24,7 @@ class AGPVersion private constructor(private val versionNumber: VersionNumber) { val v4_2_0 = fromString("4.2.0") val v7_0_0 = fromString("7.0.0-beta02") val v7_1_0 = fromString("7.1.0-beta03") + + val testedVersions = listOf(v3_4_1, v3_6_0, v4_1_0, v4_2_0, v7_0_0, v7_1_0) } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/build.gradle.kts new file mode 100644 index 00000000000..8aa2611a551 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/build.gradle.kts @@ -0,0 +1,11 @@ +allprojects { + repositories { + mavenLocal() + mavenCentral() + google() + } +} + +tasks.register("clean") { + delete(buildDir) +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/gradle.properties new file mode 100644 index 00000000000..ddcf1596570 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/gradle.properties @@ -0,0 +1,4 @@ +kotlin.code.style=official +kotlin.js.generate.executable.default=false +kotlin.mpp.enableGranularSourceSetsMetadata=true +kotlin.native.enableDependencyPropagation=false 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 new file mode 100644 index 00000000000..fd259a8ba93 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + id("com.android.library") + kotlin("multiplatform") +} + +repositories { + maven(rootProject.buildDir.resolve("repo")) + mavenCentral() +} + +android { + compileSdkVersion(30) +} + +kotlin { + android() + + sourceSets.commonMain.get().dependencies { + implementation("com.example:producer:1.0.0-SNAPSHOT") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/commonMain/kotlin/MultiplatformAndroidConsumerCommonMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/commonMain/kotlin/MultiplatformAndroidConsumerCommonMain.kt new file mode 100644 index 00000000000..0391ca6feaf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/commonMain/kotlin/MultiplatformAndroidConsumerCommonMain.kt @@ -0,0 +1,7 @@ +@file:Suppress("unused") + +object MultiplatformAndroidConsumerCommonMain { + init { + println(ProducerCommonMain) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..cacdd7fbcea --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/main/java/MultiplatformAndroidConsumerMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/main/java/MultiplatformAndroidConsumerMain.kt new file mode 100644 index 00000000000..1429015e4b9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/multiplatformAndroidConsumer/src/main/java/MultiplatformAndroidConsumerMain.kt @@ -0,0 +1,7 @@ +@file:Suppress("unused") + +object MultiplatformAndroidConsumerMain { + init { + println(ProducerCommonMain) + } +} 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 new file mode 100644 index 00000000000..5d8a1e91936 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id("com.android.library") + kotlin("android") +} + +android { + compileSdkVersion(30) +} + +repositories { + maven(rootProject.buildDir.resolve("repo")) + mavenCentral() +} + +dependencies { + implementation(kotlin("stdlib-jdk7")) + implementation("com.example:producer:1.0.0-SNAPSHOT") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..cacdd7fbcea --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/src/main/java/PlainAndroidConsumer.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/src/main/java/PlainAndroidConsumer.kt new file mode 100644 index 00000000000..55093d6a70c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/plainAndroidConsumer/src/main/java/PlainAndroidConsumer.kt @@ -0,0 +1,7 @@ +@file:Suppress("unused") + +object PlainAndroidConsumer { + init { + println(ProducerCommonMain) + } +} 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 new file mode 100644 index 00000000000..3d1d64d0a8d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/build.gradle.kts @@ -0,0 +1,27 @@ +val kotlin_version: String by extra +plugins { + `maven-publish` + id("com.android.library") + kotlin("multiplatform") +} + +group = "com.example" +version = "1.0.0-SNAPSHOT" + + +publishing { + repositories { + maven(rootProject.buildDir.resolve("repo")) { + name = "buildDir" + } + } +} + +android { + compileSdkVersion(30) +} + +kotlin { + jvm() + android { publishAllLibraryVariants() } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/src/commonMain/kotlin/ProducerCommonMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/src/commonMain/kotlin/ProducerCommonMain.kt new file mode 100644 index 00000000000..d3443669048 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/src/commonMain/kotlin/ProducerCommonMain.kt @@ -0,0 +1 @@ +object ProducerCommonMain diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..b33831954ae --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/producer/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/settings.gradle.kts new file mode 100644 index 00000000000..2ac01aae693 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android-agp-compatibility/settings.gradle.kts @@ -0,0 +1,28 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + google() + } + + val kotlin_version: String? by settings + val android_tools_version: String? by settings + + plugins { + kotlin("multiplatform").version(kotlin_version) + kotlin("android").version(kotlin_version) + } + + resolutionStrategy { + eachPlugin { + if (requested.id.id.startsWith("com.android")) { + useModule("com.android.tools.build:gradle:$android_tools_version") + } + } + } +} + +include(":producer") +include(":plainAndroidConsumer") +include(":multiplatformAndroidConsumer") +