mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
gh-103847: fix cancellation safety of asyncio.create_subprocess_exec (#140805)
This commit is contained in:
parent
fbebca289d
commit
ef474cfafb
3 changed files with 51 additions and 1 deletions
|
|
@ -11,7 +11,7 @@
|
|||
from asyncio import subprocess
|
||||
from test.test_asyncio import utils as test_utils
|
||||
from test import support
|
||||
from test.support import os_helper
|
||||
from test.support import os_helper, warnings_helper, gc_collect
|
||||
|
||||
if not support.has_subprocess_support:
|
||||
raise unittest.SkipTest("test module requires subprocess")
|
||||
|
|
@ -879,6 +879,44 @@ async def main():
|
|||
|
||||
self.loop.run_until_complete(main())
|
||||
|
||||
@warnings_helper.ignore_warnings(category=ResourceWarning)
|
||||
def test_subprocess_read_pipe_cancelled(self):
|
||||
async def main():
|
||||
loop = asyncio.get_running_loop()
|
||||
loop.connect_read_pipe = mock.AsyncMock(side_effect=asyncio.CancelledError)
|
||||
with self.assertRaises(asyncio.CancelledError):
|
||||
await asyncio.create_subprocess_exec(*PROGRAM_BLOCKED, stderr=asyncio.subprocess.PIPE)
|
||||
|
||||
asyncio.run(main())
|
||||
gc_collect()
|
||||
|
||||
@warnings_helper.ignore_warnings(category=ResourceWarning)
|
||||
def test_subprocess_write_pipe_cancelled(self):
|
||||
async def main():
|
||||
loop = asyncio.get_running_loop()
|
||||
loop.connect_write_pipe = mock.AsyncMock(side_effect=asyncio.CancelledError)
|
||||
with self.assertRaises(asyncio.CancelledError):
|
||||
await asyncio.create_subprocess_exec(*PROGRAM_BLOCKED, stdin=asyncio.subprocess.PIPE)
|
||||
|
||||
asyncio.run(main())
|
||||
gc_collect()
|
||||
|
||||
@warnings_helper.ignore_warnings(category=ResourceWarning)
|
||||
def test_subprocess_read_write_pipe_cancelled(self):
|
||||
async def main():
|
||||
loop = asyncio.get_running_loop()
|
||||
loop.connect_read_pipe = mock.AsyncMock(side_effect=asyncio.CancelledError)
|
||||
loop.connect_write_pipe = mock.AsyncMock(side_effect=asyncio.CancelledError)
|
||||
with self.assertRaises(asyncio.CancelledError):
|
||||
await asyncio.create_subprocess_exec(
|
||||
*PROGRAM_BLOCKED,
|
||||
stdin=asyncio.subprocess.PIPE,
|
||||
stdout=asyncio.subprocess.PIPE,
|
||||
stderr=asyncio.subprocess.PIPE,
|
||||
)
|
||||
|
||||
asyncio.run(main())
|
||||
gc_collect()
|
||||
|
||||
if sys.platform != 'win32':
|
||||
# Unix
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue