diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppDiagnosticsIt.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppDiagnosticsIt.kt index 9391ffecd29..a0a5d09d4c4 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppDiagnosticsIt.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppDiagnosticsIt.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.gradle.mpp import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics import org.jetbrains.kotlin.gradle.testbase.* +import org.jetbrains.kotlin.test.TestMetadata +import java.io.File import kotlin.io.path.appendText import kotlin.io.path.writeText @@ -16,9 +18,8 @@ class MppDiagnosticsIt : KGPBaseTest() { @GradleTest fun testDiagnosticsRenderingSmoke(gradleVersion: GradleVersion) { project("diagnosticsRenderingSmoke", gradleVersion) { - val expectedOutputFile = projectPath.resolve("expectedOutput.txt").toFile() build { - assertEqualsToFile(expectedOutputFile, extractProjectsAndTheirVerboseDiagnostics()) + assertEqualsToFile(expectedOutputFile(), extractProjectsAndTheirVerboseDiagnostics()) } } } @@ -46,6 +47,132 @@ class MppDiagnosticsIt : KGPBaseTest() { } } + @GradleTest + fun testErrorDiagnosticBuildFails(gradleVersion: GradleVersion) { + project("errorDiagnosticBuildFails", gradleVersion) { + // 'assemble' (triggers compileKotlin-tasks indirectly): fail + buildAndFail("assemble") { + assertEqualsToFile(expectedOutputFile("assemble"), extractProjectsAndTheirVerboseDiagnostics()) + } + + // 'clean', not directly relevant to Kotlin tasks: build is OK + build("clean") { + assertEqualsToFile(expectedOutputFile("clean"), extractProjectsAndTheirVerboseDiagnostics()) + } + + // Custom task, irrelevant to Kotlin tasks: build is OK + build("myTask", "--rerun-tasks") { + assertEqualsToFile(expectedOutputFile("customTask"), extractProjectsAndTheirVerboseDiagnostics()) + } + + // commonizer task: build is OK (otherwise IDE will be bricked) + build("commonize") { + assertEqualsToFile(expectedOutputFile("commonize"), extractProjectsAndTheirVerboseDiagnostics()) + } + } + } + + @GradleTest + @GradleTestVersions(minVersion = TestVersions.Gradle.G_7_6) + @TestMetadata("errorDiagnosticBuildFails") + fun testErrorDiagnosticBuildFailsWithConfigurationCache(gradleVersion: GradleVersion) { + project("errorDiagnosticBuildFails", gradleVersion) { + buildAndFail("assemble", buildOptions = buildOptions.copy(configurationCache = true)) { + assertConfigurationCacheStored() + assertEqualsToFile(expectedOutputFile("assemble"), extractProjectsAndTheirVerboseDiagnostics()) + } + + // fails again + buildAndFail("assemble", buildOptions = buildOptions.copy(configurationCache = true)) { + assertConfigurationCacheReused() + assertEqualsToFile(expectedOutputFile("assemble-cache-reused"), extractProjectsAndTheirVerboseDiagnostics()) + } + } + } + + @GradleTest + fun testErrorDiagnosticBuildSucceeds(gradleVersion: GradleVersion) { + project("errorDiagnosticBuildSucceeds", gradleVersion) { + build("assemble") { + assertEqualsToFile(expectedOutputFile("assemble"), extractProjectsAndTheirVerboseDiagnostics()) + } + build("myTask", "--rerun-tasks") { + assertEqualsToFile(expectedOutputFile("customTask"), extractProjectsAndTheirVerboseDiagnostics()) + } + } + } + + @GradleTest + fun testSuppressGradlePluginErrors(gradleVersion: GradleVersion) { + project("suppressGradlePluginErrors", gradleVersion) { + // build succeeds + build("assemble") { + assertEqualsToFile(expectedOutputFile(), extractProjectsAndTheirVerboseDiagnostics()) + } + } + } + + @GradleTest + fun testSuppressGradlePluginWarnings(gradleVersion: GradleVersion) { + project("suppressGradlePluginWarnings", gradleVersion) { + build("assemble") { + assertEqualsToFile(expectedOutputFile(), extractProjectsAndTheirVerboseDiagnostics()) + } + } + } + + @GradleTest + fun testSuppressGradlePluginFatals(gradleVersion: GradleVersion) { + project("suppressGradlePluginFatals", gradleVersion) { + buildAndFail("assemble") { + // Gradle 8.0+ for some reason renders exception twice in the build log + val testDataSuffixIfAny = if (gradleVersion < GradleVersion.version(TestVersions.Gradle.G_8_0)) "gradle-6.8.3" else null + + assertEqualsToFile(expectedOutputFile(testDataSuffixIfAny), extractProjectsAndTheirVerboseDiagnostics()) + } + } + } + + @GradleTest + fun testErrorsFailOnlyRelevantProjects(gradleVersion: GradleVersion) { + project("errorsFailOnlyRelevantProjects", gradleVersion) { + buildAndFail("brokenProjectA:assemble") { + assertEqualsToFile(expectedOutputFile("brokenA"), extractProjectsAndTheirVerboseDiagnostics()) + } + + buildAndFail("brokenProjectB:assemble") { + assertEqualsToFile(expectedOutputFile("brokenB"), extractProjectsAndTheirVerboseDiagnostics()) + } + + build("healthyProject:assemble") { + assertEqualsToFile(expectedOutputFile("healthy"), extractProjectsAndTheirVerboseDiagnostics()) + } + + // Turn off parallel execution so that order of execution (and therefore the testdata) is stable + buildAndFail("assemble", buildOptions = buildOptions.copy(parallel = false)) { + assertEqualsToFile(expectedOutputFile("root"), extractProjectsAndTheirVerboseDiagnostics()) + } + + buildAndFail("assemble", "--continue", buildOptions = buildOptions.copy(parallel = false)) { + assertEqualsToFile(expectedOutputFile("root-with-continue"), extractProjectsAndTheirVerboseDiagnostics()) + } + } + } + + @GradleTest + fun testEarlyTasksMaterializationDoesntBreakReports(gradleVersion: GradleVersion) { + project("earlyTasksMaterializationDoesntBreakReports", gradleVersion) { + buildAndFail("assemble") { + assertEqualsToFile(expectedOutputFile(), extractProjectsAndTheirVerboseDiagnostics()) + } + } + } + + private fun TestProject.expectedOutputFile(suffix: String? = null): File { + val suffixIfAny = if (suffix != null) "-$suffix" else "" + return projectPath.resolve("expectedOutput$suffixIfAny.txt").toFile() + } + private fun TestProject.checkDeprecatedProperties(isDeprecationExpected: Boolean) { build { if (isDeprecationExpected) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/diagnosticsAssertions.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/diagnosticsAssertions.kt index 17e41df458f..81641b8bf5c 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/diagnosticsAssertions.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/diagnosticsAssertions.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.testbase import org.gradle.testkit.runner.BuildResult import org.jetbrains.kotlin.gradle.BaseGradleIT +import org.jetbrains.kotlin.gradle.internals.ENSURE_NO_KOTLIN_GRADLE_PLUGIN_ERRORS_TASK_NAME import org.jetbrains.kotlin.gradle.internals.VERBOSE_DIAGNOSTIC_SEPARATOR import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnosticFactory @@ -117,11 +118,12 @@ fun BuildResult.extractProjectsAndTheirVerboseDiagnostics(): String = buildStrin when { line.trim() == VERBOSE_DIAGNOSTIC_SEPARATOR -> endDiagnostic(line, index) - DIAGNOSTIC_START_REGEX.matches(line) -> startDiagnostic(line, index) + DIAGNOSTIC_START_REGEX.containsMatchIn(line) -> startDiagnostic(line, index) diagnosticStarted -> continueDiagnostic(line) - line.startsWith(CONFIGURE_PROJECT_PREFIX) -> { + line.startsWith(CONFIGURE_PROJECT_PREFIX) + || (line.contains(ENSURE_NO_KOTLIN_GRADLE_PLUGIN_ERRORS_TASK_NAME) && line.startsWith(TASK_EXECUTION_PREFIX)) -> { appendLine() // additional empty line between projects appendLine(line) } @@ -132,9 +134,10 @@ fun BuildResult.extractProjectsAndTheirVerboseDiagnostics(): String = buildStrin /* Expected format w: [DIAGNOSTIC_ID | WARNING] first line of diagnostic's text +or (fatals don't have 'w:' or 'e:' prefix): + [DIAGNOSTIC_ID | FATAL] Fatal diagnostic */ -private val DIAGNOSTIC_START_REGEX = """\s*[we]:\s*\[[^\[]*].*""".toRegex() - +private val DIAGNOSTIC_START_REGEX = """\s*([we]:)?\s*\[\w+ \| \w+].*""".toRegex() /* Expected format: @@ -186,3 +189,4 @@ private fun extractNextVerboselyRenderedDiagnosticAndIndex( } private const val CONFIGURE_PROJECT_PREFIX = "> Configure project" +private const val TASK_EXECUTION_PREFIX = "> Task" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/build.gradle.kts new file mode 100644 index 00000000000..e4567fc0e03 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + + +// Materialize tasks early +tasks.all { } + +kotlin { + jvm() + linuxX64() + + sourceSets { + val myCommonMain by creating + + val commonMain by getting { + dependsOn(myCommonMain) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/expectedOutput.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/expectedOutput.txt new file mode 100644 index 00000000000..5b3bd8eae89 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/expectedOutput.txt @@ -0,0 +1,8 @@ +> Configure project : +e: [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets +#diagnostic-end + + +> Task :ensureNoKotlinGradlePluginErrors FAILED +e: [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/gradle.properties new file mode 100644 index 00000000000..51a2828b18a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/gradle.properties @@ -0,0 +1,2 @@ +# We're using dependsOn to provoke CommonMainWithDependsOn error +kotlin.mpp.applyDefaultHierarchyTemplate=false diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/settings.gradle.kts new file mode 100644 index 00000000000..11a1c9bfc64 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/earlyTasksMaterializationDoesntBreakReports/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "diagnostics-rendering-smoke" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/build.gradle.kts new file mode 100644 index 00000000000..c9281fac85a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + // Using deprecated target to provoke ERROR-diagnostic. If you came here because you removed + // that target entirely, just replace it with any other construction from KGP that provokes + // ERROR-diagnostic + @Suppress("DEPRECATION_ERROR") + linuxMips32() + linuxX64() +} + +tasks.create("myTask") { + println("Custom Task Executed") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-assemble-cache-reused.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-assemble-cache-reused.txt new file mode 100644 index 00000000000..7e8be82a0b6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-assemble-cache-reused.txt @@ -0,0 +1,3 @@ +> Task :ensureNoKotlinGradlePluginErrors FAILED +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-assemble.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-assemble.txt new file mode 100644 index 00000000000..7d8cf2c18e1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-assemble.txt @@ -0,0 +1,8 @@ +> Configure project : +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end + + +> Task :ensureNoKotlinGradlePluginErrors FAILED +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-clean.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-clean.txt new file mode 100644 index 00000000000..b0f7951555c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-clean.txt @@ -0,0 +1,3 @@ +> Configure project : +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-commonize.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-commonize.txt new file mode 100644 index 00000000000..b0f7951555c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-commonize.txt @@ -0,0 +1,3 @@ +> Configure project : +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-customTask.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-customTask.txt new file mode 100644 index 00000000000..b0f7951555c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/expectedOutput-customTask.txt @@ -0,0 +1,3 @@ +> Configure project : +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/settings.gradle.kts new file mode 100644 index 00000000000..11a1c9bfc64 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildFails/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "diagnostics-rendering-smoke" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/build.gradle.kts new file mode 100644 index 00000000000..c8f56177554 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + // no targets declared -- will provoke ERROR-diagnostic, but also no compileKotlin tasks will be created, + // so 'assemble' or similar will pass +} + +tasks.create("myTask") { + println("Custom Task Executed") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/expectedOutput-assemble.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/expectedOutput-assemble.txt new file mode 100644 index 00000000000..cc66aab1506 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/expectedOutput-assemble.txt @@ -0,0 +1,11 @@ +> Configure project : +e: [NoKotlinTargetsDeclared | ERROR] Please initialize at least one Kotlin target in 'diagnostics-rendering-smoke (:)'. +Read more https://kotl.in/set-up-targets +#diagnostic-end + +w: [UnusedSourceSetsWarning | WARNING] The following Kotlin source sets were configured but not added to any Kotlin compilation: + * commonMain + * commonTest +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 +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/expectedOutput-customTask.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/expectedOutput-customTask.txt new file mode 100644 index 00000000000..cc66aab1506 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/expectedOutput-customTask.txt @@ -0,0 +1,11 @@ +> Configure project : +e: [NoKotlinTargetsDeclared | ERROR] Please initialize at least one Kotlin target in 'diagnostics-rendering-smoke (:)'. +Read more https://kotl.in/set-up-targets +#diagnostic-end + +w: [UnusedSourceSetsWarning | WARNING] The following Kotlin source sets were configured but not added to any Kotlin compilation: + * commonMain + * commonTest +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 +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/settings.gradle.kts new file mode 100644 index 00000000000..11a1c9bfc64 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorDiagnosticBuildSucceeds/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "diagnostics-rendering-smoke" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/brokenProjectA/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/brokenProjectA/build.gradle.kts new file mode 100644 index 00000000000..6170bbf3053 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/brokenProjectA/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + kotlin("multiplatform") +} + +kotlin { + // Using deprecated target to provoke ERROR-diagnostic. If you came here because you removed + // that target entirely, just replace it with any other construction from KGP that provokes + // ERROR-diagnostic + @Suppress("DEPRECATION_ERROR") + linuxMips32() +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/brokenProjectB/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/brokenProjectB/build.gradle.kts new file mode 100644 index 00000000000..fd72f4d0dbe --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/brokenProjectB/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + kotlin("multiplatform") +} + +kotlin { + jvm() + linuxX64() + + sourceSets { + val myCommonMain by creating + + val commonMain by getting { + dependsOn(myCommonMain) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/build.gradle.kts new file mode 100644 index 00000000000..448f4930cb0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + kotlin("multiplatform") apply false +} + +allprojects { + repositories { + mavenLocal() + mavenCentral() + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-brokenA.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-brokenA.txt new file mode 100644 index 00000000000..7182f814691 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-brokenA.txt @@ -0,0 +1,17 @@ +> Configure project : + +> Configure project :brokenProjectA +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end + + +> Configure project :brokenProjectB +e: [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets +#diagnostic-end + + +> Configure project :healthyProject + +> Task :brokenProjectA:ensureNoKotlinGradlePluginErrors FAILED +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-brokenB.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-brokenB.txt new file mode 100644 index 00000000000..938474aa0bf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-brokenB.txt @@ -0,0 +1,17 @@ +> Configure project : + +> Configure project :brokenProjectA +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end + + +> Configure project :brokenProjectB +e: [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets +#diagnostic-end + + +> Configure project :healthyProject + +> Task :brokenProjectB:ensureNoKotlinGradlePluginErrors FAILED +e: [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-healthy.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-healthy.txt new file mode 100644 index 00000000000..2cd4fed135f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-healthy.txt @@ -0,0 +1,15 @@ +> Configure project : + +> Configure project :brokenProjectA +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end + + +> Configure project :brokenProjectB +e: [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets +#diagnostic-end + + +> Configure project :healthyProject + +> Task :healthyProject:ensureNoKotlinGradlePluginErrors diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-root-with-continue.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-root-with-continue.txt new file mode 100644 index 00000000000..602e1854cdc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-root-with-continue.txt @@ -0,0 +1,25 @@ +> Configure project : + +> Configure project :brokenProjectA +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end + + +> Configure project :brokenProjectB +e: [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets +#diagnostic-end + + +> Configure project :healthyProject + +> Task :brokenProjectA:ensureNoKotlinGradlePluginErrors FAILED +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end + + +> Task :brokenProjectB:ensureNoKotlinGradlePluginErrors FAILED +e: [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets +#diagnostic-end + + +> Task :healthyProject:ensureNoKotlinGradlePluginErrors diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-root.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-root.txt new file mode 100644 index 00000000000..7182f814691 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/expectedOutput-root.txt @@ -0,0 +1,17 @@ +> Configure project : + +> Configure project :brokenProjectA +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end + + +> Configure project :brokenProjectB +e: [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets +#diagnostic-end + + +> Configure project :healthyProject + +> Task :brokenProjectA:ensureNoKotlinGradlePluginErrors FAILED +e: [DeprecatedKotlinNativeTargetsDiagnostic | ERROR] The following removed Kotlin/Native targets were used in the project: linuxMips32 +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/gradle.properties new file mode 100644 index 00000000000..ac406d9e5a7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/gradle.properties @@ -0,0 +1,2 @@ +# We're using dependsOn in 'brokenProjectB' to provoke CommonMainWithDependsOn error +kotlin.mpp.applyDefaultHierarchyTemplate=false diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/healthyProject/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/healthyProject/build.gradle.kts new file mode 100644 index 00000000000..ae3d228bf14 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/healthyProject/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + kotlin("multiplatform") +} + +kotlin { + jvm() + linuxX64() +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/settings.gradle.kts new file mode 100644 index 00000000000..b0c660e260d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/errorsFailOnlyRelevantProjects/settings.gradle.kts @@ -0,0 +1,3 @@ +include("brokenProjectA", "brokenProjectB", "healthyProject") + +rootProject.name = "diagnostics-rendering-smoke" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/build.gradle.kts new file mode 100644 index 00000000000..9a2e4ff1fbd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + // Using deprecated target to provoke ERROR-diagnostic. If you came here because you removed + // that target entirely, just replace it with any other construction from KGP that provokes + // ERROR-diagnostic + @Suppress("DEPRECATION_ERROR") + linuxMips32() +} + +tasks.create("myTask") { + println("Custom Task Executed") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/expectedOutput.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/expectedOutput.txt new file mode 100644 index 00000000000..d3ab1061d79 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/expectedOutput.txt @@ -0,0 +1,12 @@ +> Configure project : +w: [InternalKotlinGradlePluginPropertiesUsed | WARNING] ATTENTION! This build uses the following Kotlin Gradle Plugin properties: + +kotlin.internal.suppressGradlePluginErrors +kotlin.internal.verboseDiagnostics + +kotlin.internal-properties are not recommended for production use. +Stability and future compatibility of the build is not guaranteed. +#diagnostic-end + + +> Task :ensureNoKotlinGradlePluginErrors diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/gradle.properties new file mode 100644 index 00000000000..60275daf393 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/gradle.properties @@ -0,0 +1,3 @@ +kotlin.internal.suppressGradlePluginErrors=DeprecatedKotlinNativeTargetsDiagnostic +# Check that the warning about internal KGP properties is not suppressible +kotlin.suppressGradlePluginWarning=InternalKotlinGradlePluginPropertiesUsed \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/settings.gradle.kts new file mode 100644 index 00000000000..11a1c9bfc64 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginErrors/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "diagnostics-rendering-smoke" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/build.gradle.kts new file mode 100644 index 00000000000..bf47435e5a1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/build.gradle.kts @@ -0,0 +1,22 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + jvm() + + sourceSets { + val intermediate by creating + + val jvmMain by getting { + dependsOn(intermediate) + } + + intermediate.dependsOn(jvmMain) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/expectedOutput-gradle-6.8.3.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/expectedOutput-gradle-6.8.3.txt new file mode 100644 index 00000000000..d722e2a0609 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/expectedOutput-gradle-6.8.3.txt @@ -0,0 +1,6 @@ +> Configure project : +[CircularDependsOnEdges | FATAL] Circular dependsOn hierarchy found in the Kotlin source sets: intermediate -> jvmMain -> intermediate +#diagnostic-end + +org.gradle.api.InvalidUserCodeException: [CircularDependsOnEdges | FATAL] Circular dependsOn hierarchy found in the Kotlin source sets: intermediate -> jvmMain -> intermediate +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/expectedOutput.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/expectedOutput.txt new file mode 100644 index 00000000000..f95c879a803 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/expectedOutput.txt @@ -0,0 +1,12 @@ +> Configure project : +[CircularDependsOnEdges | FATAL] Circular dependsOn hierarchy found in the Kotlin source sets: intermediate -> jvmMain -> intermediate +#diagnostic-end + +org.gradle.api.InvalidUserCodeException: [CircularDependsOnEdges | FATAL] Circular dependsOn hierarchy found in the Kotlin source sets: intermediate -> jvmMain -> intermediate +#diagnostic-end + +[CircularDependsOnEdges | FATAL] Circular dependsOn hierarchy found in the Kotlin source sets: intermediate -> jvmMain -> intermediate +#diagnostic-end + +org.gradle.api.InvalidUserCodeException: [CircularDependsOnEdges | FATAL] Circular dependsOn hierarchy found in the Kotlin source sets: intermediate -> jvmMain -> intermediate +#diagnostic-end diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/gradle.properties new file mode 100644 index 00000000000..0392bb2007c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/gradle.properties @@ -0,0 +1,2 @@ +kotlin.internal.suppressGradlePluginErrors=CircularDependsOnEdges +kotlin.suppressGradlePluginWarnings=CircularDependsOnEdges \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/settings.gradle.kts new file mode 100644 index 00000000000..11a1c9bfc64 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginFatals/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "diagnostics-rendering-smoke" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/build.gradle.kts new file mode 100644 index 00000000000..c6cfbcdb909 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + jvm() + + sourceSets { + val orphan by creating { } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/expectedOutput.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/expectedOutput.txt new file mode 100644 index 00000000000..07aecc3766d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/expectedOutput.txt @@ -0,0 +1,3 @@ +> Configure project : + +> Task :ensureNoKotlinGradlePluginErrors diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/gradle.properties new file mode 100644 index 00000000000..5f1e8b0da76 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/gradle.properties @@ -0,0 +1 @@ +kotlin.suppressGradlePluginWarnings=UnusedSourceSetsWarning \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/settings.gradle.kts new file mode 100644 index 00000000000..9c1598eecc1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/suppressGradlePluginWarnings/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "suppress-gradle-plugin-warnings" diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/internals/ExposedForIntegrationTests.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/internals/ExposedForIntegrationTests.kt index ed32d2dbd32..cf662589be7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/internals/ExposedForIntegrationTests.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/internals/ExposedForIntegrationTests.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.internals import org.jetbrains.kotlin.compilerRunner.asFinishLogMessage import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS import org.jetbrains.kotlin.gradle.plugin.diagnostics.DIAGNOSTIC_SEPARATOR +import org.jetbrains.kotlin.gradle.plugin.diagnostics.EnsureNoKotlinGradlePluginErrors import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinProjectStructureMetadata import org.jetbrains.kotlin.gradle.plugin.mpp.MULTIPLATFORM_PROJECT_METADATA_JSON_FILE_NAME import org.jetbrains.kotlin.gradle.plugin.mpp.parseKotlinSourceSetMetadataFromJson @@ -21,5 +22,7 @@ const val KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS_PROPERTY = KOTLIN_NATIVE_IGNORE_ const val VERBOSE_DIAGNOSTIC_SEPARATOR = DIAGNOSTIC_SEPARATOR +const val ENSURE_NO_KOTLIN_GRADLE_PLUGIN_ERRORS_TASK_NAME = EnsureNoKotlinGradlePluginErrors.TASK_NAME + val KotlinCompilerExecutionStrategy.asFinishLogMessage: String - get() = this.asFinishLogMessage \ No newline at end of file + get() = this.asFinishLogMessage