From 42109725ed16b6e5b6ab52a035a1a67b7e9d91a9 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Thu, 11 May 2023 10:49:35 +0200 Subject: [PATCH] [Gradle] Implement AndroidSourceSetLayoutV1SourceSetsNotFoundErrorTest ... to cover KT-58488 --- .../plugin/diagnostics/ToolingDiagnostic.kt | 2 +- ...eSetLayoutV1SourceSetsNotFoundErrorTest.kt | 73 +++++++++++++++++++ .../kotlin/gradle/util/diagnosticUtils.kt | 31 +++++++- 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/AndroidSourceSetLayoutV1SourceSetsNotFoundErrorTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/ToolingDiagnostic.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/ToolingDiagnostic.kt index 0f6da1a83a5..ebebd791f83 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/ToolingDiagnostic.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/ToolingDiagnostic.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.diagnostics import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi @InternalKotlinGradlePluginApi // used in integration tests -class ToolingDiagnostic(val id: String, val message: String, val severity: Severity) { +data class ToolingDiagnostic(val id: String, val message: String, val severity: Severity) { enum class Severity { WARNING, diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/AndroidSourceSetLayoutV1SourceSetsNotFoundErrorTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/AndroidSourceSetLayoutV1SourceSetsNotFoundErrorTest.kt new file mode 100644 index 00000000000..c2b60740035 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/AndroidSourceSetLayoutV1SourceSetsNotFoundErrorTest.kt @@ -0,0 +1,73 @@ +/* + * 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.unitTests.diagnosticsTests + +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics.AndroidSourceSetLayoutV1SourceSetsNotFoundError +import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic +import org.jetbrains.kotlin.gradle.plugin.diagnostics.kotlinToolingDiagnosticsCollector +import org.jetbrains.kotlin.gradle.plugin.launchInStage +import org.jetbrains.kotlin.gradle.util.androidApplication +import org.jetbrains.kotlin.gradle.util.assertContainsDiagnostic +import org.jetbrains.kotlin.gradle.util.assertNoDiagnostics +import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP +import org.junit.Test +import kotlin.test.assertFails + +class AndroidSourceSetLayoutV1SourceSetsNotFoundErrorTest { + + @Test + fun `androidTest SourceSet`() { + diagnosticsForTestProjectRequestingMissingSourceSet("androidTest") + .assertContainsDiagnostic(AndroidSourceSetLayoutV1SourceSetsNotFoundError("androidTest")) + } + + @Test + fun ` androidAndroidTest SourceSet`() { + diagnosticsForTestProjectRequestingMissingSourceSet("androidAndroidTest") + .assertContainsDiagnostic(AndroidSourceSetLayoutV1SourceSetsNotFoundError("androidAndroidTest")) + } + + @Test + fun ` androidTestDebug SourceSet`() { + diagnosticsForTestProjectRequestingMissingSourceSet("androidTestDebug") + .assertContainsDiagnostic(AndroidSourceSetLayoutV1SourceSetsNotFoundError("androidTestDebug")) + } + + @Test + fun `androidAndroidTestDebug SourceSet`() { + diagnosticsForTestProjectRequestingMissingSourceSet("androidAndroidTestDebug") + .assertContainsDiagnostic(AndroidSourceSetLayoutV1SourceSetsNotFoundError("androidAndroidTestDebug")) + } + + @Test + fun `androidDummy SourceSet - is not reported`() { + diagnosticsForTestProjectRequestingMissingSourceSet("androidDummy") + .assertNoDiagnostics(AndroidSourceSetLayoutV1SourceSetsNotFoundError) + } + + @Test + fun `androidUnitTestX SourceSet - is not reported`() { + diagnosticsForTestProjectRequestingMissingSourceSet("androidUnitTestX") + .assertNoDiagnostics(AndroidSourceSetLayoutV1SourceSetsNotFoundError) + } + + private fun diagnosticsForTestProjectRequestingMissingSourceSet(sourceSetName: String): List { + val project = buildProjectWithMPP() + project.androidApplication { compileSdk = 32 } + val kotlin = project.multiplatformExtension + + project.launchInStage(KotlinPluginLifecycle.Stage.AfterEvaluateBuildscript) { + kotlin.sourceSets.getByName(sourceSetName) + } + + assertFails { project.evaluate() } + return project.kotlinToolingDiagnosticsCollector.getDiagnosticsForProject(project).toList() + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt index 541babe6f40..411035dc64c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt @@ -6,12 +6,14 @@ package org.jetbrains.kotlin.gradle.util import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic +import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnosticFactory import org.jetbrains.kotlin.gradle.plugin.diagnostics.kotlinToolingDiagnosticsCollector import org.jetbrains.kotlin.test.KotlinTestUtils -import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic import java.io.File import java.nio.file.Path import kotlin.test.assertTrue +import kotlin.test.fail internal fun checkDiagnosticsWithMppProject(projectName: String, projectConfiguration: Project.() -> Unit) { val project = buildProjectWithMPP(projectBuilder = { withName(projectName) }) @@ -66,9 +68,36 @@ internal fun Project.assertNoDiagnostics() { ) } +internal fun Project.assertContainsDiagnostic(diagnostic: ToolingDiagnostic) { + kotlinToolingDiagnosticsCollector.getDiagnosticsForProject(this).assertContainsDiagnostic(diagnostic) +} + +internal fun Collection.assertContainsDiagnostic(diagnostic: ToolingDiagnostic) { + fun Any.withIndent() = this.toString().prependIndent(" ") + if (diagnostic !in this) { + fail("Missing diagnostic\n${diagnostic.withIndent()} \nin:\n${this.render().withIndent()}") + } +} + +internal fun Project.assertNoDiagnostics(id: String) { + kotlinToolingDiagnosticsCollector.getDiagnosticsForProject(this).assertNoDiagnostics(id) +} + +internal fun Collection.assertNoDiagnostics(id: String) { + val unexpectedDiagnostics = filter { it.id == id } + if (unexpectedDiagnostics.isNotEmpty()) { + fail("Expected to have no diagnostics with id '$id', but some were reported:\n${unexpectedDiagnostics.render()}") + } +} + +internal fun Collection.assertNoDiagnostics(factory: ToolingDiagnosticFactory) { + assertNoDiagnostics(factory.id) +} + private fun Collection.render(): String = joinToString(separator = "\n----\n") private val expectedDiagnosticsRoot: Path get() = resourcesRoot.resolve("expectedDiagnostics") private fun expectedDiagnosticsFile(projectName: String): File = expectedDiagnosticsRoot.resolve("$projectName.txt").toFile() +