[Python-checkins] cpython (2.7): Issue #18756: make test_urandom_failure more robust by executing its code in a

antoine.pitrou python-checkins at python.org
Sat Aug 24 20:55:01 CEST 2013


http://hg.python.org/cpython/rev/869df611c138
changeset:   85365:869df611c138
branch:      2.7
parent:      85357:c24941251473
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Sat Aug 24 20:52:27 2013 +0200
summary:
  Issue #18756: make test_urandom_failure more robust by executing its code in a subprocess

files:
  Lib/test/test_os.py |  30 ++++++++++++++++++++----------
  1 files changed, 20 insertions(+), 10 deletions(-)


diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -16,6 +16,7 @@
     resource = None
 
 from test import test_support
+from test.script_helper import assert_python_ok
 import mmap
 import uuid
 
@@ -569,17 +570,26 @@
 
     @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)
 
 
 class ExecvpeTests(unittest.TestCase):

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list