changeset: 85363:b9e62929460e branch: 3.3 parent: 85360:75728ef3d0c9 user: Antoine Pitrou date: Sat Aug 24 20:52:27 2013 +0200 files: Lib/test/test_os.py description: Issue #18756: make test_urandom_failure more robust by executing its code in a subprocess diff -r 75728ef3d0c9 -r b9e62929460e Lib/test/test_os.py --- a/Lib/test/test_os.py Sat Aug 24 15:52:47 2013 +0200 +++ b/Lib/test/test_os.py Sat Aug 24 20:52:27 2013 +0200 @@ -1007,17 +1007,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) @contextlib.contextmanager