Skip to content

Commit

Permalink
Make sure the web app distribution doesn't contain a duplicate skiko.…
Browse files Browse the repository at this point in the history
…wasm (#4958)

https://youtrack.jetbrains.com/issue/CMP-1114

**Testing:**
- changed an existing test to test where added a new check for the
content of the app distribution
  • Loading branch information
eymar committed Jun 20, 2024
1 parent 67da8d1 commit 53bf4df
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,11 @@ import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.gradle.api.provider.Provider
import org.jetbrains.compose.ComposeBuildConfig
import org.jetbrains.compose.ComposeExtension
import org.jetbrains.compose.web.tasks.UnpackSkikoWasmRuntimeTask
import org.jetbrains.compose.internal.utils.*
import org.jetbrains.compose.internal.utils.detachedComposeDependency
import org.jetbrains.compose.internal.utils.registerTask
import org.jetbrains.compose.internal.utils.uppercaseFirstChar
import org.jetbrains.compose.web.WebExtension
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.compose.web.tasks.UnpackSkikoWasmRuntimeTask
import org.jetbrains.kotlin.gradle.tasks.IncrementalSyncTask

internal fun Project.configureWeb(
composeExt: ComposeExtension,
Expand Down Expand Up @@ -48,11 +47,12 @@ internal fun Project.configureWeb(
}

// configure only if there is k/wasm or k/js target:
webExt.targetsToConfigure(project)
.configureWebApplication(project, shouldRunUnpackSkiko)
if (webExt.targetsToConfigure(project).isNotEmpty()) {
configureWebApplication(project, shouldRunUnpackSkiko)
}
}

internal fun Collection<KotlinJsIrTarget>.configureWebApplication(
internal fun configureWebApplication(
project: Project,
shouldRunUnpackSkiko: Provider<Boolean>
) {
Expand All @@ -63,28 +63,22 @@ internal fun Collection<KotlinJsIrTarget>.configureWebApplication(
skikoJsWasmRuntimeConfiguration.defaultDependencies {
it.addLater(skikoJsWasmRuntimeDependency)
}
forEach {
val mainCompilation = it.compilations.getByName("main")
val testCompilation = it.compilations.getByName("test")
val unpackedRuntimeDir = project.layout.buildDirectory.dir("compose/skiko-wasm/${it.targetName}")
val taskName = "unpackSkikoWasmRuntime${it.targetName.uppercaseFirstChar()}"
mainCompilation.defaultSourceSet.resources.srcDir(unpackedRuntimeDir)
testCompilation.defaultSourceSet.resources.srcDir(unpackedRuntimeDir)

val unpackRuntime = project.registerTask<UnpackSkikoWasmRuntimeTask>(taskName) {
onlyIf {
shouldRunUnpackSkiko.get()
}

skikoRuntimeFiles = skikoJsWasmRuntimeConfiguration
outputDir.set(unpackedRuntimeDir)
}
project.tasks.named(mainCompilation.processResourcesTaskName).configure { processResourcesTask ->
processResourcesTask.dependsOn(unpackRuntime)
}
project.tasks.named(testCompilation.processResourcesTaskName).configure { processResourcesTask ->
processResourcesTask.dependsOn(unpackRuntime)
val unpackedRuntimeDir = project.layout.buildDirectory.dir("compose/skiko-wasm")
val taskName = "unpackSkikoWasmRuntime"

val unpackRuntime = project.registerTask<UnpackSkikoWasmRuntimeTask>(taskName) {
onlyIf {
shouldRunUnpackSkiko.get()
}

skikoRuntimeFiles = skikoJsWasmRuntimeConfiguration
outputDir.set(unpackedRuntimeDir)
}

project.tasks.withType(IncrementalSyncTask::class.java) {
it.dependsOn(unpackRuntime)
it.from.from(unpackedRuntimeDir)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@

package org.jetbrains.compose.test.tests.integration

import org.gradle.internal.impldep.junit.framework.TestCase.assertEquals
import org.gradle.internal.impldep.junit.framework.TestCase.assertTrue
import org.gradle.util.GradleVersion
import org.jetbrains.compose.desktop.ui.tooling.preview.rpc.PreviewLogger
import org.jetbrains.compose.desktop.ui.tooling.preview.rpc.RemoteConnection
import org.jetbrains.compose.desktop.ui.tooling.preview.rpc.receiveConfigFromGradle
import org.jetbrains.compose.test.utils.GradlePluginTestBase
import org.jetbrains.compose.test.utils.TestProjects
import org.jetbrains.compose.test.utils.TestProperties
import org.jetbrains.compose.test.utils.*
import org.jetbrains.compose.test.utils.checks
import org.junit.jupiter.api.Assumptions
import org.junit.jupiter.api.Test
Expand All @@ -21,11 +21,16 @@ import java.net.SocketTimeoutException
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger
import kotlin.concurrent.thread
import kotlin.test.assertFalse

class GradlePluginTest : GradlePluginTestBase() {
@Test
fun skikoWasm() = with(
testProject(TestProjects.skikoWasm)
testProject(
TestProjects.skikoWasm,
// TODO: enable the configuration cache after moving all test projects to kotlin 2.0 or newer
defaultTestEnvironment.copy(useGradleConfigurationCache = false)
)
) {
fun jsCanvasEnabled(value: Boolean) {
modifyGradleProperties { put("org.jetbrains.compose.experimental.jscanvas.enabled", value.toString()) }
Expand All @@ -39,8 +44,22 @@ class GradlePluginTest : GradlePluginTestBase() {

jsCanvasEnabled(true)
gradle(":build").checks {
check.taskSuccessful(":unpackSkikoWasmRuntimeJs")
check.taskSuccessful(":unpackSkikoWasmRuntime")
check.taskSuccessful(":compileKotlinJs")
check.taskSuccessful(":compileKotlinWasmJs")
check.taskSuccessful(":wasmJsBrowserDistribution")

file("./build/dist/wasmJs/productionExecutable").apply {
checkExists()
assertTrue(isDirectory)
val distributionFiles = listFiles()!!.map { it.name }.toList()
assertFalse(
distributionFiles.contains("skiko.wasm"),
"skiko.wasm is probably a duplicate"
)
// one file is the app wasm file and another one is skiko wasm file with a mangled name
assertEquals(2, distributionFiles.filter { it.endsWith(".wasm") }.size)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ kotlin {
browser()
binaries.executable()
}
wasm {
browser()
binaries.executable()
}
sourceSets {
commonMain {
dependencies {
Expand All @@ -22,10 +26,6 @@ kotlin {
}
}

compose.experimental {
web.application {}
}

// test for https://github.com/JetBrains/compose-multiplatform/issues/3169
afterEvaluate {
afterEvaluate {
Expand Down

0 comments on commit 53bf4df

Please sign in to comment.