Files
nixpkgs/pkgs/development/web/playwright/browser-downloads-test.js

91 lines
2.8 KiB
JavaScript

"use strict";
const childProcess = require("child_process");
const fs = require("fs");
const [playwrightCorePath, expectedConfigPath] = process.argv.slice(2);
if (!playwrightCorePath || !expectedConfigPath) {
throw new Error("usage: browser-downloads-test.js <playwright-core> <expected-config>");
}
const browserDownloads = JSON.parse(fs.readFileSync(expectedConfigPath, "utf8"));
const browserNames = Object.keys(browserDownloads);
const hostPlatformBySystem = {
"x86_64-linux": "ubuntu24.04-x64",
"aarch64-linux": "ubuntu24.04-arm64",
"aarch64-darwin": "mac15-arm64",
};
function getRegistryDownloadURLs(hostPlatform) {
const script = `
const path = require("path");
const { registry } = require(path.join(process.env.PLAYWRIGHT_CORE_PATH, "lib/server/registry/index.js"));
const browserNames = JSON.parse(process.env.PLAYWRIGHT_BROWSER_NAMES);
const downloadURLs = Object.fromEntries(
browserNames.map((name) => [name, registry.findExecutable(name).downloadURLs]),
);
process.stdout.write(JSON.stringify(downloadURLs));
`;
return JSON.parse(
childProcess.execFileSync(process.execPath, ["-e", script], {
encoding: "utf8",
env: {
...process.env,
PLAYWRIGHT_BROWSER_NAMES: JSON.stringify(browserNames),
PLAYWRIGHT_CORE_PATH: playwrightCorePath,
PLAYWRIGHT_HOST_PLATFORM_OVERRIDE: hostPlatform,
},
}),
);
}
const failures = [];
const systems = Object.keys(browserDownloads[browserNames[0]]);
for (const system of systems) {
const hostPlatform = hostPlatformBySystem[system];
const registryDownloadURLs = getRegistryDownloadURLs(hostPlatform);
if (!hostPlatform) {
throw new Error(`unsupported system: ${system}`);
}
for (const name of browserNames) {
const expectedDownload = browserDownloads[name][system];
const actualDownloadURLs = registryDownloadURLs[name];
if (!expectedDownload) {
failures.push(`missing browser-downloads.nix entry for ${name} on ${system}`);
continue;
}
if (!Array.isArray(actualDownloadURLs) || actualDownloadURLs.length === 0) {
failures.push(`missing registry download URLs for ${name} on ${system} (${hostPlatform})`);
continue;
}
const actualDownloadURL = actualDownloadURLs[0];
if (expectedDownload.url !== actualDownloadURL) {
failures.push(
[
`${name} on ${system} (${hostPlatform}) did not match Playwright's primary download URL`,
`expected: ${browserDownloads[name][system].url}`,
`registry: ${actualDownloadURL}`,
].join("\n"),
);
}
}
}
if (failures.length > 0) {
console.error("Playwright browser download URL mismatches:");
for (const failure of failures) {
console.error(`- ${failure}`);
}
process.exit(1);
}