8000 Unexpected behavior wrt to zkapauthorizer in gridsync tahoe integration tests · Issue #46 · blaisep/private_facts · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
Unexpected behavior wrt to zkapauthorizer in gridsync tahoe integration tests #46
Open
@jwjacobson

Description

@jwjacobson

Without the zkapauthorizer fixture in conftest.py, 16/17 tests pass with one error:

jeff@konitz ~/private_facts  ✹gridsync_integration % uvr pytest private_facts -k integration
==================================================================================== test session starts =====================================================================================
platform linux -- Python 3.12.9, pytest-8.3.4, pluggy-1.5.0
rootdir: /home/jeff/private_facts/private_facts
configfile: pytest.ini
plugins: twisted-1.14.3, anyio-4.8.0
collected 52 items / 35 deselected / 17 selected                                                                                                                                             

private_facts/test/tahoe_integration_test.py ....E............                                                                                                                         [100%]

=========================================================================================== ERRORS ===========================================================================================
_______________________________________________________________________ ERROR at setup of test_no_html_in_server_error _______________________________________________________________________
file /home/jeff/private_facts/private_facts/test/tahoe_integration_test.py, line 64
  @ensureDeferred
  async def test_no_html_in_server_error(zkapauthorizer):
      try:
          # Attempting to create a directory using a `Tahoe` client that
          # is configured to use ZKAPAuthorizer against a `Tahoe` server
          # that is *not* configured to use ZKAPAuthorizer will fail with
          # a status code of 500 (possibly due to the mismatch in plugin
          # configurations between the client and the server -- or
          # possibly because the `Tahoe` client has no tokens yet?).
          # XXX: Maybe there's a better way to trigger a 500 error here?
          await zkapauthorizer.gateway.mkdir()
      except TahoeWebError as e:
          assert "status code 500:" in str(e) and "<!DOCTYPE html>" not in str(e)
E       fixture 'zkapauthorizer' not found
>       available fixtures: anyio_backend, anyio_backend_name, anyio_backend_options, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, fake_tahoe, monkeypatch, pytestconfig, reactor, record_property, record_testsuite_property, record_xml_attribute, recwarn, tahoe, tahoe_client, tahoe_factory, tahoe_server, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, twisted_greenlet
>       use 'pytest --fixtures [testpath]' for help on them.

/home/jeff/private_facts/private_facts/test/tahoe_integration_test.py:64
================================================================================== short test summary info ===================================================================================
ERROR private_facts/test/tahoe_integration_test.py::test_no_html_in_server_error
========================================================================= 16 passed, 35 deselected, 1 error in 4.82s =========================================================================

If the zkap authorizer is added, only 4/17 tests pass:

jeff@konitz ~/private_facts1 ↵  ✹gridsync_integration % uvr pytest private_facts -k integration
==================================================================================== test session starts =====================================================================================
platform linux -- Python 3.12.9, pytest-8.3.4, pluggy-1.5.0
rootdir: /home/jeff/private_facts/private_facts
configfile: pytest.ini
plugins: twisted-1.14.3, anyio-4.8.0
collected 52 items / 35 deselected / 17 selected                                                                                                                                             

private_facts/test/tahoe_integration_test.py ....FFFFFFFFFFFFFE                                                                                                                        [100%]

