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.
This commit is contained in:
Ross Wollman 2022-07-11 13:56:38 -07:00 committed by GitHub
parent 3a9b29f46c
commit 2ee235ff1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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'),
]);