diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2013-08-24 18:52:27 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2013-08-24 18:52:27 (GMT) |
commit | eba25bafc744a3889f9a791268c085598e416060 (patch) | |
tree | b626d5e99e7681f5f741308ea1815e0542023532 /Lib/test | |
parent | 71fe8c00f6e2eda39d90c225c5f7635268cc4653 (diff) | |
download | cpython-eba25bafc744a3889f9a791268c085598e416060.zip cpython-eba25bafc744a3889f9a791268c085598e416060.tar.gz cpython-eba25bafc744a3889f9a791268c085598e416060.tar.bz2 |
Issue #18756: make test_urandom_failure more robust by executing its code in a subprocess
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_os.py | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index fbf6c0c..d2424d7 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -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 |