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>