deno.land / x / deno@v1.28.2 / tools / wpt / utils.ts
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license./// FLAGS
import { parse } from "../../test_util/std/flags/mod.ts";import { join, resolve, ROOT_PATH } from "../util.js";
export const { json, wptreport, quiet, release, rebuild, ["--"]: rest, ["auto-config"]: autoConfig, ["inspect-brk"]: inspectBrk, binary,} = parse(Deno.args, { "--": true, boolean: ["quiet", "release", "no-interactive", "inspect-brk"], 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, "./tools/wpt/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, "./tools/wpt/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 (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.SpawnOptions, "cwd">>( args: string[], options: T,): Deno.Child<T> { const cmd = Deno.build.os == "windows" ? "python.exe" : "python3"; return Deno.spawnChild(cmd, { args, stdout: "inherit", stderr: "inherit", ...options, cwd: join(ROOT_PATH, "./test_util/wpt/"), });}
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 Deno.spawn("cargo", { args: ["build", ...(release ? ["--release"] : [])], cwd: ROOT_PATH, stdout: "inherit", stderr: "inherit", }); 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", }; const proc = await Deno.spawn("git", { args: ["rev-parse", "HEAD"], cwd: join(ROOT_PATH, "test_util", "wpt"), stderr: "inherit", }); const revision = (new TextDecoder().decode(proc.stdout)).trim(); const proc2 = await Deno.spawn(denoBinary(), { args: ["eval", "console.log(JSON.stringify(Deno.version))"], cwd: join(ROOT_PATH, "test_util", "wpt"), }); 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;}
Version Info