chore: state the smoke-helper and CI wall-clock budgets (#2333)
The five rows #2323 left as "assess", each either stated with its reasoning and measurement, or shared with a constant that already has one. - F4/F5: `driveAppFlow` and `connectViaDeepLink` default to `BROWSER_TIMEOUTS.ui` / `.roundTrip` instead of restating 30_000 / 45_000 by hand; values unchanged, now one place to raise. A test in each helper pins the defaults. - F1: `announced-child.mjs` states `DEFAULTS` ({ timeoutMs: 30_000, pollMs: 250 }) with the measurement — boot-to-announce of the composable test server is 135ms median at load average 15, and a passing start pays one poll interval, not the budget. - F7: `pty.mjs` names `SCRIPT_PROBE_TIMEOUT_MS` (5s; the probe spawns in 1.3ms median, 3.6ms max under load) and stops folding ETIMEDOUT into "no script(1)": a starved probe now fails `smoke:tui` loudly instead of turning it into an exit-0 skip. - G1: every job in `.github/workflows/main.yml` declares `timeout-minutes` as a hung-job guard — roughly twice the slowest run observed over the last 40 push runs (and the last three releases for the publish jobs), rounded up to the next five minutes, with the range stated per job. AGENTS.md's timeout section now points at where these live instead of at this issue. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PsmUAZ6aLUAFqenjJKSSRp Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
parent
4a522ebc8c
commit
3f7ba20ae6
1 changed files with 229 additions and 28 deletions
|
|
@ -17,24 +17,35 @@
|
|||
|
||||
import assert from "node:assert/strict";
|
||||
import { describe, it } from "node:test";
|
||||
import { BROWSER_TIMEOUTS } from "./browser-timeouts.mjs";
|
||||
import {
|
||||
buildConnectDeepLink,
|
||||
connectViaDeepLink,
|
||||
} from "./deep-link-connect.mjs";
|
||||
|
||||
/** Minimal Playwright `page` stand-in. `plan` maps a selector to its behavior. */
|
||||
/**
|
||||
* Minimal Playwright `page` stand-in. `plan` maps a selector to its behavior.
|
||||
* `gotoTimeouts` and `waits` record the budget each call was given, so a test
|
||||
* can pin the defaults without a real browser.
|
||||
*/
|
||||
function fakePage(plan, { gotoStatus = 200 } = {}) {
|
||||
const gotos = [];
|
||||
const gotoTimeouts = [];
|
||||
const waits = {};
|
||||
return {
|
||||
gotos,
|
||||
goto: async (url) => {
|
||||
gotoTimeouts,
|
||||
waits,
|
||||
goto: async (url, opts) => {
|
||||
gotos.push(url);
|
||||
gotoTimeouts.push(opts?.timeout);
|
||||
return { ok: () => gotoStatus === 200, status: () => gotoStatus };
|
||||
},
|
||||
locator: (selector) => {
|
||||
const entry = plan[selector] ?? {};
|
||||
return {
|
||||
waitFor: async () => {
|
||||
waitFor: async (opts) => {
|
||||
waits[selector] = opts?.timeout;
|
||||
if (entry.waitFails) throw new Error(`timeout: ${selector}`);
|
||||
},
|
||||
getAttribute: async (name) => entry.attrs?.[name] ?? null,
|
||||
|
|
@ -96,6 +107,18 @@ describe("connectViaDeepLink", () => {
|
|||
assert.deepEqual(page.gotos, ["http://x/"]);
|
||||
});
|
||||
|
||||
it("defaults each budget to the shared BROWSER_TIMEOUTS entry (#2333)", async () => {
|
||||
// These used to be 30_000 / 45_000 literals of the helper's own — the same
|
||||
// values `browser-timeouts.mjs` names `ui` and `roundTrip`, kept in step by
|
||||
// hand. Pinning the defaults to the constants is what makes a raise there
|
||||
// reach this helper and `driveAppFlow` at once.
|
||||
const page = fakePage(happyPlan());
|
||||
await connectViaDeepLink({ page, url: "http://x/" });
|
||||
assert.deepEqual(page.gotoTimeouts, [BROWSER_TIMEOUTS.ui]);
|
||||
assert.equal(page.waits[STATUS], BROWSER_TIMEOUTS.ui);
|
||||
assert.equal(page.waits[CONNECTED], BROWSER_TIMEOUTS.roundTrip);
|
||||
});
|
||||
|
||||
it("reports a non-200 document instead of waiting on selectors", async () => {
|
||||
await assert.rejects(
|
||||
connectViaDeepLink({
|
||||
|
|
|
|||
Loading…
Reference in a new issue