[Gradle] Add functional tests on the new diagnostics/features infra
This commit is contained in:
committed by
Space Team
parent
6452c22430
commit
97f77c2ecf
+186
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.diagnosticsTests
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.internal.project.ProjectInternal
|
||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.*
|
||||
import org.jetbrains.kotlin.gradle.util.applyKotlinJvmPlugin
|
||||
import org.jetbrains.kotlin.gradle.util.buildProject
|
||||
import org.jetbrains.kotlin.gradle.util.checkDiagnostics
|
||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic
|
||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity
|
||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.ERROR
|
||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.WARNING
|
||||
import org.junit.Test
|
||||
|
||||
class DiagnosticsReportingFunctionalTest {
|
||||
|
||||
@Test
|
||||
fun testNonDuplicatedReporting() {
|
||||
buildProjectWithMockedCheckers {
|
||||
applyKotlinJvmPlugin()
|
||||
evaluate()
|
||||
reportTestDiagnostic()
|
||||
reportTestDiagnostic()
|
||||
checkDiagnostics("nonDuplicatedReporting")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
fun testOncePerProjectReporting() {
|
||||
buildProjectWithMockedCheckers {
|
||||
applyKotlinJvmPlugin()
|
||||
evaluate()
|
||||
|
||||
reportOnePerProjectTestDiagnostic()
|
||||
reportOnePerProjectTestDiagnostic()
|
||||
|
||||
checkDiagnostics("oncePerProjectReporting")
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testOncePerBuildReporting() {
|
||||
val root = buildProjectWithMockedCheckers()
|
||||
|
||||
root.applyKotlinJvmPlugin()
|
||||
root.evaluate()
|
||||
|
||||
buildProjectWithMockedCheckers("subproject-a", root) {
|
||||
applyKotlinJvmPlugin()
|
||||
evaluate()
|
||||
reportOnePerBuildTestDiagnostic()
|
||||
reportOnePerBuildTestDiagnostic()
|
||||
}
|
||||
|
||||
buildProjectWithMockedCheckers("subproject-b", root) {
|
||||
applyKotlinJvmPlugin()
|
||||
evaluate()
|
||||
reportOnePerBuildTestDiagnostic()
|
||||
reportOnePerBuildTestDiagnostic()
|
||||
}
|
||||
|
||||
root.checkDiagnostics("oncePerBuildReporting")
|
||||
}
|
||||
|
||||
// Known quirk: deduplicated diagnostics use internalId as a default key of deduplication,
|
||||
// meaning that subsequent reported diagnostics with the same ID will be dropped even if
|
||||
// they have different message/severity
|
||||
@Test
|
||||
fun testOncePerBuildWithDifferentSeverities() {
|
||||
val root = buildProject()
|
||||
|
||||
root.applyKotlinJvmPlugin()
|
||||
root.evaluate()
|
||||
|
||||
buildProject(
|
||||
{
|
||||
withName("subproject")
|
||||
withParent(root)
|
||||
}
|
||||
).run {
|
||||
applyKotlinJvmPlugin()
|
||||
evaluate()
|
||||
reportOnePerBuildTestDiagnostic()
|
||||
reportOnePerBuildTestDiagnostic(severity = ERROR) // NB: will be lost!
|
||||
}
|
||||
|
||||
root.checkDiagnostics("deduplicationWithDifferentSeverities", compactRendering = false)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testOncePerProjectAndPerBuildAreEquivalentForRoot() {
|
||||
val root = buildProject()
|
||||
|
||||
root.applyKotlinJvmPlugin()
|
||||
root.reportOnePerProjectTestDiagnostic()
|
||||
|
||||
// using same diagnostic with same ID as in "per-project". They should be deduplicated properly.
|
||||
root.reportDiagnosticOncePerBuild(
|
||||
ToolingDiagnostic(
|
||||
"TEST_DIAGNOSTIC_ONE_PER_PROJECT",
|
||||
"This is a test diagnostics that should be reported once per project\n\nIt has multiple lines of text",
|
||||
WARNING
|
||||
)
|
||||
)
|
||||
root.evaluate()
|
||||
|
||||
root.checkDiagnostics("oncePerProjectAndOncePerBuildAreEquivalentForRoot")
|
||||
}
|
||||
}
|
||||
|
||||
private fun buildProjectWithMockedCheckers(
|
||||
name: String? = null,
|
||||
parent: ProjectInternal? = null,
|
||||
block: ProjectInternal.() -> Unit = { }
|
||||
): ProjectInternal {
|
||||
val project = buildProject(
|
||||
{
|
||||
if (name != null) withName(name)
|
||||
if (parent != null) withParent(parent)
|
||||
}
|
||||
)
|
||||
|
||||
project.allprojects {
|
||||
project.extensions.extraProperties.set(
|
||||
KOTLIN_GRADLE_PROJECT_CHECKERS_OVERRIDE,
|
||||
listOf(MockChecker, MockPerProjectChecker, MockPerBuildChecker)
|
||||
)
|
||||
}
|
||||
|
||||
project.block()
|
||||
return project
|
||||
}
|
||||
|
||||
|
||||
private fun Project.reportTestDiagnostic(severity: Severity = WARNING) {
|
||||
kotlinToolingDiagnosticsCollector.report(
|
||||
project,
|
||||
ToolingDiagnostic("TEST_DIAGNOSTIC", "This is a test diagnostic\n\nIt has multiple lines of text", severity)
|
||||
)
|
||||
}
|
||||
|
||||
private fun Project.reportOnePerProjectTestDiagnostic(severity: Severity = WARNING) {
|
||||
kotlinToolingDiagnosticsCollector.reportOncePerGradleProject(
|
||||
project,
|
||||
ToolingDiagnostic(
|
||||
"TEST_DIAGNOSTIC_ONE_PER_PROJECT",
|
||||
"This is a test diagnostics that should be reported once per project\n\nIt has multiple lines of text",
|
||||
severity
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun Project.reportOnePerBuildTestDiagnostic(severity: Severity = WARNING) {
|
||||
kotlinToolingDiagnosticsCollector.reportOncePerGradleBuild(
|
||||
project,
|
||||
ToolingDiagnostic(
|
||||
"TEST_DIAGNOSTIC_ONE_PER_BUILD",
|
||||
"This is a test diagnostics that should be reported once per build\n\nIt has multiple lines of text",
|
||||
severity
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
internal object MockChecker : KotlinGradleProjectChecker {
|
||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||
project.reportTestDiagnostic()
|
||||
}
|
||||
}
|
||||
|
||||
internal object MockPerProjectChecker : KotlinGradleProjectChecker {
|
||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||
project.reportOnePerProjectTestDiagnostic()
|
||||
}
|
||||
}
|
||||
|
||||
internal object MockPerBuildChecker : KotlinGradleProjectChecker {
|
||||
override fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
|
||||
project.reportOnePerBuildTestDiagnostic()
|
||||
}
|
||||
}
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.diagnosticsTests
|
||||
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmWithJavaTargetPreset
|
||||
import org.jetbrains.kotlin.gradle.util.*
|
||||
import org.junit.Test
|
||||
|
||||
class MppDiagnosticsFunctionalTest {
|
||||
|
||||
@Test
|
||||
fun testKmmLibrary() {
|
||||
checkDiagnosticsWithMppProject("kmmLibrary") {
|
||||
androidLibrary {
|
||||
compileSdk = 32
|
||||
}
|
||||
|
||||
kotlin {
|
||||
androidTarget()
|
||||
ios()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testKmmApplication() {
|
||||
checkDiagnosticsWithMppProject("kmmApplication") {
|
||||
androidApplication {
|
||||
compileSdk = 32
|
||||
}
|
||||
|
||||
kotlin {
|
||||
androidTarget()
|
||||
ios()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testCommonMainWithDependsOn() {
|
||||
checkDiagnosticsWithMppProject("commonMainWithDependsOn") {
|
||||
kotlin {
|
||||
jvm()
|
||||
linuxX64()
|
||||
|
||||
sourceSets.apply {
|
||||
val myCustomCommonMain = create("myCustomCommonMain")
|
||||
val myCustomCommonMain2 = create("myCustomCommonMain2")
|
||||
|
||||
commonMain {
|
||||
dependsOn(myCustomCommonMain)
|
||||
dependsOn(myCustomCommonMain2) // check that diagnostic isn't duplicated
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testDeprecatedJvmWithJavaPreset() {
|
||||
checkDiagnosticsWithMppProject("deprecatedJvmWithJavaPreset") {
|
||||
kotlin {
|
||||
targetFromPreset(presets.getByName(KotlinJvmWithJavaTargetPreset.PRESET_NAME))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testUnusedSourceSets() {
|
||||
checkDiagnosticsWithMppProject("unusedSourceSets") {
|
||||
kotlin {
|
||||
jvm()
|
||||
linuxX64()
|
||||
|
||||
sourceSets.apply {
|
||||
val unused1 = create("unused1")
|
||||
// Check that dependsOn doesn't make source set "used"
|
||||
create("unused2").dependsOn(unused1)
|
||||
// Check that depending on used source sets doesn't make source set "used"
|
||||
create("unusedWithDependsOnUsed").dependsOn(commonMain)
|
||||
|
||||
// Check that custom intermediate source set isn't reported as unused
|
||||
val intermediate = create("intermediate")
|
||||
jvmMain.dependsOn(intermediate)
|
||||
intermediate.dependsOn(commonMain)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun unusedSourceSetsAndroid() {
|
||||
checkDiagnosticsWithMppProject("unusedSourceSetsAndroid") {
|
||||
androidLibrary {
|
||||
compileSdk = 32
|
||||
|
||||
// Check that source sets of custom build types are not reported as unused
|
||||
buildTypes {
|
||||
create("staging")
|
||||
}
|
||||
|
||||
// Check that source sets of custom product flavors are not reported as unused
|
||||
flavorDimensions += "version"
|
||||
productFlavors {
|
||||
create("demo")
|
||||
create("paid")
|
||||
}
|
||||
}
|
||||
|
||||
kotlin {
|
||||
androidTarget()
|
||||
linuxX64()
|
||||
|
||||
sourceSets.apply {
|
||||
val intermediateBetweenAndroid = create("intermediate")
|
||||
androidMain.dependsOn(intermediateBetweenAndroid)
|
||||
intermediateBetweenAndroid.dependsOn(commonMain)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
[CommonMainWithDependsOnDiagnostic | WARNING] commonMain can't declare dependsOn on other source sets
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
PROJECT: <root>
|
||||
|
||||
|
||||
PROJECT: subproject
|
||||
[TEST_DIAGNOSTIC_ONE_PER_BUILD | WARNING] This is a test diagnostics that should be reported once per build
|
||||
|
||||
It has multiple lines of text
|
||||
+1
@@ -0,0 +1 @@
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
[DeprecatedJvmWithJavaPresetDiagnostic | WARNING] The 'jvmWithJava' preset is deprecated and will be removed soon. Please use an ordinary JVM target with Java support:
|
||||
|
||||
kotlin {
|
||||
jvm {
|
||||
withJava()
|
||||
}
|
||||
}
|
||||
|
||||
After this change, please move the Java sources to the Kotlin source set directories.
|
||||
For example, if the JVM target is given the default name 'jvm':
|
||||
* instead of 'src/main/java', use 'src/jvmMain/java'
|
||||
* instead of 'src/test/java', use 'src/jvmTest/java'
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
[TEST_DIAGNOSTIC | WARNING] This is a test diagnostic
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC_ONE_PER_PROJECT | WARNING] This is a test diagnostics that should be reported once per project
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC_ONE_PER_BUILD | WARNING] This is a test diagnostics that should be reported once per build
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC | WARNING] This is a test diagnostic
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC | WARNING] This is a test diagnostic
|
||||
|
||||
It has multiple lines of text
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
PROJECT: <root>
|
||||
[TEST_DIAGNOSTIC | WARNING] This is a test diagnostic
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC_ONE_PER_PROJECT | WARNING] This is a test diagnostics that should be reported once per project
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC_ONE_PER_BUILD | WARNING] This is a test diagnostics that should be reported once per build
|
||||
|
||||
It has multiple lines of text
|
||||
|
||||
PROJECT: subproject-a
|
||||
[TEST_DIAGNOSTIC | WARNING] This is a test diagnostic
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC_ONE_PER_PROJECT | WARNING] This is a test diagnostics that should be reported once per project
|
||||
|
||||
It has multiple lines of text
|
||||
|
||||
PROJECT: subproject-b
|
||||
[TEST_DIAGNOSTIC | WARNING] This is a test diagnostic
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC_ONE_PER_PROJECT | WARNING] This is a test diagnostics that should be reported once per project
|
||||
|
||||
It has multiple lines of text
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
[TEST_DIAGNOSTIC_ONE_PER_PROJECT | WARNING] This is a test diagnostics that should be reported once per project
|
||||
|
||||
It has multiple lines of text
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
[TEST_DIAGNOSTIC | WARNING] This is a test diagnostic
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC_ONE_PER_PROJECT | WARNING] This is a test diagnostics that should be reported once per project
|
||||
|
||||
It has multiple lines of text
|
||||
----
|
||||
[TEST_DIAGNOSTIC_ONE_PER_BUILD | WARNING] This is a test diagnostics that should be reported once per build
|
||||
|
||||
It has multiple lines of text
|
||||
+1
@@ -0,0 +1 @@
|
||||
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
[UnusedSourceSetsWarning | WARNING] The following Kotlin source sets were configured but not added to any Kotlin compilation:
|
||||
* unused1
|
||||
* unused2
|
||||
* unusedWithDependsOnUsed
|
||||
You can add a source set to a target's compilation by connecting it with the compilation's default source set using 'dependsOn'.
|
||||
See https://kotl.in/connecting-source-sets
|
||||
Reference in New Issue
Block a user