mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
bpo-36373: Deprecate explicit loop parameter in all public asyncio APIs [locks] (GH-13920)
This PR deprecate explicit loop parameters in all public asyncio APIs This issues is split to be easier to review. Third step: locks.py https://bugs.python.org/issue36373
This commit is contained in:
parent
9669931e5e
commit
537877d85d
7 changed files with 419 additions and 265 deletions
|
@ -1719,19 +1719,20 @@ class SubprocessTestsMixin:
|
|||
connect = self.loop.subprocess_exec(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
sys.executable, prog)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
self.assertEqual('CONNECTED', proto.state)
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
self.assertEqual('CONNECTED', proto.state)
|
||||
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
stdin.write(b'Python The Winner')
|
||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||
with test_utils.disable_logger():
|
||||
transp.close()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_killed(proto.returncode)
|
||||
self.assertEqual(b'Python The Winner', proto.data[1])
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
stdin.write(b'Python The Winner')
|
||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||
with test_utils.disable_logger():
|
||||
transp.close()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_killed(proto.returncode)
|
||||
self.assertEqual(b'Python The Winner', proto.data[1])
|
||||
|
||||
def test_subprocess_interactive(self):
|
||||
prog = os.path.join(os.path.dirname(__file__), 'echo.py')
|
||||
|
@ -1739,47 +1740,52 @@ class SubprocessTestsMixin:
|
|||
connect = self.loop.subprocess_exec(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
sys.executable, prog)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
self.assertEqual('CONNECTED', proto.state)
|
||||
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
stdin.write(b'Python ')
|
||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||
proto.got_data[1].clear()
|
||||
self.assertEqual(b'Python ', proto.data[1])
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
self.assertEqual('CONNECTED', proto.state)
|
||||
|
||||
stdin.write(b'The Winner')
|
||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||
self.assertEqual(b'Python The Winner', proto.data[1])
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
stdin.write(b'Python ')
|
||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||
proto.got_data[1].clear()
|
||||
self.assertEqual(b'Python ', proto.data[1])
|
||||
|
||||
with test_utils.disable_logger():
|
||||
transp.close()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_killed(proto.returncode)
|
||||
stdin.write(b'The Winner')
|
||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||
self.assertEqual(b'Python The Winner', proto.data[1])
|
||||
|
||||
with test_utils.disable_logger():
|
||||
transp.close()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_killed(proto.returncode)
|
||||
|
||||
def test_subprocess_shell(self):
|
||||
connect = self.loop.subprocess_shell(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
'echo Python')
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
connect = self.loop.subprocess_shell(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
'echo Python')
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
transp.get_pipe_transport(0).close()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.assertEqual(0, proto.returncode)
|
||||
self.assertTrue(all(f.done() for f in proto.disconnects.values()))
|
||||
self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python')
|
||||
self.assertEqual(proto.data[2], b'')
|
||||
transp.close()
|
||||
transp.get_pipe_transport(0).close()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.assertEqual(0, proto.returncode)
|
||||
self.assertTrue(all(f.done() for f in proto.disconnects.values()))
|
||||
self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python')
|
||||
self.assertEqual(proto.data[2], b'')
|
||||
transp.close()
|
||||
|
||||
def test_subprocess_exitcode(self):
|
||||
connect = self.loop.subprocess_shell(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
'exit 7', stdin=None, stdout=None, stderr=None)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.assertEqual(7, proto.returncode)
|
||||
|
@ -1789,7 +1795,8 @@ class SubprocessTestsMixin:
|
|||
connect = self.loop.subprocess_shell(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
'exit 7', stdin=None, stdout=None, stderr=None)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.assertIsNone(transp.get_pipe_transport(0))
|
||||
self.assertIsNone(transp.get_pipe_transport(1))
|
||||
|
@ -1804,14 +1811,16 @@ class SubprocessTestsMixin:
|
|||
connect = self.loop.subprocess_exec(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
sys.executable, prog)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
transp.kill()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_killed(proto.returncode)
|
||||
transp.close()
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
transp.kill()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_killed(proto.returncode)
|
||||
transp.close()
|
||||
|
||||
def test_subprocess_terminate(self):
|
||||
prog = os.path.join(os.path.dirname(__file__), 'echo.py')
|
||||
|
@ -1819,14 +1828,16 @@ class SubprocessTestsMixin:
|
|||
connect = self.loop.subprocess_exec(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
sys.executable, prog)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
transp.terminate()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_terminated(proto.returncode)
|
||||
transp.close()
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
transp.terminate()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_terminated(proto.returncode)
|
||||
transp.close()
|
||||
|
||||
@unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP")
|
||||
def test_subprocess_send_signal(self):
|
||||
|
@ -1840,14 +1851,16 @@ class SubprocessTestsMixin:
|
|||
connect = self.loop.subprocess_exec(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
sys.executable, prog)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
transp.send_signal(signal.SIGHUP)
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.assertEqual(-signal.SIGHUP, proto.returncode)
|
||||
transp.close()
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
transp.send_signal(signal.SIGHUP)
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.assertEqual(-signal.SIGHUP, proto.returncode)
|
||||
transp.close()
|
||||
finally:
|
||||
signal.signal(signal.SIGHUP, old_handler)
|
||||
|
||||
|
@ -1857,19 +1870,21 @@ class SubprocessTestsMixin:
|
|||
connect = self.loop.subprocess_exec(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
sys.executable, prog)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
stdin.write(b'test')
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
stdin.write(b'test')
|
||||
|
||||
transp.close()
|
||||
self.assertEqual(b'OUT:test', proto.data[1])
|
||||
self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
|
||||
self.assertEqual(0, proto.returncode)
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
|
||||
transp.close()
|
||||
self.assertEqual(b'OUT:test', proto.data[1])
|
||||
self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
|
||||
self.assertEqual(0, proto.returncode)
|
||||
|
||||
def test_subprocess_stderr_redirect_to_stdout(self):
|
||||
prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
|
||||
|
@ -1877,22 +1892,24 @@ class SubprocessTestsMixin:
|
|||
connect = self.loop.subprocess_exec(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
sys.executable, prog, stderr=subprocess.STDOUT)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
self.assertIsNotNone(transp.get_pipe_transport(1))
|
||||
self.assertIsNone(transp.get_pipe_transport(2))
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
stdin.write(b'test')
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'),
|
||||
proto.data[1])
|
||||
self.assertEqual(b'', proto.data[2])
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
self.assertIsNotNone(transp.get_pipe_transport(1))
|
||||
self.assertIsNone(transp.get_pipe_transport(2))
|
||||
|
||||
transp.close()
|
||||
self.assertEqual(0, proto.returncode)
|
||||
stdin.write(b'test')
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'),
|
||||
proto.data[1])
|
||||
self.assertEqual(b'', proto.data[2])
|
||||
|
||||
transp.close()
|
||||
self.assertEqual(0, proto.returncode)
|
||||
|
||||
def test_subprocess_close_client_stream(self):
|
||||
prog = os.path.join(os.path.dirname(__file__), 'echo3.py')
|
||||
|
@ -1900,32 +1917,33 @@ class SubprocessTestsMixin:
|
|||
connect = self.loop.subprocess_exec(
|
||||
functools.partial(MySubprocessProtocol, self.loop),
|
||||
sys.executable, prog)
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
transp, proto = self.loop.run_until_complete(connect)
|
||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||
self.loop.run_until_complete(proto.connected)
|
||||
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
stdout = transp.get_pipe_transport(1)
|
||||
stdin.write(b'test')
|
||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||
self.assertEqual(b'OUT:test', proto.data[1])
|
||||
stdin = transp.get_pipe_transport(0)
|
||||
stdout = transp.get_pipe_transport(1)
|
||||
stdin.write(b'test')
|
||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||
self.assertEqual(b'OUT:test', proto.data[1])
|
||||
|
||||
stdout.close()
|
||||
self.loop.run_until_complete(proto.disconnects[1])
|
||||
stdin.write(b'xxx')
|
||||
self.loop.run_until_complete(proto.got_data[2].wait())
|
||||
if sys.platform != 'win32':
|
||||
self.assertEqual(b'ERR:BrokenPipeError', proto.data[2])
|
||||
else:
|
||||
# After closing the read-end of a pipe, writing to the
|
||||
# write-end using os.write() fails with errno==EINVAL and
|
||||
# GetLastError()==ERROR_INVALID_NAME on Windows!?! (Using
|
||||
# WriteFile() we get ERROR_BROKEN_PIPE as expected.)
|
||||
self.assertEqual(b'ERR:OSError', proto.data[2])
|
||||
with test_utils.disable_logger():
|
||||
transp.close()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_killed(proto.returncode)
|
||||
stdout.close()
|
||||
self.loop.run_until_complete(proto.disconnects[1])
|
||||
stdin.write(b'xxx')
|
||||
self.loop.run_until_complete(proto.got_data[2].wait())
|
||||
if sys.platform != 'win32':
|
||||
self.assertEqual(b'ERR:BrokenPipeError', proto.data[2])
|
||||
else:
|
||||
# After closing the read-end of a pipe, writing to the
|
||||
# write-end using os.write() fails with errno==EINVAL and
|
||||
# GetLastError()==ERROR_INVALID_NAME on Windows!?! (Using
|
||||
# WriteFile() we get ERROR_BROKEN_PIPE as expected.)
|
||||
self.assertEqual(b'ERR:OSError', proto.data[2])
|
||||
with test_utils.disable_logger():
|
||||
transp.close()
|
||||
self.loop.run_until_complete(proto.completed)
|
||||
self.check_killed(proto.returncode)
|
||||
|
||||
def test_subprocess_wait_no_same_group(self):
|
||||
# start the new process in a new session
|
||||
|
@ -1939,7 +1957,6 @@ class SubprocessTestsMixin:
|
|||
self.assertEqual(7, proto.returncode)
|
||||
|
||||
def test_subprocess_exec_invalid_args(self):
|
||||
|
||||
async def connect(**kwds):
|
||||
await self.loop.subprocess_exec(
|
||||
asyncio.SubprocessProtocol,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue