diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ITestJvmFlagContributor.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ITestJvmFlagContributor.kt new file mode 100644 index 00000000..79e369ff --- /dev/null +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ITestJvmFlagContributor.kt @@ -0,0 +1,8 @@ +package com.beust.kobalt.api + +/** + * Plug-ins that add flags to the JVM used to run tests should implement this interface. + */ +interface ITestJvmFlagContributor : IContributor { + fun testJvmFlagsFor(project: Project, context: KobaltContext, currentFlags: List) : List +} 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 60a9d242..73011411 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 @@ -11,14 +11,14 @@ import java.util.* * Base class for testing frameworks that are invoked from a main class with arguments. Test runners can * subclass this class and override mainClass, args and the name of the dependency that should trigger this runner. */ -abstract class GenericTestRunner : ITestRunnerContributor { +abstract class GenericTestRunner: ITestRunnerContributor { abstract val dependencyName : String abstract val mainClass: String abstract fun args(project: Project, classpath: List, testConfig: TestConfig) : List override fun run(project: Project, context: KobaltContext, configName: String, classpath: List) - = TaskResult(runTests(project, classpath, configName)) + = TaskResult(runTests(project, context, classpath, configName)) override fun affinity(project: Project, context: KobaltContext) = if (project.testDependencies.any { it.id.contains(dependencyName)}) IAffinity.DEFAULT_POSITIVE_AFFINITY @@ -46,7 +46,8 @@ abstract class GenericTestRunner : ITestRunnerContributor { /** * @return true if all the tests passed */ - fun runTests(project: Project, classpath: List, configName: String) : Boolean { + fun runTests(project: Project, context: KobaltContext, classpath: List, + configName: String) : Boolean { val jvm = JavaInfo.create(File(SystemProperties.javaBase)) val java = jvm.javaExecutable var result = false @@ -56,12 +57,30 @@ abstract class GenericTestRunner : ITestRunnerContributor { if (testConfig != null) { val args = args(project, classpath, testConfig) if (args.size > 0) { - val allArgs = arrayListOf().apply { - add(java!!.absolutePath) + + // Default JVM args + val jvmFlags = arrayListOf().apply { addAll(testConfig.jvmArgs) add("-classpath") add(classpath.map { it.jarFile.get().absolutePath }.joinToString(File.pathSeparator)) add(mainClass) + } + + // JVM args from the contributors + val pluginInfo = Kobalt.INJECTOR.getInstance(PluginInfo::class.java) + + val flagsFromContributors = pluginInfo.testJvmFlagContributors.flatMap { + it.testJvmFlagsFor(project, context, jvmFlags) + } + + if (flagsFromContributors.any()) { + log(2, "Adding JVM flags from contributors: " + flagsFromContributors) + } + + val allArgs = arrayListOf().apply { + add(java!!.absolutePath) + addAll(flagsFromContributors) + addAll(jvmFlags) addAll(args) } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt index 84381862..491b2139 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt @@ -4,7 +4,7 @@ import com.beust.kobalt.TestConfig import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.Project -open public class JUnitRunner() : GenericTestRunner() { +open class JUnitRunner() : GenericTestRunner() { override val mainClass = "org.junit.runner.JUnitCore" diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt index 4f40fcbb..e39a0e9f 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt @@ -79,6 +79,7 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { // Not documented yet val buildConfigContributors = arrayListOf() val mavenIdInterceptors = arrayListOf() + val testJvmFlagContributors = arrayListOf() companion object { /** @@ -164,6 +165,7 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { if (this is IIncrementalAssemblyContributor) incrementalAssemblyContributors.add(this) // Not documented yet + if (this is ITestJvmFlagContributor) testJvmFlagContributors.add(this) } } } @@ -176,7 +178,7 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { compilerContributors, docContributors, sourceDirContributors, testSourceDirContributors, buildConfigFieldContributors, taskContributors, assemblyContributors, - incrementalAssemblyContributors + incrementalAssemblyContributors, testJvmFlagContributors ).forEach { it.forEach { it.cleanUpActors() @@ -212,6 +214,7 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { buildConfigContributors.addAll(pluginInfo.buildConfigContributors) assemblyContributors.addAll(pluginInfo.assemblyContributors) incrementalAssemblyContributors.addAll(pluginInfo.incrementalAssemblyContributors) + testJvmFlagContributors.addAll(pluginInfo.testJvmFlagContributors) } } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/SpekRunner.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/SpekRunner.kt index b3feaf69..2129a315 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/SpekRunner.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/SpekRunner.kt @@ -4,7 +4,7 @@ package com.beust.kobalt.internal * SpekRunner triggers if it finds a dependency on org.jetbrains.spek but other than that, it just * uses the regular JUnitRunner. */ -public class SpekRunner() : JUnitRunner() { +class SpekRunner : JUnitRunner() { override val dependencyName = "org.jetbrains.spek" } 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 db917077..958bfc99 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 @@ -7,7 +7,7 @@ import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.warn import java.io.File -public class TestNgRunner() : GenericTestRunner() { +class TestNgRunner : GenericTestRunner() { override val mainClass = "org.testng.TestNG"