From de6b7afb61ecf25da0a3bd697074c1822edc0537 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 09:28:33 -0700 Subject: [PATCH 01/10] Remove javaProject/kotlinProject. --- .../com/beust/kobalt/plugin/java/JavaPlugin.kt | 11 ----------- .../beust/kobalt/plugin/kotlin/KotlinPlugin.kt | 15 --------------- 2 files changed, 26 deletions(-) diff --git a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt index b0df157a..9f6108d2 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt @@ -5,7 +5,6 @@ import com.beust.kobalt.Variant import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.internal.BaseJvmPlugin -import com.beust.kobalt.internal.JvmCompilerPlugin import com.beust.kobalt.misc.warn import java.io.File import javax.inject.Inject @@ -68,16 +67,6 @@ class JavaPlugin @Inject constructor(val javaCompiler: JavaCompiler, override va } -@Directive -fun javaProject(vararg projects: Project, init: Project.() -> Unit): Project { - return Project().apply { - warn("javaProject{} is deprecated, please use project{}") - init() - (Kobalt.findPlugin(JvmCompilerPlugin.PLUGIN_NAME) as JvmCompilerPlugin) - .addDependentProjects(this, projects.toList()) - } -} - class JavaConfig(val project: Project) { val compilerArgs = arrayListOf() fun args(vararg options: String) = compilerArgs.addAll(options) diff --git a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt index 8f16a3d4..220be8a7 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt @@ -5,13 +5,11 @@ import com.beust.kobalt.Variant import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.internal.BaseJvmPlugin -import com.beust.kobalt.internal.JvmCompilerPlugin import com.beust.kobalt.internal.KobaltSettings import com.beust.kobalt.internal.KotlinJarFiles import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.dependency.FileDependency import com.beust.kobalt.misc.KobaltExecutors -import com.beust.kobalt.misc.warn import javax.inject.Inject import javax.inject.Singleton @@ -131,19 +129,6 @@ class KotlinPlugin @Inject constructor(val executors: KobaltExecutors, val depen } } -/** - * @param projects: the list of projects that need to be built before this one. - */ -@Directive -fun kotlinProject(vararg projects: Project, init: Project.() -> Unit): Project { - return Project().apply { - warn("kotlinProject{} is deprecated, please use project{}") - init() - (Kobalt.findPlugin(JvmCompilerPlugin.PLUGIN_NAME) as JvmCompilerPlugin) - .addDependentProjects(this, projects.toList()) - } -} - class KotlinConfig(val project: Project) { val args = arrayListOf() fun args(vararg options: String) = args.addAll(options) From dbb06d0e79aa525ce8d1afa97d86bbc7f3689b15 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 10:06:17 -0700 Subject: [PATCH 02/10] Added test dependent projects. --- .../src/main/kotlin/com/beust/kobalt/api/Project.kt | 7 ++++++- .../com/beust/kobalt/internal/ParallelProjectRunner.kt | 2 +- .../com/beust/kobalt/internal/SequentialProjectRunner.kt | 2 +- .../main/kotlin/com/beust/kobalt/internal/TaskManager.kt | 4 ++-- .../kotlin/com/beust/kobalt/maven/DependencyManager.kt | 9 ++++++++- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt index e6796a9a..ddd58d36 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt @@ -26,6 +26,7 @@ open class Project( @Directive open var url: String? = null, @Directive open var pom: Model? = null, @Directive open var dependsOn: ArrayList = arrayListOf(), + @Directive open var testsDependOnProjects: ArrayList = arrayListOf(), @Directive open var packageName: String? = group) : IBuildConfig, IDependencyHolder by DependencyHolder() { @@ -33,13 +34,15 @@ open class Project( this.project = this } + fun allProjectDependedOn() = project.dependsOn + project.testsDependOnProjects + class ProjectExtra(project: Project) { var isDirty = false /** * @return true if any of the projects we depend on is dirty. */ - fun dependsOnDirtyProjects(project: Project) = project.dependsOn.any { it.projectExtra.isDirty } + fun dependsOnDirtyProjects(project: Project) = project.allProjectDependedOn().any { it.projectExtra.isDirty } } /** @@ -96,6 +99,8 @@ open class Project( val testDependencies : ArrayList = arrayListOf() val testProvidedDependencies : ArrayList = arrayListOf() + fun testsDependOnProjects(vararg projects: Project) = testsDependOnProjects.addAll(projects) + /** Used to disambiguate various name properties */ @Directive val projectName: String get() = name 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 7041c402..6a703a20 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 @@ -94,7 +94,7 @@ class ParallelProjectRunner(val tasksByNames: (Project) -> ListMultimap().apply { projects.forEach { project -> addNode(ProjectTask(project, args.dryRun)) - project.dependsOn.forEach { + project.allProjectDependedOn().forEach { addEdge(ProjectTask(project, args.dryRun), ProjectTask(it, args.dryRun)) } } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/SequentialProjectRunner.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/SequentialProjectRunner.kt index 1f13626c..ec99b723 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/SequentialProjectRunner.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/SequentialProjectRunner.kt @@ -39,7 +39,7 @@ class SequentialProjectRunner(val tasksByNames: (Project) -> ListMultimap 0) { klog(2, "Marking project $projectName as skipped") diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt index 2139326c..541231fa 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt @@ -145,7 +145,7 @@ class TaskManager @Inject constructor(val args: Args, val topological = Topological().apply { projects.forEach { project -> addNode(project) - project.dependsOn.forEach { + project.allProjectDependedOn().forEach { addEdge(project, it) } } @@ -160,7 +160,7 @@ class TaskManager @Inject constructor(val args: Args, return result } else { val rootProject = projects.find { it.name == ti.project }!! - val allProjects = DynamicGraph.transitiveClosure(rootProject, { p -> p.dependsOn }) + val allProjects = DynamicGraph.transitiveClosure(rootProject, Project::allProjectDependedOn) val sortedProjects = sortProjectsTopologically(allProjects) val sortedMaps = sortedProjects.map { TaskInfo(it.name, "compile")} val result = sortedMaps.subList(0, sortedMaps.size - 1) + listOf(ti) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt index 14ae2c3d..b48822b0 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt @@ -228,13 +228,20 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, } } + val isTest = scopes.contains(Scope.TEST) + project.dependsOn.forEach { p -> maybeAddClassDir(KFiles.joinDir(p.directory, p.classesDir(context))) - val isTest = scopes.contains(Scope.TEST) if (isTest) maybeAddClassDir(KFiles.makeOutputTestDir(project).path) val otherDependencies = calculateDependencies(p, context, dependencyFilter, scopes) result.addAll(otherDependencies) + } + if (isTest) { + project.testsDependOnProjects.forEach { p -> + val otherDependencies = calculateDependencies(p, context, dependencyFilter, scopes) + result.addAll(otherDependencies) + } } return result } From c43967bec9cd688e5c439bc6713d18c1b05fcb7b Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 12:05:28 -0700 Subject: [PATCH 03/10] Preserve dependency order. --- .../main/kotlin/com/beust/kobalt/internal/JvmCompilerPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/JvmCompilerPlugin.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/JvmCompilerPlugin.kt index 15cd7fc3..7732774d 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/JvmCompilerPlugin.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/JvmCompilerPlugin.kt @@ -92,7 +92,7 @@ open class JvmCompilerPlugin @Inject constructor( scopes = listOf(Scope.TEST)) val compileDependencies = dependencyManager.calculateDependencies(project, context, scopes = listOf(Scope.COMPILE)) - val allDependencies = (compileDependencies + testDependencies).toHashSet() + val allDependencies = (testDependencies + compileDependencies).distinct() return testContributor.run(project, context, configName, allDependencies.toList()) } else { context.logger.log(project.name, 2, From a4282b299ab2ddbd98f56010975424fb97a7d538 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 13:14:25 -0700 Subject: [PATCH 04/10] Added kobaltOptions(). --- .../src/main/kotlin/com/beust/kobalt/Args.kt | 6 +++++- .../src/main/kotlin/com/beust/kobalt/BuildScript.kt | 9 +++++++-- .../src/main/kotlin/com/beust/kobalt/api/Kobalt.kt | 6 ++++++ src/main/kotlin/com/beust/kobalt/Main.kt | 10 ++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Args.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Args.kt index 443a48de..fe4cf2a3 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Args.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Args.kt @@ -82,7 +82,11 @@ class Args { @Parameter(names = arrayOf("--noIncrementalKotlin"), description = "Disable incremental Kotlin compilation") var noIncrementalKotlin: Boolean = false - @Parameter(names = arrayOf("--sequential"), description = "Build all the projects in sequence") + companion object { + const val SEQUENTIAL = "--sequential" + } + + @Parameter(names = arrayOf(Args.SEQUENTIAL), description = "Build all the projects in sequence") var sequential: Boolean = false @Parameter(names = arrayOf("--server"), description = "Run in server mode") diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/BuildScript.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/BuildScript.kt index 3d75614e..0f594fcd 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/BuildScript.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/BuildScript.kt @@ -27,8 +27,13 @@ class BuildScriptConfig { @Directive fun buildFileClasspath(vararg bfc: String) = newBuildFileClasspath(*bfc) - // The following settings modify the compiler used to compile the build file. - // Projects should use kotlinCompiler { compilerVersion } to configure the Kotin compiler for their source files. + /** Options passed to Kobalt */ + @Directive + fun kobaltOptions(vararg options: String) = Kobalt.addKobaltOptions(options) + + // The following settings modify the compiler used to compile the build file, which regular users should + // probably never need to do. Projects should use kotlinCompiler { compilerVersion } to configure the + // Kotin compiler for their source files. var kobaltCompilerVersion : String? = null var kobaltCompilerRepo: String? = null var kobaltCompilerFlags: String? = null diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt index 49b82050..2c381b1d 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt @@ -118,5 +118,11 @@ class Kobalt { get() = Duration.parse( kobaltProperties.getProperty(PROPERTY_KOBALT_VERSION_CHECK_TIMEOUT) ?: "P1D") fun findPlugin(name: String) = Plugins.findPlugin(name) + + val optionsFromBuild = arrayListOf() + + fun addKobaltOptions(options: Array) { + optionsFromBuild.addAll(options) + } } } diff --git a/src/main/kotlin/com/beust/kobalt/Main.kt b/src/main/kotlin/com/beust/kobalt/Main.kt index 8e8b2ae1..b209c147 100644 --- a/src/main/kotlin/com/beust/kobalt/Main.kt +++ b/src/main/kotlin/com/beust/kobalt/Main.kt @@ -161,6 +161,7 @@ private class Main @Inject constructor( } else { val allProjects = projectFinder.initForBuildFile(buildFile, args) + addOptionsFromBuild(args, Kobalt.optionsFromBuild) if (args.listTemplates) { // --listTemplates Templates().displayTemplates(pluginInfo) @@ -213,6 +214,15 @@ private class Main @Inject constructor( return result } + private fun addOptionsFromBuild(args: Args, optionsFromBuild: ArrayList) { + optionsFromBuild.forEach { + when(it) { + Args.SEQUENTIAL -> args.sequential = true + else -> throw IllegalArgumentException("Unsupported option found in kobaltOptions(): " + it) + } + } + } + private fun findBuildFile(): File { val deprecatedLocation = File(Constants.BUILD_FILE_NAME) val result: File = From da3ad60423cc318256f38662eda244a201c2325e Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 13:19:43 -0700 Subject: [PATCH 05/10] 1.0.19. --- kobalt/wrapper/kobalt-wrapper.properties | 2 +- src/main/resources/kobalt.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt-wrapper.properties index f92e14d5..51854da6 100644 --- a/kobalt/wrapper/kobalt-wrapper.properties +++ b/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.18 \ No newline at end of file +kobalt.version=1.0.19 \ No newline at end of file diff --git a/src/main/resources/kobalt.properties b/src/main/resources/kobalt.properties index bb9154b7..751c66c4 100644 --- a/src/main/resources/kobalt.properties +++ b/src/main/resources/kobalt.properties @@ -1 +1 @@ -kobalt.version=1.0.18 +kobalt.version=1.0.19 From 34185a6b2ad4716e2c3c54d96ea96d4c6679be15 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 14:38:43 -0700 Subject: [PATCH 06/10] Exclude tests that crash on TeamCity. --- .../com/beust/kobalt/misc/MavenResolverTest.kt | 2 +- src/test/resources/testng.xml | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/test/kotlin/com/beust/kobalt/misc/MavenResolverTest.kt b/src/test/kotlin/com/beust/kobalt/misc/MavenResolverTest.kt index 45bccdcb..a0b4be9f 100644 --- a/src/test/kotlin/com/beust/kobalt/misc/MavenResolverTest.kt +++ b/src/test/kotlin/com/beust/kobalt/misc/MavenResolverTest.kt @@ -45,7 +45,7 @@ class MavenResolverTest { assertThat(result[0].artifact.version).isEqualTo(expectedVersion) } - @Test(dataProvider = "rangeProvider") + @Test(dataProvider = "rangeProvider", groups = arrayOf("mavenResolverBug")) fun kobaltRangeVersion(id: String, expectedVersion: String) { val artifact = resolver.resolveToArtifact(id) assertThat(artifact.version).isEqualTo(expectedVersion) diff --git a/src/test/resources/testng.xml b/src/test/resources/testng.xml index 9d62b0ba..f37b9b23 100644 --- a/src/test/resources/testng.xml +++ b/src/test/resources/testng.xml @@ -1,12 +1,15 @@ - - - - - - - + + + + + + + + + + From b68ec2805066d21ef79141d4547fa472ce6052a6 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 16:32:20 -0700 Subject: [PATCH 07/10] Colors. --- kobalt/src/Build.kt | 3 +- .../main/kotlin/com/beust/kobalt/AsciiArt.kt | 28 ++-- .../com/beust/kobalt/internal/TestNgRunner.kt | 128 +++++++++++++++++- 3 files changed, 143 insertions(+), 16 deletions(-) diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 7f46d9d2..261f5b6e 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -110,7 +110,8 @@ val kobaltPluginApi = project { "org.eclipse.jgit:org.eclipse.jgit:4.5.0.201609210915-r", "org.slf4j:slf4j-simple:${Versions.slf4j}", *mavenResolver("api", "spi", "util", "impl", "connector-basic", "transport-http", "transport-file"), - "org.apache.maven:maven-aether-provider:3.3.9" + "org.apache.maven:maven-aether-provider:3.3.9", + "org.testng.testng-remote:testng-remote:1.3.0" ) exclude(*aether("impl", "spi", "util", "api")) } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/AsciiArt.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/AsciiArt.kt index 6247caeb..e138fabc 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/AsciiArt.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/AsciiArt.kt @@ -17,16 +17,16 @@ class AsciiArt { companion object { private val BANNERS = arrayOf( " __ __ __ __ __ \n" + - " / //_/ ____ / /_ ____ _ / / / /_\n" + - " / ,< / __ \\ / __ \\ / __ `/ / / / __/\n" + - " / /| | / /_/ / / /_/ // /_/ / / / / /_ \n" + - " /_/ |_| \\____/ /_.___/ \\__,_/ /_/ \\__/ ", + " / //_/ ____ / /_ ____ _ / / / /_\n" + + " / ,< / __ \\ / __ \\ / __ `/ / / / __/\n" + + " / /| | / /_/ / / /_/ // /_/ / / / / /_ \n" + + " /_/ |_| \\____/ /_.___/ \\__,_/ /_/ \\__/ ", " _ __ _ _ _ \n" + - " | |/ / ___ | |__ __ _ | | | |_ \n" + - " | ' / / _ \\ | '_ \\ / _` | | | | __|\n" + - " | . \\ | (_) | | |_) | | (_| | | | | |_ \n" + - " |_|\\_\\ \\___/ |_.__/ \\__,_| |_| \\__| " + " | |/ / ___ | |__ __ _ | | | |_ \n" + + " | ' / / _ \\ | '_ \\ / _` | | | | __|\n" + + " | . \\ | (_) | | |_) | | (_| | | | | |_ \n" + + " |_|\\_\\ \\___/ |_.__/ \\__,_| |_| \\__| " ) val banner : String get() = BANNERS[Random().nextInt(BANNERS.size)] @@ -85,7 +85,7 @@ class AsciiArt { } fun logBox(s: String, bl: String = bottomLeft, br: String = bottomRight, indent: Int = 0) - = logBox(listOf(s), bl, br, indent) + = logBox(listOf(s), bl, br, indent) fun fill(n: Int) = buildString { repeat(n, { append(" ")})}.toString() @@ -105,7 +105,7 @@ class AsciiArt { const val CYAN = "\u001B[36m" const val WHITE = "\u001B[37m" - private fun wrap(s: CharSequence, color: String) = color + s + RESET + fun wrap(s: CharSequence, color: String) = color + s + RESET private fun blue(s: CharSequence) = wrap(s, BLUE) private fun red(s: CharSequence) = wrap(s, RED) private fun yellow(s: CharSequence) = wrap(s, YELLOW) @@ -141,10 +141,10 @@ class AsciiTable { fun build() : String { val formattedHeaders = - headers.mapIndexed { index, s -> - val s2 = col(widths[index], s) - s2 - }.joinToString(vb) + headers.mapIndexed { index, s -> + val s2 = col(widths[index], s) + s2 + }.joinToString(vb) val result = StringBuffer().apply { append(AsciiArt.logBox(formattedHeaders, AsciiArt.bottomLeft2, AsciiArt.bottomRight2)) append("\n") 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 f43be88c..5f288204 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 @@ -1,12 +1,22 @@ package com.beust.kobalt.internal +import com.beust.kobalt.AsciiArt import com.beust.kobalt.TestConfig import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project +import com.beust.kobalt.maven.aether.AetherDependency import com.beust.kobalt.misc.KFiles +import com.beust.kobalt.misc.Versions +import com.beust.kobalt.misc.runCommand import com.beust.kobalt.misc.warn +import org.testng.remote.RemoteArgs +import org.testng.remote.strprotocol.JsonMessageSender +import org.testng.remote.strprotocol.MessageHelper +import org.testng.remote.strprotocol.MessageHub +import org.testng.remote.strprotocol.TestResultMessage import java.io.File +import java.io.IOException class TestNgRunner : GenericTestRunner() { @@ -39,7 +49,7 @@ class TestNgRunner : GenericTestRunner() { add("-testclass") add(testClasses.joinToString(",")) } else { - if (! testConfig.isDefault) warn("Couldn't find any test classes for ${project.name}") + if (!testConfig.isDefault) warn("Couldn't find any test classes for ${project.name}") // else do nothing: since the user didn't specify an explicit test{} directive, not finding // any test sources is not a problem } @@ -48,4 +58,120 @@ class TestNgRunner : GenericTestRunner() { addAll(testConfig.testArgs) } } + + val VERSION_6_10 = 600100000L + + override fun runTests(project: Project, context: KobaltContext, classpath: List, + configName: String): Boolean { + + val testngDependency = (project.testDependencies.filter { it.id.contains("testng") } + .firstOrNull() as AetherDependency).version + val testngDependencyVersion = Versions.toLongVersion(testngDependency) + val result = + if (testngDependencyVersion >= VERSION_6_10) { + displayPrettyColors(project, context, classpath) + } else { + super.runTests(project, context, classpath, configName) + } + return result + } + + fun displayPrettyColors(project: Project, context: KobaltContext, classpath: List) + : Boolean { + val port = 2345 + + val jf = context.dependencyManager.create("org.testng.testng-remote:testng-remote:1.3.0") + val tr = context.dependencyManager.create("org.testng.testng-remote:testng-remote6_10:1.3.0") + val testng = context.dependencyManager.create("org.testng:testng:6.10") + val dep1 = context.dependencyManager.transitiveClosure(listOf(jf, tr, testng)) + + val v = Versions.toLongVersion("6.10") + val cp = (classpath + dep1).map { it.jarFile.get() } + .joinToString(File.pathSeparator) + val passedArgs = listOf( + "-classpath", + cp, + "org.testng.remote.RemoteTestNG", + "-serport", port.toString(), + "-version", "6.10", + "-dontexit", + RemoteArgs.PROTOCOL, + "json", + "src/test/resources/testng.xml") + + Thread { + val exitCode = runCommand { + command = "java" + directory = File(project.directory) + args = passedArgs + } + }.start() + + // Thread { + // val args2 = arrayOf("-serport", port.toString(), "-dontexit", RemoteArgs.PROTOCOL, "json", + // "-version", "6.10", + // "src/test/resources/testng.xml") + // RemoteTestNG.main(args2) + // }.start() + + val mh = MessageHub(JsonMessageSender("localhost", port, true)) + mh.setDebug(true) + mh.initReceiver() + val passed = arrayListOf() + + data class FailedTest(val method: String, val cls: String, val stackTrace: String) + + val failed = arrayListOf() + var skipped = arrayListOf() + + fun d(n: Int, color: String) + = AsciiArt.wrap(String.format("%4d", n), color) + + fun red(s: String) = AsciiArt.wrap(s, AsciiArt.RED) + fun green(s: String) = AsciiArt.wrap(s, AsciiArt.GREEN) + fun yellow(s: String) = AsciiArt.wrap(s, AsciiArt.YELLOW) + + try { + var message = mh.receiveMessage() + println("") + println(green("PASSED") + " | " + red("FAILED") + " | " + yellow("SKIPPED")) + while (message != null) { + message = mh.receiveMessage() + if (message is TestResultMessage) { + when (message.result) { + MessageHelper.PASSED_TEST -> passed.add(message.name) + MessageHelper.FAILED_TEST -> failed.add(FailedTest(message.testClass, + message.method, message.stackTrace)) + MessageHelper.SKIPPED_TEST -> skipped.add(message.name) + } + } + print("\r " + d(passed.size, AsciiArt.GREEN) + + " | " + d(failed.size, AsciiArt.RED) + + " | " + d(skipped.size, AsciiArt.YELLOW)) + // Thread.sleep(500) + // print("\r" + String.format("%4d / %4d / %4d", passed.size, failed.size, skipped.size)) + // Thread.sleep(200) + } + } catch(ex: IOException) { + println("Exception: ${ex.message}") + } + println("\nPassed: " + passed.size + ", Failed: " + failed.size + ", Skipped: " + skipped.size) + failed.forEach { + val top = it.stackTrace.substring(0, it.stackTrace.indexOf("\n")) + println(" " + it.cls + "." + it.method + "\n " + top) + } + return failed.isEmpty() && skipped.isEmpty() + } +} + +fun main(args: Array) { + fun d(n: Int, color: String) + = AsciiArt.wrap(String.format("%4d", n), color) + + println("PASSED | FAILED | SKIPPED") + repeat(20) { i -> + print("\r " + d(i, AsciiArt.GREEN) + " | " + d(i * 2, AsciiArt.RED) + " | " + d(i, AsciiArt.YELLOW)) + Thread.sleep(500) + } + println("") } From 64df5ea8dfce8b398c1bb36141a0278204d4eee8 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 16:34:46 -0700 Subject: [PATCH 08/10] Forgot the repo. --- kobalt/src/Build.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 261f5b6e..08006bbe 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -1,7 +1,6 @@ -import com.beust.kobalt.TaskResult +import com.beust.kobalt.* import com.beust.kobalt.api.Project import com.beust.kobalt.api.annotation.Task -import com.beust.kobalt.homeDir import com.beust.kobalt.plugin.application.application import com.beust.kobalt.plugin.java.javaCompiler import com.beust.kobalt.plugin.kotlin.kotlinCompiler @@ -9,8 +8,6 @@ import com.beust.kobalt.plugin.packaging.assemble import com.beust.kobalt.plugin.publish.autoGitTag import com.beust.kobalt.plugin.publish.bintray import com.beust.kobalt.plugin.publish.github -import com.beust.kobalt.project -import com.beust.kobalt.test import org.apache.maven.model.Developer import org.apache.maven.model.License import org.apache.maven.model.Model @@ -20,6 +17,10 @@ import java.nio.file.Files import java.nio.file.Paths import java.nio.file.StandardCopyOption +val bs = buildScript { + repos("http://dl.bintray.com/cbeust/maven") +} + object Versions { val okhttp = "3.2.0" val okio = "1.6.0" From f486bfbd93d7c0c09120d23197d1512d4a55807b Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 16:49:26 -0700 Subject: [PATCH 09/10] Refactor. --- .../com/beust/kobalt/internal/TestNgRunner.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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 5f288204..19612c1c 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 @@ -69,8 +69,10 @@ class TestNgRunner : GenericTestRunner() { val testngDependencyVersion = Versions.toLongVersion(testngDependency) val result = if (testngDependencyVersion >= VERSION_6_10) { + context.logger.log(project.name, 1, "Modern TestNG, displaying colors") displayPrettyColors(project, context, classpath) } else { + context.logger.log(project.name, 1, "Older TestNG ($testngDependencyVersion), using the old runner") super.runTests(project, context, classpath, configName) } return result @@ -80,13 +82,15 @@ class TestNgRunner : GenericTestRunner() { : Boolean { val port = 2345 - val jf = context.dependencyManager.create("org.testng.testng-remote:testng-remote:1.3.0") - val tr = context.dependencyManager.create("org.testng.testng-remote:testng-remote6_10:1.3.0") - val testng = context.dependencyManager.create("org.testng:testng:6.10") - val dep1 = context.dependencyManager.transitiveClosure(listOf(jf, tr, testng)) + val dep = with(context.dependencyManager) { + val jf = create("org.testng.testng-remote:testng-remote:1.3.0") + val tr = create("org.testng.testng-remote:testng-remote6_10:1.3.0") + val testng = create("org.testng:testng:6.10") + transitiveClosure(listOf(jf, tr, testng)) + } val v = Versions.toLongVersion("6.10") - val cp = (classpath + dep1).map { it.jarFile.get() } + val cp = (classpath + dep).map { it.jarFile.get() } .joinToString(File.pathSeparator) val passedArgs = listOf( "-classpath", From 25df7bed387315a7b4ae470268f9fbb85ee54309 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 21 Mar 2017 16:55:59 -0700 Subject: [PATCH 10/10] Logs. --- .../src/main/kotlin/com/beust/kobalt/internal/GenericRunner.kt | 2 ++ .../src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt | 2 ++ 2 files changed, 4 insertions(+) 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 a4796e83..866eb8d4 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 @@ -98,6 +98,8 @@ abstract class GenericTestRunner: ITestRunnerContributor { configName: String) : Boolean { var result = false + context.logger.log(project.name, 1, "Running default TestNG runner") + val testConfig = project.testConfigs.firstOrNull { it.name == configName } if (testConfig != null) { 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 19612c1c..e8ea2291 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 @@ -64,6 +64,8 @@ class TestNgRunner : GenericTestRunner() { override fun runTests(project: Project, context: KobaltContext, classpath: List, configName: String): Boolean { + context.logger.log(project.name, 1, "Running enhanced TestNG runner") + val testngDependency = (project.testDependencies.filter { it.id.contains("testng") } .firstOrNull() as AetherDependency).version val testngDependencyVersion = Versions.toLongVersion(testngDependency)