fix(webServer): route output through reporters (#12198)

This commit is contained in:
Dmitry Gozman 2022-02-18 07:54:01 -08:00 committed by GitHub
parent 7696fec1fa
commit 34eec7eae7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 17 additions and 16 deletions

View file

@ -426,7 +426,7 @@ export class Runner {
await this._runAndReportError(async () => {
for (const internalGlobalSetup of this._internalGlobalSetups)
internalGlobalTeardowns.push(await internalGlobalSetup());
webServer = config.webServer ? await WebServer.create(config.webServer) : undefined;
webServer = config.webServer ? await WebServer.create(config.webServer, this._reporter) : undefined;
if (config.globalSetup)
globalSetupResult = await (await this._loader.loadGlobalHook(config.globalSetup, 'globalSetup'))(this._loader.fullConfig());
}, result);

View file

@ -17,36 +17,29 @@
import http from 'http';
import https from 'https';
import net from 'net';
import os from 'os';
import stream from 'stream';
import debug from 'debug';
import { raceAgainstTimeout } from 'playwright-core/lib/utils/async';
import { WebServerConfig } from './types';
import { launchProcess } from 'playwright-core/lib/utils/processLauncher';
import { Reporter } from '../types/testReporter';
const DEFAULT_ENVIRONMENT_VARIABLES = {
'BROWSER': 'none', // Disable that create-react-app will open the page in the browser
};
const newProcessLogPrefixer = () => new stream.Transform({
transform(this: stream.Transform, chunk: Buffer, encoding: string, callback: stream.TransformCallback) {
this.push(chunk.toString().split(os.EOL).map((line: string): string => line ? `[WebServer] ${line}` : line).join(os.EOL));
callback();
},
});
const debugWebServer = debug('pw:webserver');
export class WebServer {
private _isAvailable: () => Promise<boolean>;
private _killProcess?: () => Promise<void>;
private _processExitedPromise!: Promise<any>;
constructor(private readonly config: WebServerConfig) {
constructor(private readonly config: WebServerConfig, private readonly reporter: Reporter) {
this._isAvailable = getIsAvailableFunction(config);
}
public static async create(config: WebServerConfig): Promise<WebServer> {
const webServer = new WebServer(config);
public static async create(config: WebServerConfig, reporter: Reporter): Promise<WebServer> {
const webServer = new WebServer(config, reporter);
try {
await webServer._startProcess();
await webServer._waitForProcess();
@ -85,8 +78,11 @@ export class WebServer {
});
this._killProcess = kill;
launchedProcess.stderr!.pipe(newProcessLogPrefixer()).pipe(process.stderr);
launchedProcess.stdout!.on('data', (line: Buffer) => debugWebServer(line.toString()));
launchedProcess.stderr!.on('data', line => this.reporter.onStdErr?.('[WebServer] ' + line.toString()));
launchedProcess.stdout!.on('data', line => {
if (debugWebServer.enabled)
this.reporter.onStdOut?.('[WebServer] ' + line.toString());
});
}
private async _waitForProcess() {

View file

@ -1,4 +1,5 @@
const { TestServer } = require('../../../utils/testserver/');
console.error('error from server');
// delay creating the server to test waiting for it
setTimeout(() => {
TestServer.create(__dirname, process.argv[2] || 3000).then(server => {

View file

@ -70,6 +70,8 @@ test('should create a server', async ({ runInlineTest }, { workerIndex }) => {
});
expect(result.exitCode).toBe(0);
expect(result.passed).toBe(1);
expect(result.output).not.toContain('[WebServer] listening');
expect(result.output).toContain('[WebServer] error from server');
expect(result.report.suites[0].specs[0].tests[0].results[0].status).toContain('passed');
const expectedLogMessages = ['globalSetup-status-200', 'globalSetup-teardown-status', 'globalTeardown-status-200'];
@ -102,9 +104,11 @@ test('should create a server with environment variables', async ({ runInlineTest
}
};
`,
});
}, {}, { DEBUG: 'pw:webserver' });
expect(result.exitCode).toBe(0);
expect(result.passed).toBe(1);
expect(result.output).toContain('[WebServer] listening');
expect(result.output).toContain('[WebServer] error from server');
expect(result.report.suites[0].specs[0].tests[0].results[0].status).toContain('passed');
});