aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/tests/conftest.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/tests/conftest.py')
-rw-r--r--packages/meshbay-node/tests/conftest.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/packages/meshbay-node/tests/conftest.py b/packages/meshbay-node/tests/conftest.py
index 32c9b3d..545528b 100644
--- a/packages/meshbay-node/tests/conftest.py
+++ b/packages/meshbay-node/tests/conftest.py
@@ -1,9 +1,11 @@
"""Shared fixtures and helpers for node tests."""
+import asyncio
import sys
from pathlib import Path
import pytest
+import pytest_asyncio
from meshbay_node.roots import RootSet
# ffmpeg / ffprobe run via asyncio.create_subprocess_exec, which needs the
@@ -17,6 +19,35 @@ needs_subprocess = pytest.mark.skipif(
"SelectorEventLoop for aiortc",
)
+# The other way round, for a test that starts processes and has no two aiortc
+# ends in one process: on Windows it runs on the loop the daemon itself runs
+# on. The loop is chosen per test through pytest-asyncio's loop factories;
+# a version without them leaves the selector loop in place, where such a test
+# cannot run.
+_LOOP_FACTORIES = hasattr(
+ getattr(pytest_asyncio.plugin, "PytestAsyncioSpecs", None), "pytest_asyncio_loop_factories")
+on_the_daemons_loop = [
+ pytest.mark.daemon_loop,
+ pytest.mark.skipif(
+ sys.platform == "win32" and not _LOOP_FACTORIES,
+ reason="starts processes, which needs the ProactorEventLoop: asked for through "
+ "pytest-asyncio's loop factories, which this version does not have"),
+]
+
+
+def pytest_configure(config):
+ config.addinivalue_line(
+ "markers", "daemon_loop: on Windows, run on the event loop the daemon runs on")
+
+
+@pytest.hookimpl(optionalhook=True)
+def pytest_asyncio_loop_factories(config, item):
+ """The event loop of each async test here: the one it always had, except
+ for a test marked `daemon_loop` on Windows."""
+ if sys.platform == "win32" and item.get_closest_marker("daemon_loop"):
+ return {"proactor": asyncio.ProactorEventLoop}
+ return {"default": asyncio.new_event_loop}
+
@pytest.fixture(autouse=True)
def _no_log_file_in_the_developers_profile(monkeypatch):
"""A test that runs the daemon's entry point must not open its log file.