From 8b16f182f61d769c50551e0d4127770d9fe1f5a3 Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Thu, 4 Apr 2019 16:49:18 +0300 Subject: [PATCH] Gradle, tests: show test results in IDE #KT-29946 --- .../testing/TCServiceMessagesClient.kt | 18 +++++++++++++++--- .../gradle/plugin/KotlinTargetConfigurator.kt | 3 +-- .../js/KotlinJsCompilationTestsConfigurator.kt | 4 ++-- .../native/KotlinNativeTargetConfigurator.kt | 4 ++-- .../kotlin/gradle/tasks/AggregateTestReport.kt | 17 ----------------- .../kotlin/gradle/testing/KotlinTestFailure.kt | 6 ++++-- .../testing/{ => internal}/conventions.kt | 2 +- .../testing/{ => internal}/testsRegistry.kt | 14 ++++++++++---- .../kotlin/gradle/testing/internal/ultimate.kt | 17 +++++++++++++++++ 9 files changed, 52 insertions(+), 33 deletions(-) rename libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/{ => internal}/conventions.kt (96%) rename libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/{ => internal}/testsRegistry.kt (75%) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/ultimate.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/testing/TCServiceMessagesClient.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/testing/TCServiceMessagesClient.kt index 64d43ba34ac..5a9d0390844 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/testing/TCServiceMessagesClient.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/testing/TCServiceMessagesClient.kt @@ -32,7 +32,11 @@ internal class TCServiceMessagesClient( val settings: TCServiceMessagesClientSettings, val log: Logger ) : ServiceMessageParserCallback { + lateinit var rootOperationId: Any + inline fun root(operation: OperationIdentifier, actions: () -> Unit) { + rootOperationId = operation.id + RootNode(operation.id).open { actions() } @@ -129,7 +133,9 @@ internal class TCServiceMessagesClient( extractExceptionClassName(parsedStackTrace?.message ?: message.failureMessage), message.failureMessage, stacktrace, - patchStackTrace(this, parsedStackTrace?.stackTrace) + patchStackTrace(this, parsedStackTrace?.stackTrace), + message.expected, + message.actual ) ) } @@ -333,6 +339,7 @@ internal class TCServiceMessagesClient( inner class RootNode(val ownerBuildOperationId: Any) : GroupNode(null, settings.rootNodeName) { override val descriptor: TestDescriptorInternal = object : DefaultTestSuiteDescriptor(settings.rootNodeName, localId) { override fun getOwnerBuildOperationId(): Any? = this@RootNode.ownerBuildOperationId + override fun getParent(): TestDescriptorInternal? = null } override fun requireReportingNode(): TestDescriptorInternal = descriptor @@ -376,7 +383,9 @@ internal class TCServiceMessagesClient( this.reportingParent = reportingParent descriptor = object : DefaultTestSuiteDescriptor(id, fullName) { - override fun getParent(): TestDescriptorInternal? = reportingParent.descriptor + override fun getDisplayName(): String = fullNameWithoutRoot + override fun getOwnerBuildOperationId(): Any? = rootOperationId + override fun getParent(): TestDescriptorInternal = reportingParent.descriptor } shouldReportComplete = true @@ -413,9 +422,12 @@ internal class TCServiceMessagesClient( ) : Node(parent, localId) { val output by lazy { StringBuilder() } + private val parentDescriptor = (this@TestNode.parent as GroupNode).requireReportingNode() + override val descriptor: TestDescriptorInternal = object : DefaultTestDescriptor(id, className, methodName, classDisplayName, displayName) { - override fun getParent(): TestDescriptorInternal? = (this@TestNode.parent as GroupNode).requireReportingNode() + override fun getOwnerBuildOperationId(): Any? = rootOperationId + override fun getParent(): TestDescriptorInternal = parentDescriptor } override fun markStarted(ts: Long) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index 623175e9d04..7b3f78f04ff 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -20,13 +20,12 @@ import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.tasks.Delete import org.gradle.api.tasks.bundling.Jar -import org.gradle.api.tasks.testing.Test import org.gradle.language.base.plugins.LifecycleBasePlugin import org.gradle.language.jvm.tasks.ProcessResources import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTestTask -import org.jetbrains.kotlin.gradle.testing.registerTestTask +import org.jetbrains.kotlin.gradle.testing.internal.registerTestTask import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import java.util.concurrent.Callable diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationTestsConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationTestsConfigurator.kt index c460d6d1908..edd0500cbdc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationTestsConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationTestsConfigurator.kt @@ -9,8 +9,8 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsSetupTask import org.jetbrains.kotlin.gradle.targets.js.tasks.* import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.registerTask -import org.jetbrains.kotlin.gradle.testing.configureConventions -import org.jetbrains.kotlin.gradle.testing.registerTestTask +import org.jetbrains.kotlin.gradle.testing.internal.configureConventions +import org.jetbrains.kotlin.gradle.testing.internal.registerTestTask import org.jetbrains.kotlin.utils.addIfNotNull internal class KotlinJsCompilationTestsConfigurator( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index edf903df030..2c84d8b1e8b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -24,8 +24,8 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPI import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTestTask import org.jetbrains.kotlin.gradle.tasks.* -import org.jetbrains.kotlin.gradle.testing.configureConventions -import org.jetbrains.kotlin.gradle.testing.registerTestTask +import org.jetbrains.kotlin.gradle.testing.internal.configureConventions +import org.jetbrains.kotlin.gradle.testing.internal.registerTestTask import java.io.File import java.util.* 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/tasks/AggregateTestReport.kt index 96bfd386671..4a5e4760f28 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/tasks/AggregateTestReport.kt @@ -89,23 +89,6 @@ open class AggregateTestReport : DefaultTask() { } } - private val intellijReporterListener = 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 fun registerTestTask(task: AbstractTestTask) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/KotlinTestFailure.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/KotlinTestFailure.kt index 2af042c27bd..1be7fca5366 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/KotlinTestFailure.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/KotlinTestFailure.kt @@ -19,8 +19,10 @@ import org.gradle.internal.serialize.PlaceholderException class KotlinTestFailure( className: String, message: String?, - private val stackTraceString: String?, - private val stackTrace: List? = null + val stackTraceString: String?, + private val stackTrace: List? = null, + val expected: String? = null, + val actual: String? = null ) : PlaceholderException( className, message, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/conventions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/conventions.kt similarity index 96% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/conventions.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/conventions.kt index aeec6b33334..5682e1fe549 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/conventions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/conventions.kt @@ -3,7 +3,7 @@ * that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.gradle.testing +package org.jetbrains.kotlin.gradle.testing.internal import org.gradle.api.Project import org.gradle.api.internal.plugins.DslObject diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/testsRegistry.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/testsRegistry.kt similarity index 75% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/testsRegistry.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/testsRegistry.kt index 118754a0543..b047a247dc4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/testsRegistry.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/testsRegistry.kt @@ -3,12 +3,14 @@ * that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.gradle.testing +package org.jetbrains.kotlin.gradle.testing.internal import org.gradle.api.Project +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.targets.jvm.tasks.KotlinJvmTestTask import org.jetbrains.kotlin.gradle.tasks.AggregateTestReport import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask @@ -16,6 +18,9 @@ internal val Project.allTestsTask: TaskHolder get() = locateOrRegisterTask("allTests") { aggregate -> tasks.maybeCreate(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(aggregate) + description = "Runs the tests for all targets and create aggregated report" + group = JavaBasePlugin.VERIFICATION_GROUP + aggregate.reports.configureConventions(project, "all") aggregate.onlyIf { @@ -34,9 +39,8 @@ internal fun registerTestTask(task: AbstractTestTask) { project.gradle.taskGraph.whenReady { if (it.hasTask(allTests)) { - // when [allTestsTask] task enabled - // let all tests be executed even on failed tests - // let all failed test be reported by [allTestsTask]: + // when [allTestsTask] task enabled, test failure should be reported only on [allTestsTask], + // not at individual target's test tasks. To do that, we need: // - disable all reporting in test tasks // - enable [checkFailedTests] on [allTestsTask] @@ -48,4 +52,6 @@ internal fun registerTestTask(task: AbstractTestTask) { allTests.ignoreFailures = false } } + + ijListenTestTask(task) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/ultimate.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/ultimate.kt new file mode 100644 index 00000000000..d9f2725c36b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/testing/internal/ultimate.kt @@ -0,0 +1,17 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.testing.internal + +import org.gradle.api.tasks.testing.AbstractTestTask + +/** + * Experimental test reporting for Intellij Ultimate only + */ +internal fun ijListenTestTask(task: AbstractTestTask) { + Class.forName("org.jetbrains.kotlin.gradle.testing.internal.IjTestListener") + ?.getMethod("attachTo") + ?.invoke(null, task) +} \ No newline at end of file