Add parse of karma log to find browser's messages

- Log browser's message respects their log level
This commit is contained in:
Ilya Goncharov
2019-09-12 17:24:51 +03:00
parent 8c46fab6d8
commit 355f847ee0
2 changed files with 109 additions and 22 deletions
@@ -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")
}
@@ -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}"
}
}
}