From f48e8dd35e986bc7d1f525d2b46b9f056f9ac696 Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Thu, 18 Nov 2021 21:45:52 +0300 Subject: [PATCH] [Gradle] Move basic configuration cache IT scenario to helpers file #KT-45745 In Progress --- .../kotlin/gradle/ConfigurationCacheIT.kt | 67 ++------------- .../kotlin/gradle/JvmTargetValidationTest.kt | 5 +- .../org/jetbrains/kotlin/gradle/Kapt3IT.kt | 5 +- .../kotlin/gradle/KotlinJavaToolchainTest.kt | 10 +-- .../testbase/configurationCacheHelpers.kt | 83 +++++++++++++++++++ 5 files changed, 93 insertions(+), 77 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/configurationCacheHelpers.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt index 8217d6a60db..f51adc9d564 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt @@ -9,11 +9,6 @@ import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat import org.jetbrains.kotlin.gradle.testbase.* import org.junit.jupiter.api.DisplayName -import java.net.URI -import java.nio.file.Path -import kotlin.io.path.ExperimentalPathApi -import kotlin.io.path.name -import kotlin.test.fail @DisplayName("Configuration cache") class ConfigurationCacheIT : AbstractConfigurationCacheIT() { @@ -231,61 +226,11 @@ abstract class AbstractConfigurationCacheIT : KGPBaseTest() { checkUpToDateOnRebuild: Boolean = true, buildOptions: BuildOptions = defaultBuildOptions ) { - // First, run a build that serializes the tasks state for instant execution in further builds - - val executedTask: List = executedTaskNames ?: taskNames.toList() - - build(*taskNames, buildOptions = buildOptions) { - assertTasksExecuted(*executedTask.toTypedArray()) - assertOutputContains( - "Calculating task graph as no configuration cache is available for tasks: ${taskNames.joinToString(separator = " ")}" - ) - assertInstantExecutionSucceeded() - } - - build("clean", buildOptions = buildOptions) - - // Then run a build where tasks states are deserialized to check that they work correctly in this mode - build(*taskNames, buildOptions = buildOptions) { - assertTasksExecuted(*executedTask.toTypedArray()) - assertOutputContains("Reusing configuration cache.") - } - - if (checkUpToDateOnRebuild) { - build(*taskNames, buildOptions = buildOptions) { - assertTasksUpToDate(*executedTask.toTypedArray()) - } - } + assertSimpleConfigurationCacheScenarioWorks( + *taskNames, + executedTaskNames = executedTaskNames, + checkUpToDateOnRebuild = checkUpToDateOnRebuild, + buildOptions = buildOptions, + ) } - - private fun GradleProject.assertInstantExecutionSucceeded() { - instantExecutionReportFile?.let { htmlReportFile -> - fail("Instant execution problems were found, check ${htmlReportFile.asClickableFileUrl} for details.") - } - } - - /** - * Copies all files from the directory containing the given [htmlReportFile] to a - * fresh temp dir and returns a reference to the copied [htmlReportFile] in the new - * directory. - */ - @OptIn(ExperimentalPathApi::class) - private fun copyReportToTempDir(htmlReportFile: Path): Path = - createTempDir("report").let { tempDir -> - htmlReportFile.parent.toFile().copyRecursively(tempDir.toFile()) - tempDir.resolve(htmlReportFile.name) - } - - /** - * The instant execution report file, if exists, indicates problems were - * found while caching the task graph. - */ - private val GradleProject.instantExecutionReportFile - get() = projectPath - .resolve("build") - .findInPath("configuration-cache-report.html") - ?.let { copyReportToTempDir(it) } - - private val Path.asClickableFileUrl - get() = URI("file", "", toUri().path, null, null).toString() } 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 index 36aa763fdf6..a89d5594cc8 100644 --- 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 @@ -246,10 +246,7 @@ class JvmTargetValidationTest : KGPBaseTest() { project( projectName = "simple".fullProjectName, gradleVersion = gradleVersion, - buildOptions = defaultBuildOptions.copy( - configurationCache = true, - configurationCacheProblems = BaseGradleIT.ConfigurationCacheProblems.FAIL - ), + buildOptions = defaultBuildOptions.withConfigurationCache, buildJdk = getJdk11().javaHome // should differ from default Kotlin jvm target value ) { // Validation mode should be 'warning' because of https://github.com/gradle/gradle/issues/9339 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt index 3839a741db5..94540af81e0 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt @@ -844,10 +844,7 @@ open class Kapt3IT : Kapt3BaseIT() { project( "incrementalRebuild".withPrefix, gradleVersion, - buildOptions = defaultBuildOptions.copy( - configurationCache = true, - configurationCacheProblems = BaseGradleIT.ConfigurationCacheProblems.FAIL - ) + buildOptions = defaultBuildOptions.withConfigurationCache ) { build("assemble") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt index 3c6ec2ee7b5..b0ee380d977 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt @@ -592,10 +592,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() { project( projectName = "simple".fullProjectName, gradleVersion = gradleVersion, - buildOptions = defaultBuildOptions.copy( - configurationCache = true, - configurationCacheProblems = BaseGradleIT.ConfigurationCacheProblems.FAIL - ) + buildOptions = defaultBuildOptions.withConfigurationCache ) { useToolchainExtension(15) @@ -618,10 +615,7 @@ class KotlinJavaToolchainTest : KGPBaseTest() { project( projectName = "simple".fullProjectName, gradleVersion = gradleVersion, - buildOptions = defaultBuildOptions.copy( - configurationCache = true, - configurationCacheProblems = BaseGradleIT.ConfigurationCacheProblems.FAIL - ) + buildOptions = defaultBuildOptions.withConfigurationCache ) { //language=properties gradleProperties.append( diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/configurationCacheHelpers.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/configurationCacheHelpers.kt new file mode 100644 index 00000000000..b597f0fce05 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/configurationCacheHelpers.kt @@ -0,0 +1,83 @@ +/* + * 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.testbase + +import org.jetbrains.kotlin.gradle.BaseGradleIT +import java.net.URI +import java.nio.file.Path +import kotlin.io.path.ExperimentalPathApi +import kotlin.io.path.name +import kotlin.test.fail + +/** + * Tests whether configuration cache for the tasks specified by [buildArguments] works on simple scenario when project is built twice non-incrementally. + */ +fun TestProject.assertSimpleConfigurationCacheScenarioWorks( + vararg buildArguments: String, + buildOptions: BuildOptions, + executedTaskNames: List? = null, + checkUpToDateOnRebuild: Boolean = true, +) { + // First, run a build that serializes the tasks state for configuration cache in further builds + + val executedTask: List = executedTaskNames ?: buildArguments.toList() + + build(*buildArguments, buildOptions = buildOptions) { + assertTasksExecuted(*executedTask.toTypedArray()) + assertOutputContains( + "Calculating task graph as no configuration cache is available for tasks: ${buildArguments.joinToString(separator = " ")}" + ) + assertConfigurationCacheSucceeded() + } + + build("clean", buildOptions = buildOptions) + + // Then run a build where tasks states are deserialized to check that they work correctly in this mode + build(*buildArguments, buildOptions = buildOptions) { + assertTasksExecuted(*executedTask.toTypedArray()) + assertOutputContains("Reusing configuration cache.") + } + + if (checkUpToDateOnRebuild) { + build(*buildArguments, buildOptions = buildOptions) { + assertTasksUpToDate(*executedTask.toTypedArray()) + } + } +} + +/** + * Copies all files from the directory containing the given [htmlReportFile] to a + * fresh temp dir and returns a reference to the copied [htmlReportFile] in the new + * directory. + */ +@OptIn(ExperimentalPathApi::class) +private fun copyReportToTempDir(htmlReportFile: Path): Path = + createTempDir("report").let { tempDir -> + htmlReportFile.parent.toFile().copyRecursively(tempDir.toFile()) + tempDir.resolve(htmlReportFile.name) + } + +/** + * The configuration cache report file, if exists, indicates problems were + * found while caching the task graph. + */ +private val GradleProject.configurationCacheReportFile + get() = projectPath + .resolve("build") + .findInPath("configuration-cache-report.html") + ?.let { copyReportToTempDir(it) } + +private val Path.asClickableFileUrl + get() = URI("file", "", toUri().path, null, null).toString() + +private fun GradleProject.assertConfigurationCacheSucceeded() { + configurationCacheReportFile?.let { htmlReportFile -> + fail("Configuration cache problems were found, check ${htmlReportFile.asClickableFileUrl} for details.") + } +} + +val BuildOptions.withConfigurationCache: BuildOptions + get() = copy(configurationCache = true, configurationCacheProblems = BaseGradleIT.ConfigurationCacheProblems.FAIL) \ No newline at end of file