diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KarmaStackTraceProcessor.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KarmaStackTraceProcessor.kt new file mode 100644 index 00000000000..01b41ce744a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KarmaStackTraceProcessor.kt @@ -0,0 +1,51 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.targets.js.testing.karma + +private const val WEBPACK_PROTOCOL = "webpack://" +private const val KARMA_SOURCE_MAP_DELIMITER = " <-" + +private const val STACK_TRACE_DELIMITER = "at " +private const val WEBPACK_LOCAL_DELIMITER = ".." + +fun processKarmaStackTrace(stackTrace: String): String { + return stackTrace.lines() + .map(::processWebpackName) + .joinToString("\n") { line -> + val index = line.indexOf(KARMA_SOURCE_MAP_DELIMITER) + if (index == -1) + line + else + line + .removeRange(index, line.length - 1) + .replace(WEBPACK_PROTOCOL, "") + } +} + +fun processWebpackName(line: String): String { + // example: "at MyTest../kotlin/check-js-test-test.js.MyTest.foo (/src/test/kotlin/MyTest.kt:7:8)" + // should be "at MyTest.foo (/src/test/kotlin/MyTest.kt:7:8)" + val stackTraceDelimiter = line.indexOf(STACK_TRACE_DELIMITER) + val webpackLocalDelimiter = line.indexOf(WEBPACK_LOCAL_DELIMITER) + if (stackTraceDelimiter == -1 || webpackLocalDelimiter == -1) { + return line + } + + val traceStartIndex = stackTraceDelimiter + STACK_TRACE_DELIMITER.length + val name = line.substring( + traceStartIndex, + webpackLocalDelimiter + ) // MyTest + val fileStart = line.indexOf("(") + val fullJsName = line.substring(webpackLocalDelimiter, fileStart) // ../kotlin/check-js-test-test.js.MyTest.foo + + val nameIndex = fullJsName.indexOf(name) + if (nameIndex == -1) { + return line + } + + return line.replaceRange(traceStartIndex, fileStart, fullJsName.substring(nameIndex)) +} \ No newline at end of file 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 701bf9678e5..886290d2da7 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 @@ -354,45 +354,8 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF parseConsole(value) } - override fun processStackTrace(stackTrace: String): String { - return stackTrace.lines() - .map(::processName) - .joinToString("\n") { line -> - val index = line.indexOf(KARMA_SOURCE_MAP_DELIMITER) - if (index == -1) - line - else - line - .removeRange(index, line.length - 1) - .replace(WEBPACK_PROTOCOL, "") - } - - } - - private fun processName(line: String): String { - // example: "at MyTest../kotlin/check-js-test-test.js.MyTest.foo (/src/test/kotlin/MyTest.kt:7:8)" - // should be "at MyTest.foo (/src/test/kotlin/MyTest.kt:7:8)" - val stackTraceDelimiter = line.indexOf(STACK_TRACE_DELIMITER) - val webpackLocalDelimiter = line.indexOf(WEBPACK_LOCAL_DELIMITER) - if (stackTraceDelimiter == -1 || webpackLocalDelimiter == -1) { - return line - } - - val traceStartIndex = stackTraceDelimiter + STACK_TRACE_DELIMITER.length - val name = line.substring( - traceStartIndex, - webpackLocalDelimiter - ) // MyTest - val fileStart = line.indexOf("(") - val fullJsName = line.substring(webpackLocalDelimiter, fileStart) // ../kotlin/check-js-test-test.js.MyTest.foo - - val nameIndex = fullJsName.indexOf(name) - if (nameIndex == -1) { - return line - } - - return line.replaceRange(traceStartIndex, fileStart, fullJsName.substring(nameIndex)) - } + override fun processStackTrace(stackTrace: String): String = + processKarmaStackTrace(stackTrace) override fun getSuiteName(message: BaseTestSuiteMessage): String { val src = message.suiteName.trim() @@ -449,12 +412,6 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF const val CHROME_BIN = "CHROME_BIN" const val CHROME_CANARY_BIN = "CHROME_CANARY_BIN" - const val WEBPACK_PROTOCOL = "webpack://" - const val KARMA_SOURCE_MAP_DELIMITER = " <-" - - const val STACK_TRACE_DELIMITER = "at " - const val WEBPACK_LOCAL_DELIMITER = ".." - val KARMA_PROBLEM = "(?m)^.*\\d{2} \\d{2} \\d{4,} \\d{2}:\\d{2}:\\d{2}.\\d{3}:(ERROR|WARN) \\[.*]: (.*)\$".toRegex() } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KarmaStackTraceProcessorKtTest.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KarmaStackTraceProcessorKtTest.kt new file mode 100644 index 00000000000..a23c394d3dc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KarmaStackTraceProcessorKtTest.kt @@ -0,0 +1,69 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.targets.js.testing.karma + +import org.junit.Assert.assertEquals +import org.junit.Test + +class KarmaStackTraceProcessorKtTest { + + @Test + fun processKarmaStackTrace() { + val stackTrace = """AssertionError: Expected value to be true. + at AssertionError_init_0 (webpack:///kotlin/exceptions.kt:102:36 <- /Users/ilya.goncharov/repos/check-kotlin-js-test/build/js/packages/check-kotlin-js-test-test/adapter.js:33390:22) + at DefaultJsAsserter.failWithMessage_0 (webpack:///src/main/kotlin/kotlin/test/DefaultJsAsserter.kt:80:18 <- /Users/ilya.goncharov/repos/check-kotlin-js-test/build/js/packages/check-kotlin-js-test-test/adapter.js:1569:13) + at DefaultJsAsserter.assertTrue_o10pc4${'$'} (webpack:///src/main/kotlin/kotlin/test/DefaultJsAsserter.kt:60:12 <- /Users/ilya.goncharov/repos/check-kotlin-js-test/build/js/packages/check-kotlin-js-test-test/adapter.js:1536:12) + at DefaultJsAsserter.assertTrue_4mavae${'$'} (webpack:///src/main/kotlin/kotlin/test/DefaultJsAsserter.kt:67:8 <- /Users/ilya.goncharov/repos/check-kotlin-js-test/build/js/packages/check-kotlin-js-test-test/adapter.js:1548:10) + at assertTrue_0 (webpack:///Assertions.kt:37:20 <- /Users/ilya.goncharov/repos/check-kotlin-js-test/build/js/packages/check-kotlin-js-test-test/adapter.js:1182:27) + at assertTrue (webpack:///Assertions.kt:32:70 <- /Users/ilya.goncharov/repos/check-kotlin-js-test/build/js/packages/check-kotlin-js-test-test/adapter.js:1177:5) + at MyTest../kotlin/check-kotlin-js-test-test.js.MyTest.foo (webpack:///src/test/kotlin/MyTest.kt:7:8 <- /Users/ilya.goncharov/repos/check-kotlin-js-test/build/js/packages/check-kotlin-js-test-test/adapter.js:53047:5) + at Context. (/Users/ilya.goncharov/repos/check-kotlin-js-test/build/js/packages/check-kotlin-js-test-test/adapter.js:53080:31)""".trimIndent() + + val expected = """AssertionError: Expected value to be true. + at AssertionError_init_0 (/kotlin/exceptions.kt:102:36) + at DefaultJsAsserter.failWithMessage_0 (/src/main/kotlin/kotlin/test/DefaultJsAsserter.kt:80:18) + at DefaultJsAsserter.assertTrue_o10pc4${'$'} (/src/main/kotlin/kotlin/test/DefaultJsAsserter.kt:60:12) + at DefaultJsAsserter.assertTrue_4mavae${'$'} (/src/main/kotlin/kotlin/test/DefaultJsAsserter.kt:67:8) + at assertTrue_0 (/Assertions.kt:37:20) + at assertTrue (/Assertions.kt:32:70) + at MyTest.foo (/src/test/kotlin/MyTest.kt:7:8) + at Context. (/Users/ilya.goncharov/repos/check-kotlin-js-test/build/js/packages/check-kotlin-js-test-test/adapter.js:53080:31)""".trimIndent() + + assertEquals( + expected, + processKarmaStackTrace(stackTrace) + ) + } + + @Test + fun processWebpackName() { + val processedLine = processWebpackName( + "at MyTest../kotlin/check-js-test-test.js.MyTest.foo (/src/test/kotlin/MyTest.kt:7:8)" + ) + assertEquals( + "at MyTest.foo (/src/test/kotlin/MyTest.kt:7:8)", + processedLine + ) + } + + @Test + fun notProcessNotWebpackName() { + val line = "at DefaultJsAsserter.assertTrue(/src/main/kotlin/kotlin/test/DefaultJsAsserter.kt:67)" + assertEquals( + line, + processWebpackName(line) + ) + } + + @Test + fun notProcessMessage() { + val line = "AssertionError: Expected value to be true." + assertEquals( + line, + processWebpackName(line) + ) + } +} \ No newline at end of file