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