[Gradle] Fix early buildDir capturing in kotlinTestRegistry

User may change build directory location in the script, and our
plugin should handle such situations correctly.

^KT-61295 Fixed
This commit is contained in:
Yahor Berdnikau
2023-11-05 22:51:06 +01:00
committed by Space Team
parent 5c8d55fba7
commit 570d9dbb19
7 changed files with 35 additions and 37 deletions
@@ -8,8 +8,6 @@ package org.jetbrains.kotlin.gradle.mpp
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.condition.OS
import kotlin.io.path.absolutePathString
import kotlin.io.path.appendText
import kotlin.io.path.readText
@@ -78,6 +76,8 @@ class BrokenLazyConfigurationIT : KGPBaseTest() {
@MppGradlePluginTests
@GradleTest
// Required Gradle APIs to avoid buildDir early capture only available since 7.4
@GradleTestVersions(minVersion = TestVersions.Gradle.G_7_4)
@DisplayName("Changing build directory after task configuration doesn't lead to failures")
fun changingBuildDirInMpp(gradleVersion: GradleVersion) {
project("new-mpp-lib-with-tests", gradleVersion) {
@@ -95,7 +95,6 @@ class BrokenLazyConfigurationIT : KGPBaseTest() {
} catch (e: AssertionError) {
val expectedTopLevelSubdirectoriesMapping = mapOf(
"js" to "KT-61294",
"reports" to "KT-61295",
)
val expectedTopLevelSubdirectories = expectedTopLevelSubdirectoriesMapping.keys
val actualTopLevelDirectories =
@@ -5,13 +5,14 @@
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.testing.AbstractTestTask
import org.gradle.api.tasks.testing.TestReport
import org.jetbrains.kotlin.gradle.plugin.VariantImplementationFactories
import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport
import java.io.File
/**
* Handles the differences in the [TestReport] API introduced in Gradle 7.4
@@ -20,7 +21,7 @@ import java.io.File
interface KotlinTestReportCompatibilityHelper {
fun getDestinationDirectory(kotlinTestReport: KotlinTestReport): DirectoryProperty
fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: File)
fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: Provider<Directory>)
fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask)
@@ -37,8 +38,8 @@ internal class DefaultKotlinTestReportCompatibilityHelperVariantFactory :
internal class DefaultKotlinTestReportCompatibilityHelper : KotlinTestReportCompatibilityHelper {
override fun getDestinationDirectory(kotlinTestReport: KotlinTestReport): DirectoryProperty = kotlinTestReport.destinationDirectory
override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: File) {
kotlinTestReport.destinationDirectory.fileValue(directory).finalizeValueOnRead()
override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: Provider<Directory>) {
kotlinTestReport.destinationDirectory.value(directory).finalizeValueOnRead()
}
override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) {
@@ -81,7 +81,6 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = "
val existed = project.locateTask<KotlinTestReport>(name)
if (existed != null) return existed
val reportName = name
val testReportService = TestReportService.registerIfAbsent(project)
val aggregate: TaskProvider<KotlinTestReport> = project.registerTask(name) { aggregate ->
aggregate.description = description
@@ -91,7 +90,7 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = "
.variantImplementationFactory<KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory>()
.getInstance(project.objects)
compatibilityHelper.setDestinationDirectory(aggregate, project.testReportsDir.resolve(reportName))
compatibilityHelper.setDestinationDirectory(aggregate, project.testReportsDir.map { it.dir(name) })
val isIdeaActive = project.readSystemPropertyAtConfigurationTime("idea.active").isPresent
@@ -6,35 +6,31 @@
package org.jetbrains.kotlin.gradle.testing.internal
import org.gradle.api.Project
import org.gradle.api.internal.plugins.DslObject
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Provider
import org.gradle.api.reporting.ReportingExtension
import org.gradle.api.tasks.testing.TestTaskReports
import org.gradle.testing.base.plugins.TestingBasePlugin
import org.jetbrains.kotlin.gradle.tasks.KotlinTest
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
import java.io.File
internal val Project.testResultsDir: File
get() = project.buildDir.resolve(TestingBasePlugin.TEST_RESULTS_DIR_NAME)
internal val Project.reportsDir: File
get() = project.extensions.getByType(ReportingExtension::class.java).baseDir
private val Project.testResultsDir: Provider<Directory>
get() = project.layout.buildDirectory.dir(TestingBasePlugin.TEST_RESULTS_DIR_NAME)
private val Project.reportsDir: DirectoryProperty
get() = project.extensions.getByType(ReportingExtension::class.java).baseDirectory
internal val Project.testReportsDir: File
get() = reportsDir.resolve(TestingBasePlugin.TESTS_DIR_NAME)
internal val Project.testReportsDir: Provider<Directory>
get() = reportsDir.dir(TestingBasePlugin.TESTS_DIR_NAME)
internal fun KotlinTest.configureConventions() {
reports.configureConventions(project, name)
fun binaryResultsDirDefault(): File = project.testResultsDir.resolve("$name/binary")
@Suppress("UnstableApiUsage")
binaryResultsDirectory.convention(project.layout.buildDirectory.dir(binaryResultsDirDefault().toRelativeString(project.buildDir)))
binaryResultsDirectory
.convention(project.testResultsDir.map { it.dir("$name/binary") })
.finalizeValueOnRead()
}
internal fun TestTaskReports.configureConventions(project: Project, name: String) {
val htmlReport = DslObject(html)
val xmlReport = DslObject(junitXml)
xmlReport.conventionMapping.map("destination") { project.testResultsDir.resolve(name) }
htmlReport.conventionMapping.map("destination") { project.testReportsDir.resolve(name) }
}
html.outputLocation.convention(project.testReportsDir.map { it.dir(name) }).finalizeValueOnRead()
junitXml.outputLocation.convention(project.testResultsDir.map { it.dir(name) }).finalizeValueOnRead()
}
@@ -5,11 +5,12 @@
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.testing.AbstractTestTask
import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport
import java.io.File
internal class KotlinTestReportCompatibilityHelperG70(
private val objectFactory: ObjectFactory
@@ -17,8 +18,8 @@ internal class KotlinTestReportCompatibilityHelperG70(
override fun getDestinationDirectory(kotlinTestReport: KotlinTestReport): DirectoryProperty =
objectFactory.directoryProperty().fileValue(kotlinTestReport.destinationDir)
override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: File) {
kotlinTestReport.destinationDir = directory
override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: Provider<Directory>) {
kotlinTestReport.destinationDir = directory.get().asFile
}
override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) {
@@ -5,11 +5,12 @@
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.testing.AbstractTestTask
import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport
import java.io.File
internal class KotlinTestReportCompatibilityHelperG71(
private val objectFactory: ObjectFactory
@@ -17,8 +18,8 @@ internal class KotlinTestReportCompatibilityHelperG71(
override fun getDestinationDirectory(kotlinTestReport: KotlinTestReport): DirectoryProperty =
objectFactory.directoryProperty().fileValue(kotlinTestReport.destinationDir)
override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: File) {
kotlinTestReport.destinationDir = directory
override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: Provider<Directory>) {
kotlinTestReport.destinationDir = directory.get().asFile
}
override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) {
@@ -5,11 +5,12 @@
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.testing.AbstractTestTask
import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport
import java.io.File
internal class KotlinTestReportCompatibilityHelperG6(
private val objectFactory: ObjectFactory
@@ -17,8 +18,8 @@ internal class KotlinTestReportCompatibilityHelperG6(
override fun getDestinationDirectory(kotlinTestReport: KotlinTestReport): DirectoryProperty =
objectFactory.directoryProperty().fileValue(kotlinTestReport.destinationDir)
override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: File) {
kotlinTestReport.destinationDir = directory
override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: Provider<Directory>) {
kotlinTestReport.destinationDir = directory.get().asFile
}
override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) {