name: Test
on:
workflow_call:
env:
CARGO_TERM_COLOR: always
jobs:
native:
name: Native (${{ matrix.name }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: Linux
os: ubuntu-latest
features: "--all-features"
targets: "--all-targets"
- name: macOS
os: macos-latest
features: "--all-features"
targets: "--all-targets"
- name: Windows
os: windows-latest
features: "--all-features"
targets: "--all-targets"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
with:
shared-key: ci-${{ matrix.os }}
- name: Run clippy
run: cargo clippy --workspace ${{ matrix.targets }} ${{ matrix.features }} -- -D warnings
- name: Run tests
run: cargo test --workspace ${{ matrix.targets }} ${{ matrix.features }}
wasm-build:
name: WASM Build Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
with:
shared-key: ci-wasm
- name: Check WASM build (minimal)
run: cargo check -p skyzen --target wasm32-unknown-unknown --no-default-features --features json
- name: Check WASM build (with ws)
run: cargo check -p skyzen --target wasm32-unknown-unknown --no-default-features --features json,ws
wasm-workerd:
name: WASM (workerd)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
with:
shared-key: ci-wasm
- name: Install wasm-bindgen CLI
run: |
WASM_BINDGEN_VERSION="$(cargo tree -p skyzen --target wasm32-unknown-unknown --no-default-features --features json,form \
| grep -m1 "wasm-bindgen v" \
| sed -E 's/.*wasm-bindgen v([0-9.]+).*/\1/')"
echo "Installing wasm-bindgen-cli ${WASM_BINDGEN_VERSION}"
cargo install wasm-bindgen-cli --version "${WASM_BINDGEN_VERSION}"
- name: Build worker example
run: cargo build -p skyzen --example worker --release --target wasm32-unknown-unknown --no-default-features --features json,form
- name: Generate bindings
run: |
wasm-bindgen --target web --out-dir target/workerd target/wasm32-unknown-unknown/release/examples/worker.wasm
cp ci/workerd/worker.mjs target/workerd/worker.mjs
cp ci/workerd/wrangler.toml target/workerd/wrangler.toml
- name: Install Wrangler
run: npm install -g wrangler
- name: Launch wrangler dev
run: |
cd target/workerd
mkdir -p .home .wrangler/logs .wrangler-config
HOME=$PWD/.home \
WRANGLER_LOG_DIR=$PWD/.wrangler/logs \
XDG_CONFIG_HOME=$PWD/.wrangler-config \
wrangler dev --local --ip 127.0.0.1 --port 8787 --inspector-port 0 --config wrangler.toml > wrangler.log 2>&1 &
echo $! > ../../wrangler.pid
sleep 5
- name: Exercise worker
run: |
curl --retry 5 --retry-connrefused --retry-delay 1 -sSf http://127.0.0.1:8787/health | grep OK
curl --retry 5 --retry-connrefused --retry-delay 1 -sSf http://127.0.0.1:8787/hello/Skyzen | grep "Hello, Skyzen!"
# Exercises `WorkerContext::wait_until` against the real runtime: the handler hands a
# future to `ctx.waitUntil`, which throws if the execution context was not threaded in.
curl --retry 5 --retry-connrefused --retry-delay 1 -sSf http://127.0.0.1:8787/track | grep accepted
# Exercises the `CfProperties` extractor against a real `request.cf`. Miniflare — what
# `wrangler dev --local` runs — documents the `cf` option as supplying "an object with
# default placeholder values" when it is left unset, so the object is there and the
# route must answer 200; a 500 is what an absent or undecodable `cf` looks like, since
# the extractor refuses to invent edge metadata. The placeholder's individual field
# values are the one thing the docs do not pin down, so the assertion stops at the
# shape and the body is echoed for whoever reads the log.
cf=$(curl --retry 5 --retry-connrefused --retry-delay 1 -sSf http://127.0.0.1:8787/where-am-i)
echo "request.cf decoded as: $cf"
echo "$cf" | grep -q '^colo='
- name: Shutdown wrangler
if: always()
run: |
if [ -f wrangler.pid ]; then
kill $(cat wrangler.pid) || true
fi
if [ -f target/workerd/wrangler.log ]; then
echo "--- wrangler log ---"
tail -n 100 target/workerd/wrangler.log
fi