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 db8d5b4a9df..8d63c5a1bc1 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 @@ -257,6 +257,22 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF ): TCServiceMessagesTestExecutionSpec { if (debug) { config.singleRun = false + + confJsWriters.add { + //language=ES6 + it.appendln( + """ + if (!config.plugins) { + config.plugins = config.plugins || []; + config.plugins.push('karma-*'); // default + } + + config.plugins.push('kotlin-test-js-runner/karma-debug-framework.js'); + """.trimIndent() + ) + } + + config.frameworks.add("karma-kotlin-debug") } if (config.browsers.isEmpty()) { diff --git a/libraries/tools/kotlin-test-js-runner/build.gradle.kts b/libraries/tools/kotlin-test-js-runner/build.gradle.kts index 9dbbb75b5c1..61d6f9bab8f 100644 --- a/libraries/tools/kotlin-test-js-runner/build.gradle.kts +++ b/libraries/tools/kotlin-test-js-runner/build.gradle.kts @@ -54,6 +54,7 @@ tasks { "karma.ts", "karma-kotlin-reporter.js", "karma-debug-runner.js", + "karma-debug-framework.js", "mocha-kotlin-reporter.js", "package.json", "rollup.config.js", diff --git a/libraries/tools/kotlin-test-js-runner/karma-debug-framework.js b/libraries/tools/kotlin-test-js-runner/karma-debug-framework.js new file mode 100644 index 00000000000..fa1ef977553 --- /dev/null +++ b/libraries/tools/kotlin-test-js-runner/karma-debug-framework.js @@ -0,0 +1,36 @@ +/* + * 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. + */ + +'use strict'; + +const initDebug = function (injector) { + configureTimeouts(injector) +}; + +function configureTimeouts(injector) { + const webServer = injector.get('webServer'); + if (webServer) { + // IDE posts http '/run' request to trigger tests (see intellijRunner.js). + // If a request executes more than `httpServer.timeout`, it will be timed out. + // Disable timeout, as by default httpServer.timeout=120 seconds, not enough for suspended execution. + webServer.timeout = 0 + } + const socketServer = injector.get('socketServer'); + if (socketServer) { + // Disable socket.io heartbeat (ping) to avoid browser disconnecting when debugging tests, + // because no ping requests are sent when test execution is suspended on a breakpoint. + // Default values are not enough for suspended execution: + // 'heartbeat timeout' (pingTimeout) = 60000 ms + // 'heartbeat interval' (pingInterval) = 25000 ms + socketServer.set('heartbeat timeout', 24 * 60 * 60 * 1000); + socketServer.set('heartbeat interval', 24 * 60 * 60 * 1000) + } +} + +initDebug.$inject = ['injector']; + +module.exports = { + 'framework:karma-kotlin-debug': ['factory', initDebug] +}; \ No newline at end of file diff --git a/libraries/tools/kotlin-test-js-runner/karma-debug-runner.js b/libraries/tools/kotlin-test-js-runner/karma-debug-runner.js index 5d6c356be41..1e95a974398 100644 --- a/libraries/tools/kotlin-test-js-runner/karma-debug-runner.js +++ b/libraries/tools/kotlin-test-js-runner/karma-debug-runner.js @@ -5,7 +5,7 @@ 'use strict'; -import {configureBrowsers, fixMochaTimeout} from "./src/DebugConfigurator"; +import {configureBrowsers, fixBrowserActivityTimeout, fixMochaTimeout} from "./src/DebugConfigurator"; const karma = require('karma'); @@ -17,6 +17,7 @@ karmaConfig.singleRun = false; configureBrowsers(karmaConfig); fixMochaTimeout(karmaConfig); +fixBrowserActivityTimeout(karmaConfig); const Server = karma.Server; const server = new Server(karmaConfig, function (exitCode) { diff --git a/libraries/tools/kotlin-test-js-runner/rollup.config.js b/libraries/tools/kotlin-test-js-runner/rollup.config.js index 60c9576901c..b0e8871231e 100644 --- a/libraries/tools/kotlin-test-js-runner/rollup.config.js +++ b/libraries/tools/kotlin-test-js-runner/rollup.config.js @@ -32,6 +32,13 @@ export default [ format: 'cjs' } }, + { + input: './karma-debug-framework.js', + output: { + file: 'lib/karma-debug-framework.js', + format: 'cjs' + } + }, { input: './karma-kotlin-reporter.js', external: ['path', 'util'], diff --git a/libraries/tools/kotlin-test-js-runner/src/DebugConfigurator.js b/libraries/tools/kotlin-test-js-runner/src/DebugConfigurator.js index 574c5fc26e6..118596e2c4b 100644 --- a/libraries/tools/kotlin-test-js-runner/src/DebugConfigurator.js +++ b/libraries/tools/kotlin-test-js-runner/src/DebugConfigurator.js @@ -85,4 +85,8 @@ export function fixMochaTimeout(config) { console.error('config.client is not an object'); process.exit(1); } +} + +export function fixBrowserActivityTimeout(config) { + config.browserNoActivityTimeout = null } \ No newline at end of file