[js/web] add a test flag to customize chromium flags (#17545)

### Description
add a test flag to customize chromium flags.

Usage:
npm test -- \<other flags> --chromium-flags=<...>
This commit is contained in:
Yulong Wang 2023-09-14 10:05:31 -07:00 committed by GitHub
parent 5af6279440
commit 7af2f68ef3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 57 deletions

View file

@ -3,10 +3,22 @@
'use strict';
const bundleMode = require('minimist')(process.argv)['bundle-mode'] || 'dev'; // 'dev'|'perf'|undefined;
const karmaPlugins = require('minimist')(process.argv)['karma-plugins'] || undefined;
const timeoutMocha = require('minimist')(process.argv)['timeout-mocha'] || 60000;
const forceLocalHost = !!require('minimist')(process.argv)['force-localhost'];
const args = require('minimist')(process.argv, {});
const bundleMode = args['bundle-mode'] || 'dev'; // 'dev'|'perf'|undefined;
const karmaPlugins = args['karma-plugins'] || undefined;
const timeoutMocha = args['timeout-mocha'] || 60000;
const forceLocalHost = !!args['force-localhost'];
// parse chromium flags
let chromiumFlags = args['chromium-flags'];
if (!chromiumFlags) {
chromiumFlags = [];
} else if (typeof chromiumFlags === 'string') {
chromiumFlags = [chromiumFlags];
} else if (!Array.isArray(chromiumFlags)) {
throw new Error(`Invalid command line arg: --chromium-flags: ${chromiumFlags}`);
}
const commonFile = bundleMode === 'dev' ? '../common/dist/ort-common.js' : '../common/dist/ort-common.min.js'
const mainFile = bundleMode === 'dev' ? 'test/ort.dev.js' : 'test/ort.perf.js';
@ -91,37 +103,10 @@ module.exports = function(config) {
listenAddress,
customLaunchers: {
// the following flags are used to make sure Edge on CI agents to initialize WebGPU correctly.
EdgeWebGpuTest: {base: 'Edge', flags: ['--ignore-gpu-blocklist', '--gpu-vendor-id=0x10de']},
ChromeTest: {base: 'Chrome', flags: ['--enable-features=SharedArrayBuffer']},
ChromeTestHeadless: {base: 'ChromeHeadless', flags: ['--enable-features=SharedArrayBuffer']},
ChromeDebug:
{debug: true, base: 'Chrome', flags: ['--remote-debugging-port=9333', '--enable-features=SharedArrayBuffer']},
ChromeCanaryTest: {
base: 'ChromeCanary',
flags: ['--enable-features=SharedArrayBuffer', '--enable-experimental-web-platform-features']
},
ChromeCanaryDebug: {
debug: true,
base: 'ChromeCanary',
flags: [
'--remote-debugging-port=9333', '--enable-features=SharedArrayBuffer',
'--enable-experimental-web-platform-features'
]
},
ChromeWebGpuProfileTest: {
base: 'Chrome',
flags:
['--window-size=1,1', '--enable-features=SharedArrayBuffer', '--disable-dawn-features=disallow_unsafe_apis']
},
ChromeWebGpuProfileDebug: {
debug: true,
base: 'Chrome',
flags: [
'--remote-debugging-port=9333',
'--enable-features=SharedArrayBuffer',
'--disable-dawn-features=disallow_unsafe_apis',
]
},
EdgeTest: {base: 'Edge', flags: chromiumFlags},
ChromeTest: {base: 'Chrome', flags: chromiumFlags},
ChromeTestHeadless: {base: 'ChromeHeadless', flags: chromiumFlags},
ChromeCanaryTest: {base: 'ChromeCanary', flags: chromiumFlags},
//
// ==== BrowserStack browsers ====
//

View file

@ -80,6 +80,7 @@ Options:
--no-sandbox This flag will be passed to Chrome.
Sometimes Chrome need this flag to work together with Karma.
--chromium-flags=<...> This flag will be passed to Chrome and Edge browsers. Can be used multiple times.
Examples:
@ -173,6 +174,7 @@ export interface TestRunnerCliArgs {
webglOptions?: InferenceSession.WebGLExecutionProviderOption;
globalEnvFlags?: Test.Options['globalEnvFlags'];
noSandbox?: boolean;
chromiumFlags: string[];
}
@ -439,6 +441,17 @@ export function parseTestRunnerCliArgs(cmdlineArgs: string[]): TestRunnerCliArgs
// Option: --no-sandbox
const noSandbox = !!args['no-sandbox'];
// parse chromium flags
let chromiumFlags = args['chromium-flags'];
if (!chromiumFlags) {
chromiumFlags = [];
} else if (typeof chromiumFlags === 'string') {
chromiumFlags = [chromiumFlags];
} else if (!Array.isArray(chromiumFlags)) {
throw new Error(`Invalid command line arg: --chromium-flags: ${chromiumFlags}`);
}
npmlog.verbose('TestRunnerCli.Init', ` Mode: ${mode}`);
npmlog.verbose('TestRunnerCli.Init', ` Env: ${env}`);
npmlog.verbose('TestRunnerCli.Init', ` Debug: ${debug}`);
@ -462,6 +475,7 @@ export function parseTestRunnerCliArgs(cmdlineArgs: string[]): TestRunnerCliArgs
webglOptions,
wasmOptions,
globalEnvFlags,
noSandbox
noSandbox,
chromiumFlags
};
}

View file

@ -475,10 +475,12 @@ async function main() {
args.bundleMode === 'perf' ? 'perf' :
args.debug ? 'debug' :
'test',
webgpu, webnn, config.options.globalEnvFlags?.webgpu?.profilingMode === 'default');
webgpu, webnn);
const karmaArgs = ['karma', 'start', `--browsers ${browser}`];
const chromiumFlags = ['--enable-features=SharedArrayBuffer', ...args.chromiumFlags];
if (args.debug) {
karmaArgs.push('--log-level info --timeout-mocha 9999999');
chromiumFlags.push('--remote-debugging-port=9333');
} else {
karmaArgs.push('--single-run');
}
@ -488,7 +490,22 @@ async function main() {
if (webgpu || webnn) {
karmaArgs.push('--force-localhost');
}
if (webgpu) {
if (browser.includes('Canary')) {
chromiumFlags.push('--enable-dawn-features=allow_unsafe_apis,use_dxc');
} else {
chromiumFlags.push('--enable-dawn-features=use_dxc');
chromiumFlags.push('--disable-dawn-features=disallow_unsafe_apis');
}
}
if (webnn) {
chromiumFlags.push('--enable-experimental-web-platform-features');
}
if (config.options.globalEnvFlags?.webgpu?.profilingMode === 'default') {
chromiumFlags.push('--disable-dawn-features=disallow_unsafe_apis');
}
karmaArgs.push(`--bundle-mode=${args.bundleMode}`);
karmaArgs.push(...chromiumFlags.map(flag => `--chromium-flags=${flag}`));
if (browser.startsWith('Edge')) {
// There are currently 2 Edge browser launchers:
// - karma-edge-launcher: used to launch the old Edge browser
@ -580,12 +597,12 @@ async function main() {
}
function getBrowserNameFromEnv(
env: TestRunnerCliArgs['env'], mode: 'debug'|'perf'|'test', webgpu: boolean, webnn: boolean, profile: boolean) {
env: TestRunnerCliArgs['env'], mode: 'debug'|'perf'|'test', webgpu: boolean, webnn: boolean) {
switch (env) {
case 'chrome':
return selectChromeBrowser(mode, webgpu, webnn, profile);
return selectChromeBrowser(mode, webgpu, webnn);
case 'edge':
return webgpu ? 'EdgeWebGpuTest' : 'Edge';
return 'EdgeTest';
case 'firefox':
return 'Firefox';
case 'electron':
@ -599,25 +616,14 @@ async function main() {
}
}
function selectChromeBrowser(mode: 'debug'|'perf'|'test', webgpu: boolean, webnn: boolean, profile: boolean) {
if (webgpu) {
switch (mode) {
case 'debug':
return profile ? 'ChromeWebGpuProfileDebug' : 'ChromeDebug';
default:
return profile ? 'ChromeWebGpuProfileTest' : 'ChromeTest';
}
} else if (webnn) {
switch (mode) {
case 'debug':
return 'ChromeCanaryDebug';
default:
return 'ChromeCanaryTest';
}
function selectChromeBrowser(mode: 'debug'|'perf'|'test', webgpu: boolean, webnn: boolean) {
if (webnn) {
return 'ChromeCanaryTest';
} else if (webgpu) {
return 'ChromeTest';
} else {
switch (mode) {
case 'debug':
return 'ChromeDebug';
case 'perf':
return 'ChromeTest';
default:

View file

@ -161,7 +161,7 @@ jobs:
displayName: 'Run ort-web tests (wasm,webgl,xnnpack backend)'
condition: ne('${{ parameters.RunWebGpuTests }}', 'true')
- script: |
npm test -- -e=edge -b=webgl,wasm,xnnpack,webgpu
npm test -- -e=edge -b=webgl,wasm,xnnpack,webgpu --chromium-flags=--ignore-gpu-blocklist --chromium-flags=--gpu-vendor-id=0x10de
workingDirectory: '$(Build.SourcesDirectory)\js\web'
displayName: 'Run ort-web tests (ALL backends)'
condition: ne('${{ parameters.RunWebGpuTests }}', 'false')