From da361a030ee75c82311b22265e05e82db5e66e62 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Wed, 22 Sep 2021 16:06:59 +0200 Subject: [PATCH] [Gradle] [MPP] Fix 'getDependenciesTransformation' for ^KT-46273 This setup requires a 'jvm like' target and an orphan source set, which depends on 'commonTest'. This orphan will not participate in any compilation and therefore will not have any platform. The code expected at least one test task for this source set and therefore at least one test framework. ^KT-46273 Verification Pending --- ...6273JvmTargetAndOrphanTestSourceSetTest.kt | 48 +++++++++++++++++++ .../internal/KotlinDependenciesManagement.kt | 18 ++----- 2 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KT46273JvmTargetAndOrphanTestSourceSetTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KT46273JvmTargetAndOrphanTestSourceSetTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KT46273JvmTargetAndOrphanTestSourceSetTest.kt new file mode 100644 index 00000000000..83a5133501f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KT46273JvmTargetAndOrphanTestSourceSetTest.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle + +import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope +import kotlin.test.Test + +class KT46273JvmTargetAndOrphanTestSourceSetTest : MultiplatformExtensionTest() { + + override fun setup() { + enableGranularSourceSetsMetadata() + super.setup() + } + + @Test + fun `test KT-46273`() { + kotlin.jvm() + + val commonTest = kotlin.sourceSets.getByName("commonTest") + commonTest.dependencies { + implementation(kotlin("test")) + } + + val orphanTestSourceSet = kotlin.sourceSets.create("orphanTest") as DefaultKotlinSourceSet + orphanTestSourceSet.dependsOn(commonTest) + + project.evaluate() + + /* + Previously failed with: + Collection is empty. + java.util.NoSuchElementException: Collection is empty. + at kotlin.collections.CollectionsKt___CollectionsKt.single(_Collections.kt:562) + at org.jetbrains.kotlin.gradle.internal.KotlinDependenciesManagementKt.kotlinTestCapabilityForJvmSourceSet(KotlinDependenciesManagement.kt:347) + + The dependencies' transformation will be called by the IDE during import. + */ + KotlinDependencyScope.values().forEach { scope -> + orphanTestSourceSet.getDependenciesTransformation(scope) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt index 5aa7a3a1d32..cd2b8d11426 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt @@ -11,18 +11,13 @@ import com.android.build.gradle.api.UnitTestVariant import org.gradle.api.InvalidUserDataException import org.gradle.api.Project import org.gradle.api.Task -import org.gradle.api.artifacts.Configuration -import org.gradle.api.artifacts.Dependency -import org.gradle.api.artifacts.DependencySet -import org.gradle.api.artifacts.ExternalDependency -import org.gradle.api.artifacts.ProjectDependency +import org.gradle.api.artifacts.* import org.gradle.api.tasks.testing.AbstractTestTask import org.gradle.api.tasks.testing.Test import org.gradle.api.tasks.testing.junit.JUnitOptions import org.gradle.api.tasks.testing.junitplatform.JUnitPlatformOptions import org.gradle.api.tasks.testing.testng.TestNGOptions import org.jetbrains.kotlin.gradle.dsl.* -import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.execution.KotlinAggregateExecutionSource import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider @@ -31,13 +26,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope -import org.jetbrains.kotlin.gradle.plugin.sources.withAllDependsOnSourceSets import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope +import org.jetbrains.kotlin.gradle.plugin.sources.withAllDependsOnSourceSets import org.jetbrains.kotlin.gradle.targets.jvm.JvmCompilationsTestRunSource import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.testing.KotlinTaskTestRun -import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName internal const val KOTLIN_MODULE_GROUP = "org.jetbrains.kotlin" @@ -348,10 +342,8 @@ private fun kotlinTestCapabilityForJvmSourceSet(project: Project, kotlinSourceSe KotlinTestJvmFramework.junit } } - return when { - frameworks.size > 1 -> null - else -> "$KOTLIN_MODULE_GROUP:$KOTLIN_TEST_ROOT_MODULE_NAME-framework-${frameworks.single()}" - } + + return "$KOTLIN_MODULE_GROUP:$KOTLIN_TEST_ROOT_MODULE_NAME-framework-${frameworks.singleOrNull() ?: return null}" } internal const val KOTLIN_TEST_ROOT_MODULE_NAME = "kotlin-test" @@ -402,4 +394,4 @@ private fun Project.tryWithDependenciesIfUnresolved(configuration: Configuration private fun Configuration.allNonProjectDependencies() = allDependencies.matching { it !is ProjectDependency } -private fun Configuration.nonProjectDependencies() = dependencies.matching { it !is ProjectDependency } \ No newline at end of file +private fun Configuration.nonProjectDependencies() = dependencies.matching { it !is ProjectDependency }