diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py
index 08c622a..dee147e 100644
--- a/Lib/test/test_asyncio/test_proactor_events.py
+++ b/Lib/test/test_asyncio/test_proactor_events.py
@@ -12,6 +12,15 @@
 from asyncio import test_utils
 
 
+def close_transport(transport):
+    # Don't call transport.close() because the event loop and the IOCP proactor
+    # are mocked
+    if transport._sock is None:
+        return
+    transport._sock.close()
+    transport._sock = None
+
+
 class ProactorSocketTransportTests(test_utils.TestCase):
 
     def setUp(self):
@@ -22,17 +31,22 @@
         self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
         self.sock = mock.Mock(socket.socket)
 
+    def socket_transport(self, waiter=None):
+        transport = _ProactorSocketTransport(self.loop, self.sock,
+                                             self.protocol, waiter=waiter)
+        self.addCleanup(close_transport, transport)
+        return transport
+
     def test_ctor(self):
         fut = asyncio.Future(loop=self.loop)
-        tr = _ProactorSocketTransport(
-            self.loop, self.sock, self.protocol, fut)
+        tr = self.socket_transport(waiter=fut)
         test_utils.run_briefly(self.loop)
         self.assertIsNone(fut.result())
         self.protocol.connection_made(tr)
         self.proactor.recv.assert_called_with(self.sock, 4096)
 
     def test_loop_reading(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._loop_reading()
         self.loop._proactor.recv.assert_called_with(self.sock, 4096)
         self.assertFalse(self.protocol.data_received.called)
@@ -42,8 +56,7 @@
         res = asyncio.Future(loop=self.loop)
         res.set_result(b'data')
 
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
-
+        tr = self.socket_transport()
         tr._read_fut = res
         tr._loop_reading(res)
         self.loop._proactor.recv.assert_called_with(self.sock, 4096)
@@ -53,8 +66,7 @@
         res = asyncio.Future(loop=self.loop)
         res.set_result(b'')
 
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
-
+        tr = self.socket_transport()
         self.assertRaises(AssertionError, tr._loop_reading, res)
 
         tr.close = mock.Mock()
@@ -67,7 +79,7 @@
     def test_loop_reading_aborted(self):
         err = self.loop._proactor.recv.side_effect = ConnectionAbortedError()
 
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._fatal_error = mock.Mock()
         tr._loop_reading()
         tr._fatal_error.assert_called_with(
@@ -77,7 +89,7 @@
     def test_loop_reading_aborted_closing(self):
         self.loop._proactor.recv.side_effect = ConnectionAbortedError()
 
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._closing = True
         tr._fatal_error = mock.Mock()
         tr._loop_reading()
@@ -85,7 +97,7 @@
 
     def test_loop_reading_aborted_is_fatal(self):
         self.loop._proactor.recv.side_effect = ConnectionAbortedError()
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._closing = False
         tr._fatal_error = mock.Mock()
         tr._loop_reading()
@@ -94,7 +106,7 @@
     def test_loop_reading_conn_reset_lost(self):
         err = self.loop._proactor.recv.side_effect = ConnectionResetError()
 
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._closing = False
         tr._fatal_error = mock.Mock()
         tr._force_close = mock.Mock()
@@ -105,7 +117,7 @@
     def test_loop_reading_exception(self):
         err = self.loop._proactor.recv.side_effect = (OSError())
 
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._fatal_error = mock.Mock()
         tr._loop_reading()
         tr._fatal_error.assert_called_with(
@@ -113,19 +125,19 @@
                             'Fatal read error on pipe transport')
 
     def test_write(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._loop_writing = mock.Mock()
         tr.write(b'data')
         self.assertEqual(tr._buffer, None)
         tr._loop_writing.assert_called_with(data=b'data')
 
     def test_write_no_data(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr.write(b'')
         self.assertFalse(tr._buffer)
 
     def test_write_more(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._write_fut = mock.Mock()
         tr._loop_writing = mock.Mock()
         tr.write(b'data')
@@ -133,7 +145,7 @@
         self.assertFalse(tr._loop_writing.called)
 
     def test_loop_writing(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._buffer = bytearray(b'data')
         tr._loop_writing()
         self.loop._proactor.send.assert_called_with(self.sock, b'data')
@@ -143,7 +155,7 @@
     @mock.patch('asyncio.proactor_events.logger')
     def test_loop_writing_err(self, m_log):
         err = self.loop._proactor.send.side_effect = OSError()
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._fatal_error = mock.Mock()
         tr._buffer = [b'da', b'ta']
         tr._loop_writing()
@@ -164,7 +176,7 @@
         fut = asyncio.Future(loop=self.loop)
         fut.set_result(b'data')
 
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._write_fut = fut
         tr._loop_writing(fut)
         self.assertIsNone(tr._write_fut)
@@ -173,7 +185,7 @@
         fut = asyncio.Future(loop=self.loop)
         fut.set_result(1)
 
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._write_fut = fut
         tr.close()
         tr._loop_writing(fut)
@@ -182,13 +194,13 @@
         self.protocol.connection_lost.assert_called_with(None)
 
     def test_abort(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._force_close = mock.Mock()
         tr.abort()
         tr._force_close.assert_called_with(None)
 
     def test_close(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr.close()
         test_utils.run_briefly(self.loop)
         self.protocol.connection_lost.assert_called_with(None)
@@ -201,14 +213,14 @@
         self.assertFalse(self.protocol.connection_lost.called)
 
     def test_close_write_fut(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._write_fut = mock.Mock()
         tr.close()
         test_utils.run_briefly(self.loop)
         self.assertFalse(self.protocol.connection_lost.called)
 
     def test_close_buffer(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._buffer = [b'data']
         tr.close()
         test_utils.run_briefly(self.loop)
@@ -216,14 +228,14 @@
 
     @mock.patch('asyncio.base_events.logger')
     def test_fatal_error(self, m_logging):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._force_close = mock.Mock()
         tr._fatal_error(None)
         self.assertTrue(tr._force_close.called)
         self.assertTrue(m_logging.error.called)
 
     def test_force_close(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._buffer = [b'data']
         read_fut = tr._read_fut = mock.Mock()
         write_fut = tr._write_fut = mock.Mock()
@@ -237,14 +249,14 @@
         self.assertEqual(tr._conn_lost, 1)
 
     def test_force_close_idempotent(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._closing = True
         tr._force_close(None)
         test_utils.run_briefly(self.loop)
         self.assertFalse(self.protocol.connection_lost.called)
 
     def test_fatal_error_2(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._buffer = [b'data']
         tr._force_close(None)
 
@@ -253,14 +265,13 @@
         self.assertEqual(None, tr._buffer)
 
     def test_call_connection_lost(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         tr._call_connection_lost(None)
         self.assertTrue(self.protocol.connection_lost.called)
         self.assertTrue(self.sock.close.called)
 
     def test_write_eof(self):
-        tr = _ProactorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         self.assertTrue(tr.can_write_eof())
         tr.write_eof()
         self.sock.shutdown.assert_called_with(socket.SHUT_WR)
@@ -269,7 +280,7 @@
         tr.close()
 
     def test_write_eof_buffer(self):
-        tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         f = asyncio.Future(loop=self.loop)
         tr._loop._proactor.send.return_value = f
         tr.write(b'data')
@@ -313,11 +324,10 @@
         self.assertFalse(tr.can_write_eof())
         with self.assertRaises(NotImplementedError):
             tr.write_eof()
-        tr.close()
+        close_transport(tr)
 
     def test_pause_resume_reading(self):
-        tr = _ProactorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         futures = []
         for msg in [b'data1', b'data2', b'data3', b'data4', b'']:
             f = asyncio.Future(loop=self.loop)
@@ -345,10 +355,7 @@
 
 
     def pause_writing_transport(self, high):
-        tr = _ProactorSocketTransport(
-            self.loop, self.sock, self.protocol)
-        self.addCleanup(tr.close)
-
+        tr = self.socket_transport()
         tr.set_write_buffer_limits(high=high)
 
         self.assertEqual(tr.get_write_buffer_size(), 0)
@@ -439,7 +446,7 @@
                 return (self.ssock, self.csock)
 
         self.loop = EventLoop(self.proactor)
-        self.set_event_loop(self.loop, cleanup=False)
+        self.set_event_loop(self.loop)
 
     @mock.patch.object(BaseProactorEventLoop, 'call_soon')
     @mock.patch.object(BaseProactorEventLoop, '_socketpair')
@@ -451,6 +458,7 @@
         self.assertIs(loop._csock, csock)
         self.assertEqual(loop._internal_fds, 1)
         call_soon.assert_called_with(loop._loop_self_reading)
+        loop.close()
 
     def test_close_self_pipe(self):
         self.loop._close_self_pipe()
@@ -497,6 +505,7 @@
     def test_make_socket_transport(self):
         tr = self.loop._make_socket_transport(self.sock, asyncio.Protocol())
         self.assertIsInstance(tr, _ProactorSocketTransport)
+        close_transport(tr)
 
     def test_loop_self_reading(self):
         self.loop._loop_self_reading()
diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py
index f519419..f99d04d 100644
--- a/Lib/test/test_asyncio/test_selector_events.py
+++ b/Lib/test/test_asyncio/test_selector_events.py
@@ -39,6 +39,15 @@
     return bytearray().join(l)
 
 
+def close_transport(transport):
+    # Don't call transport.close() because the event loop and the selector
+    # are mocked
+    if transport._sock is None:
+        return
+    transport._sock.close()
+    transport._sock = None
+
+
 class BaseSelectorEventLoopTests(test_utils.TestCase):
 
     def setUp(self):
@@ -52,6 +61,7 @@
         self.loop.add_reader = mock.Mock()
         transport = self.loop._make_socket_transport(m, asyncio.Protocol())
         self.assertIsInstance(transport, _SelectorSocketTransport)
+        close_transport(transport)
 
     @unittest.skipIf(ssl is None, 'No ssl module')
     def test_make_ssl_transport(self):
@@ -64,11 +74,19 @@
         with test_utils.disable_logger():
             transport = self.loop._make_ssl_transport(
                 m, asyncio.Protocol(), m, waiter)
+            # execute the handshake while the logger is disabled
+            # to ignore SSL handshake failure
+            test_utils.run_briefly(self.loop)
+
         # Sanity check
         class_name = transport.__class__.__name__
         self.assertIn("ssl", class_name.lower())
         self.assertIn("transport", class_name.lower())
 
+        transport.close()
+        # execute pending callbacks to close the socket transport
+        test_utils.run_briefly(self.loop)
+
     @mock.patch('asyncio.selector_events.ssl', None)
     @mock.patch('asyncio.sslproto.ssl', None)
     def test_make_ssl_transport_without_ssl_error(self):
@@ -650,21 +668,27 @@
         self.sock = mock.Mock(socket.socket)
         self.sock.fileno.return_value = 7
 
+    def create_transport(self):
+        transport = _SelectorTransport(self.loop, self.sock, self.protocol,
+                                       None)
+        self.addCleanup(close_transport, transport)
+        return transport
+
     def test_ctor(self):
-        tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
+        tr = self.create_transport()
         self.assertIs(tr._loop, self.loop)
         self.assertIs(tr._sock, self.sock)
         self.assertIs(tr._sock_fd, 7)
 
     def test_abort(self):
-        tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
+        tr = self.create_transport()
         tr._force_close = mock.Mock()
 
         tr.abort()
         tr._force_close.assert_called_with(None)
 
     def test_close(self):
-        tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
+        tr = self.create_transport()
         tr.close()
 
         self.assertTrue(tr._closing)
@@ -677,7 +701,7 @@
         self.assertEqual(1, self.loop.remove_reader_count[7])
 
     def test_close_write_buffer(self):
-        tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
+        tr = self.create_transport()
         tr._buffer.extend(b'data')
         tr.close()
 
@@ -686,7 +710,7 @@
         self.assertFalse(self.protocol.connection_lost.called)
 
     def test_force_close(self):
-        tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
+        tr = self.create_transport()
         tr._buffer.extend(b'1')
         self.loop.add_reader(7, mock.sentinel)
         self.loop.add_writer(7, mock.sentinel)
@@ -705,7 +729,7 @@
     @mock.patch('asyncio.log.logger.error')
     def test_fatal_error(self, m_exc):
         exc = OSError()
-        tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
+        tr = self.create_transport()
         tr._force_close = mock.Mock()
         tr._fatal_error(exc)
 
@@ -718,7 +742,7 @@
 
     def test_connection_lost(self):
         exc = OSError()
-        tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
+        tr = self.create_transport()
         self.assertIsNotNone(tr._protocol)
         self.assertIsNotNone(tr._loop)
         tr._call_connection_lost(exc)
@@ -739,9 +763,14 @@
         self.sock = mock.Mock(socket.socket)
         self.sock_fd = self.sock.fileno.return_value = 7
 
+    def socket_transport(self, waiter=None):
+        transport = _SelectorSocketTransport(self.loop, self.sock,
+                                             self.protocol, waiter=waiter)
+        self.addCleanup(close_transport, transport)
+        return transport
+
     def test_ctor(self):
-        tr = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         self.loop.assert_reader(7, tr._read_ready)
         test_utils.run_briefly(self.loop)
         self.protocol.connection_made.assert_called_with(tr)
@@ -749,14 +778,12 @@
     def test_ctor_with_waiter(self):
         fut = asyncio.Future(loop=self.loop)
 
-        _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol, fut)
+        self.socket_transport(waiter=fut)
         test_utils.run_briefly(self.loop)
         self.assertIsNone(fut.result())
 
     def test_pause_resume_reading(self):
-        tr = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         self.assertFalse(tr._paused)
         self.loop.assert_reader(7, tr._read_ready)
         tr.pause_reading()
@@ -769,8 +796,7 @@
             tr.resume_reading()
 
     def test_read_ready(self):
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
 
         self.sock.recv.return_value = b'data'
         transport._read_ready()
@@ -778,8 +804,7 @@
         self.protocol.data_received.assert_called_with(b'data')
 
     def test_read_ready_eof(self):
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.close = mock.Mock()
 
         self.sock.recv.return_value = b''
@@ -789,8 +814,7 @@
         transport.close.assert_called_with()
 
     def test_read_ready_eof_keep_open(self):
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.close = mock.Mock()
 
         self.sock.recv.return_value = b''
@@ -804,8 +828,7 @@
     def test_read_ready_tryagain(self, m_exc):
         self.sock.recv.side_effect = BlockingIOError
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._fatal_error = mock.Mock()
         transport._read_ready()
 
@@ -815,8 +838,7 @@
     def test_read_ready_tryagain_interrupted(self, m_exc):
         self.sock.recv.side_effect = InterruptedError
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._fatal_error = mock.Mock()
         transport._read_ready()
 
@@ -826,8 +848,7 @@
     def test_read_ready_conn_reset(self, m_exc):
         err = self.sock.recv.side_effect = ConnectionResetError()
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._force_close = mock.Mock()
         with test_utils.disable_logger():
             transport._read_ready()
@@ -837,8 +858,7 @@
     def test_read_ready_err(self, m_exc):
         err = self.sock.recv.side_effect = OSError()
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._fatal_error = mock.Mock()
         transport._read_ready()
 
@@ -850,8 +870,7 @@
         data = b'data'
         self.sock.send.return_value = len(data)
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.write(data)
         self.sock.send.assert_called_with(data)
 
@@ -859,8 +878,7 @@
         data = bytearray(b'data')
         self.sock.send.return_value = len(data)
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.write(data)
         self.sock.send.assert_called_with(data)
         self.assertEqual(data, bytearray(b'data'))  # Hasn't been mutated.
@@ -869,22 +887,19 @@
         data = memoryview(b'data')
         self.sock.send.return_value = len(data)
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.write(data)
         self.sock.send.assert_called_with(data)
 
     def test_write_no_data(self):
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._buffer.extend(b'data')
         transport.write(b'')
         self.assertFalse(self.sock.send.called)
         self.assertEqual(list_to_buffer([b'data']), transport._buffer)
 
     def test_write_buffer(self):
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._buffer.extend(b'data1')
         transport.write(b'data2')
         self.assertFalse(self.sock.send.called)
@@ -895,8 +910,7 @@
         data = b'data'
         self.sock.send.return_value = 2
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.write(data)
 
         self.loop.assert_writer(7, transport._write_ready)
@@ -906,8 +920,7 @@
         data = bytearray(b'data')
         self.sock.send.return_value = 2
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.write(data)
 
         self.loop.assert_writer(7, transport._write_ready)
@@ -918,8 +931,7 @@
         data = memoryview(b'data')
         self.sock.send.return_value = 2
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.write(data)
 
         self.loop.assert_writer(7, transport._write_ready)
@@ -930,8 +942,7 @@
         self.sock.send.return_value = 0
         self.sock.fileno.return_value = 7
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.write(data)
 
         self.loop.assert_writer(7, transport._write_ready)
@@ -941,8 +952,7 @@
         self.sock.send.side_effect = BlockingIOError
 
         data = b'data'
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.write(data)
 
         self.loop.assert_writer(7, transport._write_ready)
@@ -953,8 +963,7 @@
         err = self.sock.send.side_effect = OSError()
 
         data = b'data'
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._fatal_error = mock.Mock()
         transport.write(data)
         transport._fatal_error.assert_called_with(
@@ -973,13 +982,11 @@
         m_log.warning.assert_called_with('socket.send() raised exception.')
 
     def test_write_str(self):
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         self.assertRaises(TypeError, transport.write, 'str')
 
     def test_write_closing(self):
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.close()
         self.assertEqual(transport._conn_lost, 1)
         transport.write(b'data')
@@ -989,8 +996,7 @@
         data = b'data'
         self.sock.send.return_value = len(data)
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._buffer.extend(data)
         self.loop.add_writer(7, transport._write_ready)
         transport._write_ready()
@@ -1001,8 +1007,7 @@
         data = b'data'
         self.sock.send.return_value = len(data)
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._closing = True
         transport._buffer.extend(data)
         self.loop.add_writer(7, transport._write_ready)
@@ -1013,8 +1018,7 @@
         self.protocol.connection_lost.assert_called_with(None)
 
     def test_write_ready_no_data(self):
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         # This is an internal error.
         self.assertRaises(AssertionError, transport._write_ready)
 
@@ -1022,8 +1026,7 @@
         data = b'data'
         self.sock.send.return_value = 2
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._buffer.extend(data)
         self.loop.add_writer(7, transport._write_ready)
         transport._write_ready()
@@ -1034,8 +1037,7 @@
         data = b'data'
         self.sock.send.return_value = 0
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._buffer.extend(data)
         self.loop.add_writer(7, transport._write_ready)
         transport._write_ready()
@@ -1045,8 +1047,7 @@
     def test_write_ready_tryagain(self):
         self.sock.send.side_effect = BlockingIOError
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._buffer = list_to_buffer([b'data1', b'data2'])
         self.loop.add_writer(7, transport._write_ready)
         transport._write_ready()
@@ -1057,8 +1058,7 @@
     def test_write_ready_exception(self):
         err = self.sock.send.side_effect = OSError()
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport._fatal_error = mock.Mock()
         transport._buffer.extend(b'data')
         transport._write_ready()
@@ -1071,16 +1071,14 @@
         self.sock.send.side_effect = OSError()
         remove_writer = self.loop.remove_writer = mock.Mock()
 
-        transport = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.socket_transport()
         transport.close()
         transport._buffer.extend(b'data')
         transport._write_ready()
         remove_writer.assert_called_with(self.sock_fd)
 
     def test_write_eof(self):
-        tr = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         self.assertTrue(tr.can_write_eof())
         tr.write_eof()
         self.sock.shutdown.assert_called_with(socket.SHUT_WR)
@@ -1089,8 +1087,7 @@
         tr.close()
 
     def test_write_eof_buffer(self):
-        tr = _SelectorSocketTransport(
-            self.loop, self.sock, self.protocol)
+        tr = self.socket_transport()
         self.sock.send.side_effect = BlockingIOError
         tr.write(b'data')
         tr.write_eof()
@@ -1117,9 +1114,15 @@
         self.sslcontext = mock.Mock()
         self.sslcontext.wrap_socket.return_value = self.sslsock
 
+    def ssl_transport(self, waiter=None, server_hostname=None):
+        transport = _SelectorSslTransport(self.loop, self.sock, self.protocol,
+                                          self.sslcontext, waiter=waiter,
+                                          server_hostname=server_hostname)
+        self.addCleanup(close_transport, transport)
+        return transport
+
     def _make_one(self, create_waiter=None):
-        transport = _SelectorSslTransport(
-            self.loop, self.sock, self.protocol, self.sslcontext)
+        transport = self.ssl_transport()
         self.sock.reset_mock()
         self.sslsock.reset_mock()
         self.sslcontext.reset_mock()
@@ -1128,9 +1131,7 @@
 
     def test_on_handshake(self):
         waiter = asyncio.Future(loop=self.loop)
-        tr = _SelectorSslTransport(
-            self.loop, self.sock, self.protocol, self.sslcontext,
-            waiter=waiter)
+        tr = self.ssl_transport(waiter=waiter)
         self.assertTrue(self.sslsock.do_handshake.called)
         self.loop.assert_reader(1, tr._read_ready)
         test_utils.run_briefly(self.loop)
@@ -1139,15 +1140,13 @@
     def test_on_handshake_reader_retry(self):
         self.loop.set_debug(False)
         self.sslsock.do_handshake.side_effect = ssl.SSLWantReadError
-        transport = _SelectorSslTransport(
-            self.loop, self.sock, self.protocol, self.sslcontext)
+        transport = self.ssl_transport()
         self.loop.assert_reader(1, transport._on_handshake, None)
 
     def test_on_handshake_writer_retry(self):
         self.loop.set_debug(False)
         self.sslsock.do_handshake.side_effect = ssl.SSLWantWriteError
-        transport = _SelectorSslTransport(
-            self.loop, self.sock, self.protocol, self.sslcontext)
+        transport = self.ssl_transport()
         self.loop.assert_writer(1, transport._on_handshake, None)
 
     def test_on_handshake_exc(self):
@@ -1155,16 +1154,14 @@
         self.sslsock.do_handshake.side_effect = exc
         with test_utils.disable_logger():
             waiter = asyncio.Future(loop=self.loop)
-            transport = _SelectorSslTransport(
-                self.loop, self.sock, self.protocol, self.sslcontext, waiter)
+            transport = self.ssl_transport(waiter=waiter)
         self.assertTrue(waiter.done())
         self.assertIs(exc, waiter.exception())
         self.assertTrue(self.sslsock.close.called)
 
     def test_on_handshake_base_exc(self):
         waiter = asyncio.Future(loop=self.loop)
-        transport = _SelectorSslTransport(
-            self.loop, self.sock, self.protocol, self.sslcontext, waiter)
+        transport = self.ssl_transport(waiter=waiter)
         exc = BaseException()
         self.sslsock.do_handshake.side_effect = exc
         with test_utils.disable_logger():
@@ -1177,8 +1174,7 @@
         # Python issue #23197: cancelling an handshake must not raise an
         # exception or log an error, even if the handshake failed
         waiter = asyncio.Future(loop=self.loop)
-        transport = _SelectorSslTransport(
-            self.loop, self.sock, self.protocol, self.sslcontext, waiter)
+        transport = self.ssl_transport(waiter=waiter)
         waiter.cancel()
         exc = ValueError()
         self.sslsock.do_handshake.side_effect = exc
@@ -1437,9 +1433,7 @@
 
     @unittest.skipIf(ssl is None, 'No SSL support')
     def test_server_hostname(self):
-        _SelectorSslTransport(
-            self.loop, self.sock, self.protocol, self.sslcontext,
-            server_hostname='localhost')
+        self.ssl_transport(server_hostname='localhost')
         self.sslcontext.wrap_socket.assert_called_with(
             self.sock, do_handshake_on_connect=False, server_side=False,
             server_hostname='localhost')
@@ -1462,9 +1456,15 @@
         self.sock = mock.Mock(spec_set=socket.socket)
         self.sock.fileno.return_value = 7
 
+    def datagram_transport(self, address=None):
+        transport = _SelectorDatagramTransport(self.loop, self.sock,
+                                               self.protocol,
+                                               address=address)
+        self.addCleanup(close_transport, transport)
+        return transport
+
     def test_read_ready(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
 
         self.sock.recvfrom.return_value = (b'data', ('0.0.0.0', 1234))
         transport._read_ready()
@@ -1473,8 +1473,7 @@
             b'data', ('0.0.0.0', 1234))
 
     def test_read_ready_tryagain(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
 
         self.sock.recvfrom.side_effect = BlockingIOError
         transport._fatal_error = mock.Mock()
@@ -1483,8 +1482,7 @@
         self.assertFalse(transport._fatal_error.called)
 
     def test_read_ready_err(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
 
         err = self.sock.recvfrom.side_effect = RuntimeError()
         transport._fatal_error = mock.Mock()
@@ -1495,8 +1493,7 @@
                                    'Fatal read error on datagram transport')
 
     def test_read_ready_oserr(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
 
         err = self.sock.recvfrom.side_effect = OSError()
         transport._fatal_error = mock.Mock()
@@ -1507,8 +1504,7 @@
 
     def test_sendto(self):
         data = b'data'
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport.sendto(data, ('0.0.0.0', 1234))
         self.assertTrue(self.sock.sendto.called)
         self.assertEqual(
@@ -1516,8 +1512,7 @@
 
     def test_sendto_bytearray(self):
         data = bytearray(b'data')
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport.sendto(data, ('0.0.0.0', 1234))
         self.assertTrue(self.sock.sendto.called)
         self.assertEqual(
@@ -1525,16 +1520,14 @@
 
     def test_sendto_memoryview(self):
         data = memoryview(b'data')
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport.sendto(data, ('0.0.0.0', 1234))
         self.assertTrue(self.sock.sendto.called)
         self.assertEqual(
             self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
 
     def test_sendto_no_data(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._buffer.append((b'data', ('0.0.0.0', 12345)))
         transport.sendto(b'', ())
         self.assertFalse(self.sock.sendto.called)
@@ -1542,8 +1535,7 @@
             [(b'data', ('0.0.0.0', 12345))], list(transport._buffer))
 
     def test_sendto_buffer(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
         transport.sendto(b'data2', ('0.0.0.0', 12345))
         self.assertFalse(self.sock.sendto.called)
@@ -1554,8 +1546,7 @@
 
     def test_sendto_buffer_bytearray(self):
         data2 = bytearray(b'data2')
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
         transport.sendto(data2, ('0.0.0.0', 12345))
         self.assertFalse(self.sock.sendto.called)
@@ -1567,8 +1558,7 @@
 
     def test_sendto_buffer_memoryview(self):
         data2 = memoryview(b'data2')
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
         transport.sendto(data2, ('0.0.0.0', 12345))
         self.assertFalse(self.sock.sendto.called)
@@ -1583,8 +1573,7 @@
 
         self.sock.sendto.side_effect = BlockingIOError
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport.sendto(data, ('0.0.0.0', 12345))
 
         self.loop.assert_writer(7, transport._sendto_ready)
@@ -1596,8 +1585,7 @@
         data = b'data'
         err = self.sock.sendto.side_effect = RuntimeError()
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._fatal_error = mock.Mock()
         transport.sendto(data, ())
 
@@ -1620,8 +1608,7 @@
 
         self.sock.sendto.side_effect = ConnectionRefusedError
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._fatal_error = mock.Mock()
         transport.sendto(data, ())
 
@@ -1633,8 +1620,7 @@
 
         self.sock.send.side_effect = ConnectionRefusedError
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
+        transport = self.datagram_transport(address=('0.0.0.0', 1))
         transport._fatal_error = mock.Mock()
         transport.sendto(data)
 
@@ -1642,19 +1628,16 @@
         self.assertTrue(self.protocol.error_received.called)
 
     def test_sendto_str(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         self.assertRaises(TypeError, transport.sendto, 'str', ())
 
     def test_sendto_connected_addr(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
+        transport = self.datagram_transport(address=('0.0.0.0', 1))
         self.assertRaises(
             ValueError, transport.sendto, b'str', ('0.0.0.0', 2))
 
     def test_sendto_closing(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol, address=(1,))
+        transport = self.datagram_transport(address=(1,))
         transport.close()
         self.assertEqual(transport._conn_lost, 1)
         transport.sendto(b'data', (1,))
@@ -1664,8 +1647,7 @@
         data = b'data'
         self.sock.sendto.return_value = len(data)
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._buffer.append((data, ('0.0.0.0', 12345)))
         self.loop.add_writer(7, transport._sendto_ready)
         transport._sendto_ready()
@@ -1678,8 +1660,7 @@
         data = b'data'
         self.sock.send.return_value = len(data)
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._closing = True
         transport._buffer.append((data, ()))
         self.loop.add_writer(7, transport._sendto_ready)
@@ -1690,8 +1671,7 @@
         self.protocol.connection_lost.assert_called_with(None)
 
     def test_sendto_ready_no_data(self):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         self.loop.add_writer(7, transport._sendto_ready)
         transport._sendto_ready()
         self.assertFalse(self.sock.sendto.called)
@@ -1700,8 +1680,7 @@
     def test_sendto_ready_tryagain(self):
         self.sock.sendto.side_effect = BlockingIOError
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._buffer.extend([(b'data1', ()), (b'data2', ())])
         self.loop.add_writer(7, transport._sendto_ready)
         transport._sendto_ready()
@@ -1714,8 +1693,7 @@
     def test_sendto_ready_exception(self):
         err = self.sock.sendto.side_effect = RuntimeError()
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._fatal_error = mock.Mock()
         transport._buffer.append((b'data', ()))
         transport._sendto_ready()
@@ -1727,8 +1705,7 @@
     def test_sendto_ready_error_received(self):
         self.sock.sendto.side_effect = ConnectionRefusedError
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol)
+        transport = self.datagram_transport()
         transport._fatal_error = mock.Mock()
         transport._buffer.append((b'data', ()))
         transport._sendto_ready()
@@ -1738,8 +1715,7 @@
     def test_sendto_ready_error_received_connection(self):
         self.sock.send.side_effect = ConnectionRefusedError
 
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
+        transport = self.datagram_transport(address=('0.0.0.0', 1))
         transport._fatal_error = mock.Mock()
         transport._buffer.append((b'data', ()))
         transport._sendto_ready()
@@ -1749,8 +1725,7 @@
 
     @mock.patch('asyncio.base_events.logger.error')
     def test_fatal_error_connected(self, m_exc):
-        transport = _SelectorDatagramTransport(
-            self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
+        transport = self.datagram_transport(address=('0.0.0.0', 1))
         err = ConnectionRefusedError()
         transport._fatal_error(err)
         self.assertFalse(self.protocol.error_received.called)
@@ -1758,7 +1733,6 @@
             test_utils.MockPattern(
                 'Fatal error on transport\nprotocol:.*\ntransport:.*'),
             exc_info=(ConnectionRefusedError, MOCK_ANY, MOCK_ANY))
-        transport.close()
 
 
 if __name__ == '__main__':
diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py
index 4a68ce3..126196d 100644
--- a/Lib/test/test_asyncio/test_unix_events.py
+++ b/Lib/test/test_asyncio/test_unix_events.py
@@ -26,6 +26,15 @@
 MOCK_ANY = mock.ANY
 
 
+def close_pipe_transport(transport):
+    # Don't call transport.close() because the event loop and the selector
+    # are mocked
+    if transport._pipe is None:
+        return
+    transport._pipe.close()
+    transport._pipe = None
+
+
 @unittest.skipUnless(signal, 'Signals are not supported')
 class SelectorEventLoopSignalTests(test_utils.TestCase):
 
@@ -333,24 +342,28 @@
         m_fstat.return_value = st
         self.addCleanup(fstat_patcher.stop)
 
+    def read_pipe_transport(self, waiter=None):
+        transport = unix_events._UnixReadPipeTransport(self.loop, self.pipe,
+                                                       self.protocol,
+                                                       waiter=waiter)
+        self.addCleanup(close_pipe_transport, transport)
+        return transport
+
     def test_ctor(self):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.read_pipe_transport()
         self.loop.assert_reader(5, tr._read_ready)
         test_utils.run_briefly(self.loop)
         self.protocol.connection_made.assert_called_with(tr)
 
     def test_ctor_with_waiter(self):
         fut = asyncio.Future(loop=self.loop)
-        unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol, fut)
+        tr = self.read_pipe_transport(waiter=fut)
         test_utils.run_briefly(self.loop)
         self.assertIsNone(fut.result())
 
     @mock.patch('os.read')
     def test__read_ready(self, m_read):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.read_pipe_transport()
         m_read.return_value = b'data'
         tr._read_ready()
 
@@ -359,8 +372,7 @@
 
     @mock.patch('os.read')
     def test__read_ready_eof(self, m_read):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.read_pipe_transport()
         m_read.return_value = b''
         tr._read_ready()
 
@@ -372,8 +384,7 @@
 
     @mock.patch('os.read')
     def test__read_ready_blocked(self, m_read):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.read_pipe_transport()
         m_read.side_effect = BlockingIOError
         tr._read_ready()
 
@@ -384,8 +395,7 @@
     @mock.patch('asyncio.log.logger.error')
     @mock.patch('os.read')
     def test__read_ready_error(self, m_read, m_logexc):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.read_pipe_transport()
         err = OSError()
         m_read.side_effect = err
         tr._close = mock.Mock()
@@ -401,9 +411,7 @@
 
     @mock.patch('os.read')
     def test_pause_reading(self, m_read):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.read_pipe_transport()
         m = mock.Mock()
         self.loop.add_reader(5, m)
         tr.pause_reading()
@@ -411,26 +419,20 @@
 
     @mock.patch('os.read')
     def test_resume_reading(self, m_read):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.read_pipe_transport()
         tr.resume_reading()
         self.loop.assert_reader(5, tr._read_ready)
 
     @mock.patch('os.read')
     def test_close(self, m_read):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.read_pipe_transport()
         tr._close = mock.Mock()
         tr.close()
         tr._close.assert_called_with(None)
 
     @mock.patch('os.read')
     def test_close_already_closing(self, m_read):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.read_pipe_transport()
         tr._closing = True
         tr._close = mock.Mock()
         tr.close()
@@ -438,9 +440,7 @@
 
     @mock.patch('os.read')
     def test__close(self, m_read):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.read_pipe_transport()
         err = object()
         tr._close(err)
         self.assertTrue(tr._closing)
@@ -449,8 +449,7 @@
         self.protocol.connection_lost.assert_called_with(err)
 
     def test__call_connection_lost(self):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.read_pipe_transport()
         self.assertIsNotNone(tr._protocol)
         self.assertIsNotNone(tr._loop)
 
@@ -463,8 +462,7 @@
         self.assertIsNone(tr._loop)
 
     def test__call_connection_lost_with_err(self):
-        tr = unix_events._UnixReadPipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.read_pipe_transport()
         self.assertIsNotNone(tr._protocol)
         self.assertIsNotNone(tr._loop)
 
@@ -496,31 +494,33 @@
         m_fstat.return_value = st
         self.addCleanup(fstat_patcher.stop)
 
+    def write_pipe_transport(self, waiter=None):
+        transport = unix_events._UnixWritePipeTransport(self.loop, self.pipe,
+                                                        self.protocol,
+                                                        waiter=waiter)
+        self.addCleanup(close_pipe_transport, transport)
+        return transport
+
     def test_ctor(self):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.write_pipe_transport()
         self.loop.assert_reader(5, tr._read_ready)
         test_utils.run_briefly(self.loop)
         self.protocol.connection_made.assert_called_with(tr)
 
     def test_ctor_with_waiter(self):
         fut = asyncio.Future(loop=self.loop)
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol, fut)
+        tr = self.write_pipe_transport(waiter=fut)
         self.loop.assert_reader(5, tr._read_ready)
         test_utils.run_briefly(self.loop)
         self.assertEqual(None, fut.result())
 
     def test_can_write_eof(self):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.write_pipe_transport()
         self.assertTrue(tr.can_write_eof())
 
     @mock.patch('os.write')
     def test_write(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         m_write.return_value = 4
         tr.write(b'data')
         m_write.assert_called_with(5, b'data')
@@ -529,9 +529,7 @@
 
     @mock.patch('os.write')
     def test_write_no_data(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         tr.write(b'')
         self.assertFalse(m_write.called)
         self.assertFalse(self.loop.writers)
@@ -539,9 +537,7 @@
 
     @mock.patch('os.write')
     def test_write_partial(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         m_write.return_value = 2
         tr.write(b'data')
         m_write.assert_called_with(5, b'data')
@@ -550,9 +546,7 @@
 
     @mock.patch('os.write')
     def test_write_buffer(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         self.loop.add_writer(5, tr._write_ready)
         tr._buffer = [b'previous']
         tr.write(b'data')
@@ -562,9 +556,7 @@
 
     @mock.patch('os.write')
     def test_write_again(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         m_write.side_effect = BlockingIOError()
         tr.write(b'data')
         m_write.assert_called_with(5, b'data')
@@ -574,9 +566,7 @@
     @mock.patch('asyncio.unix_events.logger')
     @mock.patch('os.write')
     def test_write_err(self, m_write, m_log):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         err = OSError()
         m_write.side_effect = err
         tr._fatal_error = mock.Mock()
@@ -602,8 +592,7 @@
 
     @mock.patch('os.write')
     def test_write_close(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.write_pipe_transport()
         tr._read_ready()  # pipe was closed by peer
 
         tr.write(b'data')
@@ -612,8 +601,7 @@
         self.assertEqual(tr._conn_lost, 2)
 
     def test__read_ready(self):
-        tr = unix_events._UnixWritePipeTransport(self.loop, self.pipe,
-                                                 self.protocol)
+        tr = self.write_pipe_transport()
         tr._read_ready()
         self.assertFalse(self.loop.readers)
         self.assertFalse(self.loop.writers)
@@ -623,8 +611,7 @@
 
     @mock.patch('os.write')
     def test__write_ready(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.write_pipe_transport()
         self.loop.add_writer(5, tr._write_ready)
         tr._buffer = [b'da', b'ta']
         m_write.return_value = 4
@@ -635,9 +622,7 @@
 
     @mock.patch('os.write')
     def test__write_ready_partial(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         self.loop.add_writer(5, tr._write_ready)
         tr._buffer = [b'da', b'ta']
         m_write.return_value = 3
@@ -648,9 +633,7 @@
 
     @mock.patch('os.write')
     def test__write_ready_again(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         self.loop.add_writer(5, tr._write_ready)
         tr._buffer = [b'da', b'ta']
         m_write.side_effect = BlockingIOError()
@@ -661,9 +644,7 @@
 
     @mock.patch('os.write')
     def test__write_ready_empty(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         self.loop.add_writer(5, tr._write_ready)
         tr._buffer = [b'da', b'ta']
         m_write.return_value = 0
@@ -675,9 +656,7 @@
     @mock.patch('asyncio.log.logger.error')
     @mock.patch('os.write')
     def test__write_ready_err(self, m_write, m_logexc):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         self.loop.add_writer(5, tr._write_ready)
         tr._buffer = [b'da', b'ta']
         m_write.side_effect = err = OSError()
@@ -698,9 +677,7 @@
 
     @mock.patch('os.write')
     def test__write_ready_closing(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         self.loop.add_writer(5, tr._write_ready)
         tr._closing = True
         tr._buffer = [b'da', b'ta']
@@ -715,9 +692,7 @@
 
     @mock.patch('os.write')
     def test_abort(self, m_write):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         self.loop.add_writer(5, tr._write_ready)
         self.loop.add_reader(5, tr._read_ready)
         tr._buffer = [b'da', b'ta']
@@ -731,8 +706,7 @@
         self.protocol.connection_lost.assert_called_with(None)
 
     def test__call_connection_lost(self):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.write_pipe_transport()
         self.assertIsNotNone(tr._protocol)
         self.assertIsNotNone(tr._loop)
 
@@ -745,8 +719,7 @@
         self.assertIsNone(tr._loop)
 
     def test__call_connection_lost_with_err(self):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.write_pipe_transport()
         self.assertIsNotNone(tr._protocol)
         self.assertIsNotNone(tr._loop)
 
@@ -759,9 +732,7 @@
         self.assertIsNone(tr._loop)
 
     def test_close(self):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         tr.write_eof = mock.Mock()
         tr.close()
         tr.write_eof.assert_called_with()
@@ -770,18 +741,14 @@
         tr.close()
 
     def test_close_closing(self):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         tr.write_eof = mock.Mock()
         tr._closing = True
         tr.close()
         self.assertFalse(tr.write_eof.called)
 
     def test_write_eof(self):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
-
+        tr = self.write_pipe_transport()
         tr.write_eof()
         self.assertTrue(tr._closing)
         self.assertFalse(self.loop.readers)
@@ -789,8 +756,7 @@
         self.protocol.connection_lost.assert_called_with(None)
 
     def test_write_eof_pending(self):
-        tr = unix_events._UnixWritePipeTransport(
-            self.loop, self.pipe, self.protocol)
+        tr = self.write_pipe_transport()
         tr._buffer = [b'data']
         tr.write_eof()
         self.assertTrue(tr._closing)
