Implement HierarchicalMppIT.testNativeLeafTestSourceSetsKt46417 to cover ^KT-46417
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt
index e136728..237a6fe 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt
@@ -19,6 +19,7 @@
import java.util.zip.ZipFile
import kotlin.test.Test
import kotlin.test.assertEquals
+import kotlin.test.assertNotNull
import kotlin.test.assertTrue
class HierarchicalMppIT : BaseGradleIT() {
@@ -506,12 +507,13 @@
}
@Test
- fun testCompileOnlyDependencyProcessingForMetadataCompilations() = with(transformNativeTestProjectWithPluginDsl("hierarchical-mpp-project-dependency")) {
- publishThirdPartyLib(withGranularMetadata = true)
+ fun testCompileOnlyDependencyProcessingForMetadataCompilations() =
+ with(transformNativeTestProjectWithPluginDsl("hierarchical-mpp-project-dependency")) {
+ publishThirdPartyLib(withGranularMetadata = true)
- gradleBuildScript("my-lib-foo").appendText("\ndependencies { \"jvmAndJsMainCompileOnly\"(kotlin(\"test-annotations-common\")) }")
- projectDir.resolve("my-lib-foo/src/jvmAndJsMain/kotlin/UseCompileOnlyDependency.kt").writeText(
- """
+ gradleBuildScript("my-lib-foo").appendText("\ndependencies { \"jvmAndJsMainCompileOnly\"(kotlin(\"test-annotations-common\")) }")
+ projectDir.resolve("my-lib-foo/src/jvmAndJsMain/kotlin/UseCompileOnlyDependency.kt").writeText(
+ """
import kotlin.test.Test
class UseCompileOnlyDependency {
@@ -519,12 +521,12 @@
fun myTest() = Unit
}
""".trimIndent()
- )
+ )
- build(":my-lib-foo:compileJvmAndJsMainKotlinMetadata") {
- assertSuccessful()
+ build(":my-lib-foo:compileJvmAndJsMainKotlinMetadata") {
+ assertSuccessful()
+ }
}
- }
@Test
fun testHmppDependenciesInJsTests() {
@@ -620,6 +622,18 @@
}
}
+ @Test
+ fun testNativeLeafTestSourceSetsKt46417() {
+ with(Project("kt-46417-ios-test-source-sets")) {
+ testDependencyTransformations("p2") { reports ->
+ val report = reports.singleOrNull { it.sourceSetName == "iosArm64Test" && it.scope == "implementation" }
+ assertNotNull(report, "No single report for 'iosArm64' and implementation scope")
+ assertEquals(setOf("commonMain", "iosMain"), report.allVisibleSourceSets)
+ assertTrue(report.groupAndModule.endsWith(":p1"))
+ }
+ }
+ }
+
private fun Project.testDependencyTransformations(
subproject: String? = null,
check: CompiledProject.(reports: Iterable<DependencyTransformationReport>) -> Unit
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/build.gradle.kts
new file mode 100644
index 0000000..2878e47
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/build.gradle.kts
@@ -0,0 +1,12 @@
+allprojects {
+ repositories {
+ mavenCentral()
+ google()
+ mavenLocal()
+ jcenter()
+ }
+}
+
+plugins {
+ kotlin("multiplatform") apply false
+}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/gradle.properties
new file mode 100644
index 0000000..d3eebf3
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/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/kt-46417-ios-test-source-sets/p1/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p1/build.gradle.kts
new file mode 100644
index 0000000..24f904d
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p1/build.gradle.kts
@@ -0,0 +1,8 @@
+plugins {
+ kotlin("multiplatform")
+}
+
+kotlin {
+ jvm()
+ ios()
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p2/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p2/build.gradle.kts
new file mode 100644
index 0000000..c783c00
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p2/build.gradle.kts
@@ -0,0 +1,13 @@
+plugins {
+ kotlin("multiplatform")
+}
+
+kotlin {
+ jvm()
+ ios()
+
+ val commonMain by sourceSets.getting
+ commonMain.dependencies {
+ implementation(project(":p1"))
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/settings.gradle.kts
new file mode 100644
index 0000000..1f2a758
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/settings.gradle.kts
@@ -0,0 +1,14 @@
+pluginManagement {
+ repositories {
+ mavenLocal()
+ gradlePluginPortal()
+ }
+ val kotlin_version: String by settings
+ plugins {
+ kotlin("multiplatform").version(kotlin_version)
+ }
+}
+
+include(":p1")
+include(":p2")
+
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt
index d34557a..59d9a36 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt
@@ -7,6 +7,7 @@
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
+import org.gradle.api.artifacts.ConfigurationContainer
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.artifacts.result.ResolvedComponentResult
@@ -15,11 +16,13 @@
import org.gradle.api.file.FileCollection
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
+import org.jetbrains.kotlin.gradle.plugin.mpp.AnonymousConfiguration.createAnonymousConfiguration
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
import java.io.File
import java.io.InputStream
import java.util.*
+import java.util.concurrent.atomic.AtomicInteger
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
import java.util.zip.ZipOutputStream
@@ -119,7 +122,7 @@
requestedDependencies.forEach { dependency ->
if (dependency !in originalDependencies) {
- modifiedConfiguration = modifiedConfiguration ?: project.configurations.detachedConfiguration().apply {
+ modifiedConfiguration = modifiedConfiguration ?: project.configurations.createAnonymousConfiguration().apply {
fun <T> copyAttribute(key: Attribute<T>) {
attributes.attribute(key, allSourceSetsConfiguration.attributes.getAttribute(key)!!)
}
@@ -468,6 +471,15 @@
}
}
+private object AnonymousConfiguration {
+ private val configurationCounter = AtomicInteger(0)
+
+ fun ConfigurationContainer.createAnonymousConfiguration(): Configuration {
+ //return detachedConfiguration()
+ return create("kotlinAnonymous${configurationCounter.getAndIncrement()}")
+ }
+}
+
// This class is needed to encapsulate how we extract the files and point to them in a way that doesn't capture the Gradle project state
internal abstract class ExtractableMetadataFiles {
abstract fun getMetadataFilesPerSourceSet(doProcessFiles: Boolean): Map<String, FileCollection>