From 9cd5e86dd95c0f6690f9325097731ff352d91fc5 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Mon, 25 Sep 2017 13:59:58 +0300 Subject: [PATCH] unit-tests: Add TeamCity logger --- .../main/kotlin/konan/test/TeamCityLogger.kt | 45 +++++++++++++++++++ .../src/main/kotlin/konan/test/TestRunner.kt | 2 +- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 runtime/src/main/kotlin/konan/test/TeamCityLogger.kt diff --git a/runtime/src/main/kotlin/konan/test/TeamCityLogger.kt b/runtime/src/main/kotlin/konan/test/TeamCityLogger.kt new file mode 100644 index 00000000000..5b5f74f6445 --- /dev/null +++ b/runtime/src/main/kotlin/konan/test/TeamCityLogger.kt @@ -0,0 +1,45 @@ +package konan.test + +import kotlin.text.StringBuilder + +class TeamCityLogger : BaseTestLogger() { + + private fun String.escapeForTC(): String = StringBuilder(length).apply { + for(char in this@escapeForTC) { + append(when(char) { + '|' -> "||" + '\'' -> "|'" + '\n' -> "|n" + '\r' -> "|r" + '[' -> "|[" + ']' -> "|]" + else -> char + }) + } + }.toString() + + private val TestCase.tcName + get() = name.escapeForTC() + + private val TestSuite.tcName + get() = name.escapeForTC() + + private fun finish(testCase: TestCase, durationMs: Long) = + report("testFinished name='${testCase.tcName}' duration='$durationMs'") + + private fun report(msg: String) = println("##teamcity[$msg]") + + override fun start(testCase: TestCase) = report("testStarted name='${testCase.tcName}'") + override fun startSuite(suite: TestSuite) = report("testSuiteStarted name='${suite.tcName}'") + override fun endSuite(suite: TestSuite, timeMillis: Long) = report("testSuiteFinished name='${suite.tcName}'") + + override fun pass(testCase: TestCase, timeMillis: Long) = finish(testCase, timeMillis) + override fun fail(testCase: TestCase, e: Throwable, timeMillis: Long) { + // TODO: Add 'details=...' command with the stack trace (need to implement stacktrace dumping as a string) + e.printStackTrace() + report("testFailed name='${testCase.tcName}' message='${e.message?.escapeForTC()}'") + finish(testCase, timeMillis) + } + + override fun ignore(testCase: TestCase) = report("testIgnored name='${testCase.tcName}'") +} \ No newline at end of file diff --git a/runtime/src/main/kotlin/konan/test/TestRunner.kt b/runtime/src/main/kotlin/konan/test/TestRunner.kt index ec7cc7ed295..29372f01665 100644 --- a/runtime/src/main/kotlin/konan/test/TestRunner.kt +++ b/runtime/src/main/kotlin/konan/test/TestRunner.kt @@ -143,7 +143,7 @@ object TestRunner { private fun setLoggerFromArg(logger: String) { when(logger.toUpperCase()) { "GTEST" -> this.logger = GTestLogger() - "TEAMCITY" -> TODO() //this.logger = TeamCityLogger() + "TEAMCITY" -> this.logger = TeamCityLogger() "SIMPLE" -> this.logger = SimpleTestLogger() "SILENT" -> this.logger = SilentTestLogger() else -> throw IllegalArgumentException("Unknown logger type. Available types: GTEST, TEAMCITY, SIMPLE")