Source code
Revision control
Copy as Markdown
Other Tools
/**
* @license
* Copyright 2025 Google Inc.
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @fileoverview 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} = await yargs(hideBin(process.argv))
.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',
default: 'test:chrome:headless',
desc: 'Test type to run, example `test:chrome:headful`',
})
.version(false)
.help()
.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',
`"BINARY=%p npm run ${test}"`,
];
await new Promise((resolve, reject) => {
const createProcess = spawn(pythonExecutable, args, {
shell: true,
stdio: 'inherit',
});
createProcess.on('error', message => {
reject(message);
});
createProcess.on('exit', () => {
resolve();
});
});