From 2ee235ff1bbcd162f68808902b761091e28da109 Mon Sep 17 00:00:00 2001 From: Ross Wollman Date: Mon, 11 Jul 2022 13:56:38 -0700 Subject: [PATCH] test: fix flaky SW tests (#15536) The Service Worker tests had some races in them that only were apparent on the bots. To repro, I ran the tests with: ``` xvfb-run taskset -c 0 npm run ctest -- chromium.spec.ts --headed --reporter=line --repeat-each 10 --workers=1 ``` Just because Playwright has a SW, does not mean the worker has fully loaded it's main/import scripts. --- tests/library/chromium/chromium.spec.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/library/chromium/chromium.spec.ts b/tests/library/chromium/chromium.spec.ts index 6be7bd3e84..2960c9b12c 100644 --- a/tests/library/chromium/chromium.spec.ts +++ b/tests/library/chromium/chromium.spec.ts @@ -47,10 +47,7 @@ test('serviceWorker(), and fromServiceWorker() work', async ({ context, page, se context.waitForEvent('request', r => r.url().endsWith('/request-from-within-worker.txt')), page.goto(server.PREFIX + '/serviceworkers/fetch/sw.html') ]); - const [inner] = await Promise.all([ - context.waitForEvent('request', r => r.url().endsWith('/inner.txt')), - page.evaluate(() => fetch('/inner.txt')), - ]); + expect(html.frame()).toBeTruthy(); expect(html.serviceWorker()).toBe(null); expect((await html.response()).fromServiceWorker()).toBe(false); @@ -59,10 +56,6 @@ test('serviceWorker(), and fromServiceWorker() work', async ({ context, page, se expect(main.serviceWorker()).toBe(worker); expect((await main.response()).fromServiceWorker()).toBe(false); - expect(inner.frame()).toBeTruthy(); - expect(inner.serviceWorker()).toBe(null); - expect((await inner.response()).fromServiceWorker()).toBe(true); - expect(inWorker.frame).toThrow(); expect(inWorker.serviceWorker()).toBe(worker); expect((await inWorker.response()).fromServiceWorker()).toBe(false); @@ -101,6 +94,7 @@ test('should intercept service worker requests (main and within)', async ({ cont const [ sw ] = await Promise.all([ context.waitForEvent('serviceworker'), + context.waitForEvent('response', r => r.url().endsWith('/request-from-within-worker')), context.waitForEvent('request', r => r.url().endsWith('sw.js') && !!r.serviceWorker()), context.waitForEvent('response', r => r.url().endsWith('sw.js') && !r.fromServiceWorker()), page.goto(server.PREFIX + '/serviceworkers/empty/sw.html'), @@ -160,6 +154,7 @@ test('should intercept service worker importScripts', async ({ context, page, se const [ sw ] = await Promise.all([ context.waitForEvent('serviceworker'), + context.waitForEvent('response', r => r.url().endsWith('/import.js')), page.goto(server.PREFIX + '/serviceworkers/empty/sw.html'), ]); @@ -194,6 +189,7 @@ test('should report intercepted service worker requests in HAR', async ({ pageWi const [ sw ] = await Promise.all([ context.waitForEvent('serviceworker'), + context.waitForEvent('response', r => r.url().endsWith('/request-from-within-worker')), page.goto(server.PREFIX + '/serviceworkers/empty/sw.html'), ]);