]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Fix error raised in set_close_exec on windows
authorBen Darnell <ben@bendarnell.com>
Sun, 22 May 2016 00:23:51 +0000 (20:23 -0400)
committerBen Darnell <ben@bendarnell.com>
Sun, 22 May 2016 01:23:01 +0000 (21:23 -0400)
This slightly improves error messaging when tornado.process.Subprocess
is used in windows.

Fixes #1703

tornado/platform/windows.py
tornado/test/runtests.py
tornado/test/windows_test.py [new file with mode: 0644]

index 92295fc6cf4ed75ebe3d8ab4b80db04f7ab26878..9a319f27715e2fea22d756e302f5f55f5490e23f 100644 (file)
@@ -17,4 +17,4 @@ HANDLE_FLAG_INHERIT = 0x00000001
 def set_close_exec(fd):
     success = SetHandleInformation(fd, HANDLE_FLAG_INHERIT, 0)
     if not success:
-        raise ctypes.GetLastError()
+        raise ctypes.WinError()
index 3b22d396eb42922f89a9c98eb3dc53f5f0a4d33a..ca82d66b9bdd9a0ff318ffe6411a548f3f3d404c 100644 (file)
@@ -53,6 +53,7 @@ TEST_MODULES = [
     'tornado.test.util_test',
     'tornado.test.web_test',
     'tornado.test.websocket_test',
+    'tornado.test.windows_test',
     'tornado.test.wsgi_test',
 ]
 
diff --git a/tornado/test/windows_test.py b/tornado/test/windows_test.py
new file mode 100644 (file)
index 0000000..26e0161
--- /dev/null
@@ -0,0 +1,25 @@
+import functools
+import os
+import socket
+import unittest
+
+from tornado.platform.auto import set_close_exec
+
+skipIfNonWindows = unittest.skipIf(os.name != 'nt', 'non-windows platform')
+
+@skipIfNonWindows
+class WindowsTest(unittest.TestCase):
+    def test_set_close_exec(self):
+        # set_close_exec works with sockets.
+        s = socket.socket()
+        self.addCleanup(s.close)
+        set_close_exec(s.fileno())
+
+        # But it doesn't work with pipes.
+        r, w = os.pipe()
+        self.addCleanup(functools.partial(os.close, r))
+        self.addCleanup(functools.partial(os.close, w))
+        with self.assertRaises(WindowsError) as cm:
+            set_close_exec(r)
+        ERROR_INVALID_HANDLE = 6
+        self.assertEqual(cm.exception.winerror, ERROR_INVALID_HANDLE)