diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/AggregateTestReport.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/AggregateTestReport.kt new file mode 100644 index 00000000000..78ea58aa6a2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/AggregateTestReport.kt @@ -0,0 +1,97 @@ +/* + * Copyright 2010-2019 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.testing.internal + +import org.gradle.api.GradleException +import org.gradle.api.internal.AbstractTask +import org.gradle.api.tasks.* +import org.gradle.api.tasks.testing.AbstractTestTask +import org.gradle.api.tasks.testing.TestDescriptor +import org.gradle.api.tasks.testing.TestListener +import org.gradle.api.tasks.testing.TestResult +import java.io.File + +open class AggregateTestReport : AbstractTask() { + @Internal + val testTasks = mutableListOf() + + /** + * Returns the set of binary test results to include in the report. + */ + @Suppress("MemberVisibilityCanBePrivate") + val testResultDirs: Collection + @PathSensitive(PathSensitivity.NONE) + @InputFiles + @SkipWhenEmpty + get() { + val dirs = mutableListOf() + testTasks.forEach { + @Suppress("UnstableApiUsage") + dirs.add(it.binResultsDir) + } + return dirs + } + + @Input + var ignoreFailures: Boolean = false + + private var hasFailedTests = false + + private val failedTestsListener = object : TestListener { + override fun beforeTest(testDescriptor: TestDescriptor) { + } + + override fun afterSuite(suite: TestDescriptor, result: TestResult) { + } + + override fun beforeSuite(suite: TestDescriptor) { + } + + override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) { + if (result.failedTestCount > 0) { + hasFailedTests = true + } + } + } + + @Input + var checkFailedTests: Boolean = false + + fun registerTestTask(task: AbstractTestTask) { + testTasks.add(task) + task.addTestListener(failedTestsListener) + } + + open fun configureReportsConvention(name: String) { + + } + + @Internal + protected open val htmlReportUrl: String? = null + + protected fun checkFailedTests() { + if (checkFailedTests && hasFailedTests) { + val message = StringBuilder("There were failing tests.") + + val reportUrl = htmlReportUrl + if (reportUrl != null) { + message.append(" See the report at: $reportUrl") + } + + if (ignoreFailures) { + logger.warn(message.toString()) + } else { + throw GradleException(message.toString()) + } + } + } + + open fun overrideReporting(task: AbstractTestTask) { + task.ignoreFailures = true + checkFailedTests = true + ignoreFailures = false + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/AggregateTestReport.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/AggregateTestReportGradle5.kt similarity index 58% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/AggregateTestReport.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/AggregateTestReportGradle5.kt index 2f57ddf1e4f..237ef441091 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/AggregateTestReport.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/AggregateTestReportGradle5.kt @@ -1,56 +1,30 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. + * Copyright 2010-2019 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.tasks +package org.jetbrains.kotlin.gradle.testing.internal -import org.gradle.api.DefaultTask -import org.gradle.api.GradleException import org.gradle.api.internal.CollectionCallbackActionDecorator import org.gradle.api.internal.tasks.testing.DefaultTestTaskReports import org.gradle.api.internal.tasks.testing.junit.result.* import org.gradle.api.internal.tasks.testing.report.DefaultTestReport -import org.gradle.api.tasks.* +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.Nested +import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.testing.AbstractTestTask -import org.gradle.api.tasks.testing.TestDescriptor -import org.gradle.api.tasks.testing.TestListener -import org.gradle.api.tasks.testing.TestResult import org.gradle.internal.concurrent.CompositeStoppable.stoppable import org.gradle.internal.logging.ConsoleRenderer import org.gradle.internal.operations.BuildOperationExecutor import org.gradle.internal.reflect.Instantiator import org.gradle.internal.remote.internal.inet.InetAddressFactory import org.jetbrains.kotlin.gradle.utils.injected -import java.io.File import java.util.* import javax.inject.Inject @Suppress("UnstableApiUsage") -open class AggregateTestReport : DefaultTask() { +open class AggregateTestReportGradle5 : AggregateTestReport() { @Internal - val testTasks = mutableListOf() - - /** - * Returns the set of binary test results to include in the report. - */ - @Suppress("MemberVisibilityCanBePrivate") - val testResultDirs: Collection - @PathSensitive(PathSensitivity.NONE) - @InputFiles - @SkipWhenEmpty - get() { - val dirs = mutableListOf() - testTasks.forEach { - dirs.add(it.binResultsDir) - } - return dirs - } - - @Input - var ignoreFailures: Boolean = false - - @Nested val reports: DefaultTestTaskReports protected open val instantiator: Instantiator @@ -72,31 +46,14 @@ open class AggregateTestReport : DefaultTask() { reports.html.isEnabled = true } - private var hasFailedTests = false - - private val failedTestsListener = object : TestListener { - override fun beforeTest(testDescriptor: TestDescriptor) { - } - - override fun afterSuite(suite: TestDescriptor, result: TestResult) { - } - - override fun beforeSuite(suite: TestDescriptor) { - } - - override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) { - if (result.failedTestCount > 0) { - hasFailedTests = true - } - } + override fun configureReportsConvention(name: String) { + reports.configureConventions(project, name) } - internal var checkFailedTests: Boolean = false - - fun registerTestTask(task: AbstractTestTask) { - testTasks.add(task) - task.addTestListener(failedTestsListener) - } + override val htmlReportUrl: String? + get() = + if (reports.html.isEnabled) ConsoleRenderer().asClickableFileUrl(reports.html.destination.resolve("index.html")) + else null @TaskAction fun generateReport() { @@ -130,20 +87,7 @@ open class AggregateTestReport : DefaultTask() { stoppable(resultsProvider).stop() } - if (checkFailedTests && hasFailedTests) { - val message = StringBuilder("There were failing tests.") - - if (reports.html.isEnabled) { - val reportUrl = ConsoleRenderer().asClickableFileUrl(reports.html.destination.resolve("index.html")) - message.append(" See the report at: $reportUrl") - } - - if (ignoreFailures) { - logger.warn(message.toString()) - } else { - throw GradleException(message.toString()) - } - } + checkFailedTests() } private fun createAggregateProvider(): TestResultsProvider { @@ -157,4 +101,17 @@ open class AggregateTestReport : DefaultTask() { throw e } } + + override fun overrideReporting(task: AbstractTestTask) { + task.ignoreFailures = true + + @Suppress("UnstableApiUsage") + task.reports.html.isEnabled = false + + @Suppress("UnstableApiUsage") + task.reports.junitXml.isEnabled = false + + checkFailedTests = true + ignoreFailures = false + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/testsRegistry.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/testsRegistry.kt index f420011e4d1..2141c0004c8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/testsRegistry.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/testsRegistry.kt @@ -11,7 +11,6 @@ import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.tasks.testing.AbstractTestTask import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.plugin.TaskHolder -import org.jetbrains.kotlin.gradle.tasks.AggregateTestReport import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask private val Project.allTestsTask: TaskHolder @@ -29,7 +28,7 @@ internal fun Project.getAggregatedTestTask(name: String, description: String, re aggregate.description = description aggregate.group = JavaBasePlugin.VERIFICATION_GROUP - aggregate.reports.configureConventions(project, reportName) + aggregate.configureReportsConvention(reportName) aggregate.onlyIf { aggregate.testTasks.size > 1 @@ -80,16 +79,7 @@ internal fun registerTestTaskInAggregate( // - disable all reporting in test tasks // - enable [checkFailedTests] on [allTestsTask] - task.ignoreFailures = true - - @Suppress("UnstableApiUsage") - task.reports.html.isEnabled = false - - @Suppress("UnstableApiUsage") - task.reports.junitXml.isEnabled = false - - allTests.checkFailedTests = true - allTests.ignoreFailures = false + allTests.overrideReporting(task) } }