[Python-checkins] bpo-38547: Fix test_pty if the process is the session leader (GH-17519)

Victor Stinner webhook-mailer at python.org
Mon Dec 9 05:57:18 EST 2019


https://github.com/python/cpython/commit/a1838ec2592e5082c75c77888f2a7a3eb21133e5
commit: a1838ec2592e5082c75c77888f2a7a3eb21133e5
branch: master
author: Victor Stinner <vstinner at python.org>
committer: GitHub <noreply at github.com>
date: 2019-12-09T11:57:05+01:00
summary:

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.

files:
A Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst
M Lib/test/test_pty.py

diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
index 3b448569a2ffc..ce85f575a0830 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 @@ def test_basic(self):
         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 0000000000000..10f3cc08511dd
--- /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.



More information about the Python-checkins mailing list