#!/usr/bin/env bash set -e DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # shellcheck source=/dev/null . "${DIR}/shell_include.sh" ensure_ladybird_source_dir WPT_SOURCE_DIR=${WPT_SOURCE_DIR:-"${LADYBIRD_SOURCE_DIR}/Tests/LibWeb/WPT/wpt"} WPT_REPOSITORY_URL=${WPT_REPOSITORY_URL:-"https://github.com/web-platform-tests/wpt.git"} BUILD_PRESET=${BUILD_PRESET:-default} BUILD_DIR=$(get_build_dir "$BUILD_PRESET") default_binary_path() { if [ "$(uname -s)" = "Darwin" ]; then echo "${BUILD_DIR}/bin/Ladybird.app/Contents/MacOS" else echo "${BUILD_DIR}/bin" fi } ladybird_git_hash() { pushd "${LADYBIRD_SOURCE_DIR}" > /dev/null git rev-parse --short HEAD popd > /dev/null } LADYBIRD_BINARY=${LADYBIRD_BINARY:-"$(default_binary_path)/Ladybird"} WEBDRIVER_BINARY=${WEBDRIVER_BINARY:-"$(default_binary_path)/WebDriver"} HEADLESS_BROWSER_BINARY=${HEADLESS_BROWSER_BINARY:-"$(default_binary_path)/headless-browser"} WPT_PROCESSES=${WPT_PROCESSES:-$(get_number_of_processing_units)} WPT_CERTIFICATES=( "tools/certs/cacert.pem" "${BUILD_DIR}/Lagom/cacert.pem" ) WPT_ARGS=( "--webdriver-binary=${WEBDRIVER_BINARY}" "--install-webdriver" "--processes=${WPT_PROCESSES}" "--webdriver-arg=--force-cpu-painting" "--no-pause-after-test" "-f" "${EXTRA_WPT_ARGS[@]}" ) ARG0=$0 print_help() { NAME=$(basename "$ARG0") cat <&2 print_help exit 1 } CMD=$1 [ -n "$CMD" ] || usage shift if [ "$CMD" = "--help" ] || [ "$CMD" = "help" ]; then print_help exit 0 fi set_logging_flags() { [ -n "${1}" ] || usage; [ -n "${2}" ] || usage; log_type="${1}" log_name="$(absolutize_path "${2}")" WPT_ARGS+=( "${log_type}=${log_name}" ) } ARG=$1 while [[ "$ARG" =~ ^(--headless|(--log(-(raw|unittest|xunit|html|mach|tbpl|grouped|chromium|wptreport|wptscreenshot))?))$ ]]; do case "$ARG" in --headless) LADYBIRD_BINARY="$(default_binary_path)/headless-browser" WPT_ARGS+=( "--webdriver-arg=--headless" ) ;; --log) set_logging_flags "--log-raw" "${2}" shift ;; *) set_logging_flags "${ARG}" "${2}" shift ;; esac shift ARG=$1 done WPT_ARGS+=( "--binary=${LADYBIRD_BINARY}" ) TEST_LIST=( "$@" ) for i in "${!TEST_LIST[@]}"; do item="${TEST_LIST[i]}" item="${item#"$WPT_SOURCE_DIR"/}" item="${item#*Tests/LibWeb/WPT/wpt/}" TEST_LIST[i]="$item" done exit_if_running_as_root "Do not run WPT.sh as root" ensure_wpt_repository() { mkdir -p "${WPT_SOURCE_DIR}" pushd "${WPT_SOURCE_DIR}" > /dev/null if [ ! -d .git ]; then git clone --depth 1 "${WPT_REPOSITORY_URL}" "${WPT_SOURCE_DIR}" fi # Update hosts file if needed if [ "$(comm -13 <(sort -u /etc/hosts) <(./wpt make-hosts-file | sort -u) | wc -l)" -gt 0 ]; then echo "Enter superuser password to append wpt hosts to /etc/hosts" ./wpt make-hosts-file | sudo tee -a /etc/hosts fi popd > /dev/null } build_ladybird_and_webdriver() { "${DIR}"/ladybird.sh build WebDriver } update_wpt() { ensure_wpt_repository pushd "${WPT_SOURCE_DIR}" > /dev/null git pull popd > /dev/null } execute_wpt() { pushd "${WPT_SOURCE_DIR}" > /dev/null for certificate_path in "${WPT_CERTIFICATES[@]}"; do if [ ! -f "${certificate_path}" ]; then echo "Certificate not found: \"${certificate_path}\"" exit 1 fi WPT_ARGS+=( "--webdriver-arg=--certificate=${certificate_path}" ) done echo QT_QPA_PLATFORM="offscreen" LADYBIRD_GIT_VERSION="$(ladybird_git_hash)" ./wpt run "${WPT_ARGS[@]}" ladybird "${TEST_LIST[@]}" QT_QPA_PLATFORM="offscreen" LADYBIRD_GIT_VERSION="$(ladybird_git_hash)" ./wpt run "${WPT_ARGS[@]}" ladybird "${TEST_LIST[@]}" popd > /dev/null } run_wpt() { ensure_wpt_repository build_ladybird_and_webdriver execute_wpt } serve_wpt() { ensure_wpt_repository pushd "${WPT_SOURCE_DIR}" > /dev/null ./wpt serve popd > /dev/null } import_wpt() { pushd "${LADYBIRD_SOURCE_DIR}" > /dev/null ./Meta/ladybird.sh build headless-browser for path in "${INPUT_PATHS[@]}"; do echo "Importing test from ${path}" ./Meta/import-wpt-test.py https://wpt.live/"${path}" "${HEADLESS_BROWSER_BINARY}" --run-tests ./Tests/LibWeb --rebaseline -f "$path" done popd > /dev/null } compare_wpt() { ensure_wpt_repository METADATA_DIR=$(mktemp -d) pushd "${WPT_SOURCE_DIR}" > /dev/null ./wpt update-expectations --product ladybird --full --metadata="${METADATA_DIR}" "${INPUT_LOG_NAME}" popd > /dev/null WPT_ARGS+=( "--metadata=${METADATA_DIR}" ) build_ladybird_and_webdriver execute_wpt rm -rf "${METADATA_DIR}" } if [[ "$CMD" =~ ^(update|run|serve|compare|import)$ ]]; then case "$CMD" in update) update_wpt ;; run) run_wpt ;; serve) serve_wpt ;; import) if [ $# -eq 0 ]; then usage fi INPUT_PATHS=( "$@" ) import_wpt ;; compare) INPUT_LOG_NAME="$(pwd -P)/$1" if [ ! -f "$INPUT_LOG_NAME" ]; then echo "Log file not found: \"${INPUT_LOG_NAME}\"" usage; fi shift compare_wpt ;; esac else >&2 echo "Unknown command: $CMD" usage fi