@@ -393,6 +393,10 @@ async def gen():
393393 r'anext\(\): asynchronous generator is already running' ):
394394 an .__next__ ()
395395
396+ with self .assertRaisesRegex (RuntimeError ,
397+ r"cannot reuse already awaited __anext__\(\)/asend\(\)" ):
398+ an .send (None )
399+
396400 def test_async_gen_asend_throw_concurrent_with_send (self ):
397401 import types
398402
@@ -422,6 +426,10 @@ async def agenfn():
422426 r'anext\(\): asynchronous generator is already running' ):
423427 gen2 .throw (MyExc )
424428
429+ with self .assertRaisesRegex (RuntimeError ,
430+ r"cannot reuse already awaited __anext__\(\)/asend\(\)" ):
431+ gen2 .send (None )
432+
425433 def test_async_gen_athrow_throw_concurrent_with_send (self ):
426434 import types
427435
@@ -451,6 +459,10 @@ async def agenfn():
451459 r'athrow\(\): asynchronous generator is already running' ):
452460 gen2 .throw (MyExc )
453461
462+ with self .assertRaisesRegex (RuntimeError ,
463+ r"cannot reuse already awaited aclose\(\)/athrow\(\)" ):
464+ gen2 .send (None )
465+
454466 def test_async_gen_asend_throw_concurrent_with_throw (self ):
455467 import types
456468
@@ -485,6 +497,10 @@ async def agenfn():
485497 r'anext\(\): asynchronous generator is already running' ):
486498 gen2 .throw (MyExc )
487499
500+ with self .assertRaisesRegex (RuntimeError ,
501+ r"cannot reuse already awaited __anext__\(\)/asend\(\)" ):
502+ gen2 .send (None )
503+
488504 def test_async_gen_athrow_throw_concurrent_with_throw (self ):
489505 import types
490506
@@ -518,6 +534,10 @@ async def agenfn():
518534 r'athrow\(\): asynchronous generator is already running' ):
519535 gen2 .throw (MyExc )
520536
537+ with self .assertRaisesRegex (RuntimeError ,
538+ r"cannot reuse already awaited aclose\(\)/athrow\(\)" ):
539+ gen2 .send (None )
540+
521541 def test_async_gen_3_arg_deprecation_warning (self ):
522542 async def gen ():
523543 yield 123
@@ -1941,5 +1961,52 @@ class MyException(Exception):
19411961 del g
19421962 gc_collect () # does not warn unawaited
19431963
1964+ def test_asend_send_already_running (self ):
1965+ @types .coroutine
1966+ def _async_yield (v ):
1967+ return (yield v )
1968+
1969+ async def agenfn ():
1970+ while True :
1971+ await _async_yield (1 )
1972+ return
1973+ yield
1974+
1975+ agen = agenfn ()
1976+ gen = agen .asend (None )
1977+ gen .send (None )
1978+ gen2 = agen .asend (None )
1979+
1980+ with self .assertRaisesRegex (RuntimeError ,
1981+ r'anext\(\): asynchronous generator is already running' ):
1982+ gen2 .send (None )
1983+
1984+ del gen2
1985+ gc_collect () # does not warn unawaited
1986+
1987+
1988+ def test_athrow_send_already_running (self ):
1989+ @types .coroutine
1990+ def _async_yield (v ):
1991+ return (yield v )
1992+
1993+ async def agenfn ():
1994+ while True :
1995+ await _async_yield (1 )
1996+ return
1997+ yield
1998+
1999+ agen = agenfn ()
2000+ gen = agen .asend (None )
2001+ gen .send (None )
2002+ gen2 = agen .athrow (Exception )
2003+
2004+ with self .assertRaisesRegex (RuntimeError ,
2005+ r'athrow\(\): asynchronous generator is already running' ):
2006+ gen2 .send (None )
2007+
2008+ del gen2
2009+ gc_collect () # does not warn unawaited
2010+
19442011if __name__ == "__main__" :
19452012 unittest .main ()
0 commit comments