From 34eec7eae7a4ab91f4d91ad2110f6f6d56323667 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 18 Feb 2022 07:54:01 -0800 Subject: [PATCH] fix(webServer): route output through reporters (#12198) --- packages/playwright-test/src/runner.ts | 2 +- packages/playwright-test/src/webServer.ts | 24 ++++++++----------- tests/playwright-test/assets/simple-server.js | 1 + tests/playwright-test/web-server.spec.ts | 6 ++++- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/playwright-test/src/runner.ts b/packages/playwright-test/src/runner.ts index 465dfcc8ff..5b6546a20d 100644 --- a/packages/playwright-test/src/runner.ts +++ b/packages/playwright-test/src/runner.ts @@ -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); diff --git a/packages/playwright-test/src/webServer.ts b/packages/playwright-test/src/webServer.ts index 74d1d66108..4278403c2b 100644 --- a/packages/playwright-test/src/webServer.ts +++ b/packages/playwright-test/src/webServer.ts @@ -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; private _killProcess?: () => Promise; private _processExitedPromise!: Promise; - 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 { - const webServer = new WebServer(config); + public static async create(config: WebServerConfig, reporter: Reporter): Promise { + 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() { diff --git a/tests/playwright-test/assets/simple-server.js b/tests/playwright-test/assets/simple-server.js index ccf7d7484f..2e178a3923 100644 --- a/tests/playwright-test/assets/simple-server.js +++ b/tests/playwright-test/assets/simple-server.js @@ -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 => { diff --git a/tests/playwright-test/web-server.spec.ts b/tests/playwright-test/web-server.spec.ts index c17c7fae03..eda277f393 100644 --- a/tests/playwright-test/web-server.spec.ts +++ b/tests/playwright-test/web-server.spec.ts @@ -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'); });