diff options
author | Asher Gomez <ashersaupingomez@gmail.com> | 2024-03-05 11:41:16 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-05 00:41:16 +0000 |
commit | 0022c35a237773b50a771b0fef48cac734f7a9d6 (patch) | |
tree | a7a2f9472d432c6ae9b329e6a62a9dbe0f69de75 /tests/wpt/runner/utils.ts | |
parent | c559e813e172bc67225391d3c5cb5d85c14c6279 (diff) |
chore: move `tools/wpt` to `tests/wpt/runner` (#22545)
Towards #22525
---------
Signed-off-by: Asher Gomez <ashersaupingomez@gmail.com>
Co-authored-by: Matt Mastracci <matthew@mastracci.com>
Diffstat (limited to 'tests/wpt/runner/utils.ts')
-rw-r--r-- | tests/wpt/runner/utils.ts | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/tests/wpt/runner/utils.ts b/tests/wpt/runner/utils.ts new file mode 100644 index 000000000..5e3399fa7 --- /dev/null +++ b/tests/wpt/runner/utils.ts @@ -0,0 +1,214 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +/// FLAGS + +import { parse } from "../../util/std/flags/mod.ts"; +import { join, resolve, ROOT_PATH } from "../../../tools/util.js"; + +export const { + json, + wptreport, + quiet, + release, + rebuild, + ["--"]: rest, + ["auto-config"]: autoConfig, + ["inspect-brk"]: inspectBrk, + ["no-ignore"]: noIgnore, + binary, +} = parse(Deno.args, { + "--": true, + boolean: ["quiet", "release", "no-interactive", "inspect-brk", "no-ignore"], + string: ["json", "wptreport", "binary"], +}); + +export function denoBinary() { + if (binary) { + return resolve(binary); + } + return join(ROOT_PATH, `./target/${release ? "release" : "debug"}/deno`); +} + +/// WPT TEST MANIFEST + +export interface Manifest { + items: { + testharness: ManifestFolder; + }; +} +export interface ManifestFolder { + [key: string]: ManifestFolder | ManifestTest; +} +export type ManifestTest = [ + hash: string, + ...variations: ManifestTestVariation[], +]; +export type ManifestTestVariation = [ + path: string, + options: ManifestTestOptions, +]; +export interface ManifestTestOptions { + // deno-lint-ignore camelcase + script_metadata: [string, string][]; +} + +const MANIFEST_PATH = join(ROOT_PATH, "./tests/wpt/runner/manifest.json"); + +export async function updateManifest() { + const status = await runPy( + [ + "wpt", + "manifest", + "--tests-root", + ".", + "-p", + MANIFEST_PATH, + ...(rebuild ? ["--rebuild"] : []), + ], + {}, + ).status; + assert(status.success, "updating wpt manifest should succeed"); +} + +export function getManifest(): Manifest { + const manifestText = Deno.readTextFileSync(MANIFEST_PATH); + return JSON.parse(manifestText); +} + +/// WPT TEST EXPECTATIONS + +const EXPECTATION_PATH = join(ROOT_PATH, "./tests/wpt/runner/expectation.json"); + +export interface Expectation { + [key: string]: Expectation | boolean | string[]; +} + +export function getExpectation(): Expectation { + const expectationText = Deno.readTextFileSync(EXPECTATION_PATH); + return JSON.parse(expectationText); +} + +export function saveExpectation(expectation: Expectation) { + Deno.writeTextFileSync( + EXPECTATION_PATH, + JSON.stringify(expectation, undefined, " "), + ); +} + +export function getExpectFailForCase( + expectation: boolean | string[], + caseName: string, +): boolean { + if (noIgnore) return false; + if (typeof expectation == "boolean") { + return !expectation; + } + return expectation.includes(caseName); +} + +/// UTILS + +class AssertionError extends Error { + name = "AssertionError"; + constructor(message: string) { + super(message); + } +} + +export function assert(condition: unknown, message: string): asserts condition { + if (!condition) { + throw new AssertionError(message); + } +} + +export function runPy<T extends Omit<Deno.CommandOptions, "cwd">>( + args: string[], + options: T, +): Deno.ChildProcess { + const cmd = Deno.build.os == "windows" ? "python.exe" : "python3"; + return new Deno.Command(cmd, { + args, + stdout: "inherit", + stderr: "inherit", + ...options, + cwd: join(ROOT_PATH, "./tests/wpt/suite/"), + }).spawn(); +} + +export async function checkPy3Available() { + const { success, stdout } = await runPy(["--version"], { + stdout: "piped", + }).output(); + assert(success, "failed to run python --version"); + const output = new TextDecoder().decode(stdout); + assert( + output.includes("Python 3."), + `The ${ + Deno.build.os == "windows" ? "python.exe" : "python3" + } in your path is not Python 3.`, + ); +} + +export async function cargoBuild() { + if (binary) return; + const { success } = await new Deno.Command("cargo", { + args: ["build", ...(release ? ["--release"] : [])], + cwd: ROOT_PATH, + stdout: "inherit", + stderr: "inherit", + }).output(); + assert(success, "cargo build failed"); +} + +export function escapeLoneSurrogates(input: string): string; +export function escapeLoneSurrogates(input: string | null): string | null; +export function escapeLoneSurrogates(input: string | null): string | null { + if (input === null) return null; + return input.replace( + /[\uD800-\uDFFF]/gu, + (match) => `U+${match.charCodeAt(0).toString(16)}`, + ); +} + +/// WPTREPORT + +export async function generateRunInfo(): Promise<unknown> { + const oses = { + "windows": "win", + "darwin": "mac", + "linux": "linux", + "freebsd": "freebsd", + "openbsd": "openbsd", + }; + const proc = await new Deno.Command("git", { + args: ["rev-parse", "HEAD"], + cwd: join(ROOT_PATH, "tests", "wpt", "suite"), + stderr: "inherit", + }).output(); + const revision = (new TextDecoder().decode(proc.stdout)).trim(); + const proc2 = await new Deno.Command(denoBinary(), { + args: ["eval", "console.log(JSON.stringify(Deno.version))"], + cwd: join(ROOT_PATH, "tests", "wpt", "suite"), + }).output(); + const version = JSON.parse(new TextDecoder().decode(proc2.stdout)); + const runInfo = { + "os": oses[Deno.build.os], + "processor": Deno.build.arch, + "version": "unknown", + "os_version": "unknown", + "bits": 64, + "has_sandbox": true, + "webrender": false, + "automation": false, + "linux_distro": "unknown", + "revision": revision, + "python_version": 3, + "product": "deno", + "debug": false, + "browser_version": version.deno, + "browser_channel": version.deno.includes("+") ? "canary" : "stable", + "verify": false, + "wasm": false, + "headless": true, + }; + return runInfo; +} |