From 36d9001d54e0bda0f9ffd217c9e62197bad722ad Mon Sep 17 00:00:00 2001 From: Igor Laevsky Date: Thu, 28 Oct 2021 15:41:09 +0300 Subject: [PATCH] [Wasm] Teach gradle plugin to run wasm unit tests for nodejs and Mocha --- .../gradle/targets/js/ir/KotlinBrowserJsIr.kt | 15 +++++++++++++++ .../gradle/targets/js/ir/KotlinJsIrSubTarget.kt | 4 ++++ .../kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt | 15 +++++++++++++++ .../targets/js/testing/mocha/KotlinMocha.kt | 4 ++++ 4 files changed, 38 insertions(+) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt index 18dffa2bda0..86ab7a022f0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt @@ -10,6 +10,7 @@ import org.gradle.api.provider.Provider import org.gradle.api.tasks.Copy import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDceDsl @@ -269,6 +270,20 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : KotlinJsBinaryMode.DEVELOPMENT -> debugValue } + override fun addLinkOptions(compilation: KotlinJsIrCompilation) { + if (compilation.platformType != KotlinPlatformType.wasm) + return + + // Wasm requires different kinds of launchers for browser and nodejs. This might change in the future. + compilation.binaries + .withType(JsIrBinary::class.java) + .all { + it.linkTask.configure { linkTask -> + linkTask.kotlinOptions.freeCompilerArgs += "-Xwasm-launcher=esm" + } + } + } + companion object { private const val WEBPACK_TASK_NAME = "webpack" } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt index c2e1da4009d..3ed8e882e65 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt @@ -107,6 +107,8 @@ abstract class KotlinJsIrSubTarget( } } + abstract fun addLinkOptions(compilation: KotlinJsIrCompilation) + private fun configureTestsRun(testRun: KotlinJsPlatformTestRun, compilation: KotlinJsIrCompilation) { fun KotlinJsPlatformTestRun.subtargetTestTaskName(): String = disambiguateCamelCased( lowerCamelCaseName( @@ -115,6 +117,8 @@ abstract class KotlinJsIrSubTarget( ) ) + addLinkOptions(compilation) + val testJs = project.registerTask( testRun.subtargetTestTaskName(), listOf(compilation) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt index 67354e21e6d..366c6eb3c56 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.language.base.plugins.LifecycleBasePlugin +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec @@ -100,4 +101,18 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : configureRun(binary) } } + + override fun addLinkOptions(compilation: KotlinJsIrCompilation) { + if (compilation.platformType != KotlinPlatformType.wasm) + return + + // Wasm requires different kinds of launchers for browser and nodejs. This might change in the future. + compilation.binaries + .withType(JsIrBinary::class.java) + .all { + it.linkTask.configure { linkTask -> + linkTask.kotlinOptions.freeCompilerArgs += "-Xwasm-launcher=nodejs" + } + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt index afddea953eb..57a626ccb29 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt @@ -10,6 +10,7 @@ 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.Companion.TC_PROJECT_PROPERTY +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 @@ -94,6 +95,9 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv } else { addAll(cliArg(TIMEOUT_ARG, timeout)) } + if (compilation.platformType == KotlinPlatformType.wasm) { + addAll(cliArg("-n", "experimental-wasm-typed-funcref,experimental-wasm-gc,experimental-wasm-eh")) + } } return TCServiceMessagesTestExecutionSpec(