diff --git a/tests/conftest.py b/tests/conftest.py index 3363cf5..8e9a67c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -29,7 +29,7 @@ def tractor_test(fn): If fixtures: - - ``arb_addr`` (a socket addr tuple where arbiter is listening) + - ``reg_addr`` (a socket addr tuple where arbiter is listening) - ``loglevel`` (logging level passed to tractor internals) - ``start_method`` (subprocess spawning backend) @@ -40,16 +40,16 @@ def tractor_test(fn): def wrapper( *args, loglevel=None, - arb_addr=None, + reg_addr=None, start_method=None, **kwargs ): # __tracebackhide__ = True - if 'arb_addr' in inspect.signature(fn).parameters: + if 'reg_addr' in inspect.signature(fn).parameters: # injects test suite fixture value to test as well # as `run()` - kwargs['arb_addr'] = arb_addr + kwargs['reg_addr'] = reg_addr if 'loglevel' in inspect.signature(fn).parameters: # allows test suites to define a 'loglevel' fixture @@ -71,7 +71,7 @@ def tractor_test(fn): async def _main(): async with tractor.open_root_actor( # **kwargs, - arbiter_addr=arb_addr, + registry_addrs=[reg_addr] if reg_addr else None, loglevel=loglevel, start_method=start_method, @@ -92,9 +92,6 @@ def tractor_test(fn): return wrapper -_arb_addr = '127.0.0.1', random.randint(1000, 9999) - - # Sending signal.SIGINT on subprocess fails on windows. Use CTRL_* alternatives if platform.system() == 'Windows': _KILL_SIGNAL = signal.CTRL_BREAK_EVENT @@ -173,9 +170,23 @@ def ci_env() -> bool: return _ci_env +# choose randomly at import time +_reg_addr: tuple[str, int] = ( + '127.0.0.1', + random.randint(1000, 9999), +) + + @pytest.fixture(scope='session') -def arb_addr(): - return _arb_addr +def reg_addr() -> tuple[str, int]: + + # globally override the runtime to the per-test-session-dynamic + # addr so that all tests never conflict with any other actor + # tree using the default. + from tractor import _root + _root._default_lo_addrs = [_reg_addr] + + return _reg_addr def pytest_generate_tests(metafunc): @@ -216,30 +227,35 @@ def sig_prog(proc, sig): def daemon( loglevel: str, testdir, - arb_addr: tuple[str, int], + reg_addr: tuple[str, int], ): ''' - Run a daemon actor as a "remote arbiter". + Run a daemon root actor as a separate actor-process tree and + "remote registrar" for discovery-protocol related tests. ''' if loglevel in ('trace', 'debug'): - # too much logging will lock up the subproc (smh) - loglevel = 'info' + # XXX: too much logging will lock up the subproc (smh) + loglevel: str = 'info' - cmdargs = [ - sys.executable, '-c', - "import tractor; tractor.run_daemon([], registry_addr={}, loglevel={})" - .format( - arb_addr, - "'{}'".format(loglevel) if loglevel else None) + code: str = ( + "import tractor; " + "tractor.run_daemon([], registry_addrs={reg_addrs}, loglevel={ll})" + ).format( + reg_addrs=str([reg_addr]), + ll="'{}'".format(loglevel) if loglevel else None, + ) + cmd: list[str] = [ + sys.executable, + '-c', code, ] - kwargs = dict() + kwargs = {} if platform.system() == 'Windows': # without this, tests hang on windows forever kwargs['creationflags'] = subprocess.CREATE_NEW_PROCESS_GROUP proc = testdir.popen( - cmdargs, + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs,