chore: print listening on message in terminal for web trace modes (#23546)

This commit is contained in:
Pavel Feldman 2023-06-06 09:36:49 -07:00 committed by GitHub
parent 699ac3a0f2
commit d4349e5d6f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 33 additions and 15 deletions

View file

@ -285,9 +285,8 @@ program
program
.command('show-trace [trace...]')
.option('-b, --browser <browserType>', 'browser to use, one of cr, chromium, ff, firefox, wk, webkit', 'chromium')
.option('-h, --host <host>', 'Host to serve trace on', 'localhost')
.option('-p, --port <port>', 'Port to serve trace on', '9322')
.option('--web', 'Open trace viewer as a PWA in a browser tab')
.option('-h, --host <host>', 'Host to serve trace on; specifying this option opens trace in a browser tab')
.option('-p, --port <port>', 'Port to serve trace on, 0 for any free port; specifying this option opens trace in a browser tab')
.option('--stdin', 'Accept trace URLs over stdin to update the viewer')
.description('show trace viewer')
.action(function(traces, options) {
@ -298,7 +297,13 @@ program
if (options.browser === 'wk')
options.browser = 'webkit';
const openOptions = { headless: false, host: options.host, port: +options.port, isServer: !!options.stdin, openInBrowser: !!options.web };
const openOptions = {
headless: false,
host: options.host,
port: +options.port,
isServer: !!options.stdin,
openInBrowser: options.port !== undefined || options.host !== undefined
};
showTraceViewer(traces, options.browser, openOptions).catch(logErrorAndExit);
}).addHelpText('afterAll', `
Examples:

View file

@ -119,10 +119,18 @@ async function startTraceViewerServer(traceUrls: string[], options?: Options): P
params.push('isUnderTest=true');
const { host, port } = options || {};
const urlPrefix = await server.start({ preferredPort: port, host });
const url = await server.start({ preferredPort: port, host });
const { app } = options || {};
const searchQuery = params.length ? '?' + params.join('&') : '';
const url = urlPrefix + `/trace/${app || 'index.html'}${searchQuery}`;
const urlPath = `/trace/${app || 'index.html'}${searchQuery}`;
server.routePath('/', (_, response) => {
response.statusCode = 301;
response.setHeader('Location', urlPath);
response.end();
return true;
});
return { server, url };
}
@ -175,6 +183,8 @@ export async function openTraceViewerApp(traceUrls: string[], browserName: strin
async function openTraceInBrowser(traceUrls: string[], options?: Options) {
const { url } = await startTraceViewerServer(traceUrls, options);
// eslint-disable-next-line no-console
console.log('\nListening on ' + url);
// eslint-disable-next-line no-console
await open(url, { wait: true }).catch(() => console.log(`Failed to open browser on ${url}`));
}

View file

@ -139,8 +139,8 @@ async function runTests(args: string[], opts: { [key: string]: any }) {
const runner = new Runner(config);
let status: FullResult['status'];
if (opts.ui || opts.uiWeb)
status = await runner.uiAllTests(!!opts.uiWeb);
if (opts.ui || opts.uiHost || opts.uiPort)
status = await runner.uiAllTests({ host: opts.uiHost, port: opts.uiPort ? +opts.uiPort : undefined });
else if (process.env.PWTEST_WATCH)
status = await runner.watchAllTests();
else
@ -328,7 +328,8 @@ const testOptions: [string, string][] = [
['--timeout <timeout>', `Specify test timeout threshold in milliseconds, zero for unlimited (default: ${defaultTimeout})`],
['--trace <mode>', `Force tracing mode, can be ${kTraceModes.map(mode => `"${mode}"`).join(', ')}`],
['--ui', `Run tests in interactive UI mode`],
['--ui-web', `Open interactive UI mode in a browser tab`],
['--ui-host <host>', 'Host to serve UI on; specifying this option opens UI in a browser tab'],
['--ui-port <port>', 'Port to serve UI on, 0 for any free port; specifying this option opens UI in a browser tab'],
['-u, --update-snapshots', `Update snapshots with actual results (default: only create missing snapshots)`],
['-j, --workers <workers>', `Number of concurrent workers or percentage of logical CPU cores, use 1 to run in a single worker (default: 50%)`],
['-x', `Stop after the first failure`],

View file

@ -107,9 +107,9 @@ export class Runner {
return await runWatchModeLoop(config);
}
async uiAllTests(openInBrowser: boolean): Promise<FullResult['status']> {
async uiAllTests(options: { host?: string, port?: number }): Promise<FullResult['status']> {
const config = this._config;
webServerPluginsForConfig(config).forEach(p => config.plugins.push({ factory: p }));
return await runUIMode(config, openInBrowser);
return await runUIMode(config, options);
}
}

View file

@ -81,7 +81,7 @@ class UIMode {
return status;
}
async showUI(openInBrowser: boolean) {
async showUI(options: { host?: string, port?: number }) {
const exitPromise = new ManualPromise();
let queue = Promise.resolve();
@ -120,7 +120,9 @@ class UIMode {
app: 'uiMode.html',
headless: isUnderTest() && process.env.PWTEST_HEADED_FOR_TEST !== '1',
transport: this._transport,
openInBrowser,
host: options.host,
port: options.port,
openInBrowser: options.host !== undefined || options.port !== undefined,
});
if (!process.env.PWTEST_DEBUG) {
@ -210,12 +212,12 @@ class UIMode {
}
}
export async function runUIMode(config: FullConfigInternal, openInBrowser: boolean): Promise<FullResult['status']> {
export async function runUIMode(config: FullConfigInternal, options: { host?: string, port?: number }): Promise<FullResult['status']> {
const uiMode = new UIMode(config);
const status = await uiMode.runGlobalSetup();
if (status !== 'passed')
return status;
await uiMode.showUI(openInBrowser);
await uiMode.showUI(options);
return await uiMode.globalCleanup?.() || 'passed';
}