All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.jetbrains.kotlin.gradle.internal.kotlinTestDependencyManagement.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2022 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.
*/
package org.jetbrains.kotlin.gradle.internal
import org.gradle.api.NamedDomainObjectSet
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ConfigurationContainer
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.DependencySet
import org.gradle.api.artifacts.ExternalDependency
import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.TaskProvider
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.execution.KotlinAggregateExecutionSource
import org.jetbrains.kotlin.gradle.internal.KotlinTestJvmFramework.*
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
import org.jetbrains.kotlin.gradle.targets.js.npm.SemVer
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.*
private val Dependency.isKotlinTestRootDependency: Boolean
get() = group == KOTLIN_MODULE_GROUP && name == KOTLIN_TEST_ROOT_MODULE_NAME
private val kotlin150Version = SemVer(1.toBigInteger(), 5.toBigInteger(), 0.toBigInteger())
private fun isAtLeast1_5(version: String) = SemVer.fromGradleRichVersion(version) >= kotlin150Version
private val jvmPlatforms = setOf(KotlinPlatformType.jvm, KotlinPlatformType.androidJvm)
internal fun Project.configureKotlinTestDependency(
kotlinExtension: KotlinProjectExtension,
coreLibrariesVersion: Provider,
) {
kotlinExtension.forAllTargets { target ->
target.configureKotlinTestDependency(
configurations,
coreLibrariesVersion,
dependencies,
tasks
)
}
}
private fun KotlinTarget.configureKotlinTestDependency(
configurations: ConfigurationContainer,
coreLibrariesVersion: Provider,
dependencyHandler: DependencyHandler,
tasks: TaskContainer,
) {
compilations.configureEach { compilation ->
val platformType = compilation.platformType
if (platformType in jvmPlatforms) {
// Checking dependencies which were added via dependsOn(KotlinSourceSet) call
// Compilation has own configurations for these that are different from KotlinSourceSet configurations
KotlinDependencyScope.values()
.map { configurations.sourceSetDependencyConfigurationByScope(compilation, it) }
.forEach {
it.maybeAddTestDependencyCapability(
compilation,
coreLibrariesVersion,
dependencyHandler,
tasks
)
}
compilation.kotlinSourceSets.forEach { sourceSet ->
KotlinDependencyScope.values()
.map { configurations.sourceSetDependencyConfigurationByScope(sourceSet, it) }
.forEach {
it.maybeAddTestDependencyCapability(
compilation,
coreLibrariesVersion,
dependencyHandler,
tasks
)
}
}
}
}
}
internal fun DependencySet.addKotlinTestWithCapability(@Suppress("UNUSED_PARAMETER") dependencyHandler: DependencyHandler) {
val testRootDependency = allNonProjectDependencies().singleOrNull { it.isKotlinTestRootDependency }
if (testRootDependency == null || testRootDependency !is ExternalDependency) return
val testCapability = getKotlinTestCapability(junit)
val newTestDependencyWithCapability = testRootDependency.copy()
newTestDependencyWithCapability.capabilities {
it.requireCapability(testCapability)
}
add(newTestDependencyWithCapability)
remove(testRootDependency)
}
private fun Configuration.maybeAddTestDependencyCapability(
compilation: KotlinCompilation<*>,
coreLibrariesVersion: Provider,
dependencyHandler: DependencyHandler,
tasks: TaskContainer,
) {
withDependencies { dependencies ->
val testRootDependency = allNonProjectDependencies()
.singleOrNull { it.isKotlinTestRootDependency }
if (testRootDependency != null) {
val depVersion = testRootDependency.version ?: coreLibrariesVersion.get()
if (!isAtLeast1_5(depVersion)) return@withDependencies
val testCapability = compilation.kotlinTestCapabilityForJvmSourceSet(tasks)
if (testCapability != null) {
dependencies.addLater(
testCapability.map { capability ->
dependencyHandler
.kotlinDependency(KOTLIN_TEST_ROOT_MODULE_NAME, depVersion)
.apply {
(this as ExternalDependency).capabilities {
it.requireCapability(capability)
}
}
}
)
}
}
}
}
private fun KotlinCompilation<*>.kotlinTestCapabilityForJvmSourceSet(
tasks: TaskContainer,
): Provider? {
val compilationTarget = target
@Suppress("TYPEALIAS_EXPANSION_DEPRECATION")
val testTaskList: List> = when {
compilationTarget is KotlinTargetWithTests<*, *> -> compilationTarget
.findTestRunsByCompilation(this)
.matching { it is KotlinTaskTestRun<*, *> }
.mapNotNull { (it as KotlinTaskTestRun<*, *>).executionTask }
compilationTarget is KotlinWithJavaTarget<*, *> &&
name == KotlinCompilation.TEST_COMPILATION_NAME ->
listOfNotNull(tasks.locateTask(compilationTarget.testTaskName))
this is KotlinJvmAndroidCompilation -> when (androidVariant) {
is DeprecatedAndroidUnitTestVariant -> listOfNotNull(tasks.locateTask(lowerCamelCaseName("test", androidVariant.name)))
is DeprecatedAndroidTestVariant -> listOfNotNull(androidVariant.connectedInstrumentTestProvider)
else -> emptyList()
}
else -> emptyList()
}
if (testTaskList.isEmpty()) return null
return testTaskList
.singleOrNull()
?.map { task ->
val framework = when (task) {
is Test -> testFrameworkOf(task)
else -> // Android connected test tasks don't inherit from Test, but we use JUnit for them
junit
}
getKotlinTestCapability(framework)
}
}
private fun getKotlinTestCapability(framework: KotlinTestJvmFramework) =
"$KOTLIN_MODULE_GROUP:$KOTLIN_TEST_ROOT_MODULE_NAME-framework-$framework"
internal const val KOTLIN_TEST_ROOT_MODULE_NAME = "kotlin-test"
private enum class KotlinTestJvmFramework {
junit, testng, junit5
}
private fun testFrameworkOf(testTask: Test): KotlinTestJvmFramework = when (testTask.options) {
is JUnitOptions -> junit
is JUnitPlatformOptions -> junit5
is TestNGOptions -> testng
else -> // failed to detect, fallback to junit
junit
}
private fun KotlinTargetWithTests<*, *>.findTestRunsByCompilation(
byCompilation: KotlinCompilation<*>,
): NamedDomainObjectSet> {
fun KotlinExecution.ExecutionSource.isProducedFromTheCompilation(): Boolean = when (this) {
is CompilationExecutionSource<*> -> compilation == byCompilation
is JvmCompilationsTestRunSource -> byCompilation in testCompilations
is KotlinAggregateExecutionSource<*> -> this.executionSources.any { it.isProducedFromTheCompilation() }
else -> false
}
return testRuns.matching { it.executionSource.isProducedFromTheCompilation() }
}