summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2019-12-09 10:57:05 (GMT)
committerGitHub <noreply@github.com>2019-12-09 10:57:05 (GMT)
commita1838ec2592e5082c75c77888f2a7a3eb21133e5 (patch)
tree46c91b9a81903ff9ef48ed91107ebe10594b6837
parent109fc2792a490ee5cd8a423e17d415fbdedec5c8 (diff)
downloadcpython-a1838ec2592e5082c75c77888f2a7a3eb21133e5.zip
cpython-a1838ec2592e5082c75c77888f2a7a3eb21133e5.tar.gz
cpython-a1838ec2592e5082c75c77888f2a7a3eb21133e5.tar.bz2
bpo-38547: Fix test_pty if the process is the session leader (GH-17519)
Fix test_pty: if the process is the session leader, closing the master file descriptor raises a SIGHUP signal: simply ignore SIGHUP when running the tests.
-rw-r--r--Lib/test/test_pty.py19
-rw-r--r--Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst3
2 files changed, 19 insertions, 3 deletions
diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
index 3b44856..ce85f57 100644
--- a/Lib/test/test_pty.py
+++ b/Lib/test/test_pty.py
@@ -66,16 +66,27 @@ def _readline(fd):
# XXX(nnorwitz): these tests leak fds when there is an error.
class PtyTest(unittest.TestCase):
def setUp(self):
- # isatty() and close() can hang on some platforms. Set an alarm
- # before running the test to make sure we don't hang forever.
old_alarm = signal.signal(signal.SIGALRM, self.handle_sig)
self.addCleanup(signal.signal, signal.SIGALRM, old_alarm)
+
+ old_sighup = signal.signal(signal.SIGHUP, self.handle_sighup)
+ self.addCleanup(signal.signal, signal.SIGHUP, old_alarm)
+
+ # isatty() and close() can hang on some platforms. Set an alarm
+ # before running the test to make sure we don't hang forever.
self.addCleanup(signal.alarm, 0)
signal.alarm(10)
def handle_sig(self, sig, frame):
self.fail("isatty hung")
+ @staticmethod
+ def handle_sighup(sig, frame):
+ # if the process is the session leader, os.close(master_fd)
+ # of "master_fd, slave_name = pty.master_open()" raises SIGHUP
+ # signal: just ignore the signal.
+ pass
+
def test_basic(self):
try:
debug("Calling master_open()")
@@ -122,9 +133,11 @@ class PtyTest(unittest.TestCase):
self.assertEqual(b'For my pet fish, Eric.\n', normalize_output(s2))
os.close(slave_fd)
+ # closing master_fd can raise a SIGHUP if the process is
+ # the session leader: we installed a SIGHUP signal handler
+ # to ignore this signal.
os.close(master_fd)
-
def test_fork(self):
debug("calling pty.fork()")
pid, master_fd = pty.fork()
diff --git a/Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst b/Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst
new file mode 100644
index 0000000..10f3cc0
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst
@@ -0,0 +1,3 @@
+Fix test_pty: if the process is the session leader, closing the master file
+descriptor raises a SIGHUP signal: simply ignore SIGHUP when running the
+tests.