[Python-checkins] bpo-36013: delete fragile interactive shell SIGINT test (GH-11902)

Gregory P. Smith webhook-mailer at python.org
Sat Feb 16 20:22:44 EST 2019

commit: 414c625a7ea58943f0b1bc79d095d667d78db013
branch: master
author: Gregory P. Smith <greg at krypto.org>
committer: GitHub <noreply at github.com>
date: 2019-02-16T17:22:39-08:00

bpo-36013: delete fragile interactive shell SIGINT test (GH-11902)

It makes the existing smaller test more readable and robust at the same time.

The execution of a shell in interactive mode from CI and buildbot test automation wasn't working out.  What would work locally in our terminals would only work within a fraction of automation systems.  The integration test was a nice to have.  painful.  deleting. :)

M Lib/test/test_signal.py

diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index 80c0ff4cb4d5..063b35ca230f 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -83,42 +83,16 @@ def test_keyboard_interrupt_exit_code(self):
         """KeyboardInterrupt triggers exit via SIGINT."""
         process = subprocess.run(
                 [sys.executable, "-c",
-                 "import os,signal; os.kill(os.getpid(), signal.SIGINT)"],
+                 "import os, signal, time\n"
+                 "os.kill(os.getpid(), signal.SIGINT)\n"
+                 "for _ in range(999): time.sleep(0.01)"],
         self.assertIn(b"KeyboardInterrupt", process.stderr)
         self.assertEqual(process.returncode, -signal.SIGINT)
-    @unittest.skipUnless(sys.executable, "sys.executable required.")
-    def test_keyboard_interrupt_communicated_to_shell(self):
-        """KeyboardInterrupt exits such that shells detect a ^C."""
-        try:
-            bash_proc = subprocess.run(
-                    ["bash", "-c", 'echo "${BASH_VERSION}"'],
-                    stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
-        except OSError:
-            raise unittest.SkipTest("bash required.")
-        if bash_proc.returncode:
-            raise unittest.SkipTest("could not determine bash version.")
-        bash_ver = bash_proc.stdout.decode("ascii").strip()
-        bash_major_minor = [int(n) for n in bash_ver.split(".", 2)[:2]]
-        if bash_major_minor < [4, 4]:
-            # In older versions of bash, -i does not work as needed
-            # _for this automated test_.  Older shells do behave as
-            # expected in manual interactive use.
-            raise unittest.SkipTest(f"bash version {bash_ver} is too old.")
-        # The motivation for https://bugs.python.org/issue1054041.
-        # An _interactive_ shell (bash -i simulates that here) detects
-        # when a command exits via ^C and stops executing further
-        # commands.
-        process = subprocess.run(
-            ["bash", "-ic",
-             f"{sys.executable} -c 'import os,signal; os.kill(os.getpid(), signal.SIGINT)'; "
-             "echo TESTFAIL using bash \"${BASH_VERSION}\""],
-            stderr=subprocess.PIPE, stdout=subprocess.PIPE)
-        self.assertIn(b"KeyboardInterrupt", process.stderr)
-        # An interactive shell will abort if python exits properly to
-        # indicate that a KeyboardInterrupt occurred.
-        self.assertNotIn(b"TESTFAIL", process.stdout)
+        # Caveat: The exit code is insufficient to guarantee we actually died
+        # via a signal.  POSIX shells do more than look at the 8 bit value.
+        # Writing an automation friendly test of an interactive shell
+        # to confirm that our process died via a SIGINT proved too complex.
 @unittest.skipUnless(sys.platform == "win32", "Windows specific")

More information about the Python-checkins mailing list