bpo-30764: test_subprocess uses SuppressCrashReport (#2405) · python/cpython@cdee3f1 (original) (raw)
`@@ -2563,37 +2563,40 @@ def test_communicate_BrokenPipeError_stdin_close_with_timeout(self):
`
2563
2563
`proc.communicate(timeout=999)
`
2564
2564
`mock_proc_stdin.close.assert_called_once_with()
`
2565
2565
``
2566
``
`-
@unittest.skipIf(not ctypes, 'ctypes module required.')
`
2567
``
`-
@unittest.skipIf(not sys.executable, 'Test requires sys.executable.')
`
``
2566
`+
@unittest.skipIf(not ctypes, 'ctypes module required')
`
``
2567
`+
@unittest.skipIf(not sys.executable, 'Test requires sys.executable')
`
2568
2568
`def test_child_terminated_in_stopped_state(self):
`
2569
2569
`"""Test wait() behavior when waitpid returns WIFSTOPPED; issue29335."""
`
2570
2570
`PTRACE_TRACEME = 0 # From glibc and MacOS (PT_TRACE_ME).
`
2571
2571
`libc_name = ctypes.util.find_library('c')
`
2572
2572
`libc = ctypes.CDLL(libc_name)
`
2573
2573
`if not hasattr(libc, 'ptrace'):
`
2574
``
`-
raise unittest.SkipTest('ptrace() required.')
`
2575
``
`-
test_ptrace = subprocess.Popen(
`
2576
``
`-
[sys.executable, '-c', """if True:
`
``
2574
`+
raise unittest.SkipTest('ptrace() required')
`
``
2575
+
``
2576
`+
code = textwrap.dedent(f"""
`
2577
2577
` import ctypes
`
``
2578
`+
import faulthandler
`
``
2579
`+
from test.support import SuppressCrashReport
`
``
2580
+
2578
2581
` libc = ctypes.CDLL({libc_name!r})
`
2579
2582
` libc.ptrace({PTRACE_TRACEME}, 0, 0)
`
2580
``
`-
""".format(libc_name=libc_name, PTRACE_TRACEME=PTRACE_TRACEME)
`
2581
``
`-
])
`
2582
``
`-
if test_ptrace.wait() != 0:
`
2583
``
`-
raise unittest.SkipTest('ptrace() failed - unable to test.')
`
2584
``
`-
child = subprocess.Popen(
`
2585
``
`-
[sys.executable, '-c', """if True:
`
2586
``
`-
import ctypes, faulthandler
`
2587
``
`-
libc = ctypes.CDLL({libc_name!r})
`
2588
``
`-
libc.ptrace({PTRACE_TRACEME}, 0, 0)
`
2589
``
`-
faulthandler._sigsegv() # Crash the process.
`
2590
``
`-
""".format(libc_name=libc_name, PTRACE_TRACEME=PTRACE_TRACEME)
`
2591
``
`-
])
`
``
2583
`+
""")
`
``
2584
+
``
2585
`+
child = subprocess.Popen([sys.executable, '-c', code])
`
``
2586
`+
if child.wait() != 0:
`
``
2587
`+
raise unittest.SkipTest('ptrace() failed - unable to test')
`
``
2588
+
``
2589
`+
code += textwrap.dedent(f"""
`
``
2590
`+
with SuppressCrashReport():
`
``
2591
`+
Crash the process
`
``
2592
`+
faulthandler._sigsegv()
`
``
2593
`+
""")
`
``
2594
`+
child = subprocess.Popen([sys.executable, '-c', code])
`
2592
2595
`try:
`
2593
2596
`returncode = child.wait()
`
2594
``
`-
except Exception as e:
`
``
2597
`+
except:
`
2595
2598
`child.kill() # Clean up the hung stopped process.
`
2596
``
`-
raise e
`
``
2599
`+
raise
`
2597
2600
`self.assertNotEqual(0, returncode)
`
2598
2601
`self.assertLess(returncode, 0) # signal death, likely SIGSEGV.
`
2599
2602
``