Skip to content

Commit a891309

Browse files
authored
Merge pull request #3882 from bobleer/bob/fix-visual-skin-browser-timeouts
test(visual-skin): give browser fixture launches room for cold starts
2 parents 2d7198b + e399e26 commit a891309

11 files changed

Lines changed: 48 additions & 39 deletions

‎src/web-ui/src/infrastructure/visual-skin/browser-fixture.test-support.ts‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ export function browserFixtureFlags(platform = process.platform, environment: {
66
return platform === 'linux' && environment.CI === 'true' ? ['--no-sandbox'] : [];
77
}
88

9+
/**
10+
* Budget for one headless Chromium launch. A cold start on a loaded hosted
11+
* runner (the full web UI suite runs in parallel) can exceed 20 s by itself.
12+
*/
13+
export const BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS = 60_000;
14+
15+
/** Budget for a test that launches the browser fixture and reads its output. */
16+
export const BROWSER_FIXTURE_TEST_TIMEOUT_MS = 90_000;
17+
918
/** Chromium subprocesses can still flush their profile after the launcher exits. */
1019
export async function cleanupBrowserFixture(directory: string): Promise<void> {
1120
await rm(directory, { recursive: true, force: true, maxRetries: 10, retryDelay: 200 });

‎src/web-ui/src/infrastructure/visual-skin/calendar-composition.test.tsx‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// @vitest-environment jsdom
2-
import { browserFixtureFlags, cleanupBrowserFixture } from './browser-fixture.test-support';
2+
import { BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, BROWSER_FIXTURE_TEST_TIMEOUT_MS, browserFixtureFlags, cleanupBrowserFixture } from './browser-fixture.test-support';
33
import React from 'react';
44
import { renderToStaticMarkup } from 'react-dom/server';
55
import { existsSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
@@ -76,7 +76,7 @@ it.skipIf(!browser).each([
7676
'--window-size=1000,1100', '--virtual-time-budget=200',
7777
`--user-data-dir=${resolve(scratch, 'profile')}`, `--screenshot=${screenshot}`,
7878
'--dump-dom', pathToFileURL(html).href,
79-
], { encoding: 'utf8', windowsHide: true, timeout: 20000, stdio: 'pipe' });
79+
], { encoding: 'utf8', windowsHide: true, timeout: BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, stdio: 'pipe' });
8080
const result = JSON.parse(output.match(/<pre id="result">(.*?)<\/pre>/s)![1]);
8181
expect(result.wrapped).toEqual(result.original);
8282
expect(result.skinned).toEqual(result.original);
@@ -99,4 +99,4 @@ it.skipIf(!browser).each([
9999
} finally {
100100
await cleanupBrowserFixture(scratch);
101101
}
102-
}, 30000);
102+
}, BROWSER_FIXTURE_TEST_TIMEOUT_MS);

‎src/web-ui/src/infrastructure/visual-skin/history-loading-paint.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { compile } from 'sass';
88
import { expect, it } from 'vitest';
99
import { VisualSkinPackageParser } from './parser';
1010
import { VisualSkinRuntime } from './runtime';
11-
import { browserFixtureFlags, cleanupBrowserFixture, rehostSkinImages } from './browser-fixture.test-support';
11+
import { BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, BROWSER_FIXTURE_TEST_TIMEOUT_MS, browserFixtureFlags, cleanupBrowserFixture, rehostSkinImages } from './browser-fixture.test-support';
1212
import type { VisualSkinPackage } from './types';
1313

1414
const browser = process.env.OPENBITFUN_TEST_BROWSER ?? ['C:/Program Files/Google/Chrome/Application/chrome.exe', '/usr/bin/chromium'].find(existsSync);
@@ -60,7 +60,7 @@ it.skipIf(!browser)('reveals chat artwork while loading, preserving opaque defau
6060
document.getElementById('result').textContent=JSON.stringify(results);
6161
</script></body>`;
6262
const file = resolve(scratch, 'history.html'); writeFileSync(file, html);
63-
const output = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new', '--disable-gpu', '--no-first-run', `--user-data-dir=${resolve(scratch, 'profile')}`, '--dump-dom', pathToFileURL(file).href], { windowsHide: true, encoding: 'utf8', timeout: 20000, stdio: 'pipe' });
63+
const output = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new', '--disable-gpu', '--no-first-run', `--user-data-dir=${resolve(scratch, 'profile')}`, '--dump-dom', pathToFileURL(file).href], { windowsHide: true, encoding: 'utf8', timeout: BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, stdio: 'pipe' });
6464
const results = JSON.parse(output.match(/<pre id="result">(.*?)<\/pre>/s)![1]);
6565
expect(results).toHaveLength(cases.length);
6666
for (const result of results) {
@@ -75,4 +75,4 @@ it.skipIf(!browser)('reveals chat artwork while loading, preserving opaque defau
7575
document.documentElement.removeAttribute('data-color-scheme');
7676
await cleanupBrowserFixture(scratch);
7777
}
78-
}, 30000);
78+
}, BROWSER_FIXTURE_TEST_TIMEOUT_MS);

‎src/web-ui/src/infrastructure/visual-skin/local-reading.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import sharp from 'sharp';
99
import { expect, it } from 'vitest';
1010
import { VisualSkinRuntime } from './runtime';
1111
import { VisualSkinPackageParser } from './parser';
12-
import { browserFixtureFlags, cleanupBrowserFixture, rehostSkinImages } from './browser-fixture.test-support';
12+
import { BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, BROWSER_FIXTURE_TEST_TIMEOUT_MS, browserFixtureFlags, cleanupBrowserFixture, rehostSkinImages } from './browser-fixture.test-support';
1313

1414
const browser = process.env.OPENBITFUN_TEST_BROWSER ?? ['C:/Program Files/Google/Chrome/Application/chrome.exe', '/usr/bin/chromium'].find(existsSync);
1515
it.skipIf(!browser).each(['light','dark'])('keeps artwork clear behind glyphs and applies the shadow without changing boxes in %s', async mode => {
@@ -35,7 +35,7 @@ it.skipIf(!browser).each(['light','dark'])('keeps artwork clear behind glyphs an
3535
document.documentElement.removeAttribute('data-openbitfun-skin-id');result.original=measure();document.documentElement.dataset.openbitfunSkinId='local';document.getElementById('result').textContent=JSON.stringify(result);
3636
</script></body></html>`);
3737
const args=[...browserFixtureFlags(), '--headless=new','--disable-gpu','--hide-scrollbars','--no-first-run',`--user-data-dir=${resolve(scratch,'profile')}`,'--window-size=500,400','--force-device-scale-factor=1','--virtual-time-budget=600',`--screenshot=${shot}`,'--dump-dom',pathToFileURL(file).href];
38-
const out=execFileSync(browser!,args,{encoding:'utf8',windowsHide:true,timeout:20000,stdio:'pipe'});
38+
const out=execFileSync(browser!,args,{encoding:'utf8',windowsHide:true,timeout: BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS,stdio:'pipe'});
3939
const result=JSON.parse(out.match(/<pre id="result">(.*?)<\/pre>/s)![1]);
4040
expect(result.before).toEqual(result.original);expect(result.selectedShadow).toBe('none');expect(result.outsideTarget).not.toBe('reader');
4141
const {data,info}=await sharp(readFileSync(shot)).removeAlpha().raw().toBuffer({resolveWithObject:true});
@@ -47,4 +47,4 @@ it.skipIf(!browser).each(['light','dark'])('keeps artwork clear behind glyphs an
4747
expect(pixel(93,110)).toEqual([200,40,80]); // no plate or box-shadow around the reader
4848
const glyphs=[];for(let y=80;y<100;y++)for(let x=100;x<220;x++)glyphs.push(pixel(x,y));expect(glyphs.some(p=>p.every(v=>v>230))).toBe(true);
4949
}finally{runtime.dispose();document.body.innerHTML='';document.head.querySelectorAll('style').forEach(n=>n.remove());document.documentElement.removeAttribute('data-color-scheme');await cleanupBrowserFixture(scratch);}
50-
},30000);
50+
}, BROWSER_FIXTURE_TEST_TIMEOUT_MS);

‎src/web-ui/src/infrastructure/visual-skin/materials.test.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { browserFixtureFlags, cleanupBrowserFixture } from './browser-fixture.test-support';
1+
import { BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, BROWSER_FIXTURE_TEST_TIMEOUT_MS, browserFixtureFlags, cleanupBrowserFixture } from './browser-fixture.test-support';
22
// @vitest-environment jsdom
33
import { existsSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
44
import { execFileSync } from 'node:child_process';
@@ -135,7 +135,7 @@ it.skipIf(!browser).each([
135135
}catch(error){document.getElementById('result').textContent=JSON.stringify({error:String(error),stack:error.stack});}})();
136136
</script></body></html>`);
137137
// Explicit input capabilities exercise both media-query branches on every host.
138-
const output = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new','--disable-gpu','--no-first-run',`--blink-settings=primaryPointerType=${pointer},primaryHoverType=${hover}`,`--user-data-dir=${resolve(scratch,'profile')}`,'--virtual-time-budget=500','--dump-dom',pathToFileURL(file).href], { windowsHide: true, encoding: 'utf8', timeout: 20000, stdio: 'pipe' });
138+
const output = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new','--disable-gpu','--no-first-run',`--blink-settings=primaryPointerType=${pointer},primaryHoverType=${hover}`,`--user-data-dir=${resolve(scratch,'profile')}`,'--virtual-time-budget=500','--dump-dom',pathToFileURL(file).href], { windowsHide: true, encoding: 'utf8', timeout: BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, stdio: 'pipe' });
139139
const encoded = output.match(/<pre id="result">(.*?)<\/pre>/s)![1];
140140
const results = JSON.parse(encoded);
141141
expect(Array.isArray(results), JSON.stringify(results)).toBe(true);
@@ -152,7 +152,7 @@ it.skipIf(!browser).each([
152152
else expect(results[index + 1].paint.item[2]).toBe(results[index].paint.item[2]);
153153
}
154154
} finally { await cleanupBrowserFixture(scratch); }
155-
}, 30000);
155+
}, BROWSER_FIXTURE_TEST_TIMEOUT_MS);
156156

157157
it.skipIf(!browser)('composes image alpha on the real Button paint layer without fading content or changing geometry', async () => {
158158
const published = await import(/* @vite-ignore */ pathToFileURL(resolve('../../design-system/packages/ui/dist/index.js')).href);
@@ -176,12 +176,12 @@ it.skipIf(!browser)('composes image alpha on the real Button paint layer without
176176
const track=document.querySelector('[data-openbitfun-part="track"]'),input=document.querySelector('input');result.checked=getComputedStyle(track).backgroundPosition;input.checked=false;result.unchecked=getComputedStyle(track).backgroundPosition;
177177
document.documentElement.removeAttribute('data-openbitfun-skin-id');result.original=measure();document.documentElement.setAttribute('data-openbitfun-skin-id','material');document.getElementById('result').textContent=JSON.stringify(result);
178178
</script></body></html>`);
179-
const output = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new','--disable-gpu','--hide-scrollbars','--no-first-run',`--user-data-dir=${resolve(scratch,'profile')}`,'--window-size=400,300','--force-device-scale-factor=1','--virtual-time-budget=500',`--screenshot=${screenshot}`,'--dump-dom',pathToFileURL(file).href], { windowsHide: true, encoding: 'utf8', timeout: 20000, stdio: 'pipe' });
179+
const output = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new','--disable-gpu','--hide-scrollbars','--no-first-run',`--user-data-dir=${resolve(scratch,'profile')}`,'--window-size=400,300','--force-device-scale-factor=1','--virtual-time-budget=500',`--screenshot=${screenshot}`,'--dump-dom',pathToFileURL(file).href], { windowsHide: true, encoding: 'utf8', timeout: BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, stdio: 'pipe' });
180180
const result = JSON.parse(output.match(/<pre id="result">(.*?)<\/pre>/s)![1]);
181181
expect(result.paint).toEqual(result.original); expect(result.opacity).toBe('1'); expect(result.textOpacity).toBe('1'); expect(result.textColor).toBe('rgb(204, 0, 0)'); expect(result.image).toContain('linear-gradient');
182182
expect(result.checked).toBe('60% 60%'); expect(result.unchecked).toBe('10% 10%');
183183
const { data, info } = await sharp(readFileSync(screenshot)).removeAlpha().raw().toBuffer({ resolveWithObject: true });
184184
const pixel = [...data.subarray((26 * info.width + 100) * info.channels, (26 * info.width + 100) * info.channels + 3)];
185185
pixel.forEach((value, i) => expect(Math.abs(value - [191,191,255][i]), JSON.stringify({pixel,result})).toBeLessThanOrEqual(2));
186186
} finally { await cleanupBrowserFixture(scratch); }
187-
}, 30000);
187+
}, BROWSER_FIXTURE_TEST_TIMEOUT_MS);

‎src/web-ui/src/infrastructure/visual-skin/paint.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// @vitest-environment jsdom
2-
import { browserFixtureFlags, cleanupBrowserFixture, rehostSkinImages } from './browser-fixture.test-support';
2+
import { BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, BROWSER_FIXTURE_TEST_TIMEOUT_MS, browserFixtureFlags, cleanupBrowserFixture, rehostSkinImages } from './browser-fixture.test-support';
33
import { readFileSync, existsSync, mkdtempSync, writeFileSync } from 'node:fs';
44
import { resolve } from 'node:path';
55
import { tmpdir } from 'node:os';
@@ -119,13 +119,13 @@ describe('skin paint ownership', () => {
119119
</script></body></html>`;
120120
const path = resolve(scratch, 'paint.html');
121121
writeFileSync(path, html);
122-
const output = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new', '--disable-gpu', '--no-first-run', '--disable-background-networking', '--disable-extensions', `--user-data-dir=${resolve(scratch, 'profile')}`, '--dump-dom', pathToFileURL(path).href], { windowsHide: true, encoding: 'utf8', timeout: 20000, stdio: 'pipe' });
122+
const output = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new', '--disable-gpu', '--no-first-run', '--disable-background-networking', '--disable-extensions', `--user-data-dir=${resolve(scratch, 'profile')}`, '--dump-dom', pathToFileURL(path).href], { windowsHide: true, encoding: 'utf8', timeout: BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, stdio: 'pipe' });
123123
const result = JSON.parse(output.match(/<pre id="result">(.*?)<\/pre>/s)![1]);
124124
const canvas = 'rgba(0, 0, 0, 0)';
125125
expect(result).toEqual({ editor:'rgb(243, 237, 225)', monaco:canvas, group:canvas, widget:'rgb(10, 20, 30)', other:'rgb(10, 20, 30)', position:'absolute', zIndex:'7', backdrop:'auto', scrim:'auto', filter:owner === 'local' ? 'none' : 'blur(8px)', transcript:owner === 'local' ? canvas : 'rgb(10, 20, 30)',card:'rgb(10, 20, 30)',restored:'rgba(0, 0, 0, 0)' });
126126
} finally {
127127
await runtime.remove('paint');
128128
await cleanupBrowserFixture(scratch);
129129
}
130-
}, 30000);
130+
}, BROWSER_FIXTURE_TEST_TIMEOUT_MS);
131131
});

‎src/web-ui/src/infrastructure/visual-skin/presentation.test.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// @vitest-environment jsdom
2-
import { browserFixtureFlags, cleanupBrowserFixture, rehostSkinImages } from './browser-fixture.test-support';
2+
import { BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, BROWSER_FIXTURE_TEST_TIMEOUT_MS, browserFixtureFlags, cleanupBrowserFixture, rehostSkinImages } from './browser-fixture.test-support';
33
import { existsSync, mkdtempSync, writeFileSync } from 'node:fs';
44
import { execFileSync } from 'node:child_process';
55
import { resolve } from 'node:path';
@@ -72,14 +72,14 @@ it.skipIf(!browser).each([1000, 700])('keeps the real welcome brand centered wit
7272
document.getElementById('result').textContent=JSON.stringify({active,after:{x:after.x,y:after.y,width:after.width,height:after.height},background,logo:document.querySelector('.welcome-scene__logo').getBoundingClientRect().width,brand:document.getElementById('welcome-scene-title').textContent,heading:document.getElementById(root.getAttribute('aria-labelledby')).tagName});
7373
</script></body></html>`;
7474
const file=resolve(scratch,'welcome.html');writeFileSync(file,html);
75-
const output=execFileSync(browser!,[...browserFixtureFlags(), '--headless=new','--disable-gpu','--no-first-run',`--user-data-dir=${resolve(scratch,'profile')}`,'--dump-dom',pathToFileURL(file).href],{windowsHide:true,encoding:'utf8',timeout:20000,stdio:'pipe'});
75+
const output=execFileSync(browser!,[...browserFixtureFlags(), '--headless=new','--disable-gpu','--no-first-run',`--user-data-dir=${resolve(scratch,'profile')}`,'--dump-dom',pathToFileURL(file).href],{windowsHide:true,encoding:'utf8',timeout: BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS,stdio:'pipe'});
7676
const result=JSON.parse(output.match(/<pre id="result">(.*?)<\/pre>/s)![1]);
7777
expect(result.heading).toBe('H1');expect(result.brand).toContain('OpenBitFun');expect(result.logo).toBe(56);
7878
expect(result.background).toBe('rgba(0, 0, 0, 0)');expect(result.active).toEqual(result.after);
7979
expect(result.active.x+result.active.width/2).toBeCloseTo(width/2,0);
8080
expect(result.active.y).toBeLessThan(300);expect(result.active.y).toBeGreaterThan(100);
8181
} finally { await cleanupBrowserFixture(scratch); }
82-
},30000);
82+
}, BROWSER_FIXTURE_TEST_TIMEOUT_MS);
8383

8484

8585
it.skipIf(!browser)('retains readable settings, tables and overlays when a hidden welcome remains mounted', async () => {
@@ -94,8 +94,8 @@ it.skipIf(!browser)('retains readable settings, tables and overlays when a hidde
9494
document.getElementById('viewport').setAttribute('data-openbitfun-state','empty');result.landing=style('frame');result.landingToolbar=style('toolbar');document.getElementById('viewport').removeAttribute('data-openbitfun-state');result.restored=style('frame');document.getElementById('result').textContent=JSON.stringify(result);
9595
</script></body></html>`;
9696
const file=resolve(scratch,'reading.html');writeFileSync(file,html);
97-
const output=execFileSync(browser!,[...browserFixtureFlags(), '--headless=new','--disable-gpu','--no-first-run',`--user-data-dir=${resolve(scratch,'profile')}`,'--dump-dom',pathToFileURL(file).href],{windowsHide:true,encoding:'utf8',timeout:20000,stdio:'pipe'});
97+
const output=execFileSync(browser!,[...browserFixtureFlags(), '--headless=new','--disable-gpu','--no-first-run',`--user-data-dir=${resolve(scratch,'profile')}`,'--dump-dom',pathToFileURL(file).href],{windowsHide:true,encoding:'utf8',timeout: BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS,stdio:'pipe'});
9898
const result=JSON.parse(output.match(/<pre id="result">(.*?)<\/pre>/s)![1]);
9999
expect(result).toEqual({frame:'rgb(250, 246, 235)',viewport:'rgb(250, 246, 235)',toolbar:'rgb(232, 220, 196)',card:'rgb(255, 252, 243)',menu:'rgb(255, 252, 243)',landing:'rgba(0, 0, 0, 0)',landingToolbar:'rgba(0, 0, 0, 0)',restored:'rgb(250, 246, 235)'});
100100
} finally { runtime.dispose();await cleanupBrowserFixture(scratch); }
101-
},30000);
101+
}, BROWSER_FIXTURE_TEST_TIMEOUT_MS);

‎src/web-ui/src/infrastructure/visual-skin/reading-surfaces.test.tsx‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// @vitest-environment jsdom
2-
import { browserFixtureFlags, cleanupBrowserFixture } from './browser-fixture.test-support';
2+
import { BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS, BROWSER_FIXTURE_TEST_TIMEOUT_MS, browserFixtureFlags, cleanupBrowserFixture } from './browser-fixture.test-support';
33
import React, { act } from 'react';
44
import { createRoot } from 'react-dom/client';
55
import { renderToStaticMarkup } from 'react-dom/server';
@@ -78,7 +78,7 @@ it.skipIf(!browser).each(['light','dark'])('protects real settings, skill and ca
7878
document.documentElement.removeAttribute('data-openbitfun-skin-id');
7979
document.getElementById('result').textContent=JSON.stringify({restingMaterial,focusedMaterial,toolbarColor,calendarPlanes,headingPlates,headingColor,shadow,before,after:targets.map(measure),paints,gap,disabled:targets.map(e=>getComputedStyle(e,'::before').content)});
8080
</script></body></html>`);
81-
const out = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new','--disable-gpu','--no-first-run',`--user-data-dir=${resolve(scratch,'profile')}`,'--virtual-time-budget=200','--dump-dom',pathToFileURL(html).href], {encoding:'utf8',windowsHide:true,timeout:20000,stdio:'pipe'});
81+
const out = execFileSync(browser!, [...browserFixtureFlags(), '--headless=new','--disable-gpu','--no-first-run',`--user-data-dir=${resolve(scratch,'profile')}`,'--virtual-time-budget=200','--dump-dom',pathToFileURL(html).href], {encoding:'utf8',windowsHide:true,timeout: BROWSER_FIXTURE_LAUNCH_TIMEOUT_MS,stdio:'pipe'});
8282
const result=JSON.parse(out.match(/<pre id="result">(.*?)<\/pre>/s)![1]);
8383
expect(result.calendarPlanes).toEqual(['openbitfun-todos__calendar-body']);
8484
expect(result.paints.length).toBeGreaterThan(0);
@@ -92,4 +92,4 @@ it.skipIf(!browser).each(['light','dark'])('protects real settings, skill and ca
9292
expect(result.headingColor).toBe('rgb(23, 37, 52)');expect(result.shadow).toContain('2px');
9393
expect(result.disabled.every((content:string)=>['none','normal'].includes(content))).toBe(true);
9494
} finally { await cleanupBrowserFixture(scratch); }
95-
}, 30000);
95+
}, BROWSER_FIXTURE_TEST_TIMEOUT_MS);

0 commit comments

Comments
 (0)