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
|
||||
* 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
|
||||
}
|
||||
}
|
||||
+2
-12
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user