diff options
author | Christian Heimes <christian@cheimes.de> | 2013-08-18 01:16:16 (GMT) |
---|---|---|
committer | Christian Heimes <christian@cheimes.de> | 2013-08-18 01:16:16 (GMT) |
commit | 17dd53b4645c4684e8b662e937fe0f7cd3b45088 (patch) | |
tree | 313ccf43fed6fc3cbfe3813cd9a4ec65a0033a14 /Lib | |
parent | 5bb2c8668d7dce169cc0f22ede964cb226bb3d5f (diff) | |
parent | 8f0bddad308f8c52bf16e3f90a864b2a168e3291 (diff) | |
download | cpython-17dd53b4645c4684e8b662e937fe0f7cd3b45088.zip cpython-17dd53b4645c4684e8b662e937fe0f7cd3b45088.tar.gz cpython-17dd53b4645c4684e8b662e937fe0f7cd3b45088.tar.bz2 |
merge
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_signal.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 1efb5f7..3530d8a 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -275,6 +275,57 @@ class WakeupSignalTests(unittest.TestCase): assert_python_ok('-c', code) + def test_wakeup_write_error(self): + # Issue #16105: write() errors in the C signal handler should not + # pass silently. + # Use a subprocess to have only one thread. + code = """if 1: + import errno + import fcntl + import os + import signal + import sys + import time + from test.support import captured_stderr + + def handler(signum, frame): + 1/0 + + signal.signal(signal.SIGALRM, handler) + r, w = os.pipe() + flags = fcntl.fcntl(r, fcntl.F_GETFL, 0) + fcntl.fcntl(r, fcntl.F_SETFL, flags | os.O_NONBLOCK) + + # Set wakeup_fd a read-only file descriptor to trigger the error + signal.set_wakeup_fd(r) + try: + with captured_stderr() as err: + signal.alarm(1) + time.sleep(5.0) + except ZeroDivisionError: + # An ignored exception should have been printed out on stderr + err = err.getvalue() + if ('Exception ignored when trying to write to the signal wakeup fd' + not in err): + raise AssertionError(err) + if ('OSError: [Errno %d]' % errno.EBADF) not in err: + raise AssertionError(err) + else: + raise AssertionError("ZeroDivisionError not raised") + """ + r, w = os.pipe() + try: + os.write(r, b'x') + except OSError: + pass + else: + self.skipTest("OS doesn't report write() error on the read end of a pipe") + finally: + os.close(r) + os.close(w) + + assert_python_ok('-c', code) + def test_wakeup_fd_early(self): self.check_wakeup("""def test(): import select |