]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38547: Fix test_pty if the process is the session leader (GH-17519)
authorVictor Stinner <vstinner@python.org>
Mon, 9 Dec 2019 10:57:05 +0000 (11:57 +0100)
committerGitHub <noreply@github.com>
Mon, 9 Dec 2019 10:57:05 +0000 (11:57 +0100)
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.

Lib/test/test_pty.py
Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst [new file with mode: 0644]

index 3b448569a2ffcb969a24613455eb93bd9f62a352..ce85f575a0830816749358ca857943928d4cb32d 100644 (file)
@@ -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 (file)
index 0000000..10f3cc0
--- /dev/null
@@ -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.