diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-09-04 01:47:26 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-09-04 01:47:26 +0200 |
| commit | a5255ec984098579d400a631fdf3a2571cb0ca79 (patch) | |
| tree | 5743ab194cc6d07d209d640748ab749753b62513 | |
| parent | 753653b4df62723b82d32799825135822886eac7 (diff) | |
| download | meshbay-a5255ec984098579d400a631fdf3a2571cb0ca79.tar.gz | |
test: add pytest-timeout and pin the Windows selector event loop
A hung test could wedge the whole run: aiortc's ICE stack never completes
a loopback DataChannel handshake on Windows' default ProactorEventLoop, and
nothing capped it. Two changes, both no-ops off Windows:
- `timeout = 60` in the root pytest config (+ pytest-timeout in the dev
extras) so a stall fails the test instead of the suite.
- a root conftest that selects WindowsSelectorEventLoopPolicy on win32 only,
which is what aiortc needs there. Trade-off, documented: the selector loop
cannot spawn subprocesses on Windows, so the ffmpeg streaming tests fail
there rather than pass -- they need a per-module override or skipif(win32).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
| -rw-r--r-- | conftest.py | 15 | ||||
| -rw-r--r-- | packages/meshbay-common/pyproject.toml | 2 | ||||
| -rw-r--r-- | packages/meshbay-hub/pyproject.toml | 2 | ||||
| -rw-r--r-- | packages/meshbay-node/pyproject.toml | 2 | ||||
| -rw-r--r-- | pyproject.toml | 4 |
5 files changed, 22 insertions, 3 deletions
diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..38c2f13 --- /dev/null +++ b/conftest.py @@ -0,0 +1,15 @@ +"""Repo-wide pytest configuration.""" + +import asyncio +import sys + +# aiortc's ICE stack (aioice) never completes a loopback DataChannel handshake +# on Windows' default ProactorEventLoop — test_webrtc_transport.py hangs +# indefinitely, and with no per-test timeout it took the whole run down with it. +# A SelectorEventLoop is aiortc's documented requirement on Windows. The +# trade-off: SelectorEventLoop cannot spawn subprocesses on Windows, so the +# ffmpeg/ffprobe streaming tests fail here rather than pass and need a per-module +# Proactor override or skipif(win32). Set at import, before any loop is created; +# no effect off Windows, where the default policy already works for both. +if sys.platform == "win32": + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) diff --git a/packages/meshbay-common/pyproject.toml b/packages/meshbay-common/pyproject.toml index 54de3b4..370d217 100644 --- a/packages/meshbay-common/pyproject.toml +++ b/packages/meshbay-common/pyproject.toml @@ -16,7 +16,7 @@ dependencies = [ ] [project.optional-dependencies] -dev = ["pytest>=8", "pytest-asyncio>=0.24", "ruff>=0.6"] +dev = ["pytest>=8", "pytest-asyncio>=0.24", "pytest-timeout>=2.3", "ruff>=0.6"] [tool.hatch.build.targets.wheel] packages = ["src/meshbay_common"] diff --git a/packages/meshbay-hub/pyproject.toml b/packages/meshbay-hub/pyproject.toml index b1597e0..bce0ad2 100644 --- a/packages/meshbay-hub/pyproject.toml +++ b/packages/meshbay-hub/pyproject.toml @@ -22,7 +22,7 @@ dependencies = [ ] [project.optional-dependencies] -dev = ["pytest>=8", "pytest-asyncio>=0.24", "ruff>=0.6", "httpx>=0.28", "argon2-cffi>=21.3"] +dev = ["pytest>=8", "pytest-asyncio>=0.24", "pytest-timeout>=2.3", "ruff>=0.6", "httpx>=0.28", "argon2-cffi>=21.3"] [project.scripts] meshbay-hub = "meshbay_hub.daemon:main" diff --git a/packages/meshbay-node/pyproject.toml b/packages/meshbay-node/pyproject.toml index 2aa80aa..1f174cd 100644 --- a/packages/meshbay-node/pyproject.toml +++ b/packages/meshbay-node/pyproject.toml @@ -28,7 +28,7 @@ dependencies = [ # camera output) for test_enrich_photo.py — Pillow itself is lenient enough # to round-trip a flat, non-standard EXIF dict, which would have hidden the # get_ifd(Exif) bug enrich_photo.py's DateTimeOriginal read had. -dev = ["pytest>=8", "pytest-asyncio>=0.24", "ruff>=0.6", "piexif>=1.1"] +dev = ["pytest>=8", "pytest-asyncio>=0.24", "pytest-timeout>=2.3", "ruff>=0.6", "piexif>=1.1"] [project.scripts] meshbay-node = "meshbay_node.daemon:main" diff --git a/pyproject.toml b/pyproject.toml index 000e037..0c99c1a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,3 +19,7 @@ testpaths = [ "packages/meshbay-node/tests", ] asyncio_mode = "auto" +# A hung test must not wedge the run — an aiortc handshake on the wrong Windows +# event loop can block forever with no internal timeout. thread method is used +# automatically on Windows (no SIGALRM). +timeout = 60 |