aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/tests/harness/scroll_probe.py
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-09-08 13:21:02 +0200
committerChristophe Besson <cbesson@gmail.com>2026-09-08 13:21:02 +0200
commit79520f5f2f9a38ef719fca4dc0f95b001b477e38 (patch)
treebff43acf1903aeea806a3e983f4be6f29cd2372a /packages/meshbay-hub/tests/harness/scroll_probe.py
parentbb8aad22c4d41dd1b89c85c8d46878a31a9530e5 (diff)
downloadmeshbay-79520f5f2f9a38ef719fca4dc0f95b001b477e38.tar.gz
test(hub): stop the Chrome profile cleanup racing its own children
`terminate()` signals the parent only. Chrome's zygote, renderer and gpu children outlive it by a moment and go on writing into the profile, so rmtree walked a directory that gained a file between its readdir and its rmdir and raised "Directory not empty". The probe exited non-zero, and every test in the file errored at setup — intermittently, roughly one run in three, for a reason nowhere near the chat code they were testing. TemporaryDirectory(ignore_cleanup_errors=True) in all four probes that own a profile: a few bytes left in a throwaway directory are harmless, failing the run is not. `proc.wait()` after `kill()` was also missing — a killed process still has to be reaped. layout_probe.py never cleaned up at all (mkdtemp, no removal) and never waited for Chrome; it leaked a profile into /tmp on every run. Ten consecutive runs of test_chat_send.py are clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HCGdheDLxGReuKHga3BtST
Diffstat (limited to 'packages/meshbay-hub/tests/harness/scroll_probe.py')
-rw-r--r--packages/meshbay-hub/tests/harness/scroll_probe.py10
1 files changed, 9 insertions, 1 deletions
diff --git a/packages/meshbay-hub/tests/harness/scroll_probe.py b/packages/meshbay-hub/tests/harness/scroll_probe.py
index 46d8357..ae407b8 100644
--- a/packages/meshbay-hub/tests/harness/scroll_probe.py
+++ b/packages/meshbay-hub/tests/harness/scroll_probe.py
@@ -151,7 +151,15 @@ class H(http.server.BaseHTTPRequestHandler):
def main() -> int:
with socketserver.TCPServer(("127.0.0.1", PORT), H) as srv:
threading.Thread(target=srv.serve_forever, daemon=True).start()
- with tempfile.TemporaryDirectory() as profile:
+ # ignore_cleanup_errors: Chrome's children (zygote, renderer, gpu)
+ # outlive terminate() on the parent by a moment and go on writing into
+ # the profile. rmtree then walks a directory that gains a file between
+ # its readdir and its rmdir and raises "Directory not empty" -- which
+ # failed the probe, which failed every test in the file, intermittently
+ # and for a reason nowhere near the chat code they were testing. A few
+ # bytes left in a throwaway profile are harmless; failing the run is not.
+ with tempfile.TemporaryDirectory(
+ ignore_cleanup_errors=True) as profile:
subprocess.run(
["google-chrome", "--headless", "--disable-gpu", "--no-sandbox",
f"--user-data-dir={profile}", "--window-size=1100,1300",