From 24454ba72613a3cd64ea3978882615f9dddb8b3c Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Tue, 28 Sep 2021 13:37:40 +0200 Subject: [PATCH] Split toolchain and jvm target validation tests. Should slightly improve test suite execution time. --- .../kotlin/gradle/JvmTargetValidationTest.kt | 340 ++++++++++++++++++ .../kotlin/gradle/KotlinJavaToolchainTest.kt | 278 +------------- 2 files changed, 348 insertions(+), 270 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JvmTargetValidationTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JvmTargetValidationTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JvmTargetValidationTest.kt new file mode 100644 index 00000000000..122a89ec8f4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JvmTargetValidationTest.kt @@ -0,0 +1,340 @@ +/* + * Copyright 2010-2021 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 + +import org.gradle.api.JavaVersion +import org.gradle.api.logging.LogLevel +import org.gradle.internal.jvm.JavaInfo +import org.gradle.internal.jvm.Jvm +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.junit.jupiter.api.DisplayName +import java.io.File +import kotlin.io.path.ExperimentalPathApi +import kotlin.io.path.createDirectories +import kotlin.io.path.writeText + +@DisplayName("JVM tasks target validation") +@SimpleGradlePluginTests +class JvmTargetValidationTest : KGPBaseTest() { + + @DisplayName("Should produce warning if java and kotlin jvm targets are different") + @GradleTestVersions(minVersion = "6.7.1") + @GradleTest + internal fun shouldWarnIfJavaAndKotlinJvmTargetsAreDifferent(gradleVersion: GradleVersion) { + project( + projectName = "kotlinJavaProject".fullProjectName, + gradleVersion = gradleVersion, + buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.WARN) + ) { + setJavaCompilationCompatibility(JavaVersion.VERSION_1_8) + useToolchainToCompile(11) + + build("assemble") { + assertOutputContains( + "'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " + + "should be set to the same Java version." + ) + } + } + } + + @DisplayName("Should fail the build if verification mode is 'error' and kotlin and java targets are different") + @GradleTestVersions(minVersion = "6.7.1") + @GradleTest + internal fun shouldFailBuildIfJavaAndKotlinJvmTargetsAreDifferent(gradleVersion: GradleVersion) { + project( + projectName = "kotlinJavaProject".fullProjectName, + gradleVersion = gradleVersion + ) { + setJavaCompilationCompatibility(JavaVersion.VERSION_1_8) + useToolchainToCompile(11) + //language=properties + gradleProperties.append( + """ + # suppress inspection "UnusedProperty" + kotlin.jvm.target.validation.mode = error + """.trimIndent() + ) + + buildAndFail("assemble") { + assertOutputContains( + "'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " + + "should be set to the same Java version." + ) + } + } + } + + @DisplayName("Should ignore if verification mode is 'ignore' and kotlin and java targets are different") + @GradleTestVersions(minVersion = "6.7.1") + @GradleTest + internal fun shouldNotPrintAnythingIfJavaAndKotlinJvmTargetsAreDifferent( + gradleVersion: GradleVersion + ) { + project( + projectName = "kotlinJavaProject".fullProjectName, + gradleVersion = gradleVersion + ) { + setJavaCompilationCompatibility(JavaVersion.VERSION_1_8) + useToolchainToCompile(11) + //language=properties + gradleProperties.append( + """ + # suppress inspection "UnusedProperty" + kotlin.jvm.target.validation.mode = ignore + """.trimIndent() + ) + + build("assemble") { + assertOutputDoesNotContain( + "'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " + + "should be set to the same Java version." + ) + } + } + } + + @DisplayName("Should not produce warning when java and kotlin jvm targets are the same") + @GradleTestVersions(minVersion = "6.7.1") + @GradleTest + internal fun shouldNotWarnOnJavaAndKotlinSameJvmTargets(gradleVersion: GradleVersion) { + project( + projectName = "kotlinJavaProject".fullProjectName, + gradleVersion = gradleVersion + ) { + useToolchainToCompile(11) + + build("build") { + assertOutputDoesNotContain( + "'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " + + "should be set to the same Java version." + ) + } + } + } + + @DisplayName("Should produce Java-Kotlin jvm target incompatibility warning only for related tasks") + @GradleTestVersions(minVersion = "6.7.1") + @GradleTest + internal fun shouldProduceJavaKotlinJvmTargetDifferenceWarningOnlyForRelatedTasks( + gradleVersion: GradleVersion + ) { + project( + projectName = "kotlinJavaProject".fullProjectName, + gradleVersion = gradleVersion + ) { + useToolchainToCompile(11) + + JavaVersion.VERSION_1_8 + //language=Groovy + rootBuildGradle.append( + """ + + tasks + .matching { + it instanceof JavaCompile && it.name == "compileTestJava" + } + .configureEach { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + """.trimIndent() + ) + + build("build") { + assertOutputContains( + "'compileTestJava' task (current target is 1.8) and 'compileTestKotlin' task (current target is 11) jvm target " + + "compatibility should be set to the same Java version." + ) + assertOutputDoesNotContain( + "'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " + + "should be set to the same Java version." + ) + } + } + } + + @DisplayName("Should correctly validate JVM targets in mixed Kotlin/Java projects that are using