[Gradle] Implement AndroidSourceSetLayoutV1SourceSetsNotFoundErrorTest

... to cover KT-58488
This commit is contained in:
Sebastian Sellmair
2023-05-11 10:49:35 +02:00
committed by Space Team
parent 484863d8c6
commit 42109725ed
3 changed files with 104 additions and 2 deletions
@@ -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,
@@ -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<ToolingDiagnostic> {
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()
}
}
@@ -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<ToolingDiagnostic>.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<ToolingDiagnostic>.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<ToolingDiagnostic>.assertNoDiagnostics(factory: ToolingDiagnosticFactory) {
assertNoDiagnostics(factory.id)
}
private fun Collection<ToolingDiagnostic>.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()