Final review fixes for the per-worker test servers (#274): - A failed test gets the stderr its server wrote during that test attached as `server-stderr`, so an aiohttp traceback behind a 500 reaches the CI report. The launcher keeps the newest 256 KB with a stream position per test (stderrMark/stderrSince), and the fixture attaches it only when the test did not end as expected. - The port announcement counts only as a complete line; a chunk ending mid-number was read as a shorter port. - server.py --exit-on-stdin-eof shuts down gracefully (database closed, temp root removed) when stdin closes. The launcher holds that pipe, so a SIGKILLed worker leaves no server behind, on every OS. - settled() gives up after 600 frames with the observation stats instead of hanging to the test timeout. - The Classic text-sync test waits for the page's 50 ms timer to install serializeValue instead of sleeping 60 ms. With that timer run 100 ms late (a scratch copy), the old wait failed 20/20 and the poll passed 20/20; the spec passed 240/240 at 8 workers x10 and 240/240 at 1 CPU with 4 workers. - The workflow test checks each npm cache key names its job's pinned image tag. Every new unit test failed before its change (missing export, the old regex timing out on the split announcement, an unknown server flag, a hung settle, a mismatched cache key).
34 lines
1.5 KiB
JavaScript
34 lines
1.5 KiB
JavaScript
// Shared `test` for the page workflows: every Playwright worker owns one
|
|
// tests/browser/server.py process on a port the OS chose for it, with its own temp root
|
|
// and database. `baseURL` (and so `page`, `request` and `browser.newContext`)
|
|
// points at that worker's server. A server that dies fails the running test
|
|
// with its stderr tail, and the next test in the worker gets a fresh server.
|
|
// A test that fails gets the stderr its server wrote during it attached as
|
|
// `server-stderr`.
|
|
import { test as base, expect } from '../../tools/vendor/node_modules/@playwright/test/index.mjs';
|
|
import { attachServerStderr, createServerSupervisor, startBrowserServer } from '../../tools/vendor/start-browser-server.mjs';
|
|
|
|
const SERVER_FIXTURE_TIMEOUT_MS = 90_000;
|
|
|
|
export const test = base.extend({
|
|
testServer: [async ({}, use) => {
|
|
const supervisor = createServerSupervisor({ start: () => startBrowserServer() });
|
|
try {
|
|
await use(supervisor);
|
|
} finally {
|
|
await supervisor.stop();
|
|
}
|
|
}, { scope: 'worker', timeout: SERVER_FIXTURE_TIMEOUT_MS }],
|
|
workerServer: [async ({ testServer }, use, testInfo) => {
|
|
const server = await testServer.ensure();
|
|
const mark = server.stderrMark();
|
|
await use(server);
|
|
await attachServerStderr(testInfo, server, mark);
|
|
const crash = testServer.crash(server);
|
|
if (crash) throw crash;
|
|
}, { auto: true, timeout: SERVER_FIXTURE_TIMEOUT_MS }],
|
|
baseURL: async ({ workerServer }, use) => use(workerServer.url),
|
|
});
|
|
|
|
export { expect };
|