diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kotlinTestDependencyManagement.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kotlinTestDependencyManagement.kt index 160ad22cf5c..c7a1ae7c23f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kotlinTestDependencyManagement.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kotlinTestDependencyManagement.kt @@ -28,6 +28,9 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension import org.jetbrains.kotlin.gradle.execution.KotlinAggregateExecutionSource import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics +import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope @@ -144,6 +147,10 @@ private fun Configuration.maybeAddTestDependencyCapability( } } ) + } else { + compilation.project.reportDiagnostic( + KotlinToolingDiagnostics.KotlinTestFrameworkInferenceFailed(name) + ) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt index 3a2f24a774a..658580e7d65 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt @@ -520,6 +520,16 @@ object KotlinToolingDiagnostics { ) } + object KotlinTestFrameworkInferenceFailed : ToolingDiagnosticFactory(WARNING) { + operator fun invoke(configurationName: String) = build( + """ + kotlin-test was added to a non-testing configuration "$configurationName" where test framework couldn't be inferred. + + Learn how to configure kotlin-test at: https://kotl.in/kotlin-test-frameworks + """.trimIndent() + ) + } + object XCFrameworkDifferentInnerFrameworksName : ToolingDiagnosticFactory(WARNING) { operator fun invoke(xcFramework: String, innerFrameworks: String) = build( "Name of XCFramework '$xcFramework' differs from inner frameworks name '$innerFrameworks'! Framework renaming is not supported yet" diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/KotlinTestDependencyWithoutTestFrameworkTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/KotlinTestDependencyWithoutTestFrameworkTest.kt new file mode 100644 index 00000000000..50bbb4d4107 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/KotlinTestDependencyWithoutTestFrameworkTest.kt @@ -0,0 +1,116 @@ +/* + * Copyright 2010-2023 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.dependencyResolutionTests + +import org.gradle.api.NamedDomainObjectProvider +import org.gradle.api.artifacts.Configuration +import org.gradle.api.internal.project.ProjectInternal +import org.gradle.kotlin.dsl.dependencies +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformSourceSetConventionsImpl.dependencies +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.extraProperties +import org.jetbrains.kotlin.gradle.util.* +import org.jetbrains.kotlin.gradle.util.assertNoDiagnostics +import kotlin.test.Test + +class KotlinTestFrameworkInferenceFailedTest { + + @Test + fun `KMP project - when jvmTest depends on kotlin-test - emits no diagnostics`() { + evaluateProjectAndResolveConfigurationsWhen { + kmpProjectWithJvm { sourceSets.jvmTest.dependOnKotlinTest() } + }.assertNoDiagnostics() + } + + @Test + fun `KMP project - when commonTest depends on kotlin-test - emits no diagnostics`() { + evaluateProjectAndResolveConfigurationsWhen { + kmpProjectWithJvm { sourceSets.commonTest.dependOnKotlinTest() } + }.assertNoDiagnostics() + } + + @Test + fun `KMP project - when jvmMain depends on kotlin-test - emits a diagnostic`() { + evaluateProjectAndResolveConfigurationsWhen { + kmpProjectWithJvm { sourceSets.jvmMain.dependOnKotlinTest() } + }.checkDiagnostics("kotlin-test-kmp-jvmMain") + } + + @Test + fun `KMP project - when commonMain depends on kotlin-test - emits a diagnostic`() { + evaluateProjectAndResolveConfigurationsWhen { + kmpProjectWithJvm { sourceSets.commonMain.dependOnKotlinTest() } + }.checkDiagnostics("kotlin-test-kmp-commonMain") + } + + @Test + fun `KMP project without jvm - when commonMain depends on kotlin-test - emits no diagnostics`() { + evaluateProjectAndResolveConfigurationsWhen { + buildProjectWithMPP { + kotlin { + linuxArm64() + linuxX64() + + sourceSets.commonMain.dependOnKotlinTest() + } + } + }.assertNoDiagnostics() + } + + @Test + fun `JVM project - when testImplementation depends on kotlin-test - emits no diagnostics`() { + evaluateProjectAndResolveConfigurationsWhen { + buildProjectWithJvm { + dependencies { + "testImplementation"("org.jetbrains.kotlin:kotlin-test") + } + } + }.assertNoDiagnostics() + } + + @Test + fun `JVM project - when implementation depends on kotlin-test - emits a diagnostic`() { + evaluateProjectAndResolveConfigurationsWhen { + buildProjectWithJvm { + dependencies { + "implementation"("org.jetbrains.kotlin:kotlin-test") + } + } + }.checkDiagnostics("kotlin-test-jvm-implementation") + } + + private fun kmpProjectWithJvm(configure: KotlinMultiplatformExtension.() -> Unit): ProjectInternal { + return buildProjectWithMPP { + kotlin { + jvm() + linuxArm64() + + configure(this) + } + } + } + + private fun NamedDomainObjectProvider.dependOnKotlinTest() { + dependencies { + implementation(kotlin("test")) + } + } + + private fun evaluateProjectAndResolveConfigurationsWhen( + projectFactory: () -> ProjectInternal + ): ProjectInternal { + val project = projectFactory() + project.repositories.mavenLocal() + project.repositories.mavenCentralCacheRedirector() + project.evaluate() + project.configurations.filter(Configuration::isCanBeResolved).forEach(Configuration::resolve) + return project + } + +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlin-test-jvm-implementation.txt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlin-test-jvm-implementation.txt new file mode 100644 index 00000000000..512a996a671 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlin-test-jvm-implementation.txt @@ -0,0 +1,3 @@ +[KotlinTestFrameworkInferenceFailed | WARNING] kotlin-test was added to a non-testing configuration "implementation" where test framework couldn't be inferred. + +Learn how to configure kotlin-test at: https://kotl.in/kotlin-test-frameworks diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlin-test-kmp-commonMain.txt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlin-test-kmp-commonMain.txt new file mode 100644 index 00000000000..4d2bb882c01 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlin-test-kmp-commonMain.txt @@ -0,0 +1,3 @@ +[KotlinTestFrameworkInferenceFailed | WARNING] kotlin-test was added to a non-testing configuration "jvmCompilationImplementation" where test framework couldn't be inferred. + +Learn how to configure kotlin-test at: https://kotl.in/kotlin-test-frameworks diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlin-test-kmp-jvmMain.txt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlin-test-kmp-jvmMain.txt new file mode 100644 index 00000000000..ebe68c46c5b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlin-test-kmp-jvmMain.txt @@ -0,0 +1,7 @@ +[KotlinTestFrameworkInferenceFailed | WARNING] kotlin-test was added to a non-testing configuration "jvmMainImplementation" where test framework couldn't be inferred. + +Learn how to configure kotlin-test at: https://kotl.in/kotlin-test-frameworks +---- +[KotlinTestFrameworkInferenceFailed | WARNING] kotlin-test was added to a non-testing configuration "jvmCompilationImplementation" where test framework couldn't be inferred. + +Learn how to configure kotlin-test at: https://kotl.in/kotlin-test-frameworks