Gradle, tests: don't use gradle testing internals by default

This commit is contained in:
Sergey Rostov
2019-05-19 10:00:32 +03:00
parent 75646f97a4
commit 48fd3b6b87
3 changed files with 126 additions and 82 deletions
@@ -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<AbstractTestTask>()
/**
* Returns the set of binary test results to include in the report.
*/
@Suppress("MemberVisibilityCanBePrivate")
val testResultDirs: Collection<File>
@PathSensitive(PathSensitivity.NONE)
@InputFiles
@SkipWhenEmpty
get() {
val dirs = mutableListOf<File>()
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
}
}
@@ -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<AbstractTestTask>()
/**
* Returns the set of binary test results to include in the report.
*/
@Suppress("MemberVisibilityCanBePrivate")
val testResultDirs: Collection<File>
@PathSensitive(PathSensitivity.NONE)
@InputFiles
@SkipWhenEmpty
get() {
val dirs = mutableListOf<File>()
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
}
}
@@ -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<AggregateTestReport>
@@ -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)
}
}