bpo-39386: Prevent double awaiting of async iterator (GH-18081)

This commit is contained in:
Andrew Svetlov 2020-01-21 00:49:30 +02:00 committed by GitHub
parent 2c49becc69
commit a96e06db77
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 4 deletions

View file

@ -1128,6 +1128,42 @@ class AsyncGenAsyncioTest(unittest.TestCase):
self.assertEqual([], messages)
def test_async_gen_await_anext_twice(self):
async def async_iterate():
yield 1
yield 2
async def run():
it = async_iterate()
nxt = it.__anext__()
await nxt
with self.assertRaisesRegex(
RuntimeError,
r"cannot reuse already awaited __anext__\(\)/asend\(\)"
):
await nxt
await it.aclose() # prevent unfinished iterator warning
self.loop.run_until_complete(run())
def test_async_gen_await_aclose_twice(self):
async def async_iterate():
yield 1
yield 2
async def run():
it = async_iterate()
nxt = it.aclose()
await nxt
with self.assertRaisesRegex(
RuntimeError,
r"cannot reuse already awaited aclose\(\)/athrow\(\)"
):
await nxt
self.loop.run_until_complete(run())
if __name__ == "__main__":
unittest.main()