]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35602: Make sure the transport is always closed in SelectorEventLoopUnixSockSendf...
authorPablo Galindo <Pablogsal@gmail.com>
Sat, 29 Dec 2018 19:18:38 +0000 (19:18 +0000)
committerGitHub <noreply@github.com>
Sat, 29 Dec 2018 19:18:38 +0000 (19:18 +0000)
There is a race condition in SelectorEventLoopUnixSockSendfileTests that causes the prepare() method return a non connected server protocol, making the cleanup() method skips the correct handling of the transport. This commit makes prepare() always return a connected server protocol that can always be cleaned up correctly.

Lib/test/test_asyncio/test_unix_events.py

index 62545c0f98c37444b63088afe5d1b2c80488a031..31e710037f76a3fdce69b33453320b45e19824c0 100644 (file)
@@ -449,10 +449,12 @@ class SelectorEventLoopUnixSockSendfileTests(test_utils.TestCase):
             self.data = bytearray()
             self.fut = loop.create_future()
             self.transport = None
+            self._ready = loop.create_future()
 
         def connection_made(self, transport):
             self.started = True
             self.transport = transport
+            self._ready.set_result(None)
 
         def data_received(self, data):
             self.data.extend(data)
@@ -503,13 +505,11 @@ class SelectorEventLoopUnixSockSendfileTests(test_utils.TestCase):
         server = self.run_loop(self.loop.create_server(
             lambda: proto, sock=srv_sock))
         self.run_loop(self.loop.sock_connect(sock, (support.HOST, port)))
+        self.run_loop(proto._ready)
 
         def cleanup():
-            if proto.transport is not None:
-                # can be None if the task was cancelled before
-                # connection_made callback
-                proto.transport.close()
-                self.run_loop(proto.wait_closed())
+            proto.transport.close()
+            self.run_loop(proto.wait_closed())
 
             server.close()
             self.run_loop(server.wait_closed())