asyncio, Tulip issue 143: UNIX domain methods, fix ResourceWarning and
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 19 Feb 2014 00:45:59 +0000 (01:45 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 19 Feb 2014 00:45:59 +0000 (01:45 +0100)
DeprecationWarning warnings. create_unix_server() closes the socket on any
error, not only on OSError.

Lib/asyncio/unix_events.py
Lib/test/test_asyncio/test_unix_events.py

index 3a2fd18b2dff9650488bf4c4d10f22feca3eb958..faf4c60d5bb525e16d6ab08b8938e2901b504aa1 100644 (file)
@@ -183,13 +183,12 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
                 raise ValueError(
                     'path and sock can not be specified at the same time')
 
+            sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
             try:
-                sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
                 sock.setblocking(False)
                 yield from self.sock_connect(sock, path)
-            except OSError:
-                if sock is not None:
-                    sock.close()
+            except:
+                sock.close()
                 raise
 
         else:
@@ -213,6 +212,7 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
             try:
                 sock.bind(path)
             except OSError as exc:
+                sock.close()
                 if exc.errno == errno.EADDRINUSE:
                     # Let's improve the error message by adding
                     # with what exact address it occurs.
index 9866e33affc3dbc6eaae81b4f7251ca8f3b770f7..7b5196c8bef9894d7b24922d0a0b9a0ad80f90e6 100644 (file)
@@ -221,17 +221,17 @@ class SelectorEventLoopUnixSocketTests(unittest.TestCase):
         with test_utils.unix_socket_path() as path:
             sock = socket.socket(socket.AF_UNIX)
             sock.bind(path)
-
-            coro = self.loop.create_unix_server(lambda: None, path)
-            with self.assertRaisesRegexp(OSError,
-                                         'Address.*is already in use'):
-                self.loop.run_until_complete(coro)
+            with sock:
+                coro = self.loop.create_unix_server(lambda: None, path)
+                with self.assertRaisesRegex(OSError,
+                                            'Address.*is already in use'):
+                    self.loop.run_until_complete(coro)
 
     def test_create_unix_server_existing_path_nonsock(self):
         with tempfile.NamedTemporaryFile() as file:
             coro = self.loop.create_unix_server(lambda: None, file.name)
-            with self.assertRaisesRegexp(OSError,
-                                         'Address.*is already in use'):
+            with self.assertRaisesRegex(OSError,
+                                        'Address.*is already in use'):
                 self.loop.run_until_complete(coro)
 
     def test_create_unix_server_ssl_bool(self):
@@ -248,11 +248,13 @@ class SelectorEventLoopUnixSocketTests(unittest.TestCase):
             self.loop.run_until_complete(coro)
 
     def test_create_unix_server_path_inetsock(self):
-        coro = self.loop.create_unix_server(lambda: None, path=None,
-                                            sock=socket.socket())
-        with self.assertRaisesRegex(ValueError,
-                                    'A UNIX Domain Socket was expected'):
-            self.loop.run_until_complete(coro)
+        sock = socket.socket()
+        with sock:
+            coro = self.loop.create_unix_server(lambda: None, path=None,
+                                                sock=sock)
+            with self.assertRaisesRegex(ValueError,
+                                        'A UNIX Domain Socket was expected'):
+                self.loop.run_until_complete(coro)
 
     def test_create_unix_connection_path_sock(self):
         coro = self.loop.create_unix_connection(
@@ -278,7 +280,7 @@ class SelectorEventLoopUnixSocketTests(unittest.TestCase):
         coro = self.loop.create_unix_connection(
             lambda: None, '/dev/null', ssl=True)
 
-        with self.assertRaisesRegexp(
+        with self.assertRaisesRegex(
             ValueError, 'you have to pass server_hostname when using ssl'):
 
             self.loop.run_until_complete(coro)