@@ -2489,6 +2489,24 @@ def test_get_context(self):
24892489        finally :
24902490            loop .close ()
24912491
2492+     def  test_get_awaiter (self ):
2493+         ctask  =  getattr (tasks , '_CTask' , None )
2494+         if  ctask  is  None  or  not  issubclass (self .Task , ctask ):
2495+             self .skipTest ("Only subclasses of _CTask set cr_awaiter on wrapped coroutines" )
2496+ 
2497+         async  def  coro ():
2498+             self .assertIs (coro_obj .cr_awaiter , awaiter_obj )
2499+             return  "ok" 
2500+ 
2501+         async  def  awaiter (coro ):
2502+             task  =  self .loop .create_task (coro )
2503+             return  await  task 
2504+ 
2505+         coro_obj  =  coro ()
2506+         awaiter_obj  =  awaiter (coro_obj )
2507+         self .assertIsNone (coro_obj .cr_awaiter )
2508+         self .assertEqual (self .loop .run_until_complete (awaiter_obj ), "ok" )
2509+         self .assertIsNone (coro_obj .cr_awaiter )
24922510
24932511def  add_subclass_tests (cls ):
24942512    BaseTask  =  cls .Task 
@@ -3237,6 +3255,22 @@ async def coro(s):
32373255            # NameError should not happen: 
32383256            self .one_loop .call_exception_handler .assert_not_called ()
32393257
3258+     def  test_propagate_awaiter (self ):
3259+         async  def  coro (idx ):
3260+             self .assertIs (coro_objs [idx ].cr_awaiter , awaiter_obj )
3261+             return  "ok" 
3262+ 
3263+         async  def  awaiter (coros ):
3264+             tasks  =  [self .one_loop .create_task (c ) for  c  in  coros ]
3265+             return  await  asyncio .gather (* tasks )
3266+ 
3267+         coro_objs  =  [coro (0 ), coro (1 )]
3268+         awaiter_obj  =  awaiter (coro_objs )
3269+         self .assertIsNone (coro_objs [0 ].cr_awaiter )
3270+         self .assertIsNone (coro_objs [1 ].cr_awaiter )
3271+         self .assertEqual (self .one_loop .run_until_complete (awaiter_obj ), ["ok" , "ok" ])
3272+         self .assertIsNone (coro_objs [0 ].cr_awaiter )
3273+         self .assertIsNone (coro_objs [1 ].cr_awaiter )
32403274
32413275class  RunCoroutineThreadsafeTests (test_utils .TestCase ):
32423276    """Test case for asyncio.run_coroutine_threadsafe.""" 
@@ -3449,5 +3483,57 @@ def tearDown(self):
34493483        super ().tearDown ()
34503484
34513485
3486+ 
3487+ class  GetAsyncStackTests (test_utils .TestCase ):
3488+     def  setUp (self ):
3489+         self .loop  =  asyncio .new_event_loop ()
3490+         asyncio .set_event_loop (None )
3491+ 
3492+     def  tearDown (self ):
3493+         self .loop .close ()
3494+         self .loop  =  None 
3495+         asyncio .set_event_loop_policy (None )
3496+ 
3497+     def  check_stack (self , frames , expected_funcs ):
3498+         given  =  [f .f_code  for  f  in  frames ]
3499+         expected  =  [f .__code__  for  f  in  expected_funcs ]
3500+         self .assertEqual (given , expected )
3501+ 
3502+     def  test_single_task (self ):
3503+         async  def  coro ():
3504+             await  coro2 ()
3505+ 
3506+         async  def  coro2 ():
3507+             stack  =  asyncio .get_async_stack ()
3508+             self .check_stack (stack , [coro , coro2 ])
3509+ 
3510+         self .loop .run_until_complete (coro ())
3511+ 
3512+     def  test_cross_tasks (self ):
3513+         async  def  coro ():
3514+             t  =  asyncio .ensure_future (coro2 ())
3515+             await  t 
3516+ 
3517+         async  def  coro2 ():
3518+             t  =  asyncio .ensure_future (coro3 ())
3519+             await  t 
3520+ 
3521+         async  def  coro3 ():
3522+             stack  =  asyncio .get_async_stack ()
3523+             self .check_stack (stack , [coro , coro2 , coro3 ])
3524+ 
3525+         self .loop .run_until_complete (coro ())
3526+ 
3527+     def  test_cross_gather (self ):
3528+         async  def  coro ():
3529+             await  asyncio .gather (coro2 (), coro2 ())
3530+ 
3531+         async  def  coro2 ():
3532+             stack  =  asyncio .get_async_stack ()
3533+             self .check_stack (stack , [coro , coro2 ])
3534+ 
3535+         self .loop .run_until_complete (coro ())
3536+ 
3537+ 
34523538if  __name__  ==  '__main__' :
34533539    unittest .main ()
0 commit comments