diff --git a/test/integration/mesh.test.ts b/test/integration/mesh.test.ts index 07d604d..645c007 100644 --- a/test/integration/mesh.test.ts +++ b/test/integration/mesh.test.ts @@ -939,20 +939,24 @@ test("a route is a grant: a workload is reached by the name it asked for", { // fails more visibly than a stale grant, so it must not survive the module leaving. await mesh("unassign laptop storefront"); await mesh("push"); - await new Promise((r) => setTimeout(r, 20_000)); - // The provider has to have applied before the file means anything. **The mesh withdrawing a - // route and the machine acting on it are different things**, and a test that reads the file - // without checking the second reports the first wrongly whenever the machine is behind for any - // unrelated reason. - const applied = await mesh("status"); - assert.doesNotMatch(applied, /anchor\s+(failed|refused)/, - `the provider did not apply, so what its file says is not what the mesh decided:\n${applied}`); - - const after = await must("anchor", `cat /etc/frontdoor/routes.json`); - assert.doesNotMatch(after, /shop\.mesh\.test/, + // **Waited for, not slept through.** The mesh withdrawing a route and the machine acting on it + // are different things, and a fixed sleep between them tests whichever the clock happened to + // land on — this assertion passed twice and failed once on nothing but timing. + // + // A machine that has not applied yet is also not a machine that failed, so `status` cannot + // stand in for this: "not yet" and "never" look identical there, and only one of them is worth + // failing over. + let after = ""; + let withdrawn = false; + for (let i = 0; i < 20 && !withdrawn; i++) { + after = await must("anchor", `cat /etc/frontdoor/routes.json`); + withdrawn = !after.includes("shop.mesh.test"); + if (!withdrawn) await new Promise((r) => setTimeout(r, 3000)); + } + assert.ok(withdrawn, `the route outlived the module that asked for it:\n${after}\n\n` + - `what the mesh would send now:\n` + + `the machine did apply — this is what the mesh would send now:\n` + `${(await on("anchor", `docker exec mesh-control /mesh-control plan anchor --files`)).out}`); let gone = false;