From 570d9dbb19de3f9f662fb60389f144d66cdc5cba Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sun, 5 Nov 2023 22:51:06 +0100 Subject: [PATCH] [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 --- .../gradle/mpp/BrokenLazyConfigurationIT.kt | 5 ++- .../KotlinTestReportCompatibilityHelper.kt | 9 ++--- .../testing/internal/KotlinTestsRegistry.kt | 3 +- .../gradle/testing/internal/conventions.kt | 34 ++++++++----------- .../KotlinTestReportCompatibilityHelperG70.kt | 7 ++-- .../KotlinTestReportCompatibilityHelperG71.kt | 7 ++-- .../KotlinTestReportCompatibilityHelperG6.kt | 7 ++-- 7 files changed, 35 insertions(+), 37 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/BrokenLazyConfigurationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/BrokenLazyConfigurationIT.kt index dc91057ded8..a073bc3182c 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/BrokenLazyConfigurationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/BrokenLazyConfigurationIT.kt @@ -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 = diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelper.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelper.kt index 1942f42f2e0..addde12e24f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelper.kt @@ -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) 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) { + kotlinTestReport.destinationDirectory.value(directory).finalizeValueOnRead() } override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt index 9d01b2d46b3..38e95194249 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt @@ -81,7 +81,6 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = " val existed = project.locateTask(name) if (existed != null) return existed - val reportName = name val testReportService = TestReportService.registerIfAbsent(project) val aggregate: TaskProvider = project.registerTask(name) { aggregate -> aggregate.description = description @@ -91,7 +90,7 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = " .variantImplementationFactory() .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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/conventions.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/conventions.kt index 3731c459724..420e90c6997 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/conventions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/conventions.kt @@ -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 + 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 + 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) } -} \ No newline at end of file + html.outputLocation.convention(project.testReportsDir.map { it.dir(name) }).finalizeValueOnRead() + junitXml.outputLocation.convention(project.testResultsDir.map { it.dir(name) }).finalizeValueOnRead() +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG70.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG70.kt index 5feafd9dc61..48eaece8cfe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG70.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG70.kt @@ -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) { + kotlinTestReport.destinationDir = directory.get().asFile } override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG71.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG71.kt index 477aec054ac..f3588b4c191 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG71.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG71.kt @@ -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) { + kotlinTestReport.destinationDir = directory.get().asFile } override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG6.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG6.kt index 5f02e9a7166..4182bfaadec 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG6.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG6.kt @@ -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) { + kotlinTestReport.destinationDir = directory.get().asFile } override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) {