Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:

env:
CARGO_TERM_COLOR: always

jobs:
test_wasm32:
name: wasm32
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
# llvm-mc used
- name: Install LLVM
uses: KyleMayes/install-llvm-action@v2
with:
# rustc 1.93.0
version: "21.1.8"
- name: Test js-sys
working-directory: client
run: cargo test -p js-sys --target wasm32-unknown-unknown
- name: Test web-sys
working-directory: client
run: cargo test -p web-sys --target wasm32-unknown-unknown

test_wasm64:
name: wasm64
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@nightly
with:
components: rust-src
# llvm-mc used
- name: Install LLVM
uses: KyleMayes/install-llvm-action@v2
with:
# rustc 1.93.0
version: "21.1.8"
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 25
- name: Test js-sys
working-directory: client
run: cargo +nightly test -p js-sys --target wasm64-unknown-unknown -Zbuild-std=panic_abort,std
- name: Test web-sys
working-directory: client
run: cargo +nightly test -p web-sys --target wasm64-unknown-unknown -Zbuild-std=panic_abort,std

93 changes: 88 additions & 5 deletions TEST.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,100 @@
Manual testing commands until CI is set up:
Manual testing commands (CI not set up yet).

Quick build (from repo root):

```sh
cd client
cargo build --example basic
cargo build --example basic --release --timings
```

Test examples:

```rust
#[js_bindgen_test::test]
fn test_wasm() {}

#[js_bindgen_test::test]
#[ignore = "hah, it works"]
fn test_ignore() {
panic!("kaboom");
}

#[js_bindgen_test::test]
#[should_panic(expected = "kaboom")]
fn test_should_panic() {
panic!("kaboom");
}
```

Wasm tests: Node runner (default):

```sh
cargo test --target wasm32-unknown-unknown
```

Wasm tests: Browser runner (Playwright headless):

```sh
JBTEST_BROWSER=chromium cargo test --target wasm32-unknown-unknown
```

Wasm tests: Browser server mode (open URL in a browser):

```sh
cargo build --example basic --release --timings && wasm-tools print -o examples/basic.wat target/wasm32-unknown-unknown/release/examples/basic.wasm && wasm-tools validate examples/basic.wat
JBTEST_SERVER=1 cargo test --target wasm32-unknown-unknown
```

Runner options:

- `JBTEST_BROWSER=chromium|firefox|webkit`
- `JBTEST_WORKER=dedicated|shared|service`
- `JBTEST_SERVER=1` (serve browser runner and print URL)
- `JBTEST_SERVER_ADDRESS=127.0.0.1:8000` (defaults to 8000; falls back to a random port if busy)

List and filter tests:

```sh
cargo test --target wasm32-unknown-unknown -- --list
cargo test --target wasm32-unknown-unknown -- --list --format terse
cargo test --target wasm32-unknown-unknown -- some_substring
cargo test --target wasm32-unknown-unknown -- --exact full::test::name
cargo test --target wasm32-unknown-unknown -- --ignored
```

Other test flags:

```sh
cargo test --target wasm32-unknown-unknown -- --nocapture
```

Wasm tooling checks:

```sh
CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS="-Ctarget-feature=+atomics -Clink-arg=--shared-memory -Clink-arg=--max-memory=4294967296" cargo +nightly build --example basic -Zbuild-std=panic_abort,std --release --timings && wasm-tools print -o examples/basic.wat target/wasm32-unknown-unknown/release/examples/basic.wasm && wasm-tools validate examples/basic.wat
cd client
wasm-tools print -o examples/basic.wat target/wasm32-unknown-unknown/debug/examples/basic.wasm
wasm-tools validate examples/basic.wat
```

Shared-memory build (nightly):

```sh
cargo +nightly build --example basic --target wasm64-unknown-unknown -Zbuild-std=panic_abort,std --release --timings && wasm-tools print -o examples/basic.wat target/wasm64-unknown-unknown/release/examples/basic.wasm && wasm-tools validate examples/basic.wat
cd client
CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS="-Ctarget-feature=+atomics -Clink-arg=--shared-memory -Clink-arg=--max-memory=4294967296" \
cargo +nightly build --example basic -Zbuild-std=panic_abort,std --release --timings
```

Wasm64 builds (nightly):

```sh
CARGO_TARGET_WASM64_UNKNOWN_UNKNOWN_RUSTFLAGS="-Ctarget-feature=+atomics -Clink-arg=--shared-memory -Clink-arg=--max-memory=17179869184" cargo +nightly build --example basic --target wasm64-unknown-unknown -Zbuild-std=panic_abort,std --release --timings && wasm-tools print -o examples/basic.wat target/wasm64-unknown-unknown/release/examples/basic.wasm && wasm-tools validate examples/basic.wat
cd client
cargo +nightly build --example basic --target wasm64-unknown-unknown -Zbuild-std=panic_abort,std --release --timings
```

```sh
cd client
CARGO_TARGET_WASM64_UNKNOWN_UNKNOWN_RUSTFLAGS="-Ctarget-feature=+atomics -Clink-arg=--shared-memory -Clink-arg=--max-memory=17179869184" \
cargo +nightly build --example basic --target wasm64-unknown-unknown -Zbuild-std=panic_abort,std --release --timings
```


