Skip to content

Commit 9d8f125

Browse files
committed
🩹 [Hooks]: Configure karma ChromeHeadlessNoSandbox for wasmJs browser tests
Plain ChromeHeadless fails to launch in headless/CI shells. The built-in useChromeHeadlessNoSandbox() launcher adds --no-sandbox and --disable-dev-shm-usage so wasmJs browser tests run reliably. Verified end-to-end: ./gradlew :hooks:wasmJsBrowserTest -> BUILD SUCCESSFUL, 201 tests, 0 failures, 0 ignored in real headless Chrome (karma+webpack). Includes WasmJsSmokeTest (4) + inherited commonTest (197: Fetch/Redux/ Debounce/Form/Table). V5 now fully validated — not partial.
1 parent 705984a commit 9d8f125

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

docs/superpowers/specs/2026-06-29-wasmjs-variant-design.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ UI 行为测试(需 Compose runtime)放 wasmJsTest 的 `compose.uiTest` 变
282282
| V2 publishToMavenLocal 成功含 wasmJs klib | ✅ | `hooks2-wasm-js-2.4.0-beta-1.klib`(963KB)发布到本地 Maven |
283283
| V3 .module 含 wasmJs variant | ✅ | `.module` 含 `wasmJsRuntimeElements-published` |
284284
| V4 核心 hooks wasmJs 编译通过 | ✅ | `:hooks:compileKotlinWasmJs` BUILD SUCCESSFUL |
285-
| V5 核心 hooks wasmJs 功能正确 | ⚠️ 部分 | wasmJsTest 编译通过;karma 浏览器运行链路(Node+Yarn+webpack+karma)在本环境可启动但 headless 浏览器执行受限于环境(超时)。核心纯逻辑已由 commonTest(在 JVM 上 `testDebugUnitTest` 通过)覆盖,wasmJs 专属冒烟测试编译验证通过 |
285+
| V5 核心 hooks wasmJs 功能正确 | ✅ 完整 | **`wasmJsBrowserTest` 全绿:201 tests, 0 failures, 0 ignored**(含 `WasmJsSmokeTest` 4 项:createStore/reducer/combineStores/middleware,验证 KClassMap 键在 wasmJs 运行时可用;以及继承自 commonTestFetch/Redux/Debounce/Form 等全部 197 项)。在 headless Chrome(`useChromeHeadlessNoSandbox`)中通过 karma+webpack 端到端执行 |
286286
| V6 §3.2 hooks 状态标注 | ✅ | 见 §6.3 |
287287
| V7 下游 Palette 验证 | ⏳ 待下游 | 需 Palette 仓库侧执行 |
288288

@@ -293,3 +293,12 @@ UI 行为测试(需 Compose runtime)放 wasmJsTest 的 `compose.uiTest` 变
293293
### 10.4 一个未预见的问题:settings.gradle.kts 的 repositoriesMode
294294

295295
实施中发现 `FAIL_ON_PROJECT_REPOS`(及 `PREFER_SETTINGS`)会阻止 Kotlin Gradle 插件为 wasmJs 注入 Node.js(`nodejs.org/dist`)和 Yarn(`github.com/yarnpkg/yarn/releases`)的 Ivy 仓库,导致 `wasmJsTest` 无法下载运行时。修复为移除 `repositoriesMode`(settings 仓库仍是主源,项目仓库仅用于这些 toolchain)。这是需求文档未预见的、wasmJs 测试执行的必要改动。
296+
297+
### 10.5 浏览器测试的完整端到端验证(2026-06-29 补充)
298+
299+
V5**完整验证**,非"部分"
300+
301+
- **关键配置**:`wasmJs { browser { testTask { useKarma { useChromeHeadlessNoSandbox() } } } }`。普通 `ChromeHeadless` 在无头/CI 环境无法启动(无 sandbox),`useChromeHeadlessNoSandbox()` 是 KMP 内置的 launcher,自动加 `--no-sandbox` / `--disable-dev-shm-usage`。
302+
- **环境前置**:karma tooling 的 npm 依赖(webpack/karma/mocha 等 376 包,含 git 依赖 `karma: Kotlin/karma#6.4.5`)首次安装较慢(~3min),需在网络可用环境执行一次 `kotlinWasmToolingSetup`。
303+
- **结果**:`./gradlew :hooks:wasmJsBrowserTest` → **BUILD SUCCESSFUL201 tests, 0 failures, 0 ignored**,在真实 headless Chrome 中经 karma+webpack 端到端执行。
304+
- **验证范围**:继承自 commonTest 的 197 项(Fetch/Redux/Debounce/Form/Table 等)+ wasmJs 专属 `WasmJsSmokeTest` 4 项。证明 §3.1 核心 hooks 在 wasm 运行时功能正确。

hooks/build.gradle.kts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,20 @@ kotlin {
4444
// wasmJs depends directly on commonMain (NOT commonJvmAndroid), so the
4545
// JVM-only reflection helpers (asNoopFn/asSuspendNoopFn/checkIsLegalParameters)
4646
// are not part of this target by design.
47-
wasmJs { browser() }
47+
wasmJs {
48+
browser {
49+
testTask {
50+
useKarma {
51+
// Plain ChromeHeadless fails to launch in headless / CI
52+
// shells (no sandbox). useChromeHeadlessNoSandbox is the
53+
// built-in launcher that adds --no-sandbox /
54+
// --disable-dev-shm-usage so wasmJs browser tests run
55+
// reliably in non-interactive environments.
56+
useChromeHeadlessNoSandbox()
57+
}
58+
}
59+
}
60+
}
4861

4962
listOf(
5063
iosArm64(),

0 commit comments

Comments
 (0)