diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 96032410f2c..51df2c35d31 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -151,6 +151,11 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin { MppTestReportHelper.MppTestReportHelperVariantFactory::class, DefaultMppTestReportHelperVariantFactory() ) + + factories.putIfAbsent( + KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class, + DefaultKotlinTestReportCompatibilityHelperVariantFactory() + ) } protected fun setupAttributeMatchingStrategy( 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 new file mode 100644 index 00000000000..1942f42f2e0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelper.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2022 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.plugin.internal + +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.model.ObjectFactory +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 + * See the [migration guide](https://docs.gradle.org/7.6/userguide/upgrading_version_7.html#replacement_methods_in_org_gradle_api_tasks_testing_testreport). + */ +interface KotlinTestReportCompatibilityHelper { + fun getDestinationDirectory(kotlinTestReport: KotlinTestReport): DirectoryProperty + + fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: File) + + fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) + + interface KotlinTestReportCompatibilityHelperVariantFactory : VariantImplementationFactories.VariantImplementationFactory { + fun getInstance(objectFactory: ObjectFactory): KotlinTestReportCompatibilityHelper + } +} + +internal class DefaultKotlinTestReportCompatibilityHelperVariantFactory : + KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory { + override fun getInstance(objectFactory: ObjectFactory): KotlinTestReportCompatibilityHelper = DefaultKotlinTestReportCompatibilityHelper() +} + +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 addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) { + kotlinTestReport.testResults.from(task.binaryResultsDirectory) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestReport.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestReport.kt index 64ac8408fea..4ac7bb75a48 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestReport.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestReport.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.testing.internal import org.gradle.api.GradleException import org.gradle.api.execution.TaskExecutionGraph +import org.gradle.api.file.RegularFileProperty import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input @@ -16,10 +17,10 @@ import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.testing.* import org.jetbrains.kotlin.gradle.internal.testing.KotlinTestRunnerListener import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider +import org.jetbrains.kotlin.gradle.plugin.internal.KotlinTestReportCompatibilityHelper import org.jetbrains.kotlin.gradle.tasks.KotlinTest import org.jetbrains.kotlin.gradle.utils.appendLine -import java.io.File -import java.net.URI +import org.jetbrains.kotlin.gradle.utils.toUri /** * Aggregates tests reports for kotlin test tasks added by [registerTestTask]. @@ -77,6 +78,9 @@ abstract class KotlinTestReport : TestReport() { private val hasFailedTests: Boolean get() = testReportService.hasFailedTests(path) + @get:Internal + internal abstract val testReportCompatibilityHelper: Property + private fun computeAllParentTasksPaths(): List { val allParents = mutableListOf() var cur: KotlinTestReport? = this @@ -130,15 +134,17 @@ abstract class KotlinTestReport : TestReport() { } private fun reportOn(task: AbstractTestTask) { - reportOn(task.binaryResultsDirectory) + testReportCompatibilityHelper.get().addTestResultsFrom(this, task) } + @get:Internal + abstract val htmlReportFile: RegularFileProperty + + @Suppress("unused") + @Deprecated("Use `htmlReportFile` instead", ReplaceWith("htmlReportFile")) + @get:Internal open val htmlReportUrl: String? - @Internal get() = destinationDir?.let { asClickableFileUrl(it.resolve("index.html")) } - - private fun asClickableFileUrl(path: File): String { - return URI("file", "", path.toURI().path, null, null).toString() - } + get() = htmlReportFile.orNull?.toUri().toString() @TaskAction fun checkFailedTests() { @@ -157,9 +163,8 @@ abstract class KotlinTestReport : TestReport() { private fun getFailingTestsMessage(): String { val message = StringBuilder("There were failing tests.") - val reportUrl = htmlReportUrl - if (reportUrl != null) { - message.append(" See the report at: $reportUrl") + if (htmlReportFile.isPresent) { + message.append(" See the report at: ${htmlReportFile.get().toUri()}") } return message.toString() } 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 aa4ce88172b..7d5d4b59038 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 @@ -13,6 +13,8 @@ import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.testing.AbstractTestTask import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.logging.kotlinInfo +import org.jetbrains.kotlin.gradle.plugin.internal.KotlinTestReportCompatibilityHelper +import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory import org.jetbrains.kotlin.gradle.tasks.dependsOn import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.registerTask @@ -85,15 +87,21 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = " aggregate.description = description aggregate.group = JavaBasePlugin.VERIFICATION_GROUP - aggregate.destinationDir = project.testReportsDir.resolve(reportName) + val compatibilityHelper = project.gradle + .variantImplementationFactory() + .getInstance(project.objects) + + compatibilityHelper.setDestinationDirectory(aggregate, project.testReportsDir.resolve(reportName)) val isIdeaActive = project.readSystemPropertyAtConfigurationTime("idea.active").isPresent if (isIdeaActive) { aggregate.extensions.extraProperties.set("idea.internal.test", true) } + aggregate.htmlReportFile.value(compatibilityHelper.getDestinationDirectory(aggregate).file("index.html")).disallowChanges() aggregate.usesService(testReportService) aggregate.testReportServiceProvider.value(testReportService).finalizeValueOnRead() + aggregate.testReportCompatibilityHelper.value(compatibilityHelper).finalizeValueOnRead() project.gradle.taskGraph.whenReady { graph -> aggregate.maybeOverrideReporting(graph) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt index d6a5a2c97f8..d57785f59fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.utils import org.gradle.api.Project +import org.gradle.api.file.RegularFile import java.io.File import java.io.IOException import java.nio.file.Files @@ -114,3 +115,5 @@ fun contentEquals(file1: File, file2: File): Boolean { } } } + +internal fun RegularFile.toUri() = asFile.toPath().toUri() \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt index 5394b968627..f0928753f86 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt @@ -147,4 +147,6 @@ private fun Project.registerVariantImplementations() { ConfigurationTimePropertiesAccessorG70.ConfigurationTimePropertiesAccessorVariantFactoryG70() factories[MppTestReportHelper.MppTestReportHelperVariantFactory::class] = MppTestReportHelperG70.MppTestReportHelperVariantFactoryG70() + factories[KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class] = + KotlinTestReportCompatibilityHelperG70.KotlinTestReportCompatibilityHelperVariantFactoryG70() } 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 new file mode 100644 index 00000000000..5feafd9dc61 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG70.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2022 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.plugin.internal + +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.model.ObjectFactory +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 +) : KotlinTestReportCompatibilityHelper { + override fun getDestinationDirectory(kotlinTestReport: KotlinTestReport): DirectoryProperty = + objectFactory.directoryProperty().fileValue(kotlinTestReport.destinationDir) + + override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: File) { + kotlinTestReport.destinationDir = directory + } + + override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) { + kotlinTestReport.reportOn(task.binaryResultsDirectory) + } + + internal class KotlinTestReportCompatibilityHelperVariantFactoryG70 : + KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory { + override fun getInstance(objectFactory: ObjectFactory): KotlinTestReportCompatibilityHelper = + KotlinTestReportCompatibilityHelperG70(objectFactory) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt index 01f6e4035a7..474cef35bb7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt @@ -148,4 +148,6 @@ private fun Project.registerVariantImplementations() { ConfigurationTimePropertiesAccessorG71.ConfigurationTimePropertiesAccessorVariantFactoryG71() factories[MppTestReportHelper.MppTestReportHelperVariantFactory::class] = MppTestReportHelperG71.MppTestReportHelperVariantFactoryG71() + factories[KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class] = + KotlinTestReportCompatibilityHelperG71.KotlinTestReportCompatibilityHelperVariantFactoryG71() } 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 new file mode 100644 index 00000000000..477aec054ac --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG71.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2022 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.plugin.internal + +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.model.ObjectFactory +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 +) : KotlinTestReportCompatibilityHelper { + override fun getDestinationDirectory(kotlinTestReport: KotlinTestReport): DirectoryProperty = + objectFactory.directoryProperty().fileValue(kotlinTestReport.destinationDir) + + override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: File) { + kotlinTestReport.destinationDir = directory + } + + override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) { + kotlinTestReport.reportOn(task.binaryResultsDirectory) + } + + internal class KotlinTestReportCompatibilityHelperVariantFactoryG71 : + KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory { + override fun getInstance(objectFactory: ObjectFactory): KotlinTestReportCompatibilityHelper = + KotlinTestReportCompatibilityHelperG71(objectFactory) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt index 9618f910626..db2a719af39 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt @@ -153,4 +153,6 @@ private fun Project.registerVariantImplementations() { ConfigurationTimePropertiesAccessorG6.ConfigurationTimePropertiesAccessorVariantFactoryG6() factories[MppTestReportHelper.MppTestReportHelperVariantFactory::class] = MppTestReportHelperG6.MppTestReportHelperVariantFactoryG6() + factories[KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class] = + KotlinTestReportCompatibilityHelperG6.KotlinTestReportCompatibilityHelperVariantFactoryG6() } \ No newline at end of file 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 new file mode 100644 index 00000000000..5f02e9a7166 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/KotlinTestReportCompatibilityHelperG6.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2022 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.plugin.internal + +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.model.ObjectFactory +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 +) : KotlinTestReportCompatibilityHelper { + override fun getDestinationDirectory(kotlinTestReport: KotlinTestReport): DirectoryProperty = + objectFactory.directoryProperty().fileValue(kotlinTestReport.destinationDir) + + override fun setDestinationDirectory(kotlinTestReport: KotlinTestReport, directory: File) { + kotlinTestReport.destinationDir = directory + } + + override fun addTestResultsFrom(kotlinTestReport: KotlinTestReport, task: AbstractTestTask) { + kotlinTestReport.reportOn(task.binaryResultsDirectory) + } + + internal class KotlinTestReportCompatibilityHelperVariantFactoryG6 : + KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory { + override fun getInstance(objectFactory: ObjectFactory): KotlinTestReportCompatibilityHelper = + KotlinTestReportCompatibilityHelperG6(objectFactory) + } +} \ No newline at end of file