Gradle, tests: don't use gradle testing internals by default
This commit is contained in:
+97
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
+27
-70
@@ -1,56 +1,30 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* that can be found in the license/LICENSE.txt file.
|
* 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.CollectionCallbackActionDecorator
|
||||||
import org.gradle.api.internal.tasks.testing.DefaultTestTaskReports
|
import org.gradle.api.internal.tasks.testing.DefaultTestTaskReports
|
||||||
import org.gradle.api.internal.tasks.testing.junit.result.*
|
import org.gradle.api.internal.tasks.testing.junit.result.*
|
||||||
import org.gradle.api.internal.tasks.testing.report.DefaultTestReport
|
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.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.concurrent.CompositeStoppable.stoppable
|
||||||
import org.gradle.internal.logging.ConsoleRenderer
|
import org.gradle.internal.logging.ConsoleRenderer
|
||||||
import org.gradle.internal.operations.BuildOperationExecutor
|
import org.gradle.internal.operations.BuildOperationExecutor
|
||||||
import org.gradle.internal.reflect.Instantiator
|
import org.gradle.internal.reflect.Instantiator
|
||||||
import org.gradle.internal.remote.internal.inet.InetAddressFactory
|
import org.gradle.internal.remote.internal.inet.InetAddressFactory
|
||||||
import org.jetbrains.kotlin.gradle.utils.injected
|
import org.jetbrains.kotlin.gradle.utils.injected
|
||||||
import java.io.File
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@Suppress("UnstableApiUsage")
|
@Suppress("UnstableApiUsage")
|
||||||
open class AggregateTestReport : DefaultTask() {
|
open class AggregateTestReportGradle5 : AggregateTestReport() {
|
||||||
@Internal
|
@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
|
val reports: DefaultTestTaskReports
|
||||||
|
|
||||||
protected open val instantiator: Instantiator
|
protected open val instantiator: Instantiator
|
||||||
@@ -72,31 +46,14 @@ open class AggregateTestReport : DefaultTask() {
|
|||||||
reports.html.isEnabled = true
|
reports.html.isEnabled = true
|
||||||
}
|
}
|
||||||
|
|
||||||
private var hasFailedTests = false
|
override fun configureReportsConvention(name: String) {
|
||||||
|
reports.configureConventions(project, name)
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal var checkFailedTests: Boolean = false
|
override val htmlReportUrl: String?
|
||||||
|
get() =
|
||||||
fun registerTestTask(task: AbstractTestTask) {
|
if (reports.html.isEnabled) ConsoleRenderer().asClickableFileUrl(reports.html.destination.resolve("index.html"))
|
||||||
testTasks.add(task)
|
else null
|
||||||
task.addTestListener(failedTestsListener)
|
|
||||||
}
|
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
fun generateReport() {
|
fun generateReport() {
|
||||||
@@ -130,20 +87,7 @@ open class AggregateTestReport : DefaultTask() {
|
|||||||
stoppable(resultsProvider).stop()
|
stoppable(resultsProvider).stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkFailedTests && hasFailedTests) {
|
checkFailedTests()
|
||||||
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())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createAggregateProvider(): TestResultsProvider {
|
private fun createAggregateProvider(): TestResultsProvider {
|
||||||
@@ -157,4 +101,17 @@ open class AggregateTestReport : DefaultTask() {
|
|||||||
throw e
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+2
-12
@@ -11,7 +11,6 @@ import org.gradle.api.plugins.JavaBasePlugin
|
|||||||
import org.gradle.api.tasks.testing.AbstractTestTask
|
import org.gradle.api.tasks.testing.AbstractTestTask
|
||||||
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
||||||
import org.jetbrains.kotlin.gradle.plugin.TaskHolder
|
import org.jetbrains.kotlin.gradle.plugin.TaskHolder
|
||||||
import org.jetbrains.kotlin.gradle.tasks.AggregateTestReport
|
|
||||||
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
||||||
|
|
||||||
private val Project.allTestsTask: TaskHolder<AggregateTestReport>
|
private val Project.allTestsTask: TaskHolder<AggregateTestReport>
|
||||||
@@ -29,7 +28,7 @@ internal fun Project.getAggregatedTestTask(name: String, description: String, re
|
|||||||
aggregate.description = description
|
aggregate.description = description
|
||||||
aggregate.group = JavaBasePlugin.VERIFICATION_GROUP
|
aggregate.group = JavaBasePlugin.VERIFICATION_GROUP
|
||||||
|
|
||||||
aggregate.reports.configureConventions(project, reportName)
|
aggregate.configureReportsConvention(reportName)
|
||||||
|
|
||||||
aggregate.onlyIf {
|
aggregate.onlyIf {
|
||||||
aggregate.testTasks.size > 1
|
aggregate.testTasks.size > 1
|
||||||
@@ -80,16 +79,7 @@ internal fun registerTestTaskInAggregate(
|
|||||||
// - disable all reporting in test tasks
|
// - disable all reporting in test tasks
|
||||||
// - enable [checkFailedTests] on [allTestsTask]
|
// - enable [checkFailedTests] on [allTestsTask]
|
||||||
|
|
||||||
task.ignoreFailures = true
|
allTests.overrideReporting(task)
|
||||||
|
|
||||||
@Suppress("UnstableApiUsage")
|
|
||||||
task.reports.html.isEnabled = false
|
|
||||||
|
|
||||||
@Suppress("UnstableApiUsage")
|
|
||||||
task.reports.junitXml.isEnabled = false
|
|
||||||
|
|
||||||
allTests.checkFailedTests = true
|
|
||||||
allTests.ignoreFailures = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user