diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KarmaBrowserLogParser.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KarmaBrowserLogParser.kt new file mode 100644 index 00000000000..66d3ba43d1f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KarmaBrowserLogParser.kt @@ -0,0 +1,73 @@ +/* + * 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 + +class KarmaBrowserLogParser { + private var overflowConsole: Boolean = false + private var previousType: BrowserLogType? = null + + fun parseKarmaBrowserLog(text: String): BrowserLog? { + val logStartIndex = text.indexOf("$BROWSER_LOG_SURROUNDER[") + if (logStartIndex == -1 && !overflowConsole) { + return null + } + + var browser: String? = null + var type: String? = null + var log: String = text + + if (logStartIndex != -1 && !overflowConsole) { + val afterPrefix = text.substring(logStartIndex) + browser = afterPrefix.substringAfter("browser='").substringBefore("'") + type = afterPrefix.substringAfter("type='").substringBefore("'") + + log = afterPrefix.substringAfter("log=") + } + + val logEndIndex = text.indexOf("]$BROWSER_LOG_SURROUNDER") + if (logEndIndex != -1) { + overflowConsole = false + log = log.substringBefore("]$BROWSER_LOG_SURROUNDER") + } else { + overflowConsole = true + } + + val currentType = when (type) { + "log" -> BrowserLogType.LOG + "info" -> BrowserLogType.INFO + "warn" -> BrowserLogType.WARN + "error" -> BrowserLogType.ERROR + "debug" -> BrowserLogType.DEBUG + else -> previousType + } + + previousType = currentType + + return BrowserLog( + browser = browser, + type = currentType, + log = log + ) + } + + companion object { + const val BROWSER_LOG_SURROUNDER = "##browser" + } +} + +data class BrowserLog( + val browser: String?, + val type: BrowserLogType?, + val log: String +) + +enum class BrowserLogType(val value: String) { + LOG("log"), + INFO("info"), + WARN("warn"), + ERROR("error"), + DEBUG("debug") +} \ 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 a9d5e41338c..3d18b73f922 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 @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework +import org.jetbrains.kotlin.gradle.targets.js.testing.karma.KarmaBrowserLogParser.Companion.BROWSER_LOG_SURROUNDER import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig import org.jetbrains.kotlin.gradle.testing.internal.reportsDir import org.slf4j.Logger @@ -79,7 +80,13 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF baseReporterDecorator(this); this.onBrowserLog = (browser, log, type) => { - this.write("##browser[" + "browser='" + browser + "' " + "type='" + type + "' " + "log=" + log + "]##browser\n"); + this.write( + "$BROWSER_LOG_SURROUNDER[" + + "browser='" + browser + "' " + + "type='" + type + "' " + + "log=" + log + + "]$BROWSER_LOG_SURROUNDER\n" + ); } }; @@ -338,18 +345,12 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF val baseTestNameSuffix get() = settings.testNameSuffix override var testNameSuffix: String? = baseTestNameSuffix - lateinit var clientId: String + val browserLogParser = KarmaBrowserLogParser() override fun printNonTestOutput(text: String) { val value = text.trimEnd() progressLogger.progress(value) - if (value.contains(CLIENT_ID_MARKER)) { - clientId = value - .substringBeforeLast("]") - .substringAfterLast("[") - } - parseConsole(value) } @@ -386,21 +387,34 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF return } - if (::clientId.isInitialized && text.startsWith(clientId)) { - val logLevel = text - .substringAfter(clientId) - .substringBefore(":") - .trim() - - when (logLevel) { - "WARN" -> log.warn(text) - "ERROR" -> log.error(text) - "DEBUG" -> log.debug(text) - else -> log.info(text) - } - } - suppressedOutput.appendln(text) + + val browserLog = browserLogParser.parseKarmaBrowserLog(text) ?: return + + val formattedMessage = formatMessage(browserLog) + + when (browserLog.type) { + BrowserLogType.LOG -> println(formattedMessage) + BrowserLogType.WARN -> log.warn(formattedMessage) + BrowserLogType.ERROR -> log.error(formattedMessage) + BrowserLogType.DEBUG -> log.debug(formattedMessage) + else -> log.info(formattedMessage) + } + } + + private fun formatMessage(browserLog: BrowserLog): String { + val browser = browserLog.browser + val browserPart = browser?.plus(" ") ?: "" + + val type = browserLog.type + val typePart = if (browser != null && type != null) { + type + .value + .toUpperCase() + .plus(" ") + } else "" + + return "$browserPart$typePart${browserLog.log}" } } }