From 6401a9d2afe4a4c2c3efb5070cf8e9da84756112 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Sat, 8 Apr 2017 19:27:19 -0700 Subject: [PATCH] Bubble up test result messages. --- .../main/kotlin/com/beust/kobalt/TaskResult.kt | 7 ++++++- .../com/beust/kobalt/api/IBuildListener.kt | 6 +++++- .../com/beust/kobalt/api/ITaskContributor.kt | 2 +- .../beust/kobalt/internal/BaseProjectRunner.kt | 11 +++++++++-- .../com/beust/kobalt/internal/BuildListeners.kt | 16 +++++++++++----- .../com/beust/kobalt/internal/DynamicGraph.kt | 5 +++-- .../com/beust/kobalt/internal/GenericRunner.kt | 13 +++++++++---- .../kobalt/internal/ParallelProjectRunner.kt | 6 +++--- .../com/beust/kobalt/internal/TaskManager.kt | 5 +++-- .../com/beust/kobalt/internal/TestNgRunner.kt | 10 ++++++---- .../src/main/kotlin/com/beust/kobalt/misc/Git.kt | 2 +- .../com/beust/kobalt/plugin/java/JavaCompiler.kt | 4 ++-- .../beust/kobalt/plugin/kotlin/KotlinCompiler.kt | 2 +- .../beust/kobalt/plugin/publish/BintrayApi.kt | 2 +- .../beust/kobalt/plugin/publish/PublishPlugin.kt | 2 +- .../beust/kobalt/internal/DynamicGraphTest.kt | 2 +- 16 files changed, 63 insertions(+), 32 deletions(-) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/TaskResult.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/TaskResult.kt index 4d6a45f3..241bc045 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/TaskResult.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/TaskResult.kt @@ -1,3 +1,8 @@ package com.beust.kobalt -open public class TaskResult(val success: Boolean = true, val errorMessage: String? = null) +class TestResult(val success: Boolean, val shortMessage: String? = null, val longMessage: String? = null) + +open class TaskResult(val success: Boolean = true, + val testResult: TestResult? = null, + val errorMessage: String? = null +) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/IBuildListener.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/IBuildListener.kt index 1e53cc49..2b0fdadb 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/IBuildListener.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/IBuildListener.kt @@ -4,8 +4,12 @@ package com.beust.kobalt.api * Plug-ins that listen to build events. */ interface IBuildListener : IListener { + + class TaskEndInfo(val success: Boolean, val shortMessage: String? = null, + val longMessage: String? = null) + fun taskStart(project: Project, context: KobaltContext, taskName: String) {} - fun taskEnd(project: Project, context: KobaltContext, taskName: String, success: Boolean) {} + fun taskEnd(project: Project, context: KobaltContext, taskName: String, info: TaskEndInfo) {} fun projectStart(project: Project, context: KobaltContext) {} fun projectEnd(project: Project, context: KobaltContext, status: ProjectBuildStatus) {} diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ITaskContributor.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ITaskContributor.kt index 83621451..714bd61b 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ITaskContributor.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ITaskContributor.kt @@ -23,7 +23,7 @@ class DynamicTask(override val plugin: IPlugin, override val name: String, overr override fun call(): TaskResult2 { val taskResult = closure.invoke(project) - return TaskResult2(taskResult.success, taskResult.errorMessage, this) + return TaskResult2(taskResult.success, errorMessage = taskResult.errorMessage, value = this) } override fun toString() = "[DynamicTask $name dependsOn=$dependsOn reverseDependsOn=$reverseDependsOn]" diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BaseProjectRunner.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BaseProjectRunner.kt index 2dc77ca0..963255bd 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BaseProjectRunner.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BaseProjectRunner.kt @@ -1,5 +1,7 @@ package com.beust.kobalt.internal +import com.beust.kobalt.TestResult +import com.beust.kobalt.api.IBuildListener import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project import com.beust.kobalt.api.ProjectBuildStatus @@ -25,9 +27,14 @@ abstract class BaseProjectRunner { } fun runBuildListenersForTask(project: Project, context: KobaltContext, taskName: String, start: Boolean, - success: Boolean = false) { + success: Boolean = false, testResult: TestResult? = null) { context.pluginInfo.buildListeners.forEach { - if (start) it.taskStart(project, context, taskName) else it.taskEnd(project, context, taskName, success) + if (start) { + it.taskStart(project, context, taskName) + } else { + val info = IBuildListener.TaskEndInfo(success, testResult?.shortMessage, testResult?.longMessage) + it.taskEnd(project, context, taskName, info) + } } } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BuildListeners.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BuildListeners.kt index 1a8781a5..9dbe042d 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BuildListeners.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BuildListeners.kt @@ -11,7 +11,8 @@ import java.util.concurrent.ConcurrentHashMap */ class BuildListeners : IBuildListener, IBuildReportContributor { class ProfilerInfo(val taskName: String, val durationMillis: Long) - class ProjectInfo(val projectName: String, var durationMillis: Long = 0) + class ProjectInfo(val projectName: String, var durationMillis: Long = 0, + var shortMessage: String? = null, var longMessage: String? = null) private val startTimes = ConcurrentHashMap() private val timings = arrayListOf() @@ -29,18 +30,21 @@ class BuildListeners : IBuildListener, IBuildReportContributor { } // IBuildListener - override fun taskEnd(project: Project, context: KobaltContext, taskName: String, success: Boolean) { + override fun taskEnd(project: Project, context: KobaltContext, taskName: String, info: IBuildListener.TaskEndInfo) { + val success = info.success if (! success) hasFailures = true startTimes[taskName]?.let { val taskTime = System.currentTimeMillis() - it timings.add(ProfilerInfo(taskName, taskTime)) projectInfos[project.name]?.let { - it.durationMillis += taskTime.toLong() + it.durationMillis += taskTime + if (info.shortMessage != null && it.shortMessage == null) it.shortMessage = info.shortMessage + if (info.longMessage != null && it.longMessage == null) it.longMessage = info.longMessage } } } - private val projectStatuses = arrayListOf>() + private val projectStatuses = arrayListOf>() // IBuildListener override fun projectStart(project: Project, context: KobaltContext) { @@ -49,7 +53,9 @@ class BuildListeners : IBuildListener, IBuildReportContributor { // IBuildListener override fun projectEnd(project: Project, context: KobaltContext, status: ProjectBuildStatus) { - projectStatuses.add(Pair(project, status)) + val shortMessage = projectInfos[project.name]?.shortMessage + val statusText = status.toString() + (if (shortMessage != null) " ($shortMessage)" else "") + projectStatuses.add(Pair(project, statusText)) } // IBuildReportContributor diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/DynamicGraph.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/DynamicGraph.kt index 1ea14a1a..a3e26afd 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/DynamicGraph.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/DynamicGraph.kt @@ -7,7 +7,8 @@ import java.lang.reflect.InvocationTargetException import java.util.* import java.util.concurrent.* -open class TaskResult2(success: Boolean, errorMessage: String?, val value: T) : TaskResult(success, errorMessage) { +open class TaskResult2(success: Boolean, testResult: TestResult? = null, + errorMessage: String? = null, val value: T) : TaskResult(success, testResult, errorMessage) { override fun toString() = com.beust.kobalt.misc.toString("TaskResult", "value", value, "success", success) } @@ -393,7 +394,7 @@ fun main(argv: Array) { object: IWorker { override fun call(): TaskResult2? { kobaltLog(1, " Running worker $it") - return TaskResult2(true, null, it) + return TaskResult2(true, value = it) } override val priority: Int get() = 0 diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/GenericRunner.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/GenericRunner.kt index b1f3dcd9..9819d1f3 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/GenericRunner.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/GenericRunner.kt @@ -16,6 +16,8 @@ abstract class GenericTestRunner: ITestRunnerContributor { abstract val mainClass: String abstract val annotationPackage: String abstract val runnerName: String + open val shortMessage: String? = null//""Short message" + open val longMessage: String? = null//""Long message" abstract fun args(project: Project, context: KobaltContext, classpath: List, testConfig: TestConfig) : List @@ -25,8 +27,10 @@ abstract class GenericTestRunner: ITestRunnerContributor { open fun filterTestClasses(classes: List) : List = classes override fun run(project: Project, context: KobaltContext, configName: String, - classpath: List) - = TaskResult(runTests(project, context, classpath, configName)) + classpath: List) : TaskResult { + val tr = runTests(project, context, classpath, configName) + return TaskResult(tr.success, testResult = tr) + } override fun affinity(project: Project, context: KobaltContext) : Int { val result = @@ -99,7 +103,7 @@ abstract class GenericTestRunner: ITestRunnerContributor { * @return true if all the tests passed */ open fun runTests(project: Project, context: KobaltContext, classpath: List, - configName: String) : Boolean { + configName: String) : TestResult { var result = false context.logger.log(project.name, 1, "Running tests with " + runnerName) @@ -140,7 +144,8 @@ abstract class GenericTestRunner: ITestRunnerContributor { } else { throw KobaltException("Couldn't find a test configuration named \"$configName\"") } - return result + + return TestResult(result, shortMessage, longMessage) } /* diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/ParallelProjectRunner.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/ParallelProjectRunner.kt index 6a703a20..d98f0d8a 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/ParallelProjectRunner.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/ParallelProjectRunner.kt @@ -54,12 +54,12 @@ class ParallelProjectRunner(val tasksByNames: (Project) -> ListMultimap ListMultimap { val taskResult = task(project) - return TaskResult2(taskResult.success, taskResult.errorMessage, this) + return TaskResult2(taskResult.success, errorMessage = taskResult.errorMessage, value = this, + testResult = taskResult.testResult) } }) dependsOn.forEach { dependsOn(it, name) } @@ -321,7 +322,7 @@ class TaskWorker(val tasks: List, val dryRun: Boolean, val pluginInfo: Pl success = success and tr.success if (tr.errorMessage != null) errorMessages.add(tr.errorMessage) } - return TaskResult2(success, errorMessages.joinToString("\n"), tasks[0]) + return TaskResult2(success, errorMessage = errorMessages.joinToString("\n"), value = tasks[0]) } // override val timeOut : Long = 10000 diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt index 735b26e1..afe32430 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt @@ -2,6 +2,7 @@ package com.beust.kobalt.internal import com.beust.kobalt.AsciiArt import com.beust.kobalt.TestConfig +import com.beust.kobalt.TestResult import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project @@ -64,7 +65,7 @@ class TestNgRunner : GenericTestRunner() { fun _runTests(project: Project, context: KobaltContext, classpath: List, // override fun runTests(project: Project, context: KobaltContext, classpath: List, - configName: String): Boolean { + configName: String): TestResult { val testConfig = project.testConfigs.firstOrNull { it.name == configName } @@ -85,7 +86,7 @@ class TestNgRunner : GenericTestRunner() { } return result } else { - return true + return TestResult(true) } } @@ -102,7 +103,8 @@ class TestNgRunner : GenericTestRunner() { } private fun displayPrettyColors(project: Project, context: KobaltContext, - classpath: List, testConfig: TestConfig, versions: Pair): Boolean { + classpath: List, testConfig: TestConfig, versions: Pair) + : TestResult { val port = 2345 // launchRemoteServer(project, context, classpath, testConfig, versions, port) @@ -151,7 +153,7 @@ class TestNgRunner : GenericTestRunner() { val top = it.stackTrace.substring(0, it.stackTrace.indexOf("\n")) kobaltLog(1, " " + it.cls + "." + it.method + "\n " + top) } - return failed.isEmpty() && skipped.isEmpty() + return TestResult(failed.isEmpty() && skipped.isEmpty()) } fun launchRemoteServer(project: Project, context: KobaltContext, classpath: List, diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt index f4c4161f..f8892390 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt @@ -11,7 +11,7 @@ class Git @Inject constructor() { if (uploadResult.success && enabled) { val tagSuccess = tagRelease(project, annotated, tag, message) if (! tagSuccess) { - TaskResult(false, "Couldn't tag the project") + TaskResult(false, errorMessage = "Couldn't tag the project") } else { TaskResult() } diff --git a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt index 01b7c90d..97d7644b 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt @@ -94,11 +94,11 @@ class JavaCompiler @Inject constructor(val jvmCompiler: JvmCompiler, val kobaltL } return if (result) { - TaskResult(true, "Compilation succeeded") + TaskResult(true, errorMessage = "Compilation succeeded") } else { val message = "Compilation errors, command:\n$command\n" + errorMessage logk(1, message) - TaskResult(false, message) + TaskResult(false, errorMessage = message) } } diff --git a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinCompiler.kt b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinCompiler.kt index a1c1176c..df46a947 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinCompiler.kt @@ -126,7 +126,7 @@ class KotlinCompiler @Inject constructor( // The Kotlin compiler issues warnings on stderr :-( containsErrors = { errors: List -> errors.any { it.contains("rror")} } }).invoke() - return TaskResult(result == 0, "Error while compiling") + return TaskResult(result == 0, errorMessage = "Error while compiling") } private fun invokeCompilerDirectly(projectName: String, outputDir: String?, info: CompilerActionInfo, diff --git a/src/main/kotlin/com/beust/kobalt/plugin/publish/BintrayApi.kt b/src/main/kotlin/com/beust/kobalt/plugin/publish/BintrayApi.kt index 7793a77d..878d0e1c 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/publish/BintrayApi.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/publish/BintrayApi.kt @@ -204,7 +204,7 @@ class BintrayApi @Inject constructor(val http: Http, return TaskResult() } else { error(" Errors while uploading:\n" + errorMessages.map { " $it" }.joinToString("\n")) - return TaskResult(false, errorMessages.joinToString("\n")) + return TaskResult(false, errorMessage = errorMessages.joinToString("\n")) } } else { warn("Found no artifacts to upload") diff --git a/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt index 23519c43..f5b1e4d0 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt @@ -153,7 +153,7 @@ class PublishPlugin @Inject constructor(val files: KFiles, val factory: PomGener TaskResult() } - val result = TaskResult(tmpResult.success, messages.joinToString("\n ")) + val result = TaskResult(tmpResult.success, errorMessage = messages.joinToString("\n ")) return result } diff --git a/src/test/kotlin/com/beust/kobalt/internal/DynamicGraphTest.kt b/src/test/kotlin/com/beust/kobalt/internal/DynamicGraphTest.kt index 64dbd5bd..ca74505a 100644 --- a/src/test/kotlin/com/beust/kobalt/internal/DynamicGraphTest.kt +++ b/src/test/kotlin/com/beust/kobalt/internal/DynamicGraphTest.kt @@ -31,7 +31,7 @@ class DynamicGraphTest { override fun call() : TaskResult2 { kobaltLog(2, "Running node $n") runNodes.add(n) - return TaskResult2(errorFunction(n), null, n) + return TaskResult2(errorFunction(n), value = n) } }