From c3a0a4152465c7d220fe6fd7508359ba299ba740 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 8 Mar 2024 16:30:24 +0000 Subject: [PATCH] [Wasm] Use named imports in test-loader, runUnitTests generating into static dir KT-65777 --- .../gradle/targets/js/testing/KotlinWasmD8.kt | 26 +++++------- .../targets/js/testing/KotlinWasmNode.kt | 40 +++++++------------ .../targets/js/testing/karma/KotlinKarma.kt | 14 +++---- .../kotlin/gradle/targets/js/utils.kt | 12 ++++-- .../js/testing/karma/KotlinKarmaTest.kt | 14 +++---- 5 files changed, 48 insertions(+), 58 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt index f8d6b0fc458..78fbb431896 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt @@ -5,14 +5,11 @@ package org.jetbrains.kotlin.gradle.targets.js.testing -import org.gradle.api.Project import org.gradle.api.file.Directory -import org.gradle.api.file.DirectoryProperty import org.gradle.api.provider.Provider import org.gradle.process.ProcessForkOptions import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec -import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutor import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments import org.jetbrains.kotlin.gradle.targets.js.d8.D8RootPlugin @@ -21,21 +18,19 @@ import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.writeWasmUnitTestRunner import org.jetbrains.kotlin.gradle.utils.getValue -import java.nio.file.Path -internal class KotlinWasmD8(private val kotlinJsTest: KotlinJsTest) : KotlinJsTestFramework { +internal class KotlinWasmD8(kotlinJsTest: KotlinJsTest) : KotlinJsTestFramework { override val settingsState: String = "KotlinWasmD8" + + private val testPath = kotlinJsTest.path + @Transient override val compilation: KotlinJsIrCompilation = kotlinJsTest.compilation - @Transient - private val project: Project = compilation.target.project - private val d8 = D8RootPlugin.apply(project.rootProject) - private val d8Executable by project.provider { d8.requireConfigured().executable } - private val npmProjectDir by project.provider { compilation.npmProject.dir } + private val d8 = D8RootPlugin.apply(kotlinJsTest.project.rootProject) + private val d8Executable by kotlinJsTest.project.provider { d8.requireConfigured().executable } - override val workingDir: Provider - get() = npmProjectDir + override val workingDir: Provider = compilation.npmProject.dir override fun createTestExecutionSpec( task: KotlinJsTest, @@ -43,10 +38,11 @@ internal class KotlinWasmD8(private val kotlinJsTest: KotlinJsTest) : KotlinJsTe nodeJsArgs: MutableList, debug: Boolean ): TCServiceMessagesTestExecutionSpec { - val testRunnerFile = writeWasmUnitTestRunner(task.inputFileProperty.get().asFile) + val compiledFile = task.inputFileProperty.get().asFile + val testRunnerFile = writeWasmUnitTestRunner(workingDir.get().asFile, compiledFile) forkOptions.executable = d8Executable - forkOptions.workingDir = testRunnerFile.parentFile + forkOptions.workingDir = compiledFile.parentFile val clientSettings = TCServiceMessagesClientSettings( task.name, @@ -80,5 +76,5 @@ internal class KotlinWasmD8(private val kotlinJsTest: KotlinJsTest) : KotlinJsTe override val requiredNpmDependencies: Set = emptySet() - override fun getPath(): String = "${kotlinJsTest.path}:kotlinTestFrameworkStub" + override fun getPath(): String = "$testPath:kotlinTestFrameworkStub" } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt index 789a2294087..9e3ca52f32f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt @@ -5,13 +5,11 @@ package org.jetbrains.kotlin.gradle.targets.js.testing -import org.gradle.api.Project import org.gradle.api.file.Directory import org.gradle.api.provider.Provider import org.gradle.process.ProcessForkOptions import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec -import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutor import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments @@ -20,41 +18,33 @@ import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.writeWasmUnitTestRunner -import org.jetbrains.kotlin.gradle.utils.getValue -import org.jetbrains.kotlin.gradle.utils.providerWithLazyConvention -import java.nio.file.Path -internal class KotlinWasmNode(private val kotlinJsTest: KotlinJsTest) : KotlinJsTestFramework { +internal class KotlinWasmNode(kotlinJsTest: KotlinJsTest) : KotlinJsTestFramework { override val settingsState: String = "KotlinWasmNode" + + private val testPath = kotlinJsTest.path + @Transient override val compilation: KotlinJsIrCompilation = kotlinJsTest.compilation - @Transient - private val target: KotlinJsIrTarget = compilation.target as KotlinJsIrTarget + private val projectLayout = kotlinJsTest.project.layout - @Transient - private val project: Project = target.project - - private val projectLayout = project.layout - - private val npmProjectDir by project.provider { compilation.npmProject.dir } - - private val wasmTargetType: KotlinWasmTargetType? = target.wasmTargetType - - override val workingDir: Provider - get() = if (wasmTargetType != KotlinWasmTargetType.WASI) { - npmProjectDir - } else { - projectLayout.dir(kotlinJsTest.inputFileProperty.asFile.map { it.parentFile }) + override val workingDir: Provider = + (compilation.target as KotlinJsIrTarget).wasmTargetType.let { wasmTargetType -> + if (wasmTargetType != KotlinWasmTargetType.WASI) { + compilation.npmProject.dir + } else { + projectLayout.dir(kotlinJsTest.inputFileProperty.asFile.map { it.parentFile }) + } } override fun createTestExecutionSpec( task: KotlinJsTest, forkOptions: ProcessForkOptions, nodeJsArgs: MutableList, - debug: Boolean + debug: Boolean, ): TCServiceMessagesTestExecutionSpec { - val testRunnerFile = writeWasmUnitTestRunner(task.inputFileProperty.get().asFile) + val testRunnerFile = writeWasmUnitTestRunner(workingDir.get().asFile.parentFile, task.inputFileProperty.get().asFile) val clientSettings = TCServiceMessagesClientSettings( task.name, @@ -87,5 +77,5 @@ internal class KotlinWasmNode(private val kotlinJsTest: KotlinJsTest) : KotlinJs override val requiredNpmDependencies: Set = emptySet() - override fun getPath(): String = "${kotlinJsTest.path}:kotlinTestFrameworkStub" + override fun getPath(): String = "$testPath:kotlinTestFrameworkStub" } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt index 89ac12e2717..c67d24f950d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt @@ -624,13 +624,13 @@ internal fun createLoadWasm(npmProjectDir: File, file: File): File { val relativePath = file.relativeTo(static).invariantSeparatorsPath writer.println( """ - import( /* webpackMode: "eager" */ "$relativePath") - .then((exports) => { - exports.default.startUnitTests(); - window.__karma__.loaded(); - }, (reason) => { - window.__karma__.error("Problem with loading", void 0, void 0, void 0, reason) - }) + import { startUnitTests } from "$relativePath" + try { + startUnitTests() + window.__karma__.loaded(); + } catch (e) { + window.__karma__.error("Problem with loading", void 0, void 0, void 0, e) + } """.trimIndent() ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/utils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/utils.kt index 56246c82ba5..c196897b931 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/utils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/utils.kt @@ -65,12 +65,16 @@ const val JS_MAP = "js.map" const val META_JS = "meta.js" const val HTML = "html" -internal fun writeWasmUnitTestRunner(compiledFile: File): File { - val testRunnerFile = compiledFile.parentFile.resolve("runUnitTests.mjs") +internal fun writeWasmUnitTestRunner(workingDir: File, compiledFile: File): File { + val static = workingDir.resolve("static").also { + it.mkdirs() + } + + val testRunnerFile = static.resolve("runUnitTests.mjs") testRunnerFile.writeText( """ - import { startUnitTests } from './${compiledFile.name}'; - startUnitTests?.(); + import { startUnitTests } from './${compiledFile.relativeTo(static).invariantSeparatorsPath}'; + startUnitTests(); """.trimIndent() ) return testRunnerFile diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarmaTest.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarmaTest.kt index 9b670638caa..611ab75b1ab 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarmaTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarmaTest.kt @@ -24,13 +24,13 @@ class KotlinKarmaTest { assertEquals( """ - import( /* webpackMode: "eager" */ "../kotlin/main.mjs") - .then((exports) => { - exports.default.startUnitTests(); - window.__karma__.loaded(); - }, (reason) => { - window.__karma__.error("Problem with loading", void 0, void 0, void 0, reason) - }) + import { startUnitTests } from "../kotlin/main.mjs" + try { + startUnitTests() + window.__karma__.loaded(); + } catch (e) { + window.__karma__.error("Problem with loading", void 0, void 0, void 0, e) + } """.trimIndent(), loadWasm.readText().trimIndent() )