`wasm-pack test --headless --chrome` fails in docker container
🐛 Bug description
While running wasm-pack-test --headless --chrome in an docker container the test fails with following error:
[2023-12-29T14:15:05Z DEBUG wasm_bindgen_test_runner::headless] POST /session {"desiredCapabilities":{"goog:chromeOptions":{"args":["--whitelisted-ips=","--port=41795","--verbose","headless","disable-dev-shm-usage","no-sandbox"]}},"requiredCapabilities":{}}
[2023-12-29T14:15:05Z DEBUG wasm_bindgen_test_runner::headless] got: {"sessionId":"7ab4c03796d4d4a3120bbc76daeac47e","status":13,"value":{"message":"unknown error: cannot find Chrome binary\n (Driver info: chromedriver=114.0.5735.90 (386bc09e8f4f2e025eddae123f36f6263096ae49-refs/branch-heads/5735@{#1052}),platform=Linux 5.15.133.1-microsoft-standard-WSL2 x86_64)"}}
using the wasm-pack version 0.12.1.
The non --headless version works.
Full log (`RUST_LOG=wasm_bindgen_test_runner wasm-pack test --chrome --headless`)
[INFO]: 🎯 Checking for the Wasm target...
warning: function `set_panic_hook` is never used
--> src/utils.rs:1:8
|
1 | pub fn set_panic_hook() {
| ^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `wasm` (lib) generated 1 warning
warning: `wasm` (lib test) generated 1 warning (1 duplicate)
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
[INFO]: ⬇️ Installing wasm-bindgen...
warning: function `set_panic_hook` is never used
--> src/utils.rs:1:8
|
1 | pub fn set_panic_hook() {
| ^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `wasm` (lib) generated 1 warning
warning: `wasm` (lib test) generated 1 warning (1 duplicate)
Finished test [unoptimized + debuginfo] target(s) in 0.01s
Running unittests src/lib.rs (target/wasm32-unknown-unknown/debug/deps/wasm-305b5e1823605350.wasm)
no tests to run!
Running tests/web.rs (target/wasm32-unknown-unknown/debug/deps/web-7841cbe865bd89c1.wasm)
Set timeout to 20 seconds...
[2023-12-29T14:15:05Z DEBUG wasm_bindgen_test_runner::headless] executing "/home/node/.cache/.wasm-pack/chromedriver-365490088b2eefa3/chromedriver" "--port=43979"
Running headless tests in Chrome on `http://127.0.0.1:43979/`
Try find `webdriver.json` for configure browser's capabilities:
Ok
[2023-12-29T14:15:05Z DEBUG wasm_bindgen_test_runner::headless] POST /session {"desiredCapabilities":{"goog:chromeOptions":{"args":["--whitelisted-ips=","--port=41795","--verbose","headless","disable-dev-shm-usage","no-sandbox"]}},"requiredCapabilities":{}}
[2023-12-29T14:15:05Z DEBUG wasm_bindgen_test_runner::headless] got: {"sessionId":"7ab4c03796d4d4a3120bbc76daeac47e","status":13,"value":{"message":"unknown error: cannot find Chrome binary\n (Driver info: chromedriver=114.0.5735.90 (386bc09e8f4f2e025eddae123f36f6263096ae49-refs/branch-heads/5735@{#1052}),platform=Linux 5.15.133.1-microsoft-standard-WSL2 x86_64)"}}
[2023-12-29T14:15:05Z DEBUG wasm_bindgen_test_runner::headless] POST /session/7ab4c03796d4d4a3120bbc76daeac47e/url {"url":"http://127.0.0.1:43947"}
[2023-12-29T14:15:05Z DEBUG wasm_bindgen_test_runner::headless] DELETE /session/7ab4c03796d4d4a3120bbc76daeac47e/window
[2023-12-29T14:15:05Z WARN wasm_bindgen_test_runner::headless] failed to close window http://127.0.0.1:43979/session/7ab4c03796d4d4a3120bbc76daeac47e/window: status code 404
driver status: signal: 9 (SIGKILL)
driver stdout:
Starting ChromeDriver 114.0.5735.90 (386bc09e8f4f2e025eddae123f36f6263096ae49-refs/branch-heads/5735@{#1052}) on port 43979
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
driver stderr:
[1703859305.789][SEVERE]: bind() failed: Cannot assign requested address (99)
Error: http://127.0.0.1:43979/session/7ab4c03796d4d4a3120bbc76daeac47e/url: status code 404
error: test failed, to rerun pass `--test web`
Caused by:
process didn't exit successfully: `/home/node/.cache/.wasm-pack/wasm-bindgen-b04961754c8ad633/wasm-bindgen-test-runner /workspaces/gcc-output-map-web-renderer/src/wasm/target/wasm32-unknown-unknown/debug/deps/web-7841cbe865bd89c1.wasm` (exit status: 1)
note: test exited abnormally; to see the full output pass --nocapture to the harness.
Error: Running Wasm tests with wasm-bindgen-test failed
Caused by: Running Wasm tests with wasm-bindgen-test failed
Caused by: failed to execute `cargo test`: exited with exit status: 1
full command: cd "/workspaces/gcc-output-map-web-renderer/src/wasm" && CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER="/home/node/.cache/.wasm-pack/wasm-bindgen-b04961754c8ad633/wasm-bindgen-test-runner" CHROMEDRIVER="/home/node/.cache/.wasm-pack/chromedriver-365490088b2eefa3/chromedriver" WASM_BINDGEN_TEST_ONLY_WEB="1" "cargo" "test" "--target" "wasm32-unknown-unknown"
🤔 Expected Behavior
The test should succeed as they do with the non --headless version.
👟 Steps to reproduce
alternatively build with with Dockerfile
Dockerfile
ARG VARIANT="16"
ARG RUSTUP_VERSION="1.26.0"
FROM node:${VARIANT}
ARG RUSTUP_VERSION
ENV RUSTUP_VERSION $RUSTUP_VERSION
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y \
vim
USER node
RUN curl -L --proto '=https' --tlsv1.2 --output /tmp/rustup-init \
"https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/x86_64-unknown-linux-gnu/rustup-init" \
&& chmod +x /tmp/rustup-init \
&& /tmp/rustup-init -y \
&& rm /tmp/rustup-init
RUN /home/node/.cargo/bin/cargo install \
wasm-pack
-
Start docker container
docker run --rm -it node:16 bash -
Setup environment
# install deps
apt update
apt install -y libnss3
# install rust
curl -L --proto '=https' --tlsv1.2 --output /tmp/rustup-init \
"https://static.rust-lang.org/rustup/archive/1.26.0/x86_64-unknown-linux-gnu/rustup-init" \
&& chmod +x /tmp/rustup-init \
&& /tmp/rustup-init -y \
&& rm /tmp/rustup-init
source "$HOME/.cargo/env"
export USER=root
# install wasm-pack
cargo install wasm-pack
# follow quickstart
cd /tmp && wasm-pack new hello-wasm
cd /tmp/hello-wasm
wasm-pack build
- Run test (which fails as indicated)
wasm-pack test --headless --chrome
🌍 Your environment
wasm-pack version: 0.12.1
rustc version: 1.75.0 (82e1608df 2023-12-21)
Docker (Debian 10 - buster)
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
Docker Host (WSL)
$ uname -a
Linux DESKTOP-P63NNCI 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 Linux
$ cat /etc/*release
3.18.2
NAME="Rancher Desktop WSL Distro"
ID="rancher-desktop-wsl-distro"
PRETTY_NAME="Rancher Desktop WSL Distribution"
VERSION_ID="0.42"
BUILD_ID="964afb744b08a220ffd06e66e83e38c8fa8b7372"
HOME_URL="https://rancherdesktop.io/"
SUPPORT_URL="https://rancher-users.slack.com/channels/rancher-desktop"
BUG_REPORT_URL="https://github.com/rancher-sandbox/rancher-desktop-wsl-distro/issues/new"
Findings
-
This error seems to be related to chromedriver beeing started without
--whitelisted-ips=. I do not know on how to pass arguments to the chrome driver to verify this. -
~The firefox headless fails aswell, thought with a
SIGKILL~ Expected behaviordriver status: signal: 9 (SIGKILL) driver stdout: 1703858086482 geckodriver INFO Listening on 127.0.0.1:36377 -
Seems to be related to #1126
Installing the correct googledriver and chrome version from google chrome labs will fix this. I will leave this issue open, as I believe two things would improve user friendliness:
- Add a hint or some additional documentation that the browser needs to be installed (https://rustwasm.github.io/docs/wasm-pack/commands/test.html).
- Maybe a friendly error message to indicate the browser is not installed.
Otherwise seems to work as expected. Thanks to the team for the great work ❤️
Updated the Dockerfile to install the correct chromedriver and chrome version, which then allows running: wasm-pack test --chrome --chromedriver "$(which chromedriver)" --headless.
New Dockerfile
ARG VARIANT="16"
ARG RUSTUP_VERSION="1.26.0"
ARG CHROME_VERSION="120.0.6099.109"
FROM node:${VARIANT}
ARG RUSTUP_VERSION
ENV RUSTUP_VERSION $RUSTUP_VERSION
ARG CHROME_VERSION
ENV CHROME_VERSION $CHROME_VERSION
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y \
ca-certificates \
fonts-liberation \
libasound2 \
libatk-bridge2.0-0 \
libatk1.0-0 \
libatspi2.0-0 \
libc6 \
libcairo2 \
libcups2 \
libcurl3-gnutls \
libcurl3-nss \
libcurl4 \
libdbus-1-3 \
libdbus-1-3 \
libdrm2 \
libexpat1 \
libgbm1 \
libglib2.0-0 \
libgtk-3-0 \
libnspr4 \
libnss3 \
libpango-1.0-0 \
libu2f-udev \
libvulkan1 \
libx11-6 \
libxcb1 \
libxcomposite1 \
libxdamage1 \
libxext6 \
libxfixes3 \
libxkbcommon0 \
libxrandr2 \
vim
# Install chrome + chromedriver
RUN mkdir -p /opt/google/chrome/ \
&& cd /opt/google/chrome/ \
&& curl -L --proto '=https' --tlsv1.2 --output /tmp/chromedriver.zip \
"https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/120.0.6099.109/linux64/chromedriver-linux64.zip" \
&& unzip /tmp/chromedriver.zip \
&& rm /tmp/chromedriver.zip \
&& ln -s /opt/google/chrome/chromedriver-linux64/chromedriver /usr/bin/chromedriver \
&& curl -L --proto '=https' --tlsv1.2 --output /tmp/chrome.zip \
"https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/120.0.6099.109/linux64/chrome-linux64.zip" \
&& unzip /tmp/chrome.zip \
&& ln -s /opt/google/chrome/chrome-linux64/chrome /usr/bin/google-chrome-stable \
&& ln -s /usr/bin/google-chrome-stable /usr/bin/google-chrome \
&& rm /tmp/chrome.zip
USER node
RUN curl -L --proto '=https' --tlsv1.2 --output /tmp/rustup-init \
"https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/x86_64-unknown-linux-gnu/rustup-init" \
&& chmod +x /tmp/rustup-init \
&& /tmp/rustup-init -y \
&& rm /tmp/rustup-init
RUN /home/node/.cargo/bin/cargo install \
wasm-pack