Skip to content

Commit 596191d

Browse files
committed
Test pure-Python and C-accelerated versions of future_add_to/future_discard_from
1 parent 9533ab9 commit 596191d

File tree

2 files changed

+103
-10
lines changed

2 files changed

+103
-10
lines changed

Lib/asyncio/futures.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -465,16 +465,17 @@ def future_discard_from_awaited_by(fut, waiter, /):
465465
fut._Future__asyncio_awaited_by.discard(waiter)
466466

467467

468+
_py_future_add_to_awaited_by = future_add_to_awaited_by
469+
_py_future_discard_from_awaited_by = future_discard_from_awaited_by
470+
468471
try:
469472
import _asyncio
470473
except ImportError:
471474
pass
472475
else:
473476
# _CFuture is needed for tests.
474477
Future = _CFuture = _asyncio.Future
475-
476-
try:
477-
from _asyncio import future_add_to_awaited_by, \
478-
future_discard_from_awaited_by
479-
except ImportError:
480-
pass
478+
future_add_to_awaited_by = _asyncio.future_add_to_awaited_by
479+
future_discard_from_awaited_by = _asyncio.future_discard_from_awaited_by
480+
_c_future_add_to_awaited_by = future_add_to_awaited_by
481+
_c_future_discard_from_awaited_by = future_discard_from_awaited_by

Lib/test/test_asyncio/test_graph.py

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ def walk(s):
4545
return walk(stack), buf.getvalue()
4646

4747

48-
class TestCallStack(unittest.IsolatedAsyncioTestCase):
49-
48+
class CallStackTestBase:
5049

5150
async def test_stack_tgroup(self):
5251

@@ -107,7 +106,7 @@ async def main():
107106
])
108107

109108
self.assertIn(
110-
' async TestCallStack.test_stack_tgroup()',
109+
' async CallStackTestBase.test_stack_tgroup()',
111110
stack_for_c5[1])
112111

113112

@@ -143,8 +142,11 @@ async def main():
143142
[]
144143
])
145144

145+
from pprint import pprint
146+
pprint(stack_for_gen_nested_call[1])
147+
146148
self.assertIn(
147-
'async generator TestCallStack.test_stack_async_gen.<locals>.gen()',
149+
'async generator CallStackTestBase.test_stack_async_gen.<locals>.gen()',
148150
stack_for_gen_nested_call[1])
149151

150152
async def test_stack_gather(self):
@@ -345,3 +347,93 @@ async def main():
345347
)
346348

347349
self.assertTrue(stack_for_fut[1].startswith('* Future(id='))
350+
351+
352+
@unittest.skipIf(
353+
not hasattr(asyncio.futures, "_c_future_add_to_awaited_by"),
354+
"C-accelerated asyncio call graph backend missing",
355+
)
356+
class TestCallStackC(CallStackTestBase, unittest.IsolatedAsyncioTestCase):
357+
def setUp(self):
358+
futures = asyncio.futures
359+
tasks = asyncio.tasks
360+
361+
self._Future = asyncio.Future
362+
asyncio.Future = futures.Future = futures._CFuture
363+
364+
self._Task = asyncio.Task
365+
asyncio.Task = tasks.Task = tasks._CTask
366+
367+
self._future_add_to_awaited_by = asyncio.future_add_to_awaited_by
368+
futures.future_add_to_awaited_by = futures._c_future_add_to_awaited_by
369+
asyncio.future_add_to_awaited_by = futures.future_add_to_awaited_by
370+
371+
self._future_discard_from_awaited_by = asyncio.future_discard_from_awaited_by
372+
futures.future_discard_from_awaited_by = futures._c_future_discard_from_awaited_by
373+
asyncio.future_discard_from_awaited_by = futures.future_discard_from_awaited_by
374+
375+
376+
def tearDown(self):
377+
futures = asyncio.futures
378+
tasks = asyncio.tasks
379+
380+
futures.future_discard_from_awaited_by = self._future_discard_from_awaited_by
381+
asyncio.future_discard_from_awaited_by = self._future_discard_from_awaited_by
382+
del self._future_discard_from_awaited_by
383+
384+
futures.future_add_to_awaited_by = self._future_add_to_awaited_by
385+
asyncio.future_add_to_awaited_by = self._future_add_to_awaited_by
386+
del self._future_add_to_awaited_by
387+
388+
asyncio.Task = self._Task
389+
tasks = self._Task
390+
del self._Task
391+
392+
asyncio.Future = self._Future
393+
futures.Future = self._Future
394+
del self._Future
395+
396+
397+
@unittest.skipIf(
398+
not hasattr(asyncio.futures, "_py_future_add_to_awaited_by"),
399+
"Pure Python asyncio call graph backend missing",
400+
)
401+
class TestCallStackPy(CallStackTestBase, unittest.IsolatedAsyncioTestCase):
402+
def setUp(self):
403+
futures = asyncio.futures
404+
tasks = asyncio.tasks
405+
406+
self._Future = asyncio.Future
407+
asyncio.Future = futures.Future = futures._PyFuture
408+
409+
self._Task = asyncio.Task
410+
asyncio.Task = tasks.Task = tasks._PyTask
411+
412+
self._future_add_to_awaited_by = asyncio.future_add_to_awaited_by
413+
futures.future_add_to_awaited_by = futures._py_future_add_to_awaited_by
414+
asyncio.future_add_to_awaited_by = futures.future_add_to_awaited_by
415+
416+
self._future_discard_from_awaited_by = asyncio.future_discard_from_awaited_by
417+
futures.future_discard_from_awaited_by = futures._py_future_discard_from_awaited_by
418+
asyncio.future_discard_from_awaited_by = futures.future_discard_from_awaited_by
419+
420+
421+
def tearDown(self):
422+
futures = asyncio.futures
423+
tasks = asyncio.tasks
424+
425+
futures.future_discard_from_awaited_by = self._future_discard_from_awaited_by
426+
asyncio.future_discard_from_awaited_by = self._future_discard_from_awaited_by
427+
del self._future_discard_from_awaited_by
428+
429+
futures.future_add_to_awaited_by = self._future_add_to_awaited_by
430+
asyncio.future_add_to_awaited_by = self._future_add_to_awaited_by
431+
del self._future_add_to_awaited_by
432+
433+
asyncio.Task = self._Task
434+
tasks = self._Task
435+
del self._Task
436+
437+
asyncio.Future = self._Future
438+
futures.Future = self._Future
439+
del self._Future

0 commit comments

Comments
 (0)