]> granicus.if.org Git - python/commitdiff
Issue #18756: make test_urandom_failure more robust by executing its code in a subprocess
authorAntoine Pitrou <solipsis@pitrou.net>
Sat, 24 Aug 2013 18:52:27 +0000 (20:52 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Sat, 24 Aug 2013 18:52:27 +0000 (20:52 +0200)
Lib/test/test_os.py

index fbf6c0cf7e5a5c3b1183105e958d5ea961ebd32e..d2424d786559e072a62d52eefba59d5724699b5c 100644 (file)
@@ -1007,17 +1007,26 @@ class URandomTests(unittest.TestCase):
 
     @unittest.skipUnless(resource, "test requires the resource module")
     def test_urandom_failure(self):
-        soft_limit, hard_limit = resource.getrlimit(resource.RLIMIT_NOFILE)
-        resource.setrlimit(resource.RLIMIT_NOFILE, (1, hard_limit))
-        try:
-            with self.assertRaises(OSError) as cm:
+        # Check urandom() failing when it is not able to open /dev/random.
+        # We spawn a new process to make the test more robust (if getrlimit()
+        # failed to restore the file descriptor limit after this, the whole
+        # test suite would crash; this actually happened on the OS X Tiger
+        # buildbot).
+        code = """if 1:
+            import errno
+            import os
+            import resource
+
+            soft_limit, hard_limit = resource.getrlimit(resource.RLIMIT_NOFILE)
+            resource.setrlimit(resource.RLIMIT_NOFILE, (1, hard_limit))
+            try:
                 os.urandom(16)
-            self.assertEqual(cm.exception.errno, errno.EMFILE)
-        finally:
-            # We restore the old limit as soon as possible.  If doing it
-            # using addCleanup(), code running in between would fail
-            # creating any file descriptor.
-            resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit))
+            except OSError as e:
+                assert e.errno == errno.EMFILE, e.errno
+            else:
+                raise AssertionError("OSError not raised")
+            """
+        assert_python_ok('-c', code)
 
 
 @contextlib.contextmanager