blob: d3a2c16d7acb77953b9d384553e7e467888d517b [file] [log] [blame]
/**
* @license
* Copyright 2025 Google Inc.
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file A tiny wrapper around the Chromium bisect script
* that runs Puppeteer tests
* It's recommended to add .only to the failing test so
* the script runs quicker.
*/
import { spawn } from 'node:child_process';
import os from 'node:os';
import path from 'node:path';
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
const { chromium, good, bad, test, dry } = await yargs(hideBin(process.argv))
.parserConfiguration({
'populate--': true,
})
.options('chromium', {
type: 'string',
default: path.join(os.homedir(), 'chromium', 'src'),
alias: 'c',
desc: 'Path to chromium download',
})
.option('good', {
type: 'string',
alias: 'g',
demandOption: true,
desc: 'Last known good version',
})
.option('bad', {
type: 'string',
alias: 'b',
demandOption: true,
desc: 'First known bad version',
})
.option('test', {
type: 'string',
alias: 't',
desc: 'Test file to run. If omitted run all e2e tests.',
})
.option('dry', {
type: 'boolean',
alias: 'd',
desc: 'Prints the command to console rather then running it.',
})
.version(false)
.help(
'help',
'https://www.chromium.org/developers/bisect-builds-py/ \nWrapper script around the above chromium one to runs DevTools tests.',
)
.parse();
const pythonExecutable = 'python3';
const bisectScript = path.join(chromium, 'tools', 'bisect-builds.py');
const args = [
bisectScript,
'-g',
good,
'-b',
bad,
'-cft',
'-v',
'--verify-range',
'--not-interactive',
'-c',
`"npm run test -- ${test} --chrome-binary=%p"`,
];
if (dry) {
console.log([pythonExecutable, ...args].join(' '));
process.exit(0);
}
await new Promise((resolve, reject) => {
const createProcess = spawn(pythonExecutable, args, {
shell: true,
stdio: 'inherit',
});
createProcess.on('error', message => {
reject(message);
});
createProcess.on('exit', () => {
resolve(undefined);
});
});