fix(webServer): route output through reporters (#12198)
This commit is contained in:
parent
7696fec1fa
commit
34eec7eae7
|
|
@ -426,7 +426,7 @@ export class Runner {
|
||||||
await this._runAndReportError(async () => {
|
await this._runAndReportError(async () => {
|
||||||
for (const internalGlobalSetup of this._internalGlobalSetups)
|
for (const internalGlobalSetup of this._internalGlobalSetups)
|
||||||
internalGlobalTeardowns.push(await internalGlobalSetup());
|
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)
|
if (config.globalSetup)
|
||||||
globalSetupResult = await (await this._loader.loadGlobalHook(config.globalSetup, 'globalSetup'))(this._loader.fullConfig());
|
globalSetupResult = await (await this._loader.loadGlobalHook(config.globalSetup, 'globalSetup'))(this._loader.fullConfig());
|
||||||
}, result);
|
}, result);
|
||||||
|
|
|
||||||
|
|
@ -17,36 +17,29 @@
|
||||||
import http from 'http';
|
import http from 'http';
|
||||||
import https from 'https';
|
import https from 'https';
|
||||||
import net from 'net';
|
import net from 'net';
|
||||||
import os from 'os';
|
|
||||||
import stream from 'stream';
|
|
||||||
import debug from 'debug';
|
import debug from 'debug';
|
||||||
import { raceAgainstTimeout } from 'playwright-core/lib/utils/async';
|
import { raceAgainstTimeout } from 'playwright-core/lib/utils/async';
|
||||||
import { WebServerConfig } from './types';
|
import { WebServerConfig } from './types';
|
||||||
import { launchProcess } from 'playwright-core/lib/utils/processLauncher';
|
import { launchProcess } from 'playwright-core/lib/utils/processLauncher';
|
||||||
|
import { Reporter } from '../types/testReporter';
|
||||||
|
|
||||||
const DEFAULT_ENVIRONMENT_VARIABLES = {
|
const DEFAULT_ENVIRONMENT_VARIABLES = {
|
||||||
'BROWSER': 'none', // Disable that create-react-app will open the page in the browser
|
'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');
|
const debugWebServer = debug('pw:webserver');
|
||||||
|
|
||||||
export class WebServer {
|
export class WebServer {
|
||||||
private _isAvailable: () => Promise<boolean>;
|
private _isAvailable: () => Promise<boolean>;
|
||||||
private _killProcess?: () => Promise<void>;
|
private _killProcess?: () => Promise<void>;
|
||||||
private _processExitedPromise!: Promise<any>;
|
private _processExitedPromise!: Promise<any>;
|
||||||
constructor(private readonly config: WebServerConfig) {
|
|
||||||
|
constructor(private readonly config: WebServerConfig, private readonly reporter: Reporter) {
|
||||||
this._isAvailable = getIsAvailableFunction(config);
|
this._isAvailable = getIsAvailableFunction(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async create(config: WebServerConfig): Promise<WebServer> {
|
public static async create(config: WebServerConfig, reporter: Reporter): Promise<WebServer> {
|
||||||
const webServer = new WebServer(config);
|
const webServer = new WebServer(config, reporter);
|
||||||
try {
|
try {
|
||||||
await webServer._startProcess();
|
await webServer._startProcess();
|
||||||
await webServer._waitForProcess();
|
await webServer._waitForProcess();
|
||||||
|
|
@ -85,8 +78,11 @@ export class WebServer {
|
||||||
});
|
});
|
||||||
this._killProcess = kill;
|
this._killProcess = kill;
|
||||||
|
|
||||||
launchedProcess.stderr!.pipe(newProcessLogPrefixer()).pipe(process.stderr);
|
launchedProcess.stderr!.on('data', line => this.reporter.onStdErr?.('[WebServer] ' + line.toString()));
|
||||||
launchedProcess.stdout!.on('data', (line: Buffer) => debugWebServer(line.toString()));
|
launchedProcess.stdout!.on('data', line => {
|
||||||
|
if (debugWebServer.enabled)
|
||||||
|
this.reporter.onStdOut?.('[WebServer] ' + line.toString());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private async _waitForProcess() {
|
private async _waitForProcess() {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
const { TestServer } = require('../../../utils/testserver/');
|
const { TestServer } = require('../../../utils/testserver/');
|
||||||
|
console.error('error from server');
|
||||||
// delay creating the server to test waiting for it
|
// delay creating the server to test waiting for it
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
TestServer.create(__dirname, process.argv[2] || 3000).then(server => {
|
TestServer.create(__dirname, process.argv[2] || 3000).then(server => {
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,8 @@ test('should create a server', async ({ runInlineTest }, { workerIndex }) => {
|
||||||
});
|
});
|
||||||
expect(result.exitCode).toBe(0);
|
expect(result.exitCode).toBe(0);
|
||||||
expect(result.passed).toBe(1);
|
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');
|
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'];
|
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.exitCode).toBe(0);
|
||||||
expect(result.passed).toBe(1);
|
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');
|
expect(result.report.suites[0].specs[0].tests[0].results[0].status).toContain('passed');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue