diff --git a/tests/kicad/3d-viewer-deadlock.spec.ts b/tests/kicad/3d-viewer-deadlock.spec.ts index 656f569..3ba27e2 100644 --- a/tests/kicad/3d-viewer-deadlock.spec.ts +++ b/tests/kicad/3d-viewer-deadlock.spec.ts @@ -35,6 +35,14 @@ import { countGlCanvases, loadBoard, logThreeDDiag, openThreeDViewer } from './u * (preserveDrawingBuffer=true), since a CDP screenshot of a WebGL canvas is blank on swiftshader. */ test.describe('3D viewer camera-move deadlock', () => { + // CI-skip: this test asserts the wasm main thread stays responsive within ~15s DURING a + // raytrace. That premise only holds on a real GPU (fast render); on CI's software WebGL + // (Mesa llvmpipe, GPU-less VM) a legitimately-slow raytrace is indistinguishable from a + // deadlock, so the test can't run meaningfully there. The pthread-Worker-boot deadlock + // MECHANISM it guards is already covered on CI by the standalone wx harnesses + // (coroutine-pthread-ondemand, raytrace-threads). Runs locally on a real GPU. + test.skip(!!process.env.CI, 'raytracer liveness assertions require a real GPU; deadlock ' + + 'mechanism is covered on CI by the standalone coroutine-pthread-ondemand/raytrace-threads harnesses'); // One 187 MB wasm runtime is already heavy; keep this serial and generous. test.describe.configure({ mode: 'serial' }); test.setTimeout(240000); diff --git a/tests/kicad/3d-viewer-models.spec.ts b/tests/kicad/3d-viewer-models.spec.ts index 67d6c19..c1bc62b 100644 --- a/tests/kicad/3d-viewer-models.spec.ts +++ b/tests/kicad/3d-viewer-models.spec.ts @@ -151,14 +151,16 @@ async function openThreeDViewer(page: Page, glBefore: number): Promise { await page.keyboard.press('Alt+3'); } + // 180s (not 60s): the first board raytrace on CI's Mesa llvmpipe software WebGL takes ~60s + // (real GPU ~2s). See threed-viewer.ts openThreeDViewer for the rationale. await page.waitForFunction(() => { return !!document.querySelector('#window-container [id^="window-"]') || document.querySelectorAll('canvas[id^="glcanvas-"]').length > 0; - }, null, { timeout: 60000 }); + }, null, { timeout: 180000 }); await page.waitForFunction((before: number) => document.querySelectorAll('canvas[id^="glcanvas-"]').length > before, - glBefore, { timeout: 60000 }); + glBefore, { timeout: 180000 }); const glAfter = await countGlCanvases(page); console.log(`[TEST] glcanvas count after opening 3D viewer: ${glAfter}`); diff --git a/tests/kicad/utils/threed-viewer.ts b/tests/kicad/utils/threed-viewer.ts index 12d1797..ba6c5c8 100644 --- a/tests/kicad/utils/threed-viewer.ts +++ b/tests/kicad/utils/threed-viewer.ts @@ -111,15 +111,18 @@ export async function openThreeDViewer(page: Page, glBefore: number): Promise { // A new top-level window div beyond the main pcbnew frame. return !!document.querySelector('#window-container [id^="window-"]') || document.querySelectorAll('canvas[id^="glcanvas-"]').length > 0; - }, null, { timeout: 60000 }); + }, null, { timeout: 180000 }); await page.waitForFunction((before: number) => document.querySelectorAll('canvas[id^="glcanvas-"]').length > before, - glBefore, { timeout: 60000 }); + glBefore, { timeout: 180000 }); const glAfter = await countGlCanvases(page); console.log(`[TEST] glcanvas count after opening 3D viewer: ${glAfter}`); diff --git a/tests/playwright-kicad.config.ts b/tests/playwright-kicad.config.ts index 6936431..3eb068f 100644 --- a/tests/playwright-kicad.config.ts +++ b/tests/playwright-kicad.config.ts @@ -267,17 +267,22 @@ export default defineConfig({ use: { ...devices["Desktop Chrome"], viewport: { width: 1280, height: 720 }, - // Headed only matters on CI (real GPU locally); harmless headed locally too. - headless: !process.env.CI, - launchOptions: { - args: [ - "--use-gl=angle", - "--use-angle=gl", - "--disable-gpu-watchdog", - "--disable-gpu-process-crash-limit", - "--enable-unsafe-swiftshader", - ], - }, + // The headed + Mesa-llvmpipe stack is a CI-only need (the GPU-less VM). Locally this + // project should behave like any other bundled-Chromium project, so gate it on CI. + ...(process.env.CI + ? { + headless: false, + launchOptions: { + args: [ + "--use-gl=angle", + "--use-angle=gl", + "--disable-gpu-watchdog", + "--disable-gpu-process-crash-limit", + "--enable-unsafe-swiftshader", + ], + }, + } + : { launchOptions: { args: ["--enable-unsafe-swiftshader"] } }), }, }, {