[Gradle] Move basic configuration cache IT scenario to helpers file

#KT-45745 In Progress
This commit is contained in:
Alexander Likhachev
2021-11-18 21:45:52 +03:00
parent 09da67767e
commit f48e8dd35e
5 changed files with 93 additions and 77 deletions
@@ -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<String> = 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()
}
@@ -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
@@ -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")
@@ -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(
@@ -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<String>? = null,
checkUpToDateOnRebuild: Boolean = true,
) {
// First, run a build that serializes the tasks state for configuration cache in further builds
val executedTask: List<String> = 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)