[Gradle] Add tests for KT-31468 Targets disambiguation doesn't work if

a depending multiplatform module uses `withJava()` mode

^KT-31468
This commit is contained in:
Anton Lakotka
2022-07-28 09:44:32 +02:00
committed by Space
parent 174252f68f
commit 8bfe5691e6
18 changed files with 230 additions and 0 deletions
@@ -273,6 +273,29 @@ class HierarchicalMppIT : KGPBaseTest() {
)
}
@GradleTest
@DisplayName("Test that disambiguation attribute of Kotlin JVM Target is propagated to Java configurations")
fun testMultipleJvmTargetsWithJavaAndDisambiguationAttributeKt31468(gradleVersion: GradleVersion) {
project(
projectName = "kt-31468-multiple-jvm-targets-with-java",
gradleVersion = gradleVersion
) {
build("assemble", "testClasses") {
assertTasksExecuted(
":dependsOnPlainJvm:compileKotlinJvm",
":dependsOnPlainJvm:compileJava",
":dependsOnJvmWithJava:compileKotlinJvm",
":dependsOnJvmWithJava:compileJava",
":dependsOnPlainJvm:compileTestKotlinJvm",
":dependsOnPlainJvm:compileTestJava",
":dependsOnJvmWithJava:compileTestKotlinJvm",
":dependsOnJvmWithJava:compileTestJava",
)
}
}
}
private fun publishThirdPartyLib(
projectName: String = "third-party-lib".withPrefix,
withGranularMetadata: Boolean,
@@ -0,0 +1,10 @@
plugins {
kotlin("multiplatform").apply(false)
}
allprojects {
repositories {
mavenLocal()
mavenCentral()
}
}
@@ -0,0 +1,20 @@
plugins {
kotlin("multiplatform")
}
val disambiguationAttribute = Attribute.of("disambiguationAttribute", String::class.java)
kotlin {
jvm {
withJava()
attributes { attribute(disambiguationAttribute, "jvmWithJava") }
}
sourceSets {
val jvmMain by getting {
dependencies {
api(project(":lib"))
}
}
}
}
@@ -0,0 +1,8 @@
package test;
public class MainJava {
public static void main() {
JvmWithJava obj1 = new JvmWithJava();
JvmWithJavaKotlin obj2 = new JvmWithJavaKotlin();
}
}
@@ -0,0 +1,6 @@
package test
fun main() {
val kotlin = JvmWithJavaKotlin()
val java = JvmWithJava()
}
@@ -0,0 +1,8 @@
package test;
public class MainJavaTest {
public static void main() {
JvmWithJava obj1 = new JvmWithJava();
JvmWithJavaKotlin obj2 = new JvmWithJavaKotlin();
}
}
@@ -0,0 +1,6 @@
package test
fun main() {
val kotlin = JvmWithJavaKotlin()
val java = JvmWithJava()
}
@@ -0,0 +1,20 @@
plugins {
kotlin("multiplatform")
}
val disambiguationAttribute = Attribute.of("disambiguationAttribute", String::class.java)
kotlin {
jvm {
withJava()
attributes { attribute(disambiguationAttribute, "plainJvm") }
}
sourceSets {
val commonMain by getting {
dependencies {
api(project(":lib"))
}
}
}
}
@@ -0,0 +1,7 @@
package test;
public class MainJava {
public static void main() {
PlainJvmKotlin obj = new PlainJvmKotlin();
}
}
@@ -0,0 +1,7 @@
package test;
public class MainJavaTest {
public static void main() {
PlainJvmKotlin obj = new PlainJvmKotlin();
}
}
@@ -0,0 +1,16 @@
plugins {
kotlin("multiplatform")
}
val disambiguationAttribute = Attribute.of("disambiguationAttribute", String::class.java)
kotlin {
jvm("plainJvm") {
attributes { attribute(disambiguationAttribute, "plainJvm") }
}
jvm("jvmWithJava") {
withJava()
attributes { attribute(disambiguationAttribute, "jvmWithJava") }
}
}
@@ -0,0 +1 @@
include("lib", "dependsOnPlainJvm", "dependsOnJvmWithJava")
@@ -218,4 +218,79 @@ class ConfigurationsTest : MultiplatformExtensionTest() {
}
}
}
@Test
fun `test that jvm target attributes are propagated to java configurations`() {
val disambiguationAttribute = org.gradle.api.attributes.Attribute.of("disambiguationAttribute", String::class.java)
val project = buildProjectWithMPP {
kotlin {
jvm("plainJvm") {
attributes { attribute(disambiguationAttribute, "plainJvm") }
}
jvm("jvmWithJava") {
withJava()
attributes { attribute(disambiguationAttribute, "jvmWithJava") }
}
}
}
//NB: There is no "api" configuration registered by Java Plugin
val javaConfigurations = listOf(
"compileClasspath",
"runtimeClasspath",
"implementation",
"compileOnly",
"runtimeOnly"
)
val kotlinJvmConfigurations = listOf(
"jvmWithJavaCompileClasspath",
"jvmWithJavaRuntimeClasspath",
"jvmWithJavaApi",
"jvmWithJavaImplementation",
"jvmWithJavaCompileOnly",
"jvmWithJavaRuntimeOnly",
)
val outgoingConfigurations = listOf(
"jvmWithJavaApiElements",
"jvmWithJavaRuntimeElements",
)
val testJavaConfigurations = listOf(
"testCompileClasspath",
"testCompileOnly",
"testImplementation",
"testRuntimeClasspath",
"testRuntimeOnly"
)
val jvmWithJavaTestConfigurations = listOf(
"jvmWithJavaTestCompileClasspath",
"jvmWithJavaTestRuntimeClasspath",
"jvmWithJavaTestApi",
"jvmWithJavaTestCompileOnly",
"jvmWithJavaTestImplementation",
"jvmWithJavaTestRuntimeOnly"
)
val expectedConfigurationsWithDisambiguationAttribute = javaConfigurations +
kotlinJvmConfigurations +
outgoingConfigurations +
testJavaConfigurations +
jvmWithJavaTestConfigurations
with(project.evaluate()) {
val actualConfigurationsWithDisambiguationAttribute = configurations
.filter { it.attributes.getAttribute(disambiguationAttribute) == "jvmWithJava" }
.map { it.name }
assertEquals(
expectedConfigurationsWithDisambiguationAttribute.sorted(),
actualConfigurationsWithDisambiguationAttribute.sorted()
)
}
}
}