mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(test-runner): WebServer: use socket for reuseExistingServer to detect servers that aren't using SO_REUSEADDR (#8537)
This commit is contained in:
parent
bafa426231
commit
0ae38b5aec
@ -54,7 +54,7 @@ export class WebServer {
|
|||||||
let processExitedReject = (error: Error) => { };
|
let processExitedReject = (error: Error) => { };
|
||||||
this._processExitedPromise = new Promise((_, reject) => processExitedReject = reject);
|
this._processExitedPromise = new Promise((_, reject) => processExitedReject = reject);
|
||||||
|
|
||||||
const portIsUsed = !await canBindPort(this.config.port);
|
const portIsUsed = await isPortUsed(this.config.port);
|
||||||
if (portIsUsed) {
|
if (portIsUsed) {
|
||||||
if (this.config.reuseExistingServer)
|
if (this.config.reuseExistingServer)
|
||||||
return;
|
return;
|
||||||
@ -104,31 +104,23 @@ export class WebServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function canBindPort(port: number): Promise<boolean> {
|
async function isPortUsed(port: number): Promise<boolean> {
|
||||||
return new Promise<boolean>(resolve => {
|
return new Promise<boolean>(resolve => {
|
||||||
const server = net.createServer();
|
const conn = net
|
||||||
server.on('error', () => resolve(false));
|
.connect(port)
|
||||||
server.listen(port, () => {
|
.on('error', () => {
|
||||||
server.close(() => {
|
resolve(false);
|
||||||
resolve(true);
|
})
|
||||||
});
|
.on('connect', () => {
|
||||||
});
|
conn.end();
|
||||||
|
resolve(true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function waitForSocket(port: number, delay: number, cancellationToken: { canceled: boolean }) {
|
async function waitForSocket(port: number, delay: number, cancellationToken: { canceled: boolean }) {
|
||||||
while (!cancellationToken.canceled) {
|
while (!cancellationToken.canceled) {
|
||||||
const connected = await new Promise(resolve => {
|
const connected = await isPortUsed(port);
|
||||||
const conn = net
|
|
||||||
.connect(port)
|
|
||||||
.on('error', () => {
|
|
||||||
resolve(false);
|
|
||||||
})
|
|
||||||
.on('connect', () => {
|
|
||||||
conn.end();
|
|
||||||
resolve(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
if (connected)
|
if (connected)
|
||||||
return;
|
return;
|
||||||
await new Promise(x => setTimeout(x, delay));
|
await new Promise(x => setTimeout(x, delay));
|
||||||
|
@ -225,3 +225,37 @@ test('should throw when a server is already running on the given port and strict
|
|||||||
expect(result.output).toContain(`Port ${port} is used, make sure that nothing is running on the port`);
|
expect(result.output).toContain(`Port ${port} is used, make sure that nothing is running on the port`);
|
||||||
await new Promise(resolve => server.close(resolve));
|
await new Promise(resolve => server.close(resolve));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
for (const host of ['localhost', '127.0.0.1', '0.0.0.0']) {
|
||||||
|
test(`should detect the server if a web-server is already running on ${host}`, async ({ runInlineTest }, { workerIndex }) => {
|
||||||
|
const port = workerIndex + 10500;
|
||||||
|
const server = http.createServer((req: http.IncomingMessage, res: http.ServerResponse) => {
|
||||||
|
res.end('<html><body>hello</body></html>');
|
||||||
|
});
|
||||||
|
await new Promise(resolve => server.listen(port, host, resolve));
|
||||||
|
try {
|
||||||
|
const result = await runInlineTest({
|
||||||
|
'test.spec.ts': `
|
||||||
|
const { test } = pwt;
|
||||||
|
test('connect to the server via the baseURL', async ({baseURL, page}) => {
|
||||||
|
await page.goto('/hello');
|
||||||
|
expect(await page.textContent('body')).toBe('hello');
|
||||||
|
});
|
||||||
|
`,
|
||||||
|
'playwright.config.ts': `
|
||||||
|
module.exports = {
|
||||||
|
webServer: {
|
||||||
|
command: 'node -e "process.exit(1)"',
|
||||||
|
port: ${port},
|
||||||
|
reuseExistingServer: false,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
expect(result.exitCode).toBe(1);
|
||||||
|
expect(result.output).toContain(`Port ${port} is used, make sure that nothing is running on the port`);
|
||||||
|
} finally {
|
||||||
|
await new Promise(resolve => server.close(resolve));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user