>>> py3-starlette: Building community/py3-starlette 0.37.2-r1 (using abuild 3.12.0-r5) started Sun, 14 Apr 2024 03:02:46 +0000 >>> py3-starlette: Checking sanity of /home/buildozer/aports/community/py3-starlette/APKBUILD... >>> py3-starlette: Analyzing dependencies... >>> py3-starlette: Installing for build: build-base py3-anyio py3-gpep517 py3-hatchling py3-installer py3-httpx py3-itsdangerous py3-jinja2 py3-pytest-forked py3-pytest-xdist py3-python-multipart py3-trio py3-typing-extensions py3-yaml (1/90) Installing libffi (3.4.6-r0) (2/90) Installing gdbm (1.23-r1) (3/90) Installing mpdecimal (4.0.0-r0) (4/90) Installing libpanelw (6.4_p20240330-r0) (5/90) Installing readline (8.2.10-r0) (6/90) Installing sqlite-libs (3.45.2-r0) (7/90) Installing python3 (3.12.3-r0) (8/90) Installing python3-pycache-pyc0 (3.12.3-r0) (9/90) Installing pyc (3.12.3-r0) (10/90) Installing py3-idna (3.7-r0) (11/90) Installing py3-idna-pyc (3.7-r0) (12/90) Installing py3-curio (1.6-r2) (13/90) Installing py3-curio-pyc (1.6-r2) (14/90) Installing py3-sniffio (1.3.1-r1) (15/90) Installing py3-sniffio-pyc (1.3.1-r1) (16/90) Installing py3-anyio-pyc (4.3.0-r2) (17/90) Installing python3-pyc (3.12.3-r0) (18/90) Installing py3-anyio (4.3.0-r2) (19/90) Installing py3-installer (0.7.0-r2) (20/90) Installing py3-installer-pyc (0.7.0-r2) (21/90) Installing py3-gpep517 (15-r2) (22/90) Installing py3-gpep517-pyc (15-r2) (23/90) Installing py3-editables (0.5-r2) (24/90) Installing py3-editables-pyc (0.5-r2) (25/90) Installing py3-parsing (3.1.2-r1) (26/90) Installing py3-parsing-pyc (3.1.2-r1) (27/90) Installing py3-packaging (24.0-r1) (28/90) Installing py3-packaging-pyc (24.0-r1) (29/90) Installing py3-pathspec (0.12.1-r2) (30/90) Installing py3-pathspec-pyc (0.12.1-r2) (31/90) Installing py3-pluggy (1.4.0-r1) (32/90) Installing py3-pluggy-pyc (1.4.0-r1) (33/90) Installing py3-trove-classifiers (2024.3.3-r2) (34/90) Installing py3-trove-classifiers-pyc (2024.3.3-r2) (35/90) Installing py3-hatchling (1.22.5-r1) (36/90) Installing py3-hatchling-pyc (1.22.5-r1) (37/90) Installing py3-certifi (2024.2.2-r1) (38/90) Installing py3-certifi-pyc (2024.2.2-r1) (39/90) Installing py3-h11 (0.14.0-r4) (40/90) Installing py3-h11-pyc (0.14.0-r4) (41/90) Installing py3-httpcore (1.0.4-r1) (42/90) Installing py3-httpcore-pyc (1.0.4-r1) (43/90) Installing py3-httpx (0.27.0-r1) (44/90) Installing py3-httpx-pyc (0.27.0-r1) (45/90) Installing py3-itsdangerous (2.1.2-r4) (46/90) Installing py3-itsdangerous-pyc (2.1.2-r4) (47/90) Installing py3-markupsafe (2.1.5-r1) (48/90) Installing py3-markupsafe-pyc (2.1.5-r1) (49/90) Installing py3-jinja2 (3.1.3-r1) (50/90) Installing py3-jinja2-pyc (3.1.3-r1) (51/90) Installing py3-iniconfig (2.0.0-r1) (52/90) Installing py3-iniconfig-pyc (2.0.0-r1) (53/90) Installing py3-py (1.11.0-r3) (54/90) Installing py3-py-pyc (1.11.0-r3) (55/90) Installing py3-pytest (8.1.1-r1) (56/90) Installing py3-pytest-pyc (8.1.1-r1) (57/90) Installing py3-pytest-forked (1.6.0-r2) (58/90) Installing py3-pytest-forked-pyc (1.6.0-r2) (59/90) Installing py3-apipkg (2.1.0-r3) (60/90) Installing py3-apipkg-pyc (2.1.0-r3) (61/90) Installing py3-execnet (1.9.0-r3) (62/90) Installing py3-execnet-pyc (1.9.0-r3) (63/90) Installing py3-pytest-xdist (3.5.0-r1) (64/90) Installing py3-pytest-xdist-pyc (3.5.0-r1) (65/90) Installing py3-python-multipart (0.0.9-r1) (66/90) Installing py3-python-multipart-pyc (0.0.9-r1) (67/90) Installing py3-attrs (23.2.0-r1) (68/90) Installing py3-attrs-pyc (23.2.0-r1) (69/90) Installing py3-async_generator (1.10-r6) (70/90) Installing py3-async_generator-pyc (1.10-r6) (71/90) Installing py3-cparser (2.22-r1) (72/90) Installing py3-cparser-pyc (2.22-r1) (73/90) Installing py3-cffi (1.16.0-r1) (74/90) Installing py3-cffi-pyc (1.16.0-r1) (75/90) Installing py3-cryptography (42.0.5-r1) (76/90) Installing py3-cryptography-pyc (42.0.5-r1) (77/90) Installing py3-openssl (24.1.0-r1) (78/90) Installing py3-openssl-pyc (24.1.0-r1) (79/90) Installing py3-outcome (1.3.0-r1) (80/90) Installing py3-outcome-pyc (1.3.0-r1) (81/90) Installing py3-sortedcontainers (2.4.0-r5) (82/90) Installing py3-sortedcontainers-pyc (2.4.0-r5) (83/90) Installing py3-trio (0.25.0-r1) (84/90) Installing py3-trio-pyc (0.25.0-r1) (85/90) Installing py3-typing-extensions (4.11.0-r1) (86/90) Installing py3-typing-extensions-pyc (4.11.0-r1) (87/90) Installing yaml (0.2.5-r2) (88/90) Installing py3-yaml (6.0.1-r3) (89/90) Installing py3-yaml-pyc (6.0.1-r3) (90/90) Installing .makedepends-py3-starlette (20240414.030248) Executing busybox-1.36.1-r25.trigger OK: 447 MiB in 203 packages >>> py3-starlette: Cleaning up srcdir >>> py3-starlette: Cleaning up pkgdir >>> py3-starlette: Cleaning up tmpdir >>> py3-starlette: Fetching https://distfiles.alpinelinux.org/distfiles/edge/py3-starlette-0.37.2.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 19 2779k 19 543k 0 0 2113k 0 0:00:01 --:--:-- 0:00:01 2108k 100 2779k 100 2779k 0 0 8451k 0 --:--:-- --:--:-- --:--:-- 8448k >>> py3-starlette: Fetching https://distfiles.alpinelinux.org/distfiles/edge/py3-starlette-0.37.2.tar.gz >>> py3-starlette: Checking sha512sums... py3-starlette-0.37.2.tar.gz: OK >>> py3-starlette: Unpacking /var/cache/distfiles/edge/py3-starlette-0.37.2.tar.gz... 2024-04-14 03:02:50,048 gpep517 INFO Building wheel via backend hatchling.build 2024-04-14 03:02:50,209 gpep517 INFO The backend produced .dist/starlette-0.37.2-py3-none-any.whl starlette-0.37.2-py3-none-any.whl ============================= test session starts ============================== platform linux -- Python 3.12.3, pytest-8.1.1, pluggy-1.4.0 rootdir: /home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2 configfile: pyproject.toml plugins: xdist-3.5.0, anyio-0.0.0, forked-1.6.0 created: 32/32 workers 32 workers [795 items] ........................................................................ [ 9%] ........................................................................ [ 18%] ........................................................................ [ 27%] ..................................................x..................... [ 36%] ........................................................................ [ 45%] x....................................................................... [ 54%] ........................................................................ [ 63%] ........................................................................ [ 72%] ........................................................................ [ 81%] ........................................................................ [ 90%] ........................................................................ [ 99%] ... [100%] ================================== XFAILURES =================================== ________ test_contextvars[trio-CustomMiddlewareUsingBaseHTTPMiddleware] ________ [gw3] linux -- Python 3.12.3 /usr/bin/python3 + Exception Group Traceback (most recent call last): | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/_utils.py", line 87, in collapse_excgroups | yield | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/base.py", line 190, in __call__ | async with anyio.create_task_group() as task_group: | File "/usr/lib/python3.12/site-packages/anyio/_backends/_trio.py", line 169, in __aexit__ | return await self._nursery_manager.__aexit__(exc_type, exc_val, exc_tb) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/trio/_core/_run.py", line 954, in __aexit__ | raise combined_error_from_nursery | ExceptionGroup: Exceptions from Trio nursery (1 sub-exception) +-+---------------- 1 ---------------- | Traceback (most recent call last): | File "/usr/lib/python3.12/site-packages/_pytest/runner.py", line 340, in from_call | result: Optional[TResult] = func() | ^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/runner.py", line 240, in | lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_hooks.py", line 501, in __call__ | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_manager.py", line 119, in _hookexec | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 138, in _multicall | raise exception.with_traceback(exception.__traceback__) | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/threadexception.py", line 87, in pytest_runtest_call | yield from thread_exception_runtest_hook() | File "/usr/lib/python3.12/site-packages/_pytest/threadexception.py", line 63, in thread_exception_runtest_hook | yield | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 90, in pytest_runtest_call | yield from unraisable_exception_runtest_hook() | File "/usr/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 65, in unraisable_exception_runtest_hook | yield | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/logging.py", line 849, in pytest_runtest_call | yield from self._runtest_for(item, "call") | File "/usr/lib/python3.12/site-packages/_pytest/logging.py", line 832, in _runtest_for | yield | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/capture.py", line 883, in pytest_runtest_call | return (yield) | ^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/skipping.py", line 256, in pytest_runtest_call | return (yield) | ^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 102, in _multicall | res = hook_impl.function(*args) | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/runner.py", line 182, in pytest_runtest_call | raise e | File "/usr/lib/python3.12/site-packages/_pytest/runner.py", line 172, in pytest_runtest_call | item.runtest() | File "/usr/lib/python3.12/site-packages/_pytest/python.py", line 1772, in runtest | self.ihook.pytest_pyfunc_call(pyfuncitem=self) | File "/usr/lib/python3.12/site-packages/pluggy/_hooks.py", line 501, in __call__ | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_manager.py", line 119, in _hookexec | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 138, in _multicall | raise exception.with_traceback(exception.__traceback__) | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 102, in _multicall | res = hook_impl.function(*args) | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/python.py", line 195, in pytest_pyfunc_call | result = testfunction(**testargs) | ^^^^^^^^^^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/tests/middleware/test_base.py", line 258, in test_contextvars | response = client.get("/") | ^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/testclient.py", line 548, in get | return super().get( | ^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 1054, in get | return self.request( | ^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/testclient.py", line 516, in request | return super().request( | ^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 827, in request | return self.send(request, auth=auth, follow_redirects=follow_redirects) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 914, in send | response = self._send_handling_auth( | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 942, in _send_handling_auth | response = self._send_handling_redirects( | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 979, in _send_handling_redirects | response = self._send_single_request(request) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 1015, in _send_single_request | response = transport.handle_request(request) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/testclient.py", line 398, in handle_request | raise exc | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/testclient.py", line 395, in handle_request | portal.call(self.app, scope, receive, send) | File "/usr/lib/python3.12/site-packages/anyio/from_thread.py", line 288, in call | return cast(T_Retval, self.start_task_soon(func, *args).result()) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/concurrent/futures/_base.py", line 449, in result | return self.__get_result() | ^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result | raise self._exception | File "/usr/lib/python3.12/site-packages/anyio/from_thread.py", line 217, in _call_func | retval = await retval_or_awaitable | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/applications.py", line 123, in __call__ | await self.middleware_stack(scope, receive, send) | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/errors.py", line 186, in __call__ | raise exc | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/errors.py", line 164, in __call__ | await self.app(scope, receive, _send) | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/base.py", line 189, in __call__ | with collapse_excgroups(): | File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__ | self.gen.throw(value) | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/_utils.py", line 93, in collapse_excgroups | raise exc | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/base.py", line 191, in __call__ | response = await self.dispatch_func(request, call_next) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/tests/middleware/test_base.py", line 221, in dispatch | assert ctxvar.get() == "set by endpoint" | AssertionError: assert 'set by middleware' == 'set by endpoint' | | - set by endpoint | + set by middleware +------------------------------------ During handling of the above exception, another exception occurred: test_client_factory = functools.partial(, backend='trio', backend_options={}) middleware_cls = @pytest.mark.parametrize( "middleware_cls", [ CustomMiddlewareWithoutBaseHTTPMiddleware, pytest.param( CustomMiddlewareUsingBaseHTTPMiddleware, marks=pytest.mark.xfail( reason=( "BaseHTTPMiddleware creates a TaskGroup which copies the context" "and erases any changes to it made within the TaskGroup" ), raises=AssertionError, ), ), ], ) def test_contextvars( test_client_factory: TestClientFactory, middleware_cls: type[_MiddlewareClass[Any]], ) -> None: # this has to be an async endpoint because Starlette calls run_in_threadpool # on sync endpoints which has it's own set of peculiarities w.r.t propagating # contextvars (it propagates them forwards but not backwards) async def homepage(request: Request) -> PlainTextResponse: assert ctxvar.get() == "set by middleware" ctxvar.set("set by endpoint") return PlainTextResponse("Homepage") app = Starlette( middleware=[Middleware(middleware_cls)], routes=[Route("/", homepage)] ) client = test_client_factory(app) > response = client.get("/") tests/middleware/test_base.py:258: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ starlette/testclient.py:548: in get return super().get( /usr/lib/python3.12/site-packages/httpx/_client.py:1054: in get return self.request( starlette/testclient.py:516: in request return super().request( /usr/lib/python3.12/site-packages/httpx/_client.py:827: in request return self.send(request, auth=auth, follow_redirects=follow_redirects) /usr/lib/python3.12/site-packages/httpx/_client.py:914: in send response = self._send_handling_auth( /usr/lib/python3.12/site-packages/httpx/_client.py:942: in _send_handling_auth response = self._send_handling_redirects( /usr/lib/python3.12/site-packages/httpx/_client.py:979: in _send_handling_redirects response = self._send_single_request(request) /usr/lib/python3.12/site-packages/httpx/_client.py:1015: in _send_single_request response = transport.handle_request(request) starlette/testclient.py:398: in handle_request raise exc starlette/testclient.py:395: in handle_request portal.call(self.app, scope, receive, send) /usr/lib/python3.12/site-packages/anyio/from_thread.py:288: in call return cast(T_Retval, self.start_task_soon(func, *args).result()) /usr/lib/python3.12/concurrent/futures/_base.py:449: in result return self.__get_result() /usr/lib/python3.12/concurrent/futures/_base.py:401: in __get_result raise self._exception /usr/lib/python3.12/site-packages/anyio/from_thread.py:217: in _call_func retval = await retval_or_awaitable starlette/applications.py:123: in __call__ await self.middleware_stack(scope, receive, send) starlette/middleware/errors.py:186: in __call__ raise exc starlette/middleware/errors.py:164: in __call__ await self.app(scope, receive, _send) starlette/middleware/base.py:189: in __call__ with collapse_excgroups(): /usr/lib/python3.12/contextlib.py:158: in __exit__ self.gen.throw(value) starlette/_utils.py:93: in collapse_excgroups raise exc starlette/middleware/base.py:191: in __call__ response = await self.dispatch_func(request, call_next) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = call_next = .call_next at 0xf59ac668> async def dispatch( self, request: Request, call_next: RequestResponseEndpoint, ) -> Response: ctxvar.set("set by middleware") resp = await call_next(request) > assert ctxvar.get() == "set by endpoint" E AssertionError: assert 'set by middleware' == 'set by endpoint' E E - set by endpoint E + set by middleware tests/middleware/test_base.py:221: AssertionError ______ test_contextvars[asyncio-CustomMiddlewareUsingBaseHTTPMiddleware] _______ [gw0] linux -- Python 3.12.3 /usr/bin/python3 + Exception Group Traceback (most recent call last): | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/_utils.py", line 87, in collapse_excgroups | yield | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/base.py", line 190, in __call__ | async with anyio.create_task_group() as task_group: | File "/usr/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 678, in __aexit__ | raise BaseExceptionGroup( | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) +-+---------------- 1 ---------------- | Traceback (most recent call last): | File "/usr/lib/python3.12/site-packages/_pytest/runner.py", line 340, in from_call | result: Optional[TResult] = func() | ^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/runner.py", line 240, in | lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_hooks.py", line 501, in __call__ | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_manager.py", line 119, in _hookexec | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 138, in _multicall | raise exception.with_traceback(exception.__traceback__) | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/threadexception.py", line 87, in pytest_runtest_call | yield from thread_exception_runtest_hook() | File "/usr/lib/python3.12/site-packages/_pytest/threadexception.py", line 63, in thread_exception_runtest_hook | yield | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 90, in pytest_runtest_call | yield from unraisable_exception_runtest_hook() | File "/usr/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 65, in unraisable_exception_runtest_hook | yield | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/logging.py", line 849, in pytest_runtest_call | yield from self._runtest_for(item, "call") | File "/usr/lib/python3.12/site-packages/_pytest/logging.py", line 832, in _runtest_for | yield | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/capture.py", line 883, in pytest_runtest_call | return (yield) | ^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall | teardown.throw(exception) # type: ignore[union-attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/skipping.py", line 256, in pytest_runtest_call | return (yield) | ^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 102, in _multicall | res = hook_impl.function(*args) | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/runner.py", line 182, in pytest_runtest_call | raise e | File "/usr/lib/python3.12/site-packages/_pytest/runner.py", line 172, in pytest_runtest_call | item.runtest() | File "/usr/lib/python3.12/site-packages/_pytest/python.py", line 1772, in runtest | self.ihook.pytest_pyfunc_call(pyfuncitem=self) | File "/usr/lib/python3.12/site-packages/pluggy/_hooks.py", line 501, in __call__ | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_manager.py", line 119, in _hookexec | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 138, in _multicall | raise exception.with_traceback(exception.__traceback__) | File "/usr/lib/python3.12/site-packages/pluggy/_callers.py", line 102, in _multicall | res = hook_impl.function(*args) | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/_pytest/python.py", line 195, in pytest_pyfunc_call | result = testfunction(**testargs) | ^^^^^^^^^^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/tests/middleware/test_base.py", line 258, in test_contextvars | response = client.get("/") | ^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/testclient.py", line 548, in get | return super().get( | ^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 1054, in get | return self.request( | ^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/testclient.py", line 516, in request | return super().request( | ^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 827, in request | return self.send(request, auth=auth, follow_redirects=follow_redirects) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 914, in send | response = self._send_handling_auth( | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 942, in _send_handling_auth | response = self._send_handling_redirects( | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 979, in _send_handling_redirects | response = self._send_single_request(request) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/site-packages/httpx/_client.py", line 1015, in _send_single_request | response = transport.handle_request(request) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/testclient.py", line 398, in handle_request | raise exc | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/testclient.py", line 395, in handle_request | portal.call(self.app, scope, receive, send) | File "/usr/lib/python3.12/site-packages/anyio/from_thread.py", line 288, in call | return cast(T_Retval, self.start_task_soon(func, *args).result()) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/concurrent/futures/_base.py", line 456, in result | return self.__get_result() | ^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result | raise self._exception | File "/usr/lib/python3.12/site-packages/anyio/from_thread.py", line 217, in _call_func | retval = await retval_or_awaitable | ^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/applications.py", line 123, in __call__ | await self.middleware_stack(scope, receive, send) | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/errors.py", line 186, in __call__ | raise exc | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/errors.py", line 164, in __call__ | await self.app(scope, receive, _send) | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/base.py", line 189, in __call__ | with collapse_excgroups(): | File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__ | self.gen.throw(value) | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/_utils.py", line 93, in collapse_excgroups | raise exc | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/starlette/middleware/base.py", line 191, in __call__ | response = await self.dispatch_func(request, call_next) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/home/buildozer/aports/community/py3-starlette/src/starlette-0.37.2/tests/middleware/test_base.py", line 221, in dispatch | assert ctxvar.get() == "set by endpoint" | AssertionError: assert 'set by middleware' == 'set by endpoint' | | - set by endpoint | + set by middleware +------------------------------------ During handling of the above exception, another exception occurred: test_client_factory = functools.partial(, backend='asyncio', backend_options={}) middleware_cls = @pytest.mark.parametrize( "middleware_cls", [ CustomMiddlewareWithoutBaseHTTPMiddleware, pytest.param( CustomMiddlewareUsingBaseHTTPMiddleware, marks=pytest.mark.xfail( reason=( "BaseHTTPMiddleware creates a TaskGroup which copies the context" "and erases any changes to it made within the TaskGroup" ), raises=AssertionError, ), ), ], ) def test_contextvars( test_client_factory: TestClientFactory, middleware_cls: type[_MiddlewareClass[Any]], ) -> None: # this has to be an async endpoint because Starlette calls run_in_threadpool # on sync endpoints which has it's own set of peculiarities w.r.t propagating # contextvars (it propagates them forwards but not backwards) async def homepage(request: Request) -> PlainTextResponse: assert ctxvar.get() == "set by middleware" ctxvar.set("set by endpoint") return PlainTextResponse("Homepage") app = Starlette( middleware=[Middleware(middleware_cls)], routes=[Route("/", homepage)] ) client = test_client_factory(app) > response = client.get("/") tests/middleware/test_base.py:258: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ starlette/testclient.py:548: in get return super().get( /usr/lib/python3.12/site-packages/httpx/_client.py:1054: in get return self.request( starlette/testclient.py:516: in request return super().request( /usr/lib/python3.12/site-packages/httpx/_client.py:827: in request return self.send(request, auth=auth, follow_redirects=follow_redirects) /usr/lib/python3.12/site-packages/httpx/_client.py:914: in send response = self._send_handling_auth( /usr/lib/python3.12/site-packages/httpx/_client.py:942: in _send_handling_auth response = self._send_handling_redirects( /usr/lib/python3.12/site-packages/httpx/_client.py:979: in _send_handling_redirects response = self._send_single_request(request) /usr/lib/python3.12/site-packages/httpx/_client.py:1015: in _send_single_request response = transport.handle_request(request) starlette/testclient.py:398: in handle_request raise exc starlette/testclient.py:395: in handle_request portal.call(self.app, scope, receive, send) /usr/lib/python3.12/site-packages/anyio/from_thread.py:288: in call return cast(T_Retval, self.start_task_soon(func, *args).result()) /usr/lib/python3.12/concurrent/futures/_base.py:456: in result return self.__get_result() /usr/lib/python3.12/concurrent/futures/_base.py:401: in __get_result raise self._exception /usr/lib/python3.12/site-packages/anyio/from_thread.py:217: in _call_func retval = await retval_or_awaitable starlette/applications.py:123: in __call__ await self.middleware_stack(scope, receive, send) starlette/middleware/errors.py:186: in __call__ raise exc starlette/middleware/errors.py:164: in __call__ await self.app(scope, receive, _send) starlette/middleware/base.py:189: in __call__ with collapse_excgroups(): /usr/lib/python3.12/contextlib.py:158: in __exit__ self.gen.throw(value) starlette/_utils.py:93: in collapse_excgroups raise exc starlette/middleware/base.py:191: in __call__ response = await self.dispatch_func(request, call_next) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = request = call_next = .call_next at 0xf59c84d8> async def dispatch( self, request: Request, call_next: RequestResponseEndpoint, ) -> Response: ctxvar.set("set by middleware") resp = await call_next(request) > assert ctxvar.get() == "set by endpoint" E AssertionError: assert 'set by middleware' == 'set by endpoint' E E - set by endpoint E + set by middleware tests/middleware/test_base.py:221: AssertionError =========================== short test summary info ============================ XFAIL tests/middleware/test_base.py::test_contextvars[trio-CustomMiddlewareUsingBaseHTTPMiddleware] - BaseHTTPMiddleware creates a TaskGroup which copies the contextand erases any changes to it made within the TaskGroup XFAIL tests/middleware/test_base.py::test_contextvars[asyncio-CustomMiddlewareUsingBaseHTTPMiddleware] - BaseHTTPMiddleware creates a TaskGroup which copies the contextand erases any changes to it made within the TaskGroup ======================== 793 passed, 2 xfailed in 8.30s ======================== >>> py3-starlette: Entering fakeroot... >>> py3-starlette-pyc*: Running split function pyc... '/home/buildozer/aports/community/py3-starlette/pkg/py3-starlette/usr/lib/python3.12/site-packages/starlette/__pycache__' -> '/home/buildozer/aports/community/py3-starlette/pkg/py3-starlette-pyc/usr/lib/python3.12/site-packages/starlette/__pycache__' '/home/buildozer/aports/community/py3-starlette/pkg/py3-starlette/usr/lib/python3.12/site-packages/starlette/middleware/__pycache__' -> '/home/buildozer/aports/community/py3-starlette/pkg/py3-starlette-pyc/usr/lib/python3.12/site-packages/starlette/middleware/__pycache__' >>> py3-starlette-pyc*: Preparing subpackage py3-starlette-pyc... >>> py3-starlette-pyc*: Running postcheck for py3-starlette-pyc >>> py3-starlette*: Running postcheck for py3-starlette >>> py3-starlette*: Preparing package py3-starlette... >>> py3-starlette-pyc*: Tracing dependencies... py3-anyio python3~3.12 >>> py3-starlette-pyc*: Package size: 424.0 KB >>> py3-starlette-pyc*: Compressing data... >>> py3-starlette-pyc*: Create checksum... >>> py3-starlette-pyc*: Create py3-starlette-pyc-0.37.2-r1.apk >>> py3-starlette*: Tracing dependencies... py3-anyio python3~3.12 >>> py3-starlette*: Package size: 380.0 KB >>> py3-starlette*: Compressing data... >>> py3-starlette*: Create checksum... >>> py3-starlette*: Create py3-starlette-0.37.2-r1.apk >>> py3-starlette: Build complete at Sun, 14 Apr 2024 03:03:00 +0000 elapsed time 0h 0m 14s >>> py3-starlette: Cleaning up srcdir >>> py3-starlette: Cleaning up pkgdir >>> py3-starlette: Uninstalling dependencies... (1/90) Purging .makedepends-py3-starlette (20240414.030248) (2/90) Purging py3-gpep517-pyc (15-r2) (3/90) Purging py3-gpep517 (15-r2) (4/90) Purging py3-hatchling-pyc (1.22.5-r1) (5/90) Purging py3-hatchling (1.22.5-r1) (6/90) Purging py3-editables-pyc (0.5-r2) (7/90) Purging py3-editables (0.5-r2) (8/90) Purging py3-pathspec-pyc (0.12.1-r2) (9/90) Purging py3-pathspec (0.12.1-r2) (10/90) Purging py3-trove-classifiers-pyc (2024.3.3-r2) (11/90) Purging py3-trove-classifiers (2024.3.3-r2) (12/90) Purging py3-installer-pyc (0.7.0-r2) (13/90) Purging py3-installer (0.7.0-r2) (14/90) Purging py3-httpx-pyc (0.27.0-r1) (15/90) Purging py3-httpx (0.27.0-r1) (16/90) Purging py3-httpcore-pyc (1.0.4-r1) (17/90) Purging py3-httpcore (1.0.4-r1) (18/90) Purging py3-anyio-pyc (4.3.0-r2) (19/90) Purging py3-anyio (4.3.0-r2) (20/90) Purging py3-certifi-pyc (2024.2.2-r1) (21/90) Purging py3-certifi (2024.2.2-r1) (22/90) Purging py3-h11-pyc (0.14.0-r4) (23/90) Purging py3-h11 (0.14.0-r4) (24/90) Purging py3-itsdangerous-pyc (2.1.2-r4) (25/90) Purging py3-itsdangerous (2.1.2-r4) (26/90) Purging py3-jinja2-pyc (3.1.3-r1) (27/90) Purging py3-jinja2 (3.1.3-r1) (28/90) Purging py3-markupsafe-pyc (2.1.5-r1) (29/90) Purging py3-markupsafe (2.1.5-r1) (30/90) Purging py3-pytest-forked-pyc (1.6.0-r2) (31/90) Purging py3-pytest-forked (1.6.0-r2) (32/90) Purging py3-pytest-xdist-pyc (3.5.0-r1) (33/90) Purging py3-pytest-xdist (3.5.0-r1) (34/90) Purging py3-execnet-pyc (1.9.0-r3) (35/90) Purging py3-execnet (1.9.0-r3) (36/90) Purging py3-apipkg-pyc (2.1.0-r3) (37/90) Purging py3-apipkg (2.1.0-r3) (38/90) Purging py3-pytest-pyc (8.1.1-r1) (39/90) Purging py3-pytest (8.1.1-r1) (40/90) Purging py3-iniconfig-pyc (2.0.0-r1) (41/90) Purging py3-iniconfig (2.0.0-r1) (42/90) Purging py3-packaging-pyc (24.0-r1) (43/90) Purging py3-packaging (24.0-r1) (44/90) Purging py3-parsing-pyc (3.1.2-r1) (45/90) Purging py3-parsing (3.1.2-r1) (46/90) Purging py3-pluggy-pyc (1.4.0-r1) (47/90) Purging py3-pluggy (1.4.0-r1) (48/90) Purging py3-py-pyc (1.11.0-r3) (49/90) Purging py3-py (1.11.0-r3) (50/90) Purging py3-python-multipart-pyc (0.0.9-r1) (51/90) Purging py3-python-multipart (0.0.9-r1) (52/90) Purging py3-trio-pyc (0.25.0-r1) (53/90) Purging py3-trio (0.25.0-r1) (54/90) Purging py3-idna-pyc (3.7-r0) (55/90) Purging py3-idna (3.7-r0) (56/90) Purging py3-openssl-pyc (24.1.0-r1) (57/90) Purging py3-openssl (24.1.0-r1) (58/90) Purging py3-cryptography-pyc (42.0.5-r1) (59/90) Purging py3-cryptography (42.0.5-r1) (60/90) Purging py3-cffi-pyc (1.16.0-r1) (61/90) Purging py3-cffi (1.16.0-r1) (62/90) Purging py3-cparser-pyc (2.22-r1) (63/90) Purging py3-cparser (2.22-r1) (64/90) Purging py3-outcome-pyc (1.3.0-r1) (65/90) Purging py3-outcome (1.3.0-r1) (66/90) Purging py3-async_generator-pyc (1.10-r6) (67/90) Purging py3-async_generator (1.10-r6) (68/90) Purging py3-attrs-pyc (23.2.0-r1) (69/90) Purging py3-attrs (23.2.0-r1) (70/90) Purging py3-sniffio-pyc (1.3.1-r1) (71/90) Purging py3-sniffio (1.3.1-r1) (72/90) Purging py3-curio-pyc (1.6-r2) (73/90) Purging py3-curio (1.6-r2) (74/90) Purging py3-sortedcontainers-pyc (2.4.0-r5) (75/90) Purging py3-sortedcontainers (2.4.0-r5) (76/90) Purging py3-typing-extensions-pyc (4.11.0-r1) (77/90) Purging py3-typing-extensions (4.11.0-r1) (78/90) Purging py3-yaml-pyc (6.0.1-r3) (79/90) Purging py3-yaml (6.0.1-r3) (80/90) Purging python3-pyc (3.12.3-r0) (81/90) Purging python3-pycache-pyc0 (3.12.3-r0) (82/90) Purging pyc (3.12.3-r0) (83/90) Purging yaml (0.2.5-r2) (84/90) Purging python3 (3.12.3-r0) (85/90) Purging gdbm (1.23-r1) (86/90) Purging libffi (3.4.6-r0) (87/90) Purging libpanelw (6.4_p20240330-r0) (88/90) Purging mpdecimal (4.0.0-r0) (89/90) Purging readline (8.2.10-r0) (90/90) Purging sqlite-libs (3.45.2-r0) Executing busybox-1.36.1-r25.trigger OK: 379 MiB in 113 packages >>> py3-starlette: Updating the community/x86 repository index... >>> py3-starlette: Signing the index...