Three CI failures on ed809f7:
- Windows: server.py exited 1 on stdin EOF because create_app works with
the temp root as its cwd, and Windows cannot remove a process's cwd.
main() now restores the original cwd before the root is removed.
- Python 3.10 to 3.12: the lifetime test's cleanup called communicate()
after closing stdin, which flushes the closed pipe (ValueError); 3.13
tolerates it. It now waits and closes the pipes itself, and the exit
assertion shows the server's stderr. Under 3.12: errors=2 before, OK
after.
- Tooling (CI container): the SIGKILLed-worker tests treated an exited
server as alive, because the container's PID 1 does not reap orphans
and kill(pid, 0) succeeds on a zombie. Reproduced locally with docker
without --init (2 failed); a zombie now counts as exited (2 passed).
Final review fixes for the per-worker test servers (#274):
- A failed test gets the stderr its server wrote during that test
attached as `server-stderr`, so an aiohttp traceback behind a 500
reaches the CI report. The launcher keeps the newest 256 KB with a
stream position per test (stderrMark/stderrSince), and the fixture
attaches it only when the test did not end as expected.
- The port announcement counts only as a complete line; a chunk ending
mid-number was read as a shorter port.
- server.py --exit-on-stdin-eof shuts down gracefully (database closed,
temp root removed) when stdin closes. The launcher holds that pipe,
so a SIGKILLed worker leaves no server behind, on every OS.
- settled() gives up after 600 frames with the observation stats
instead of hanging to the test timeout.
- The Classic text-sync test waits for the page's 50 ms timer to
install serializeValue instead of sleeping 60 ms. With that timer run
100 ms late (a scratch copy), the old wait failed 20/20 and the poll
passed 20/20; the spec passed 240/240 at 8 workers x10 and 240/240
at 1 CPU with 4 workers.
- The workflow test checks each npm cache key names its job's pinned
image tag.
Every new unit test failed before its change (missing export, the old
regex timing out on the split announcement, an unknown server flag, a
hung settle, a mismatched cache key).