[Gradle, JS] Improvements of kotlin test adapters

- divide adapter.js into different files, which frameworks could load separately
- possibility to inject something to kotlin-test adapter by user

^KT-54418 fixed
This commit is contained in:
Ilya Goncharov
2022-10-12 14:14:50 +00:00
committed by Space Team
parent d423782fac
commit b01411544a
4 changed files with 19 additions and 55 deletions
@@ -146,7 +146,7 @@ class KotlinKarma(
{ {
type: 'kotlin-test-js-runner/tc-log-appender.js', type: 'kotlin-test-js-runner/tc-log-appender.js',
//default layout //default layout
layout: { type: 'pattern', pattern: '%[%d{DATE}:%p [%c]: %]%m' } layout: { type: 'pattern', pattern: '%[%d{DATETIME}:%p [%c]: %]%m' }
} }
] ]
""".trimIndent() """.trimIndent()
@@ -241,6 +241,7 @@ class KotlinKarma(
} }
private fun useWebpack() { private fun useWebpack() {
config.frameworks.add("webpack")
requiredDependencies.add(versions.karmaWebpack) requiredDependencies.add(versions.karmaWebpack)
requiredDependencies.add( requiredDependencies.add(
webpackMajorVersion.choose( webpackMajorVersion.choose(
@@ -353,26 +354,6 @@ class KotlinKarma(
} }
} }
private fun createAdapterJs(
file: String,
debug: Boolean
): File {
val adapterJs = npmProject.dir.resolve("adapter-browser.js")
adapterJs.printWriter().use { writer ->
val karmaRunner = npmProject.require("kotlin-test-js-runner/kotlin-test-karma-runner.js")
// It is necessary for debugger attaching (--inspect-brk analogue)
if (debug) {
writer.println("debugger;")
}
writer.println("require(${karmaRunner.jsQuoted()})")
writer.println("module.exports = require(${file.jsQuoted()})")
}
return adapterJs
}
override fun createTestExecutionSpec( override fun createTestExecutionSpec(
task: KotlinJsTest, task: KotlinJsTest,
forkOptions: ProcessForkOptions, forkOptions: ProcessForkOptions,
@@ -381,9 +362,8 @@ class KotlinKarma(
): TCServiceMessagesTestExecutionSpec { ): TCServiceMessagesTestExecutionSpec {
val file = task.inputFileProperty.get().asFile.toString() val file = task.inputFileProperty.get().asFile.toString()
val adapterJs = createAdapterJs(file, debug) config.files.add(npmProject.require("kotlin-test-js-runner/kotlin-test-karma-runner.js"))
config.files.add(file)
config.files.add(adapterJs.canonicalPath)
if (debug) { if (debug) {
config.singleRun = false config.singleRun = false
@@ -14,13 +14,11 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
import org.jetbrains.kotlin.gradle.targets.js.jsQuoted
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin 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.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest 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.KotlinJsTestFramework
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinTestRunnerCliArgs import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinTestRunnerCliArgs
import java.io.File
class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, private val basePath: String) : class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, private val basePath: String) :
KotlinJsTestFramework { KotlinJsTestFramework {
@@ -72,7 +70,6 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv
val file = task.inputFileProperty.get().asFile.toString() val file = task.inputFileProperty.get().asFile.toString()
val adapter = createAdapterJs(file, "kotlin-test-nodejs-runner", ADAPTER_NODEJS)
val args = mutableListOf( val args = mutableListOf(
"--require", "--require",
npmProject.require("source-map-support/register.js") npmProject.require("source-map-support/register.js")
@@ -81,9 +78,10 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv
add("--inspect-brk") add("--inspect-brk")
} }
add(mocha) add(mocha)
add(adapter.canonicalPath) add(file)
addAll(cliArgs.toList()) addAll(cliArgs.toList())
addAll(cliArg("--reporter", "kotlin-test-js-runner/mocha-kotlin-reporter.js")) addAll(cliArg("--reporter", "kotlin-test-js-runner/mocha-kotlin-reporter.js"))
addAll(cliArg("--require", npmProject.require("kotlin-test-js-runner/kotlin-test-nodejs-runner.js")))
if (debug) { if (debug) {
add(NO_TIMEOUT_ARG) add(NO_TIMEOUT_ARG)
} else { } else {
@@ -102,8 +100,9 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv
npmProject.require("source-map-support/register.js") npmProject.require("source-map-support/register.js")
).apply { ).apply {
add(mocha) add(mocha)
add(createAdapterJs(file, "kotlin-test-nodejs-empty-runner", ADAPTER_EMPTY_NODEJS).canonicalPath) add(file)
addAll(cliArgs.toList()) addAll(cliArgs.toList())
addAll(cliArg("--require", npmProject.require("kotlin-test-js-runner/kotlin-test-nodejs-empty-runner.js")))
addAll(cliArg("-n", "experimental-wasm-typed-funcref,experimental-wasm-gc,experimental-wasm-eh")) addAll(cliArg("-n", "experimental-wasm-typed-funcref,experimental-wasm-gc,experimental-wasm-eh"))
} }
@@ -122,28 +121,7 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv
return value?.let { listOf(cli, it) } ?: emptyList() return value?.let { listOf(cli, it) } ?: emptyList()
} }
private fun createAdapterJs(
file: String,
adapter: String,
adapterName: String
): File {
val adapterJs = npmProject.dir.resolve(adapterName)
adapterJs.printWriter().use { writer ->
val adapterFile = npmProject.require("kotlin-test-js-runner/$adapter.js")
val escapedFile = file.jsQuoted()
writer.println("require(${adapterFile.jsQuoted()})")
writer.println("module.exports = require($escapedFile)")
}
return adapterJs
}
companion object { companion object {
const val ADAPTER_NODEJS = "adapter-nodejs.js"
const val ADAPTER_EMPTY_NODEJS = "adapter-empty-nodejs.js"
private const val DEFAULT_TIMEOUT = "2s" private const val DEFAULT_TIMEOUT = "2s"
} }
} }
+10 -2
View File
@@ -13,10 +13,18 @@ const parser = new CliArgsParser(
throw new Error(`Exit with ${exitCode}`) throw new Error(`Exit with ${exitCode}`)
} }
); );
const untypedArgs = parser.parse(window.__karma__.config.args); const untypedArgs = parser.parse(window.__karma__.config.args);
const adapterTransformer: (current: KotlinTestRunner) => KotlinTestRunner = current => let adapterTransformer: (current: KotlinTestRunner) => KotlinTestRunner
runWithFilteringAndConsoleAdapters(current, untypedArgs); if (window.kotlinTest) {
const currentAdapterTransformer = window.kotlinTest.adapterTransformer;
adapterTransformer = current =>
runWithFilteringAndConsoleAdapters(currentAdapterTransformer(current), untypedArgs);
} else {
adapterTransformer = current =>
runWithFilteringAndConsoleAdapters(current, untypedArgs);
}
window.kotlinTest = { window.kotlinTest = {
adapterTransformer: adapterTransformer adapterTransformer: adapterTransformer
@@ -36,8 +36,6 @@ export function runWithTeamCityConsoleAdapter(
runner.suite(name, isIgnored, fn) runner.suite(name, isIgnored, fn)
}, },
test: function (name: string, isIgnored: boolean, fn: () => void) { test: function (name: string, isIgnored: boolean, fn: () => void) {
let revertLogMethods: CallableFunction[] = [];
runner.test(name, isIgnored, () => { runner.test(name, isIgnored, () => {
const log = (type: LogType) => function (message?: any, ...optionalParams: any[]) { const log = (type: LogType) => function (message?: any, ...optionalParams: any[]) {
let messageType: 'testStdOut' | 'testStdErr' let messageType: 'testStdOut' | 'testStdErr'
@@ -62,7 +60,7 @@ export function runWithTeamCityConsoleAdapter(
[method: string]: (message?: any, ...optionalParams: any[]) => void [method: string]: (message?: any, ...optionalParams: any[]) => void
}; };
revertLogMethods = logTypes const revertLogMethods = logTypes
.map(method => { .map(method => {
const realMethod = globalConsole[method]; const realMethod = globalConsole[method];
globalConsole[method] = log(method); globalConsole[method] = log(method);