#!/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 "$@"
