Add tests for processing karma stack traces

This commit is contained in:
Ilya Goncharov
2019-10-01 15:13:51 +03:00
parent 4b5877f3b5
commit 58e9b756f1
3 changed files with 122 additions and 45 deletions
@@ -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))
}
@@ -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()
}
}
@@ -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.<anonymous> (/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.<anonymous> (/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)
)
}
}