=========================================================================================== ERRORS ===========================================================================================
____________________________________________________________________ ERROR at teardown of test_apply_connection_settings _____________________________________________________________________
  + Exception Group Traceback (most recent call last):
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 341, in from_call
  |     result: TResult | None = func()
  |                              ^^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 242, in <lambda>
  |     lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
  |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
  |     return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
  |     return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall
  |     raise exception.with_traceback(exception.__traceback__)
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 122, in _multicall
  |     teardown.throw(exception)  # type: ignore[union-attr]
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/threadexception.py", line 97, in pytest_runtest_teardown
  |     yield from thread_exception_runtest_hook()
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
  |     yield
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 122, in _multicall
  |     teardown.throw(exception)  # type: ignore[union-attr]
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 100, in pytest_runtest_teardown
  |     yield from unraisable_exception_runtest_hook()
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
  |     yield
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 122, in _multicall
  |     teardown.throw(exception)  # type: ignore[union-attr]
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/logging.py", line 853, in pytest_runtest_teardown
  |     yield from self._runtest_for(item, "teardown")
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/logging.py", line 829, in _runtest_for
  |     yield
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 122, in _multicall
  |     teardown.throw(exception)  # type: ignore[union-attr]
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/capture.py", line 885, in pytest_runtest_teardown
  |     return (yield)
  |             ^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
  |     res = hook_impl.function(*args)
  |           ^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 189, in pytest_runtest_teardown
  |     item.session._setupstate.teardown_exact(nextitem)
  |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 557, in teardown_exact
  |     raise exceptions[0]
  | ExceptionGroup: errors while tearing down <Module tahoe_integration_test.py> (3 sub-exceptions)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 546, in teardown_exact
    |     fin()
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/fixtures.py", line 1032, in finish
    |     raise exceptions[0]
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/fixtures.py", line 1021, in finish
    |     fin()
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py", line 311, in finalizer
    |     _run_inline_callbacks(
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py", line 337, in _run_inline_callbacks
    |     raise RuntimeError("twisted reactor has stopped")
    | RuntimeError: twisted reactor has stopped
    +---------------- 2 ----------------
    | Traceback (most recent call last):
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 546, in teardown_exact
    |     fin()
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/fixtures.py", line 1032, in finish
    |     raise exceptions[0]
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/fixtures.py", line 1021, in finish
    |     fin()
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py", line 311, in finalizer
    |     _run_inline_callbacks(
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py", line 337, in _run_inline_callbacks
    |     raise RuntimeError("twisted reactor has stopped")
    | RuntimeError: twisted reactor has stopped
    +---------------- 3 ----------------
    | Traceback (most recent call last):
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 546, in teardown_exact
    |     fin()
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/fixtures.py", line 1032, in finish
    |     raise exceptions[0]
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/_pytest/fixtures.py", line 1021, in finish
    |     fin()
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py", line 311, in finalizer
    |     _run_inline_callbacks(
    |   File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py", line 337, in _run_inline_callbacks
    |     raise RuntimeError("twisted reactor has stopped")
    | RuntimeError: twisted reactor has stopped
    +------------------------------------
----------------------------------------------------------------------------------- Captured log teardown ------------------------------------------------------------------------------------
WARNING  root:watchdog_.py:55 Tried to stop Watchdog that wasn't started.
WARNING  root:supervisor.py:79 Tried to stop a supervised process that wasn't running
WARNING  root:watchdog_.py:55 Tried to stop Watchdog that wasn't started.
WARNING  root:supervisor.py:79 Tried to stop a supervised process that wasn't running
========================================================================================== FAILURES ==========================================================================================
________________________________________________________________________________ test_no_html_in_server_error ________________________________________________________________________________

pyfuncitem = <Function test_no_html_in_server_error>

Unhandled error in Deferred:

Traceback (most recent call last):
  File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/twisted/internet/defer.py", line 2017, in _inlineCallbacks
    result = context.run(gen.send, result)
  File "/home/jeff/private_facts/private_facts/test/conftest.py", line 92, in zkapauthorizer
    await client.stop()
  File "/home/jeff/private_facts/private_facts/src/gridsync/tahoe.py", line 479, in stop
    await self.supervisor.stop()
  File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/twisted/internet/defer.py", line 1191, in __iter__
    result.raiseException()
  File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/twisted/python/failure.py", line 455, in raiseException
    raise self.value.with_traceback(self.tb)
  File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/twisted/internet/defer.py", line 2013, in _inlineCallbacks
    result = context.run(
  File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/twisted/python/failure.py", line 467, in throwExceptionIntoGenerator
    return g.throw(self.value.with_traceback(self.tb))
  File "/home/jeff/private_facts/private_facts/src/gridsync/supervisor.py", line 84, in stop
    yield terminate(self._protocol, kill_after=5)
  File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/twisted/internet/defer.py", line 2017, in _inlineCallbacks
    result = context.run(gen.send, result)
  File "/home/jeff/private_facts/private_facts/src/gridsync/system.py", line 93, in terminate
    proc.transport.signalProcess("TERM")  # type:ignore
  File "/home/jeff/private_facts/.venv/lib/python3.12/site-packages/twisted/internet/process.py", line 343, in signalProcess
    raise ProcessExitedAlready()
twisted.internet.error.ProcessExitedAlready: 

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:344: in _run_inline_callbacks
    blockon_default(d)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

d = <Deferred at 0x7b467d3bfb00 waiting on Deferred at 0x7b467d5bdc70>

    def blockon_default(d):
        current = greenlet.getcurrent()
        assert (
            current is not _instances.gr_twisted
        ), "blockon cannot be called from the twisted greenlet"
        result = []
    
        def cb(r):
            result.append(r)
            if greenlet.getcurrent() is not current:
                current.switch(result)
    
        d.addCallbacks(cb, cb)
        if not result:
            _result = _instances.gr_twisted.switch()
>           assert _result is result, "illegal switch in blockon"
E           AssertionError: illegal switch in blockon
E           assert None is []

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:104: AssertionError
------------------------------------------------------------------------------------- Captured log setup -------------------------------------------------------------------------------------
CRITICAL root:msg.py:63 Error starting Tahoe-LAFS gateway for nodedir: A critical error occurred when attempting to start the Tahoe-LAFS gateway for "nodedir". Gridsync will now exit.

Click "Show Details..." for more information. 'tahoe run' in '/tmp/pytest-of-jeff/pytest-11/tahoe_client1/nodedir'
running node in '/tmp/pytest-of-jeff/pytest-11/tahoe_client1/nodedir'
2025-05-24T00:33:05-0400 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 24.11.0 (/home/jeff/private_facts/.venv/bin/python 3.12.9) starting up.
2025-05-24T00:33:05-0400 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor.
Missing Plugin
The configuration requests a plugin:

    privatestorageio-zkapauthz-v2

...which cannot be found.
This typically means that some software hasn't been installed or the plugin couldn't be instantiated.

2025-05-24T00:33:05-0400 [twisted.internet.base#info] Main loop terminated.
2025-05-24T00:33:05-0400 [twisted.scripts._twistd_unix.UnixAppLogger#info] Server Shut Down.
___________________________________________________________________________________ test_upload_to_dircap ____________________________________________________________________________________

pyfuncitem = <Function test_upload_to_dircap>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>, args = (<Function test_upload_to_dircap>, <function test_upload_to_dircap at 0x7b467d6314e0>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
____________________________________________________________________________________ test_upload_mutable _____________________________________________________________________________________

pyfuncitem = <Function test_upload_mutable>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>, args = (<Function test_upload_mutable>, <function test_upload_mutable at 0x7b467d631580>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
_______________________________________________________________________________ test_upload_to_dircap_mutable ________________________________________________________________________________

pyfuncitem = <Function test_upload_to_dircap_mutable>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>, args = (<Function test_upload_to_dircap_mutable>, <function test_upload_to_dircap_mutable at 0x7b467d631620>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E             
9864
  RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
________________________________________________________________________ test_upload_to_dircap_mutable_uses_same_cap _________________________________________________________________________

pyfuncitem = <Function test_upload_to_dircap_mutable_uses_same_cap>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>
args = (<Function test_upload_to_dircap_mutable_uses_same_cap>, <function test_upload_to_dircap_mutable_uses_same_cap at 0x7b467d6316c0>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
__________________________________________________________________________________________ test_ls ___________________________________________________________________________________________

pyfuncitem = <Function test_ls>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>, args = (<Function test_ls>, <function test_ls at 0x7b467d631760>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
__________________________________________________________________________________ test_ls_exclude_dirnodes __________________________________________________________________________________

pyfuncitem = <Function test_ls_exclude_dirnodes>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>, args = (<Function test_ls_exclude_dirnodes>, <function test_ls_exclude_dirnodes at 0x7b467d631800>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
_________________________________________________________________________________ test_ls_exclude_filenodes __________________________________________________________________________________

pyfuncitem = <Function test_ls_exclude_filenodes>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>, args = (<Function test_ls_exclude_filenodes>, <function test_ls_exclude_filenodes at 0x7b467d6318a0>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
__________________________________________________________________________ test_ls_includes_most_authoritative_cap ___________________________________________________________________________

pyfuncitem = <Function test_ls_includes_most_authoritative_cap>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>
args = (<Function test_ls_includes_most_authoritative_cap>, <function test_ls_includes_most_authoritative_cap at 0x7b467d631940>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
__________________________________________________________________________________ test_ls_nonexistent_path __________________________________________________________________________________

pyfuncitem = <Function test_ls_nonexistent_path>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>, args = (<Function test_ls_nonexistent_path>, <function test_ls_nonexistent_path at 0x7b467d6319e0>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
________________________________________________________________________________________ test_get_cap ________________________________________________________________________________________

pyfuncitem = <Function test_get_cap>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>, args = (<Function test_get_cap>, <function test_get_cap at 0x7b467d631a80>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
_________________________________________________________________________ test_get_cap_returns_none_for_missing_path _________________________________________________________________________

pyfuncitem = <Function test_get_cap_returns_none_for_missing_path>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>
args = (<Function test_get_cap_returns_none_for_missing_path>, <function test_get_cap_returns_none_for_missing_path at 0x7b467d631b20>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
_______________________________________________________________________________ test_apply_connection_settings _______________________________________________________________________________

pyfuncitem = <Function test_apply_connection_settings>

    def pytest_pyfunc_call(pyfuncitem):
        """Interface to async test call handler."""
        # TODO: only handle 'our' tests?  what is the point of handling others?
        #       well, because our interface allowed people to return deferreds
        #       from arbitrary tests so we kinda have to keep this up for now
        maybe_hypothesis = getattr(pyfuncitem.obj, "hypothesis", None)
        if maybe_hypothesis is None:
>           _run_inline_callbacks(
                _async_pytest_pyfunc_call,
                pyfuncitem,
                pyfuncitem.obj,
                {}
            )

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:358: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

f = <function _async_pytest_pyfunc_call at 0x7b4684b29080>, args = (<Function test_apply_connection_settings>, <function test_apply_connection_settings at 0x7b467d631bc0>, {})

    def _run_inline_callbacks(f, *args):
        """Interface into Twisted greenlet to run and wait for a deferred."""
        if _instances.gr_twisted is not None:
            if _instances.gr_twisted.dead:
>               raise RuntimeError("twisted reactor has stopped")
E               RuntimeError: twisted reactor has stopped

.venv/lib/python3.12/site-packages/pytest_twisted/__init__.py:337: RuntimeError
================================================================================== short test summary info ===================================================================================
FAILED private_facts/test/tahoe_integration_test.py::test_no_html_in_server_error - AssertionError: illegal switch in blockon
FAILED private_facts/test/tahoe_integration_test.py::test_upload_to_dircap - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_upload_mutable - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_upload_to_dircap_mutable - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_upload_to_dircap_mutable_uses_same_cap - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_ls - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_ls_exclude_dirnodes - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_ls_exclude_filenodes - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_ls_includes_most_authoritative_cap - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_ls_nonexistent_path - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_get_cap - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_get_cap_returns_none_for_missing_path - RuntimeError: twisted reactor has stopped
FAILED private_facts/test/tahoe_integration_test.py::test_apply_connection_settings - RuntimeError: twisted reactor has stopped
ERROR private_facts/test/tahoe_integration_test.py::test_apply_connection_settings - ExceptionGroup: errors while tearing down <Module tahoe_integration_test.py> (3 sub-exceptions)
==================================================================== 13 failed, 4 passed, 35 deselected, 1 error in 5.08s ====================================================================

IIRC from talking to Chris, the solution might be to extricate zkapauthorizer entirely...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0