diff --git a/tests/web-socket.spec.ts b/tests/web-socket.spec.ts index 3286373171..982ebbf5e3 100644 --- a/tests/web-socket.spec.ts +++ b/tests/web-socket.spec.ts @@ -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:sent'); + expect(log).toEqual(['open', 'sent', 'received', '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:sent'); + expect(log).toEqual(['open', 'received', 'sent', 'close']); }); it('should pass self as argument to close event', async ({ page, server }) => { diff --git a/utils/testserver/index.js b/utils/testserver/index.js index 353e3aa763..408857062e 100644 --- a/utils/testserver/index.js +++ b/utils/testserver/index.js @@ -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} */ 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)); } }