test: make e2e error attribution total, and fix the README canary text
All checks were successful
check / check (push) Successful in 19s
All checks were successful
check / check (push) Successful in 19s
The error collector had a window API (mark/since) and twice a record fell outside somebody's window and was silently dropped, producing a green run that proved nothing: first the mark started after test 1, discarding everything recorded during launch; then the tail after the final test was never read at all, so a request escaping the fixtures at the end of the last test reported 5/5 passed and exit 0. Rather than patch a second boundary and invite a third, the window concept is gone. ErrorCollector exposes only take(), which always drains everything outstanding, so successive takes partition the whole record stream with no gaps, and seal(), which closes the stream at the end of the run and routes stragglers straight to a failure. Attribution is total by construction: launch through test 1 goes to test 1, each subsequent interval to the test that ends it, the tail to the suite. The tail also needs to exist before it can be drained. A request a test fires without awaiting reaches the route handler about 10ms after that test's function resolves, and closing the context does not wait for it, so with no window at all it died unobserved. The run now keeps collecting for a bounded 1.5s after the last test before teardown. Also: - README described a canary that was built, found to kill the service worker, and deleted. Replaced with what actually runs: the harness waits for the background worker's own startup blocklist fetch to reach the route handler and aborts if it does not. Documents --host-resolver-rules=MAP * ~NOTFOUND as defence in depth. - The canary's failure message asserted traffic was escaping to the real internet and blamed the -e flag. It cannot distinguish that from a lost startup race, so it now states what was observed and lists both causes. - E2E_TRACE_NETWORK was compared strictly to "1", so E2E_TRACE_NETWORK=true silently did nothing. Recognised on/off values are accepted and anything else is a hard error rather than a quiet default. - The measured margin that makes the canary sound is route install at 11-23ms against the worker fetch at 525-883ms, not the 30s timeout slack the comment cited.
This commit is contained in:
@@ -146,6 +146,33 @@ function handleRpc(route, postData, report) {
|
||||
return jsonResponse(route, Array.isArray(payload) ? replies : replies[0]);
|
||||
}
|
||||
|
||||
const TRACE_TRUE = ["1", "true", "yes", "on"];
|
||||
const TRACE_FALSE = ["", "0", "false", "no", "off"];
|
||||
|
||||
// Whether E2E_TRACE_NETWORK asks for the request trace.
|
||||
//
|
||||
// A set-but-unrecognised value is a hard error rather than a quiet
|
||||
// "off": E2E_TRACE_NETWORK=true asking for a trace and getting silence
|
||||
// is the operator being lied to about what the harness is doing, which
|
||||
// is the whole failure mode this suite exists to eliminate. Refusing to
|
||||
// guess costs one line and one obvious error message.
|
||||
function traceEnabled(raw) {
|
||||
if (raw === undefined || raw === null) return false;
|
||||
const v = String(raw).trim().toLowerCase();
|
||||
if (TRACE_TRUE.includes(v)) return true;
|
||||
if (TRACE_FALSE.includes(v)) return false;
|
||||
throw new Error(
|
||||
"E2E_TRACE_NETWORK is set to " +
|
||||
JSON.stringify(String(raw)) +
|
||||
", which is not a recognised on/off value. Use one of " +
|
||||
TRACE_TRUE.join(", ") +
|
||||
" to enable the request trace, or one of " +
|
||||
TRACE_FALSE.slice(1).join(", ") +
|
||||
" to disable it. Refusing to guess: a diagnostic that silently " +
|
||||
"does nothing is worse than one that is not there",
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Route every http(s) request through local fixtures.
|
||||
*
|
||||
@@ -174,7 +201,7 @@ async function installNetworkStubs(ctx, opts) {
|
||||
// showing up with an [sw] tag is the proof that the worker really is
|
||||
// intercepted and that the raw.githubusercontent.com stub below is
|
||||
// live code rather than decoration.
|
||||
const trace = process.env.E2E_TRACE_NETWORK === "1";
|
||||
const trace = traceEnabled(process.env.E2E_TRACE_NETWORK);
|
||||
|
||||
// Regex rather than a glob so chrome-extension:// resource loads are
|
||||
// never touched — routing those would break the popup itself.
|
||||
|
||||
Reference in New Issue
Block a user