also looking at this
test: label native browser transport failures
#66
7 files
+177
-11
| @@ -0,0 +1,41 @@ | ||
| 1 | import assert from 'node:assert/strict' | |
| 2 | import { closeSync, openSync, writeSync } from 'node:fs' | |
| 3 | import { readFile } from 'node:fs/promises' | |
| 4 | import { basename, join } from 'node:path' | |
| 5 | import { startWorkspaceBrowser } from '../../helpers/workspace-browser' | |
| 6 | import { requestWorkspaceControl } from '../../helpers/workspace-control' | |
| 7 | ||
| 8 | const root = process.cwd(), mode = process.env.BROWSER_PEER_MODE | |
| 9 | assert(basename(root).startsWith('drone-incident-access-browser-operation-')) | |
| 10 | const unwritable = process.env.BROWSER_OPERATION_UNWRITABLE_DIAGNOSTIC === 'true' | |
| 11 | if (unwritable) { | |
| 12 | closeSync(2) | |
| 13 | assert.equal(openSync('/dev/null', 'r'), 2, 'Keep descriptor two reserved and read-only') | |
| 14 | assert.throws(() => writeSync(2, 'probe'), { code: 'EBADF' }) | |
| 15 | } | |
| 16 | let browser: Awaited<ReturnType<typeof startWorkspaceBrowser>> | undefined | |
| 17 | let caught: unknown | |
| 18 | const began = performance.now() | |
| 19 | try { | |
| 20 | browser = await startWorkspaceBrowser(root) | |
| 21 | if (mode?.startsWith('target-') || mode === 'page-socket') await browser.page('http://fixture.invalid/incidents') | |
| 22 | if (mode?.startsWith('control-')) { | |
| 23 | const port = (await readFile(join(root, 'browser-profile/DevToolsActivePort'), 'utf8')).split('\n')[0] | |
| 24 | const result = await requestWorkspaceControl({ url: `http://127.0.0.1:${port}`, control: 'synthetic-peer-control' }, 'status') | |
| 25 | assert.deepEqual(result, { ok: true }) | |
| 26 | } | |
| 27 | } | |
| 28 | catch (error) { caught = error } | |
| 29 | finally { await browser?.close() } | |
| 30 | if (unwritable) assert.throws(() => writeSync(2, 'probe'), { code: 'EBADF' }) | |
| 31 | if (mode === 'ok' || mode === 'control-ok') assert.equal(caught, undefined) | |
| 32 | else { | |
| 33 | assert(caught instanceof Error) | |
| 34 | if (mode?.endsWith('-socket')) { assert.equal(caught.name, 'Error'); assert.match(caught.message, /^Browser socket /) } | |
| 35 | else assert(['TimeoutError', 'AbortError'].includes(caught.name), 'Preserve the native abort exception instead of replacing it') | |
| 36 | assert(performance.now() - began >= 5000, 'Exercise the original five-second native fetch timeout') | |
| 37 | } | |
| 38 | const peer = Number(await readFile(join(root, 'peer.pid'), 'utf8')) | |
| 39 | assert(Number.isSafeInteger(peer) && peer > 1) | |
| 40 | assert.throws(() => process.kill(peer, 0), 'Owned peer must actually exit before files are removed') | |
| 41 | console.log(JSON.stringify({ oracle: 'browser-operation-peer-result', mode, nativeError: caught instanceof Error ? caught.name : null, elapsedMs: performance.now() - began, peerReaped: true })) | |