test: unflake some websocket tests (#11069)

This commit is contained in:
Dmitry Gozman 2021-12-22 11:17:34 -08:00 committed by GitHub
parent f933759ad1
commit af153b9826
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 21 deletions

View File

@ -50,7 +50,9 @@ it('should emit close events', async ({ page, server }) => {
});
it('should emit frame events', async ({ page, server }) => {
server.sendOnWebSocketConnection('incoming');
server.onceWebSocketConnection(ws => {
ws.on('message', () => ws.send('incoming'));
});
let socketClosed;
const socketClosePromise = new Promise(f => socketClosed = f);
const log = [];
@ -64,16 +66,17 @@ it('should emit frame events', async ({ page, server }) => {
const ws = new WebSocket('ws://localhost:' + port + '/ws');
ws.addEventListener('open', () => ws.send('outgoing'));
ws.addEventListener('message', () => { ws.close(); });
(window as any).ws = ws;
}, server.PORT);
await socketClosePromise;
expect(log[0]).toBe('open');
expect(log[3]).toBe('close');
log.sort();
expect(log.join(':')).toBe('close:open:received<incoming>:sent<outgoing>');
expect(log).toEqual(['open', 'sent<outgoing>', 'received<incoming>', 'close']);
});
it('should filter out the close events when the server closes with a message', async ({ page, server }) => {
server.sendOnWebSocketConnection('incoming');
server.onceWebSocketConnection(ws => {
ws.send('incoming');
ws.on('message', () => ws.close(1003, 'closed by Playwright test-server'));
});
let socketClosed;
const socketClosePromise = new Promise(f => socketClosed = f);
const log = [];
@ -84,15 +87,12 @@ it('should filter out the close events when the server closes with a message', a
ws.on('close', () => { log.push('close'); socketClosed(); });
});
await page.evaluate(port => {
const ws = new WebSocket('ws://localhost:' + port + '/ws-emit-and-close');
ws.addEventListener('open', () => ws.send('outgoing'));
ws.addEventListener('message', () => { ws.close(); });
const ws = new WebSocket('ws://localhost:' + port + '/ws');
ws.addEventListener('message', () => ws.send('outgoing'));
(window as any).ws = ws;
}, server.PORT);
await socketClosePromise;
expect(log[0]).toBe('open');
expect(log[3]).toBe('close');
log.sort();
expect(log.join(':')).toBe('close:open:received<incoming>:sent<outgoing>');
expect(log).toEqual(['open', 'received<incoming>', 'sent<outgoing>', 'close']);
});
it('should pass self as argument to close event', async ({ page, server }) => {

View File

@ -75,7 +75,7 @@ class TestServer {
const pathname = url.parse(request.url).pathname;
if (pathname === '/ws-slow')
await new Promise(f => setTimeout(f, 2000));
if (!['/ws', '/ws-slow', '/ws-emit-and-close'].includes(pathname)) {
if (!['/ws', '/ws-slow'].includes(pathname)) {
socket.write('HTTP/1.1 400 Bad Request\r\n\r\n');
socket.destroy();
return;
@ -83,10 +83,6 @@ class TestServer {
this._wsServer.handleUpgrade(request, socket, head, ws => {
// Next emit is only for our internal 'connection' listeners.
this._wsServer.emit('connection', ws, request);
if (this._onWebSocketConnectionData !== undefined)
ws.send(this._onWebSocketConnectionData);
if (pathname === '/ws-emit-and-close')
ws.close(1003, 'closed by Playwright test-server');
});
});
this._server.listen(port);
@ -110,8 +106,6 @@ class TestServer {
this._gzipRoutes = new Set();
/** @type {!Map<string, !Promise>} */
this._requestSubscribers = new Map();
/** @type {string|undefined} */
this._onWebSocketConnectionData = undefined;
const cross_origin = loopback || '127.0.0.1';
const same_origin = loopback || 'localhost';
@ -341,7 +335,7 @@ class TestServer {
}
sendOnWebSocketConnection(data) {
this._onWebSocketConnectionData = data;
this.onceWebSocketConnection(ws => ws.send(data));
}
}