#!/usr/bin/env bash # Load the viewer page in headless Chromium and check what it renders. # # browser.sh FIXTURE_DIR # # FIXTURE_DIR holds fixture.h5 from make_fixture.py (and big.h5 when it was # run with WASM_BIG_MB); ../pkg must be built. test/serve.py serves the # page and, under /fix, the fixtures, with HTTP range requests (no copies, # no links). The page is opened with ?file=fix/&path=, which # opens the file with openUrl (range requests), builds the tree down to # and shows it; the rendered DOM is dumped and checked for the # values libhdf5 reads and for the request counter. # # Browser: $CHROME, else chromium/google-chrome on PATH, else a Playwright # download under ~/.cache/ms-playwright. Exit 3 when none is found. # BROWSER_DEBUG=/some/prefix saves each rendered page as prefix..html. set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" FIX="$(cd "$1" && pwd)" PY="${CLAWHDF5_PYTHON:-python3}" chrome="${CHROME:-}" if [ -z "$chrome" ]; then for c in chromium chromium-browser google-chrome chrome-headless-shell; do if command -v "$c" >/dev/null; then chrome="$(command -v "$c")"; break; fi done fi if [ -z "$chrome" ]; then chrome="$(ls -d "$HOME"/.cache/ms-playwright/chromium_headless_shell-*/chrome-headless-shell-linux64/chrome-headless-shell 2>/dev/null | tail -1 || true)" fi if [ -z "$chrome" ] || [ ! -x "$chrome" ]; then echo "no Chromium found (set CHROME)" >&2 exit 3 fi profiles="$(mktemp -d)" server="" cleanup() { [ -n "$server" ] && kill "$server" 2>/dev/null || true rm -rf "$profiles" } trap cleanup EXIT "$PY" "$HERE/serve.py" --root "fix=$FIX" --root "=$HERE/.." > "$profiles/port" & server=$! for _ in $(seq 50); do [ -s "$profiles/port" ] && break sleep 0.1 done port="$(head -1 "$profiles/port")" fails=0 # A fresh profile per page: a second instance on the same profile fails. render() { local profile profile="$(mktemp -d "$profiles/profile.XXXXXX")" "$chrome" --headless --no-sandbox --disable-gpu --user-data-dir="$profile" \ --virtual-time-budget=20000 \ --dump-dom "http://127.0.0.1:$port/index.html?file=$1&path=$2" 2>/dev/null } # expect FILE PATH TEXT...: every TEXT appears in the page rendered for PATH # of FILE (a URL relative to the page); "re:TEXT" is an extended regex. expect() { local file="$1" path="$2" dom shift 2 dom="$(render "$file" "$path")" [ -n "${BROWSER_DEBUG:-}" ] && printf "%s\n" "$dom" > "$BROWSER_DEBUG.$(echo "$file$path" | tr / _).html" for text in "$@"; do local flag=-qF if [ "${text#re:}" != "$text" ]; then flag=-qE; text="${text#re:}"; fi if ! grep $flag -- "$text" <<<"$dom"; then echo "FAIL: page for $file $path lacks: $text" >&2 fails=$((fails + 1)) fi done echo "rendered $file $path" } H5=fix/fixture.h5 # Tree (root expanded; the group row carries its path) and root attributes. expect $H5 "/" 'data-path="/sensors"' 'data-path="/grid"' 'title"wasm fixture"' \ 'big9223372036854775813' '(compound{x: f64, n: i32})' # A chunked, deflated 2-D dataset: type, shape, the first window of values; # the request counter. expect $H5 "/grid" '
f64
' '
(6, 10)
' '9' '0.25' '14.75' \ 'showing rows 0–5, columns 0–9 of 60 values' 'request' 'fetched (100.0%)' # Nested path revealed through the tree; big-endian float32. expect $H5 "/sensors/temp" 'data-path="/sensors/temp"' '
f32
' '21.5' '22.25' # 64-bit integers stay exact; strings; array datatype cells. expect $H5 "/u64" '18446744073709551615' expect $H5 "/vlen_str" '"двa"' '
vlen string
' expect $H5 "/pairs" '[2, 3]' '
array[2]<i32>
' # 3-D: leading dimension held at 0, window over the last two. expect $H5 "/cube" '
(2, 5, 6)
' '29' 'dim 0' # Unsupported type: an error, not values. expect $H5 "/table" 'class="error"' 'reading compound{x: f64, n: i32} datasets is not supported' # A server without range support: the file is downloaded whole, and says so. expect norange/$H5 "/grid" '14.75' 'downloaded whole' # A large file: a small dataset, and a window of the large one, fetch a few # blocks (the counter shows a small percentage: "(1.5%)", not "(100.0%)"). if [ -f "$FIX/big.h5" ]; then expect fix/big.h5 "/small" '1.5' '3.25' 're:MiB of 191 MiB fetched \([0-9]\.[0-9]%\)' expect fix/big.h5 "/big" '
(25000000)
' '0' '24.5' \ 're:MiB of 191 MiB fetched \([0-9]\.[0-9]%\)' fi if [ "$fails" -gt 0 ]; then echo "browser: $fails checks failed" >&2 exit 1 fi echo "browser: all checks passed ($chrome)"