[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',
//default layout
layout: { type: 'pattern', pattern: '%[%d{DATE}:%p [%c]: %]%m' }
layout: { type: 'pattern', pattern: '%[%d{DATETIME}:%p [%c]: %]%m' }
}
]
""".trimIndent()
@@ -241,6 +241,7 @@ class KotlinKarma(
}
private fun useWebpack() {
config.frameworks.add("webpack")
requiredDependencies.add(versions.karmaWebpack)
requiredDependencies.add(
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(
task: KotlinJsTest,
forkOptions: ProcessForkOptions,
@@ -381,9 +362,8 @@ class KotlinKarma(
): TCServiceMessagesTestExecutionSpec {
val file = task.inputFileProperty.get().asFile.toString()
val adapterJs = createAdapterJs(file, debug)
config.files.add(adapterJs.canonicalPath)
config.files.add(npmProject.require("kotlin-test-js-runner/kotlin-test-karma-runner.js"))
config.files.add(file)
if (debug) {
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.targets.js.RequiredKotlinJsDependency
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.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.KotlinTestRunnerCliArgs
import java.io.File
class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, private val basePath: String) :
KotlinJsTestFramework {
@@ -72,7 +70,6 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv
val file = task.inputFileProperty.get().asFile.toString()
val adapter = createAdapterJs(file, "kotlin-test-nodejs-runner", ADAPTER_NODEJS)
val args = mutableListOf(
"--require",
npmProject.require("source-map-support/register.js")
@@ -81,9 +78,10 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv
add("--inspect-brk")
}
add(mocha)
add(adapter.canonicalPath)
add(file)
addAll(cliArgs.toList())
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) {
add(NO_TIMEOUT_ARG)
} else {
@@ -102,8 +100,9 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv
npmProject.require("source-map-support/register.js")
).apply {
add(mocha)
add(createAdapterJs(file, "kotlin-test-nodejs-empty-runner", ADAPTER_EMPTY_NODEJS).canonicalPath)
add(file)
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"))
}
@@ -122,28 +121,7 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv
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 {
const val ADAPTER_NODEJS = "adapter-nodejs.js"
const val ADAPTER_EMPTY_NODEJS = "adapter-empty-nodejs.js"
private const val DEFAULT_TIMEOUT = "2s"
}
}
+10 -2
View File
@@ -13,10 +13,18 @@ const parser = new CliArgsParser(
throw new Error(`Exit with ${exitCode}`)
}
);
const untypedArgs = parser.parse(window.__karma__.config.args);
const adapterTransformer: (current: KotlinTestRunner) => KotlinTestRunner = current =>
runWithFilteringAndConsoleAdapters(current, untypedArgs);
let adapterTransformer: (current: KotlinTestRunner) => KotlinTestRunner
if (window.kotlinTest) {
const currentAdapterTransformer = window.kotlinTest.adapterTransformer;
adapterTransformer = current =>
runWithFilteringAndConsoleAdapters(currentAdapterTransformer(current), untypedArgs);
} else {
adapterTransformer = current =>
runWithFilteringAndConsoleAdapters(current, untypedArgs);
}
window.kotlinTest = {
adapterTransformer: adapterTransformer
@@ -36,8 +36,6 @@ export function runWithTeamCityConsoleAdapter(
runner.suite(name, isIgnored, fn)
},
test: function (name: string, isIgnored: boolean, fn: () => void) {
let revertLogMethods: CallableFunction[] = [];
runner.test(name, isIgnored, () => {
const log = (type: LogType) => function (message?: any, ...optionalParams: any[]) {
let messageType: 'testStdOut' | 'testStdErr'
@@ -62,7 +60,7 @@ export function runWithTeamCityConsoleAdapter(
[method: string]: (message?: any, ...optionalParams: any[]) => void
};
revertLogMethods = logTypes
const revertLogMethods = logTypes
.map(method => {
const realMethod = globalConsole[method];
globalConsole[method] = log(method);