Hackathon fixes

Merge upstream pull requests:
- Decompress local files when running tests
- Support url tests and tags param splitting

Change-Id: Ibdf392d7c33b951e2f622c2cbfb875ac1777488f
Reviewed-on: https://chromium-review.googlesource.com/c/external/github.com/WebKit/JetStream/+/7035653
Reviewed-by: Marja Hölttä <marja@chromium.org>
This commit is contained in:
Camillo Bruni 2025-10-13 13:23:55 +02:00
parent 43fec888d2
commit 4ac9debce4
5 changed files with 59 additions and 41 deletions

View file

@ -39,9 +39,6 @@ jobs:
- name: Install Node Packages
run: npm ci
- name: Decompress compressed files
run: npm run decompress
- name: Cache jsvu Binaries
uses: actions/cache@v4
with:

View file

@ -17,19 +17,20 @@
"scripts": {
"server": "node tests/server.mjs",
"compress": "node utils/compress.mjs",
"decompress": "node utils/compress.mjs -d -k",
"decompress": "node utils/compress.mjs --decompress --keep ",
"lint:check": "eslint **/*.{js,mjs,jsx,ts,tsx}",
"pretty:check": "prettier --check ./",
"pretty:format": "prettier --write ./",
"format:check": "npm run pretty:check && npm run lint:check",
"test:chrome": "node tests/run-browser.mjs --browser chrome",
"test:firefox": "node tests/run-browser.mjs --browser firefox",
"test:safari": "node tests/run-browser.mjs --browser safari",
"test:edge": "node tests/run-browser.mjs --browser edge",
"test:shell": "npm run test:v8 && npm run test:jsc && npm run test:spidermonkey",
"test:v8": "node tests/run-shell.mjs --shell v8",
"test:jsc": "node tests/run-shell.mjs --shell jsc",
"test:spidermonkey": "node tests/run-shell.mjs --shell spidermonkey"
"test:prepare": "npm run decompress -- --quiet",
"test:chrome": "npm run test:prepare && node tests/run-browser.mjs --browser chrome",
"test:firefox": "npm run test:prepare && node tests/run-browser.mjs --browser firefox",
"test:safari": "npm run test:prepare && node tests/run-browser.mjs --browser safari",
"test:edge": "npm run test:prepare && node tests/run-browser.mjs --browser edge",
"test:shell": "npm run test:prepare && npm run test:v8 && npm run test:jsc && npm run test:spidermonkey",
"test:v8": "npm run test:prepare && node tests/run-shell.mjs --shell v8",
"test:jsc": "npm run test:prepare && node tests/run-shell.mjs --shell jsc",
"test:spidermonkey": "npm run test:prepare && node tests/run-shell.mjs --shell spidermonkey"
},
"devDependencies": {
"@actions/core": "^1.11.1",

View file

@ -78,8 +78,9 @@ class Params {
if (this.report && !this.startDelay)
this.startDelay = 4000;
for (const paramKey of ["tag", "tags", "test", "tests"])
for (const paramKey of ["tag", "tags", "test", "tests"]) {
this.testList = this._parseTestListParam(sourceParams, paramKey);
}
this.testIterationCount = this._parseIntParam(sourceParams, "iterationCount", 1);
this.testWorstCaseCount = this._parseIntParam(sourceParams, "worstCaseCount", 1);
@ -94,14 +95,18 @@ class Params {
return this.testList;
let testList = [];
if (sourceParams?.getAll) {
testList = sourceParams?.getAll(key);
for (const param of sourceParams?.getAll(key)) {
testList.push(...param.split(","));
}
} else {
// fallback for cli sourceParams which is just a Map;
testList = sourceParams.get(key).split(",");
}
testList = testList.map(each => each.trim());
sourceParams.delete(key);
if (this.testList.length > 0 && testList.length > 0)
if (this.testList.length > 0 && testList.length > 0) {
throw new Error(`Overriding previous testList='${this.testList.join()}' with ${key} url-parameter.`);
}
return testList;
}

View file

@ -61,6 +61,7 @@ async function runTests() {
let success = true;
try {
success &&= await runEnd2EndTest("Run Single Suite", { test: "proxy-mobx" });
success &&= await runEnd2EndTest("Run Multiple Suites", { test: "prismjs-startup-es6,postcss-wtb" });
success &&= await runEnd2EndTest("Run Tag No Prefetch", { tag: "proxy", prefetchResources: "false" });
success &&= await runEnd2EndTest("Run Disabled Suite", { tag: "disabled" });
success &&= await runEnd2EndTest("Run Default Suite");

View file

@ -1,15 +1,19 @@
import commandLineArgs from 'command-line-args';
import commandLineUsage from 'command-line-usage';
import { globSync } from 'glob';
import { globSync, globIterate } from 'glob';
import zlib from 'zlib';
import fs from 'fs';
import path from 'path';
let log = console.log
function parseCommandLineArgs() {
const optionDefinitions = [
{ name: 'decompress', alias: 'd', type: Boolean, description: 'Decompress files (default: compress).' },
{ name: 'keep', alias: 'k', type: Boolean, description: 'Keep input files after processing (default: delete).' },
{ name: 'help', alias: 'h', type: Boolean, description: 'Print this usage guide.' },
{ name: 'quiet', alias: 'q', type: Boolean, description: 'Quite output, only print errors.' },
{ name: 'globs', type: String, multiple: true, defaultOption: true, description: 'Glob patterns of files to process.' },
];
const options = commandLineArgs(optionDefinitions);
@ -32,10 +36,14 @@ function parseCommandLineArgs() {
process.exit(0);
}
if (options.quiet) {
log = () => {};
}
if (options.globs === undefined) {
if (options.decompress) {
const defaultGlob = '**/*.z';
console.log(`No input glob pattern given, using default: ${defaultGlob}`);
log(`No input glob pattern given, using default: ${defaultGlob}`);
options.globs = [defaultGlob];
} else {
// For compression, require the user to specify explicit input file patterns.
@ -44,6 +52,7 @@ function parseCommandLineArgs() {
process.exit(1);
}
}
return options;
}
@ -61,9 +70,9 @@ function compress(inputData) {
const originalSize = inputData.length;
const compressedSize = compressedData.length;
const compressionRatio = calculateCompressionRatio(originalSize, compressedSize);
console.log(` Original size: ${String(originalSize).padStart(8)} bytes`);
console.log(` Compressed size: ${String(compressedSize).padStart(8)} bytes`);
console.log(` Compression ratio: ${compressionRatio.toFixed(2).padStart(8)}%`);
log(` Original size: ${String(originalSize).padStart(8)} bytes`);
log(` Compressed size: ${String(compressedSize).padStart(8)} bytes`);
log(` Compression ratio: ${compressionRatio.toFixed(2).padStart(8)}%`);
return compressedData;
}
@ -74,35 +83,39 @@ function decompress(inputData) {
const compressedSize = inputData.length;
const decompressedSize = decompressedData.length;
const expansionRatio = calculateExpansionRatio(compressedSize, decompressedSize);
console.log(` Compressed size: ${String(compressedSize).padStart(8)} bytes`);
console.log(` Decompressed size: ${String(decompressedSize).padStart(8)} bytes`);
console.log(` Expansion ratio: ${expansionRatio.toFixed(2).padStart(8)}%`);
log(` Compressed size: ${String(compressedSize).padStart(8)} bytes`);
log(` Decompressed size: ${String(decompressedSize).padStart(8)} bytes`);
log(` Expansion ratio: ${expansionRatio.toFixed(2).padStart(8)}%`);
return decompressedData;
}
function globsToFiles(globs) {
let files = [];
async function* globsToFiles(globs) {
let files = new Set();
console.assert(globs.length > 0);
const globtions = { nodir: true, ignore: '**/node_modules/**' };
for (const glob of globs) {
const matches = globSync(glob, { nodir: true });
files = files.concat(matches);
for await (const file of globIterate(glob, globtions)) {
if (files.has(file))
continue;
files.add(file)
yield file;
}
}
files = Array.from(new Set(files)).sort();
return files;
}
function processFiles(files, isDecompress, keep) {
async function processFiles(filesGenerator, isDecompress, keep) {
const verb = isDecompress ? 'decompress' : 'compress';
console.log(`Found ${files.length} files to ${verb}` + (files.length ? ':' : '.'));
const files = [];
// For printing overall statistics at the end.
let totalInputSize = 0;
let totalOutputSize = 0;
for (const inputFilename of files) {
for await (const inputFilename of filesGenerator) {
files.push(inputFilename);
try {
console.log(inputFilename);
log(inputFilename);
let outputFilename;
if (isDecompress) {
if (path.extname(inputFilename) !== '.z') {
@ -111,7 +124,7 @@ function processFiles(files, isDecompress, keep) {
} else {
outputFilename = inputFilename.slice(0, -2);
}
console.log(` Decompressing to: ${outputFilename}`);
log(` Decompressing to: ${outputFilename}`);
} else {
if (path.extname(inputFilename) === '.z') {
console.warn(` Warning: Input file already has a .z extension.`);
@ -130,7 +143,7 @@ function processFiles(files, isDecompress, keep) {
if (!keep) {
fs.unlinkSync(inputFilename);
console.log(` Deleted input file.`);
log(` Deleted input file.`);
}
} catch (err) {
console.error(`Error ${verb}ing ${inputFilename}:`, err);
@ -138,16 +151,17 @@ function processFiles(files, isDecompress, keep) {
}
if (files.length > 1) {
log(`Found ${files.length} files to ${verb}` + (files.length ? ':' : '.'));
if (isDecompress) {
const totalExpansionRatio = calculateExpansionRatio(totalInputSize, totalOutputSize);
console.log(`Total compressed sizes: ${String(totalInputSize).padStart(9)} bytes`);
console.log(`Total decompressed sizes: ${String(totalOutputSize).padStart(9)} bytes`);
console.log(`Average expansion ratio: ${totalExpansionRatio.toFixed(2).padStart(9)}%`);
log(`Total compressed sizes: ${String(totalInputSize).padStart(9)} bytes`);
log(`Total decompressed sizes: ${String(totalOutputSize).padStart(9)} bytes`);
log(`Average expansion ratio: ${totalExpansionRatio.toFixed(2).padStart(9)}%`);
} else {
const totalCompressionRatio = calculateCompressionRatio(totalInputSize, totalOutputSize);
console.log(`Total original sizes: ${String(totalInputSize).padStart(9)} bytes`);
console.log(`Total compressed sizes: ${String(totalOutputSize).padStart(9)} bytes`);
console.log(`Average compression ratio: ${totalCompressionRatio.toFixed(2).padStart(9)}%`);
log(`Total original sizes: ${String(totalInputSize).padStart(9)} bytes`);
log(`Total compressed sizes: ${String(totalOutputSize).padStart(9)} bytes`);
log(`Average compression ratio: ${totalCompressionRatio.toFixed(2).padStart(9)}%`);
}
}
}