#!/bin/sh # script/test-e2e-firefox: build the extension and drive the real popup in # a real Firefox inside a pinned container. The Firefox counterpart to # script/test-e2e. Our own extension to scripts-to-rule-them-all. # # Deliberately NOT called by script/check or script/test, for the same # reason as the Chrome suite: REPO_POLICIES.md caps make test at 20 seconds # and a browser suite does not fit. .gitea/workflows/e2e.yml also runs it # on every push, in a job separate from check. # # Unlike script/test-e2e this builds its base image locally, because no # published image carries both a pinned Firefox and a matching geckodriver. # All three external artifacts are pinned by digest inside the Dockerfile; # see tests/e2e/firefox/Dockerfile, which also explains why the repo and # the extension build are baked into the image rather than mounted. # # Docker is the only prerequisite: nothing here depends on the node, yarn # or make on the machine that starts the run. set -eu SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)" ROOT="$(cd "$SCRIPT_DIR/.." && pwd -P)" IMAGE="$("$SCRIPT_DIR/projectname")-e2e-firefox" IIDFILE="" cleanup() { if [ -n "$IIDFILE" ]; then rm -f "$IIDFILE" fi } main() { cd "$ROOT" if ! command -v docker >/dev/null 2>&1; then echo "test-e2e-firefox: docker is required to run the e2e suite" >&2 exit 1 fi IIDFILE="$(mktemp)" trap cleanup EXIT trap 'cleanup; exit 130' INT TERM echo "Building the pinned Firefox e2e image (extension included)..." docker build --iidfile "$IIDFILE" -t "$IMAGE" \ -f tests/e2e/firefox/Dockerfile . echo "Running the Firefox e2e suite..." # The image is run by ID, not by tag: where two clones of this repo run # the suite at once, the other build can move the tag between this # build and this run, and the suite would then silently test the other # checkout. # # --shm-size=1g: Firefox needs more than the default 64MB /dev/shm. # --network none: the suite stubs nothing, so this is what keeps the # run offline and deterministic. The extension swallows its own # fetch failures, so the popup flows work unchanged; see the # network note in README.md. Weaker than the Chrome suite's # fixture interception, and honestly so — it proves no request # escaped, but it cannot report which ones were attempted. # HOME=/tmp: the image's root home is not a reliable place for the # browser profile. # # No --privileged. Firefox's sandbox logs # "CanCreateUserNamespace() clone() failure: EPERM" on startup here; # it is cosmetic and headless Firefox runs fine without it. docker run --rm \ --shm-size=1g \ --network none \ -e HOME=/tmp \ "$(cat "$IIDFILE")" \ node tests/e2e/firefox/run.js dist/firefox } main "$@"