1 change: 1 addition & 0 deletions client/.cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ target = "wasm32-unknown-unknown"

[target.'cfg(all(target_family = "wasm", any(target_os = "none", target_os = "unknown")))']
linker = "../linker-shim/linker"
runner = "../linker-shim/test-runner"
4 changes: 3 additions & 1 deletion client/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[workspace]
members = ["js-sys", "web-sys"]
members = ["js-bindgen-test", "js-sys", "web-sys"]
resolver = "2"

[workspace.package]
Expand All @@ -8,6 +8,8 @@ rust-version = "1.85"

[workspace.dependencies]
js-bindgen = { path = "../host/js-bindgen" }
js-bindgen-test = { path = "js-bindgen-test" }
js-bindgen-test-macro = { path = "../host/js-bindgen-test-macro" }
js-sys = { path = "js-sys" }
js-sys-macro = { path = "../host/js-sys-macro" }
mini-alloc = "1"
Expand Down
12 changes: 12 additions & 0 deletions client/js-bindgen-test/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[package]
edition.workspace = true
name = "js-bindgen-test"
rust-version.workspace = true
version = "0.1.0"

[dependencies]
js-bindgen-test-macro = { workspace = true }
js-sys = { workspace = true }

[lints]
workspace = true
57 changes: 57 additions & 0 deletions client/js-bindgen-test/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
pub use js_bindgen_test_macro::test;
use js_sys::JsString;
use std::{cell::RefCell, panic::PanicHookInfo};

struct LastPanic {
payload: Option<String>,
info: Option<String>,
}

thread_local! {
static LAST_PANIC: RefCell<LastPanic> = const { RefCell::new(LastPanic {
payload: None,
info: None
}) };
}

pub fn set_panic_hook() {
// TODO: Bump rustc to 1.91.0 and remove this func
fn payload_as_str<'a>(info: &'a PanicHookInfo) -> Option<&'a str> {
if let Some(s) = info.payload().downcast_ref::<&str>() {
Some(s)
} else if let Some(s) = info.payload().downcast_ref::<String>() {
Some(s)
} else {
None
}
}

static HOOK: std::sync::Once = std::sync::Once::new();

HOOK.call_once(|| {
std::panic::set_hook(Box::new(|info| {
LAST_PANIC.with(|cell| {
*cell.borrow_mut() = LastPanic {
payload: payload_as_str(info).map(|s| s.to_owned()),
info: Some(info.to_string()),
}
});
}));
});
}

#[unsafe(no_mangle)]
pub extern "C" fn last_panic_message() -> JsString {
match LAST_PANIC.with(|cell| cell.borrow_mut().info.take()) {
Some(info) => JsString::from_str(&info),
None => JsString::from_str(""),
}
}

#[unsafe(no_mangle)]
pub extern "C" fn last_panic_payload() -> JsString {
match LAST_PANIC.with(|cell| cell.borrow_mut().payload.take()) {
Some(payload) => JsString::from_str(&payload),
None => JsString::from_str(""),
}
}
3 changes: 3 additions & 0 deletions client/web-sys/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@ rust-version = { workspace = true }

[dependencies]
js-sys = { workspace = true }

[dev-dependencies]
js-bindgen-test = { workspace = true }
25 changes: 25 additions & 0 deletions client/web-sys/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,28 @@ pub mod console {
pub fn log2(data1: &JsValue, data2: &JsValue);
}
}

#[cfg(test)]
mod tests {
use super::console;
use js_bindgen_test::test;
use js_sys::JsString;

#[test]
fn test_console_log() {
let value = JsString::from_str("hello world");
console::log(&value);
}

#[test]
#[ignore = "hah, it works"]
fn test_ignore() {
panic!("kaboom");
}

#[test]
#[should_panic(expected = "kaboom")]
fn test_should_panic() {
panic!("kaboom");
}
}
12 changes: 11 additions & 1 deletion host/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
[workspace]
members = ["js-bindgen", "js-sys-macro", "ld", "ld-shared", "macro-shared", "wasm-ld-opt"]
members = [
"js-bindgen",
"js-sys-macro",
"js-bindgen-test-macro",
"js-bindgen-test-runner",
"ld",
"ld-shared",
"macro-shared",
"wasm-ld-opt",
]
resolver = "2"

[workspace.package]
Expand All @@ -20,6 +29,7 @@ prettyplease = "0.2"
proc-macro2 = { version = "1", default-features = false }
quote = { version = "1", default-features = false }
rand = { version = "0.9", default-features = false, features = ["thread_rng"] }
serde = { version = "1", default-features = false }
serde_json = { version = "1", default-features = false, features = ["alloc"] }
similar-asserts = { version = "1", default-features = false }
syn = { version = "2", default-features = false, features = ["parsing", "printing"] }
Expand Down
14 changes: 14 additions & 0 deletions host/js-bindgen-test-macro/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[package]
edition.workspace = true
name = "js-bindgen-test-macro"
rust-version.workspace = true
version = "0.1.0"

[lib]
proc-macro = true

[dependencies]
js-bindgen-macro-shared = { workspace = true }

[lints]
workspace = true
Loading