Gradle, js: mocha
#KT-31010 Fixed
This commit is contained in:
+2
-2
@@ -44,8 +44,8 @@ interface KotlinDependencyHandler {
|
|||||||
|
|
||||||
fun project(notation: Map<String, Any?>): ProjectDependency
|
fun project(notation: Map<String, Any?>): ProjectDependency
|
||||||
|
|
||||||
fun npm(packageName: String, version: String = "*"): Dependency?
|
fun npm(packageName: String, version: String = "*"): Dependency
|
||||||
fun npm(org: String, packageName: String, version: String = "*"): Dependency?
|
fun npm(org: String, packageName: String, version: String = "*"): Dependency
|
||||||
}
|
}
|
||||||
|
|
||||||
interface HasKotlinDependencies {
|
interface HasKotlinDependencies {
|
||||||
|
|||||||
+8
-2
@@ -24,7 +24,8 @@ data class TCServiceMessagesClientSettings(
|
|||||||
val testNameSuffix: String? = null,
|
val testNameSuffix: String? = null,
|
||||||
val prepandSuiteName: Boolean = false,
|
val prepandSuiteName: Boolean = false,
|
||||||
val treatFailedTestOutputAsStacktrace: Boolean = false,
|
val treatFailedTestOutputAsStacktrace: Boolean = false,
|
||||||
val stackTraceParser: (String) -> ParsedStackTrace? = { null }
|
val stackTraceParser: (String) -> ParsedStackTrace? = { null },
|
||||||
|
val ignoreOutOfRootNodes: Boolean = false
|
||||||
)
|
)
|
||||||
|
|
||||||
internal class TCServiceMessagesClient(
|
internal class TCServiceMessagesClient(
|
||||||
@@ -190,8 +191,13 @@ internal class TCServiceMessagesClient(
|
|||||||
|
|
||||||
private fun close(ts: Long, assertLocalId: String?) = pop().also {
|
private fun close(ts: Long, assertLocalId: String?) = pop().also {
|
||||||
if (assertLocalId != null) {
|
if (assertLocalId != null) {
|
||||||
|
if (it.localId != assertLocalId && settings.ignoreOutOfRootNodes && it.parent == null) {
|
||||||
|
push(it)
|
||||||
|
return it
|
||||||
|
}
|
||||||
|
|
||||||
check(it.localId == assertLocalId) {
|
check(it.localId == assertLocalId) {
|
||||||
"Bad TCSM: unexpected node to close: ${it.localId}, stack: ${
|
"Bad TCSM: unexpected node to close `$assertLocalId`, expected `${it.localId}`, stack: ${
|
||||||
leaf.collectParents().joinToString("") { item -> "\n - ${item.localId}" }
|
leaf.collectParents().joinToString("") { item -> "\n - ${item.localId}" }
|
||||||
}\n"
|
}\n"
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-38
@@ -1,11 +1,10 @@
|
|||||||
package org.jetbrains.kotlin.gradle.targets.js
|
package org.jetbrains.kotlin.gradle.targets.js
|
||||||
|
|
||||||
import org.gradle.api.file.FileCollection
|
|
||||||
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles
|
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProjectLayout
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.tasks.KotlinNodeJsTestTask
|
import org.jetbrains.kotlin.gradle.targets.js.tasks.KotlinNodeJsTestTask
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin
|
||||||
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
||||||
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||||
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
|
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
|
||||||
@@ -35,58 +34,28 @@ internal class KotlinJsCompilationTestsConfigurator(
|
|||||||
return components.first() + components.drop(1).joinToString("") { it.capitalize() }
|
return components.first() + components.drop(1).joinToString("") { it.capitalize() }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("SameParameterValue")
|
|
||||||
private fun disambiguateUnderscored(name: String, includeCompilation: Boolean) =
|
|
||||||
disambiguate(name, includeCompilation).joinToString("_")
|
|
||||||
|
|
||||||
private val testTaskName: String
|
private val testTaskName: String
|
||||||
get() = disambiguateCamelCased("test", false)
|
get() = disambiguateCamelCased("test", false)
|
||||||
|
|
||||||
private val Kotlin2JsCompile.jsRuntimeClasspath: FileCollection
|
|
||||||
get() = classpath.plus(project.files(destinationDir))
|
|
||||||
|
|
||||||
fun configure() {
|
fun configure() {
|
||||||
compilation.dependencies {
|
// apply plugin (cannot do it lazy)
|
||||||
implementation(kotlin("test-nodejs-runner"))
|
|
||||||
}
|
|
||||||
|
|
||||||
val nodeJs = NodeJsPlugin[target.project]
|
val nodeJs = NodeJsPlugin[target.project]
|
||||||
|
|
||||||
val testTask = registerTask(project, testTaskName, KotlinNodeJsTestTask::class.java) { testJs ->
|
registerTask(project, testTaskName, KotlinNodeJsTestTask::class.java) { testJs ->
|
||||||
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
|
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
|
||||||
|
|
||||||
testJs.dependsOn(compileTestKotlin2Js)
|
testJs.dependsOn(compileTestKotlin2Js, nodeJs.nodeJsSetupTask)
|
||||||
|
|
||||||
testJs.onlyIf {
|
testJs.onlyIf {
|
||||||
compileTestKotlin2Js.outputFile.exists()
|
compileTestKotlin2Js.outputFile.exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disambiguationClassifier != null) {
|
testJs.runtimeDependencyHandler = compilation
|
||||||
testJs.targetName = disambiguationClassifier
|
testJs.targetName = disambiguationClassifier
|
||||||
testJs.showTestTargetName = true
|
testJs.nodeModulesToLoad.add(compileTestKotlin2Js.outputFile.name)
|
||||||
}
|
|
||||||
|
|
||||||
testJs.nodeJsProcessOptions.workingDir = project.projectDir
|
|
||||||
testJs.testRuntimeNodeModules = listOf(
|
|
||||||
"kotlin-test-nodejs-runner.js",
|
|
||||||
"kotlin-nodejs-source-map-support.js"
|
|
||||||
)
|
|
||||||
testJs.nodeModulesToLoad = setOf(compileTestKotlin2Js.outputFile.name)
|
|
||||||
|
|
||||||
testJs.configureConventions()
|
testJs.configureConventions()
|
||||||
registerTestTask(testJs)
|
registerTestTask(testJs)
|
||||||
}
|
}
|
||||||
|
|
||||||
project.afterEvaluate {
|
|
||||||
// defer nodeJs executable setup, as nodejs project settings may change during configuration
|
|
||||||
testTask.configure {
|
|
||||||
val nodeJsSetupTask = nodeJs.nodeJsSetupTask
|
|
||||||
it.dependsOn(nodeJsSetupTask)
|
|
||||||
|
|
||||||
if (it.nodeJsProcessOptions.executable == null) {
|
|
||||||
it.nodeJsProcessOptions.executable = nodeJs.buildEnv().nodeExec
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -6,7 +6,7 @@ internal data class NodeJsEnv(
|
|||||||
val nodeDir: File,
|
val nodeDir: File,
|
||||||
val nodeBinDir: File,
|
val nodeBinDir: File,
|
||||||
val nodeExecutable: String,
|
val nodeExecutable: String,
|
||||||
|
val npmExecutable: String,
|
||||||
|
|
||||||
val platformName: String,
|
val platformName: String,
|
||||||
val architectureName: String,
|
val architectureName: String,
|
||||||
|
|||||||
+2
-2
@@ -49,8 +49,8 @@ open class NodeJsRootExtension(project: Project) : NodeJsExtension(project) {
|
|||||||
return NodeJsEnv(
|
return NodeJsEnv(
|
||||||
nodeDir = nodeDir,
|
nodeDir = nodeDir,
|
||||||
nodeBinDir = nodeBinDir,
|
nodeBinDir = nodeBinDir,
|
||||||
nodeExec = getExecutable("node", nodeCommand, "exe"),
|
nodeExecutable = getExecutable("node", nodeCommand, "exe"),
|
||||||
npmExec = getExecutable("npm", npmCommand, "cmd"),
|
npmExecutable = getExecutable("npm", npmCommand, "cmd"),
|
||||||
platformName = platform,
|
platformName = platform,
|
||||||
architectureName = architecture,
|
architectureName = architecture,
|
||||||
ivyDependency = getIvyDependency()
|
ivyDependency = getIvyDependency()
|
||||||
|
|||||||
+1
-1
@@ -66,7 +66,7 @@ open class NodeJsSetupTask : DefaultTask() {
|
|||||||
unpackNodeArchive(result, destination.parentFile) // parent because archive contains name already
|
unpackNodeArchive(result, destination.parentFile) // parent because archive contains name already
|
||||||
|
|
||||||
if (!env.isWindows) {
|
if (!env.isWindows) {
|
||||||
File(env.nodeExec).setExecutable(true)
|
File(env.nodeExecutable).setExecutable(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+17
-12
@@ -177,18 +177,23 @@ internal class GradleNodeModulesSync(val project: Project) {
|
|||||||
val kotlin2JsCompile = compilation.compileKotlinTask as Kotlin2JsCompile
|
val kotlin2JsCompile = compilation.compileKotlinTask as Kotlin2JsCompile
|
||||||
|
|
||||||
// classpath
|
// classpath
|
||||||
kotlin2JsCompile.classpath.forEach { srcFile ->
|
compilation.relatedConfigurationNames.forEach {
|
||||||
when {
|
val configuration = project.configurations.getByName(it)
|
||||||
srcFile.name == PACKAGE_JSON -> visitPackageJson(srcFile, transitiveDependencies)
|
if (configuration.isCanBeResolved) {
|
||||||
isKotlinJsRuntimeFile(srcFile) -> getOrCompute(srcFile) {
|
configuration.resolve().forEach { srcFile ->
|
||||||
listOf(srcFile)
|
when {
|
||||||
}
|
srcFile.name == PACKAGE_JSON -> visitPackageJson(srcFile, transitiveDependencies)
|
||||||
srcFile.isZip -> getOrCompute(srcFile) {
|
isKotlinJsRuntimeFile(srcFile) -> getOrCompute(srcFile) {
|
||||||
mutableListOf<File>().also { files ->
|
listOf(srcFile)
|
||||||
this.project.zipTree(srcFile).forEach { innerFile ->
|
}
|
||||||
when {
|
srcFile.isZip -> getOrCompute(srcFile) {
|
||||||
innerFile.name == PACKAGE_JSON -> visitPackageJson(innerFile, transitiveDependencies)
|
mutableListOf<File>().also { files ->
|
||||||
isKotlinJsRuntimeFile(innerFile) -> files.add(innerFile)
|
this.project.zipTree(srcFile).forEach { innerFile ->
|
||||||
|
when {
|
||||||
|
innerFile.name == PACKAGE_JSON -> visitPackageJson(innerFile, transitiveDependencies)
|
||||||
|
isKotlinJsRuntimeFile(innerFile) -> files.add(innerFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-91
@@ -6,50 +6,42 @@
|
|||||||
package org.jetbrains.kotlin.gradle.targets.js.tasks
|
package org.jetbrains.kotlin.gradle.targets.js.tasks
|
||||||
|
|
||||||
import org.gradle.api.tasks.Input
|
import org.gradle.api.tasks.Input
|
||||||
import org.gradle.api.tasks.InputDirectory
|
|
||||||
import org.gradle.api.tasks.Internal
|
import org.gradle.api.tasks.Internal
|
||||||
import org.gradle.api.tasks.SkipWhenEmpty
|
|
||||||
import org.gradle.process.ProcessForkOptions
|
|
||||||
import org.gradle.process.internal.DefaultProcessForkOptions
|
import org.gradle.process.internal.DefaultProcessForkOptions
|
||||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings
|
|
||||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTrace
|
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProjectLayout
|
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProjectLayout
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolver
|
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolver
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.testing.nodejs.KotlinNodeJsTestRunner
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.testing.mocha.KotlinMocha
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinTestTask
|
import org.jetbrains.kotlin.gradle.tasks.KotlinTestTask
|
||||||
import org.jetbrains.kotlin.gradle.testing.IgnoredTestSuites
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
open class KotlinNodeJsTestTask : KotlinTestTask() {
|
open class KotlinNodeJsTestTask : KotlinTestTask() {
|
||||||
@Input
|
|
||||||
var ignoredTestSuites: IgnoredTestSuites =
|
|
||||||
IgnoredTestSuites.showWithContents
|
|
||||||
|
|
||||||
@Input
|
|
||||||
@SkipWhenEmpty
|
|
||||||
var nodeModulesToLoad: Set<String> = setOf()
|
|
||||||
|
|
||||||
@Input
|
|
||||||
lateinit var testRuntimeNodeModules: Collection<String>
|
|
||||||
|
|
||||||
@Suppress("LeakingThis")
|
|
||||||
@Internal
|
@Internal
|
||||||
val nodeJsProcessOptions: ProcessForkOptions = DefaultProcessForkOptions(fileResolver)
|
private var testFramework: KotlinJsTestFramework = KotlinNodeJsTestRunner()
|
||||||
|
|
||||||
@Suppress("unused")
|
|
||||||
val nodeJsExecutable: String
|
|
||||||
@Input get() = nodeJsProcessOptions.executable
|
|
||||||
|
|
||||||
@Suppress("unused")
|
|
||||||
val nodeJsWorkingDirCanonicalPath: String
|
|
||||||
@Input get() = nodeJsProcessOptions.workingDir.canonicalPath
|
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
var debug: Boolean = false
|
var debug: Boolean = false
|
||||||
|
|
||||||
fun nodeJs(options: ProcessForkOptions.() -> Unit) {
|
@Internal
|
||||||
options(nodeJsProcessOptions)
|
var runtimeDependencyHandler: HasKotlinDependencies? = null
|
||||||
|
|
||||||
|
@Input
|
||||||
|
var nodeModulesToLoad: MutableList<String> = mutableListOf()
|
||||||
|
|
||||||
|
fun useNodeJs(body: KotlinNodeJsTestRunner.() -> Unit) = use(KotlinNodeJsTestRunner(), body)
|
||||||
|
|
||||||
|
fun useMocha(body: KotlinMocha.() -> Unit) = use(KotlinMocha(), body)
|
||||||
|
|
||||||
|
private inline fun <T : KotlinJsTestFramework> use(runner: T, body: T.() -> Unit) {
|
||||||
|
testFramework = runner.also(body)
|
||||||
|
|
||||||
|
val dependenciesHolder = runtimeDependencyHandler
|
||||||
|
if (dependenciesHolder != null) {
|
||||||
|
testFramework.configure(dependenciesHolder)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun executeTests() {
|
override fun executeTests() {
|
||||||
@@ -58,13 +50,12 @@ open class KotlinNodeJsTestTask : KotlinTestTask() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun createTestExecutionSpec(): TCServiceMessagesTestExecutionSpec {
|
override fun createTestExecutionSpec(): TCServiceMessagesTestExecutionSpec {
|
||||||
val extendedForkOptions = DefaultProcessForkOptions(fileResolver)
|
val forkOptions = DefaultProcessForkOptions(fileResolver)
|
||||||
nodeJsProcessOptions.copyTo(extendedForkOptions)
|
|
||||||
|
|
||||||
NpmResolver.resolve(project)
|
NpmResolver.resolve(project)
|
||||||
|
|
||||||
val npmProjectLayout = NpmProjectLayout[project]
|
forkOptions.workingDir = NpmProjectLayout[project].nodeWorkDir
|
||||||
extendedForkOptions.workingDir = npmProjectLayout.nodeWorkDir
|
forkOptions.executable = NodeJsPlugin[project].buildEnv().nodeExecutable
|
||||||
|
|
||||||
val nodeJsArgs = mutableListOf<String>()
|
val nodeJsArgs = mutableListOf<String>()
|
||||||
|
|
||||||
@@ -72,61 +63,6 @@ open class KotlinNodeJsTestTask : KotlinTestTask() {
|
|||||||
nodeJsArgs.add("--inspect-brk")
|
nodeJsArgs.add("--inspect-brk")
|
||||||
}
|
}
|
||||||
|
|
||||||
val cliArgs = KotlinNodeJsTestRunnerCliArgs(
|
return testFramework.createTestExecutionSpec(this, forkOptions, nodeJsArgs)
|
||||||
nodeModulesToLoad.toList(),
|
|
||||||
filterExt.includePatterns + filterExt.commandLineIncludePatterns,
|
|
||||||
excludes,
|
|
||||||
ignoredTestSuites.cli
|
|
||||||
)
|
|
||||||
|
|
||||||
val clientSettings = TCServiceMessagesClientSettings(
|
|
||||||
name,
|
|
||||||
testNameSuffix = if (showTestTargetName) targetName else null,
|
|
||||||
prepandSuiteName = true,
|
|
||||||
stackTraceParser = ::parseNodeJsStackTraceAsJvm
|
|
||||||
)
|
|
||||||
|
|
||||||
return TCServiceMessagesTestExecutionSpec(
|
|
||||||
extendedForkOptions,
|
|
||||||
nodeJsArgs +
|
|
||||||
testRuntimeNodeModules
|
|
||||||
.map { npmProjectLayout.nodeModulesDir.resolve(it) }
|
|
||||||
.filter { it.exists() }
|
|
||||||
.map { it.absolutePath } +
|
|
||||||
cliArgs.toList(),
|
|
||||||
true,
|
|
||||||
clientSettings
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data class KotlinNodeJsTestRunnerCliArgs(
|
|
||||||
val moduleNames: List<String>,
|
|
||||||
val include: Collection<String> = listOf(),
|
|
||||||
val exclude: Collection<String> = listOf(),
|
|
||||||
val ignoredTestSuites: IgnoredTestSuitesReporting = IgnoredTestSuitesReporting.reportAllInnerTestsAsIgnored
|
|
||||||
) {
|
|
||||||
fun toList(): List<String> = mutableListOf<String>().also { args ->
|
|
||||||
if (include.isNotEmpty()) {
|
|
||||||
args.add("--include")
|
|
||||||
args.add(include.joinToString(","))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (exclude.isNotEmpty()) {
|
|
||||||
args.add("--exclude")
|
|
||||||
args.add(exclude.joinToString(","))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ignoredTestSuites !== IgnoredTestSuitesReporting.reportAllInnerTestsAsIgnored) {
|
|
||||||
args.add("--ignoredTestSuites")
|
|
||||||
args.add(ignoredTestSuites.name)
|
|
||||||
}
|
|
||||||
|
|
||||||
args.addAll(moduleNames)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("EnumEntryName")
|
|
||||||
enum class IgnoredTestSuitesReporting {
|
|
||||||
skip, reportAsIgnoredTest, reportAllInnerTestsAsIgnored
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* 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.targets.js.testing
|
||||||
|
|
||||||
|
import org.gradle.process.ProcessForkOptions
|
||||||
|
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.tasks.KotlinNodeJsTestTask
|
||||||
|
|
||||||
|
interface KotlinJsTestFramework {
|
||||||
|
fun createTestExecutionSpec(
|
||||||
|
task: KotlinNodeJsTestTask,
|
||||||
|
forkOptions: ProcessForkOptions,
|
||||||
|
nodeJsArgs: MutableList<String>
|
||||||
|
): TCServiceMessagesTestExecutionSpec
|
||||||
|
|
||||||
|
fun configure(dependenciesHolder: HasKotlinDependencies) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
-6
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSetti
|
|||||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
||||||
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
|
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
|
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
|
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProjectLayout
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
|
import org.jetbrains.kotlin.gradle.targets.js.tasks.KotlinNodeJsTestTask
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
|
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
|
||||||
|
|
||||||
class KotlinMocha : KotlinJsTestFramework {
|
class KotlinMocha : KotlinJsTestFramework {
|
||||||
@@ -24,14 +24,14 @@ class KotlinMocha : KotlinJsTestFramework {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun createTestExecutionSpec(
|
override fun createTestExecutionSpec(
|
||||||
task: KotlinJsTest,
|
task: KotlinNodeJsTestTask,
|
||||||
forkOptions: ProcessForkOptions,
|
forkOptions: ProcessForkOptions,
|
||||||
nodeJsArgs: MutableList<String>
|
nodeJsArgs: MutableList<String>
|
||||||
): TCServiceMessagesTestExecutionSpec {
|
): TCServiceMessagesTestExecutionSpec {
|
||||||
val clientSettings = TCServiceMessagesClientSettings(
|
val clientSettings = TCServiceMessagesClientSettings(
|
||||||
task.name,
|
task.name,
|
||||||
testNameSuffix = task.targetName,
|
testNameSuffix = task.targetName,
|
||||||
prependSuiteName = true,
|
prepandSuiteName = true,
|
||||||
stackTraceParser = ::parseNodeJsStackTraceAsJvm,
|
stackTraceParser = ::parseNodeJsStackTraceAsJvm,
|
||||||
ignoreOutOfRootNodes = true
|
ignoreOutOfRootNodes = true
|
||||||
)
|
)
|
||||||
@@ -41,12 +41,12 @@ class KotlinMocha : KotlinJsTestFramework {
|
|||||||
task.nodeModulesToLoad.single()
|
task.nodeModulesToLoad.single()
|
||||||
)
|
)
|
||||||
|
|
||||||
val npmProjectLayout = NpmProject[task.project]
|
val npmProjectLayout = NpmProjectLayout[task.project]
|
||||||
|
|
||||||
val args = nodeJsArgs +
|
val args = nodeJsArgs +
|
||||||
nodeModules.map {
|
nodeModules.map {
|
||||||
npmProjectLayout.nodeModulesDir.resolve(it).also { file ->
|
npmProjectLayout.nodeModulesDir.resolve(it).also { file ->
|
||||||
check(file.isFile) { "Cannot find ${file.canonicalPath}" }
|
check(file.isFile) { "Cannot find ${file.canonicalPath}"}
|
||||||
}.canonicalPath
|
}.canonicalPath
|
||||||
} +
|
} +
|
||||||
listOf(
|
listOf(
|
||||||
|
|||||||
+12
-8
@@ -11,9 +11,9 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSetti
|
|||||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
||||||
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
|
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
|
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
|
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProjectLayout
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.tasks.KotlinNodeJsTestTask
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
|
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
|
|
||||||
import org.jetbrains.kotlin.gradle.testing.IgnoredTestSuites
|
import org.jetbrains.kotlin.gradle.testing.IgnoredTestSuites
|
||||||
|
|
||||||
class KotlinNodeJsTestRunner : KotlinJsTestFramework {
|
class KotlinNodeJsTestRunner : KotlinJsTestFramework {
|
||||||
@@ -27,7 +27,7 @@ class KotlinNodeJsTestRunner : KotlinJsTestFramework {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun createTestExecutionSpec(
|
override fun createTestExecutionSpec(
|
||||||
task: KotlinJsTest,
|
task: KotlinNodeJsTestTask,
|
||||||
forkOptions: ProcessForkOptions,
|
forkOptions: ProcessForkOptions,
|
||||||
nodeJsArgs: MutableList<String>
|
nodeJsArgs: MutableList<String>
|
||||||
): TCServiceMessagesTestExecutionSpec {
|
): TCServiceMessagesTestExecutionSpec {
|
||||||
@@ -41,20 +41,24 @@ class KotlinNodeJsTestRunner : KotlinJsTestFramework {
|
|||||||
val clientSettings = TCServiceMessagesClientSettings(
|
val clientSettings = TCServiceMessagesClientSettings(
|
||||||
task.name,
|
task.name,
|
||||||
testNameSuffix = task.targetName,
|
testNameSuffix = task.targetName,
|
||||||
prependSuiteName = true,
|
prepandSuiteName = true,
|
||||||
stackTraceParser = ::parseNodeJsStackTraceAsJvm
|
stackTraceParser = ::parseNodeJsStackTraceAsJvm
|
||||||
)
|
)
|
||||||
|
|
||||||
val testRuntimeNodeModules = listOf(
|
val testRuntimeNodeModules = listOf(
|
||||||
"kotlin-test-nodejs-runner/kotlin-test-nodejs-runner.js",
|
"kotlin-test-nodejs-runner.js",
|
||||||
"kotlin-test-nodejs-runner/kotlin-nodejs-source-map-support.js"
|
"kotlin-nodejs-source-map-support.js"
|
||||||
)
|
)
|
||||||
|
|
||||||
val npmProjectLayout = NpmProject[task.project]
|
val npmProjectLayout = NpmProjectLayout[task.project]
|
||||||
|
|
||||||
val args = nodeJsArgs +
|
val args = nodeJsArgs +
|
||||||
testRuntimeNodeModules.map {
|
testRuntimeNodeModules.map {
|
||||||
npmProjectLayout.getModuleEntryPath(it)
|
npmProjectLayout.nodeModulesDir.resolve(it).also { file ->
|
||||||
|
check(file.isFile) {
|
||||||
|
"Cannot find ${file.canonicalPath}"
|
||||||
|
}
|
||||||
|
}.canonicalPath
|
||||||
} +
|
} +
|
||||||
cliArgs.toList()
|
cliArgs.toList()
|
||||||
|
|
||||||
|
|||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* 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.targets.js.testing.nodejs
|
||||||
|
|
||||||
|
data class KotlinNodeJsTestRunnerCliArgs(
|
||||||
|
val moduleNames: List<String>,
|
||||||
|
val include: Collection<String> = listOf(),
|
||||||
|
val exclude: Collection<String> = listOf(),
|
||||||
|
val ignoredTestSuites: IgnoredTestSuitesReporting = IgnoredTestSuitesReporting.reportAllInnerTestsAsIgnored
|
||||||
|
) {
|
||||||
|
fun toList(): List<String> = mutableListOf<String>().also { args ->
|
||||||
|
if (include.isNotEmpty()) {
|
||||||
|
args.add("--include")
|
||||||
|
args.add(include.joinToString(","))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exclude.isNotEmpty()) {
|
||||||
|
args.add("--exclude")
|
||||||
|
args.add(exclude.joinToString(","))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ignoredTestSuites !== IgnoredTestSuitesReporting.reportAllInnerTestsAsIgnored) {
|
||||||
|
args.add("--ignoredTestSuites")
|
||||||
|
args.add(ignoredTestSuites.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
args.addAll(moduleNames)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("EnumEntryName")
|
||||||
|
enum class IgnoredTestSuitesReporting {
|
||||||
|
skip, reportAsIgnoredTest, reportAllInnerTestsAsIgnored
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-2
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.gradle.targets.js.yarn
|
|||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.jetbrains.kotlin.gradle.internal.execWithProgress
|
import org.jetbrains.kotlin.gradle.internal.execWithProgress
|
||||||
import org.jetbrains.kotlin.gradle.internal.operation
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
|
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProjectLayout
|
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProjectLayout
|
||||||
@@ -32,7 +31,7 @@ object Yarn : NpmApi {
|
|||||||
val yarnEnv = YarnPlugin[project].buildEnv()
|
val yarnEnv = YarnPlugin[project].buildEnv()
|
||||||
|
|
||||||
project.execWithProgress(description) { exec ->
|
project.execWithProgress(description) { exec ->
|
||||||
exec.executable = nodeJsEnv.nodeExec
|
exec.executable = nodeJsEnv.nodeExecutable
|
||||||
exec.args = listOf(yarnEnv.home.resolve("bin/yarn.js").absolutePath) + args
|
exec.args = listOf(yarnEnv.home.resolve("bin/yarn.js").absolutePath) + args
|
||||||
exec.workingDir = npmProjectLayout.nodeWorkDir
|
exec.workingDir = npmProjectLayout.nodeWorkDir
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -135,7 +135,6 @@ open class KotlinNativeTargetConfigurator(
|
|||||||
group = LifecycleBasePlugin.VERIFICATION_GROUP
|
group = LifecycleBasePlugin.VERIFICATION_GROUP
|
||||||
description = "Executes Kotlin/Native unit tests for target ${binary.target.name}."
|
description = "Executes Kotlin/Native unit tests for target ${binary.target.name}."
|
||||||
targetName = binary.compilation.target.targetName
|
targetName = binary.compilation.target.targetName
|
||||||
showTestTargetName = true
|
|
||||||
|
|
||||||
enabled = binary.target.konanTarget.isCurrentHost
|
enabled = binary.target.konanTarget.isCurrentHost
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -48,8 +48,8 @@ open class KotlinNativeTestTask : KotlinTestTask() {
|
|||||||
|
|
||||||
val clientSettings = TCServiceMessagesClientSettings(
|
val clientSettings = TCServiceMessagesClientSettings(
|
||||||
name,
|
name,
|
||||||
testNameSuffix = if (showTestTargetName) targetName else null,
|
testNameSuffix = targetName,
|
||||||
prepandSuiteName = showTestTargetName,
|
prepandSuiteName = targetName != null,
|
||||||
treatFailedTestOutputAsStacktrace = true,
|
treatFailedTestOutputAsStacktrace = true,
|
||||||
stackTraceParser = ::parseKotlinNativeStackTraceAsJvm
|
stackTraceParser = ::parseKotlinNativeStackTraceAsJvm
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-5
@@ -17,9 +17,6 @@ import org.jetbrains.kotlin.gradle.utils.injected
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
abstract class KotlinTestTask : AbstractTestTask() {
|
abstract class KotlinTestTask : AbstractTestTask() {
|
||||||
@Input
|
|
||||||
var showTestTargetName: Boolean = false
|
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
@Optional
|
@Optional
|
||||||
var targetName: String? = null
|
var targetName: String? = null
|
||||||
@@ -35,10 +32,10 @@ abstract class KotlinTestTask : AbstractTestTask() {
|
|||||||
filterExt.isFailOnNoMatchingTests = false
|
filterExt.isFailOnNoMatchingTests = false
|
||||||
}
|
}
|
||||||
|
|
||||||
protected val includePatterns: Set<String>
|
val includePatterns: Set<String>
|
||||||
@Internal get() = filterExt.includePatterns + filterExt.commandLineIncludePatterns
|
@Internal get() = filterExt.includePatterns + filterExt.commandLineIncludePatterns
|
||||||
|
|
||||||
protected val excludePatterns: Set<String>
|
val excludePatterns: Set<String>
|
||||||
@Internal get() = excludes
|
@Internal get() = excludes
|
||||||
|
|
||||||
@get:Inject
|
@get:Inject
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
package org.jetbrains.kotlin.gradle.testing
|
package org.jetbrains.kotlin.gradle.testing
|
||||||
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.tasks.KotlinNodeJsTestRunnerCliArgs
|
import org.jetbrains.kotlin.gradle.targets.js.testing.nodejs.KotlinNodeJsTestRunnerCliArgs
|
||||||
|
|
||||||
@Suppress("EnumEntryName")
|
@Suppress("EnumEntryName")
|
||||||
enum class IgnoredTestSuites(val cli: KotlinNodeJsTestRunnerCliArgs.IgnoredTestSuitesReporting) {
|
enum class IgnoredTestSuites(val cli: KotlinNodeJsTestRunnerCliArgs.IgnoredTestSuitesReporting) {
|
||||||
|
|||||||
Reference in New Issue
Block a user