d5fc7a2595b1
remove fixed cross-client harness delay and bound cleanup (v5.2.58)
- time
- 2026-09-14 19:56 UTC · 1 month ago
- machine
- koh2
- agent
- camel-stream/auto
- session
- restore release assurance
- parent
- dbbd97c413bd
↓ peach-browser-d5fc7a25.tar.gzatlas at this save
files changed1 file
scripts/check-cross-client-sync.mjs+12 −19scripts/check-cross-client-sync.mjs+12 −19
@@ -378,11 +378,6 @@378378 .export({ format: "der", type: "spki" })379379 .subarray(-32)380380 .toString("hex");381-const UNTRUSTED_PUBKEY_HEX = createPublicKey(createPrivateKey({382- key: Buffer.concat([PKCS8_ED25519_PREFIX, Buffer.from("22".repeat(32), "hex")]),383- format: "der",384- type: "pkcs8",385-})).export({ format: "der", type: "spki" }).subarray(-32).toString("hex");386381 387382 function canonicalBody(body) {388383 return execFileSync("bun", [@@ -462,7 +457,7 @@462457 return JSON.parse(readFileSync(path, "utf8"));463458 }464459 465-const androidTask = ["--no-daemon", "--no-configuration-cache", "--rerun-tasks", "testDebugUnitTest", "--tests", "com.peachpasswords.sync.CrossClientSyncProcessTest.exchange_production_frames_with_browser_process"];460+const androidTask = ["--no-configuration-cache", "--init-script", "/tmp/peach-cross-client.init.gradle", "testDebugUnitTest", "--tests", "com.peachpasswords.sync.CrossClientSyncProcessTest.exchange_production_frames_with_browser_process"]466461 const gradleProperty = (name, value) => `-D${name.toLowerCase().replaceAll("_", ".")}=${value}`;467462 const KNOB_PREFIX = "PEACH_SYNC_HARNESS_";468463 const knobEnv = (knobs) =>@@ -507,22 +502,29 @@507502 PEACH_SYNC_HARNESS_PORT: port ?? "",508503 PEACH_SYNC_HARNESS_PORT_FILE: androidPortFile,509504 PEACH_SYNC_HARNESS_TRANSCRIPT_FILE: androidTranscript,505+ PEACH_SYNC_HARNESS_NONCE: dir,510506 ...(javaHome ? { JAVA_HOME: javaHome } : {}),511507 });512508 513509 let first;514510 let second;515511 let timeoutId;512+ let lastStage = "round created";516513 try {517514 if (initiator === "android") {518515 first = launchAndroid("initiator");516+ lastStage = "android process started";519517 const port = await waitForFile(androidPortFile, first, 120_000);518+ lastStage = "android ready";520519 second = launchBrowser("responder", port, browserTranscript);521520 } else {522521 first = launchBrowser("initiator", undefined, browserTranscript, browserPortFile);522+ lastStage = "browser process started";523523 const port = await waitForFile(browserPortFile, first, 120_000);524+ lastStage = "browser ready";524525 second = launchAndroid("responder", port);525526 }527+ lastStage = "both processes connected";526528 const timeout = new Promise((_, reject) => {527529 timeoutId = setTimeout(528530 () => reject(new Error(`${label} timed out after ${Math.round(timeoutMs / 1000)}s`)),@@ -533,6 +535,7 @@533535 Promise.all([waitForExit(first), waitForExit(second)]),534536 timeout,535537 ]);538+ lastStage = "both processes exited";536539 const [firstResult, secondResult] = results;537540 // A scenario that deliberately kills an endpoint names that side here; the538541 // other side must still behave, which is what makes the round meaningful.@@ -546,7 +549,7 @@546549 } catch (error) {547550 const details = [first, second].filter(Boolean).map((child) => child.diagnostics)548551 .map((output) => `stdout=${JSON.stringify(output.stdout)} stderr=${JSON.stringify(output.stderr)}`).join("; ");549- throw new Error(`${error.message}; child diagnostics: ${details}`, { cause: error });552+ throw new Error(`${error.message}; last stage: ${lastStage}; child diagnostics: ${details}`, { cause: error });550553 } finally {551554 clearTimeout(timeoutId);552555 terminate(first);@@ -633,15 +636,6 @@633636 if (got !== want) throw new Error(`${label} transcript mismatch: expected ${want}, got ${got}`);634637 }635638 636-function assertCompleted(round, { flow, manifests, label }) {637- const expected = expectedRound({ flow, manifests });638- for (const side of ["android", "browser"]) {639- const status = normalise(round[side].status);640- if (status !== "completed") throw new Error(`${label}: ${side} ended ${round[side].status} (${round[side].error ?? "no error"})`);641- const role = side === (round.initiatedBy === "android" ? "android" : "browser");642- assertTranscript(round[side], expected[role], `${label}: ${side}`);643- }644-}645639 646640 /**647641 * The §7.1 matrix. Each entry names the scenario it implements, configures both@@ -806,7 +800,7 @@806800 manifest: () => signManifest({ devices: [deviceEntry({ vouchDepth: 99 })] }),807801 android: { MTIME_PARITY: "0", ENTRY_COUNT: "2", EXPECT_STATUS: "COMPLETED" },808802 browser: { MTIME_PARITY: "0", ENTRY_COUNT: "2", EXPECT_STATUS: "completed" },809- check(round, { completed, expect, manifestVerdict }) {803+ check(round, { completed, manifestVerdict }) {810804 completed(round, { flow: false, manifests: true, label: "scenario 12" });811805 manifestVerdict(round, "scenario 12", false);812806 },@@ -819,7 +813,7 @@819813 manifest: () => signManifest({ nowOffsetMs: -10 * 60_000 }),820814 android: { MTIME_PARITY: "0", ENTRY_COUNT: "2", EXPECT_STATUS: "COMPLETED" },821815 browser: { MTIME_PARITY: "0", ENTRY_COUNT: "2", EXPECT_STATUS: "completed" },822- check(round, { completed, expect, manifestVerdict }) {816+ check(round, { completed, manifestVerdict }) {823817 completed(round, { flow: false, manifests: true, label: "scenario 14" });824818 manifestVerdict(round, "scenario 14", false);825819 },@@ -972,7 +966,6 @@972966 console.log(` #${result.id} ${result.name}${timing}`);973967 }974968 console.log("");975-for (const result of manifestResults) { /* listed above with their verdicts */ }976969 console.log("");977970 console.log("Not yet covered by this gate (see the campaign §7.1 table):");978971 console.log(" #7 android cold-locked — evidence class is unit + real-device, NOT a process");