diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt index 9d01bb1d03e..771d16973fd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt @@ -238,6 +238,8 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF val adapterJs = npmProject.dir.resolve("adapter-browser.js") adapterJs.printWriter().use { writer -> val karmaRunner = npmProject.require("kotlin-test-js-runner/kotlin-test-karma-runner.js") + // It is necessary for debugger attaching (--inspect-brk analogue) + writer.println("debugger;") writer.println("require(${karmaRunner.jsQuoted()})") writer.println("module.exports = require(${file.jsQuoted()})") @@ -253,6 +255,11 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF nodeJsArgs: MutableList, debug: Boolean ): TCServiceMessagesTestExecutionSpec { + if (debug) { + config.client.mocha.timeout = "0" + config.singleRun = false + } + if (config.browsers.isEmpty()) { error("No browsers configured for $task") } @@ -306,15 +313,16 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF val nodeModules = listOf("karma/bin/karma") + val karmaConfigAbsolutePath = karmaConfJs.absolutePath val args = if (debug) { - config.client.mocha.timeout = "0" - - //TODO need generate it - listOf("./debugRunner.js") + listOf( + npmProject.require("kotlin-test-js-runner/karma-debug.js"), + karmaConfigAbsolutePath + ) } else { nodeJsArgs + nodeModules.map { npmProject.require(it) } + - listOf("start", karmaConfJs.absolutePath) + listOf("start", karmaConfigAbsolutePath) } return object : JSServiceMessagesTestExecutionSpec( diff --git a/libraries/tools/kotlin-test-js-runner/build.gradle.kts b/libraries/tools/kotlin-test-js-runner/build.gradle.kts index a979f64930c..2a53d7bb2d6 100644 --- a/libraries/tools/kotlin-test-js-runner/build.gradle.kts +++ b/libraries/tools/kotlin-test-js-runner/build.gradle.kts @@ -53,6 +53,7 @@ tasks { "nodejs.ts", "karma.ts", "karma-kotlin-reporter.js", + "karma-debug.js", "mocha-kotlin-reporter.js", "package.json", "rollup.config.js", diff --git a/libraries/tools/kotlin-test-js-runner/karma-debug.js b/libraries/tools/kotlin-test-js-runner/karma-debug.js new file mode 100644 index 00000000000..b6991e6ee34 --- /dev/null +++ b/libraries/tools/kotlin-test-js-runner/karma-debug.js @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +const karma = require('karma'); + +const cfg = karma.config; + +const karmaConfig = cfg.parseConfig(process.argv[2]); + +const Server = karma.Server; +const server = new Server(karmaConfig, function (exitCode) { + console.log('Karma has exited with ' + exitCode); +}); + +server.on('browsers_ready', function () { + // It is unreliable decision, but we need some delay for debugger attaching + setTimeout(function () { + karma.runner.run(karmaConfig, function (exitCode) { + console.log('Runner has exited with ' + exitCode); + karma.stopper.stop(karmaConfig, function (exitCode) { + console.log('Stopper has exited with ' + exitCode); + }) + }) + }, 1000) +}); + +server.start(); \ No newline at end of file diff --git a/libraries/tools/kotlin-test-js-runner/rollup.config.js b/libraries/tools/kotlin-test-js-runner/rollup.config.js index a752698f878..3ad500b2e96 100644 --- a/libraries/tools/kotlin-test-js-runner/rollup.config.js +++ b/libraries/tools/kotlin-test-js-runner/rollup.config.js @@ -25,6 +25,13 @@ export default [ }, plugins: plugins() }, + { + input: './karma-debug.js', + output: { + file: 'lib/karma-debug.js', + format: 'cjs' + } + }, { input: './karma-kotlin-reporter.js', external: ['path', 'util'], diff --git a/libraries/tools/kotlin-test-js-runner/tsconfig.json b/libraries/tools/kotlin-test-js-runner/tsconfig.json index bb7ef503871..d704981740f 100644 --- a/libraries/tools/kotlin-test-js-runner/tsconfig.json +++ b/libraries/tools/kotlin-test-js-runner/tsconfig.json @@ -4,8 +4,7 @@ "module": "ESNext", "strict": true, "sourceMap": true, - "allowSyntheticDefaultImports": true, - "inlineSourceMap": true + "allowSyntheticDefaultImports": true }, "exclude": [ "**/*Debug.ts"