From 0c3949c963c9f39095f85c5ec24d0f958e915ae9 Mon Sep 17 00:00:00 2001
From: Victor Stinner <victor.stinner@gmail.com>
Date: Sun, 9 Feb 2014 02:51:40 +0100
Subject: [PATCH] asyncio: Remove Process.subprocess attribute; it's too easy
 to get inconsistent Process and Popen objects

---
 Doc/library/asyncio-subprocess.rst       |  6 +-----
 Lib/asyncio/subprocess.py                |  4 ----
 Lib/test/test_asyncio/test_subprocess.py | 20 --------------------
 3 files changed, 1 insertion(+), 29 deletions(-)

diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst
index a2c46dc372..5e6e657e3e 100644
--- a/Doc/library/asyncio-subprocess.rst
+++ b/Doc/library/asyncio-subprocess.rst
@@ -87,10 +87,6 @@ Process
       Standard error stream (read), ``None`` if the process was created with
       ``stderr=None``.
 
-   .. attribute:: subprocess
-
-      Underlying :class:`subprocess.Popen` object.
-
    .. method:: communicate(input=None)
 
       Interact with process: Send data to stdin.  Read data from stdout and
@@ -102,7 +98,7 @@ Process
       :meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``.
 
       Note that if you want to send data to the process's stdin, you need to
-      create the Popen object with ``stdin=PIPE``.  Similarly, to get anything
+      create the Process object with ``stdin=PIPE``.  Similarly, to get anything
       other than ``None`` in the result tuple, you need to give ``stdout=PIPE``
       and/or ``stderr=PIPE`` too.
 
diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py
index 3047894b38..848d64f970 100644
--- a/Lib/asyncio/subprocess.py
+++ b/Lib/asyncio/subprocess.py
@@ -106,10 +106,6 @@ class Process:
         yield from waiter
         return waiter.result()
 
-    @property
-    def subprocess(self):
-        return self._transport.get_extra_info('subprocess')
-
     def _check_alive(self):
         if self._transport.get_returncode() is not None:
             raise ProcessLookupError()
diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py
index 785156c77f..1b2f05bef2 100644
--- a/Lib/test/test_asyncio/test_subprocess.py
+++ b/Lib/test/test_asyncio/test_subprocess.py
@@ -7,9 +7,6 @@ from test import support
 if sys.platform != 'win32':
     from asyncio import unix_events
 
-# Program exiting quickly
-PROGRAM_EXIT_FAST = [sys.executable, '-c', 'pass']
-
 # Program blocking
 PROGRAM_BLOCKED = [sys.executable, '-c', 'import time; time.sleep(3600)']
 
@@ -119,23 +116,6 @@ class SubprocessMixin:
         returncode = self.loop.run_until_complete(proc.wait())
         self.assertEqual(-signal.SIGHUP, returncode)
 
-    def test_subprocess(self):
-        args = PROGRAM_EXIT_FAST
-
-        @asyncio.coroutine
-        def run():
-            proc = yield from asyncio.create_subprocess_exec(*args,
-                                                             loop=self.loop)
-            yield from proc.wait()
-            # need to poll subprocess.Popen, otherwise the returncode
-            # attribute is not set
-            proc.subprocess.wait()
-            return proc
-
-        proc = self.loop.run_until_complete(run())
-        self.assertEqual(proc.subprocess.returncode, proc.returncode)
-        self.assertEqual(proc.subprocess.pid, proc.pid)
-
     def test_broken_pipe(self):
         large_data = b'x' * support.PIPE_MAX_SIZE
 
-- 
2.49.0