mirror of
https://github.com/python/cpython.git
synced 2025-10-17 04:08:28 +00:00
Port #1220212 (os.kill for Win32) to py3k.
This commit is contained in:
parent
b2416e54b1
commit
eb24d7498f
10 changed files with 200 additions and 6 deletions
|
@ -7,9 +7,13 @@ import errno
|
|||
import unittest
|
||||
import warnings
|
||||
import sys
|
||||
import signal
|
||||
import subprocess
|
||||
import time
|
||||
import shutil
|
||||
from test import support
|
||||
|
||||
|
||||
# Tests creating TESTFN
|
||||
class FileTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
|
@ -739,7 +743,6 @@ if sys.platform != 'win32':
|
|||
def test_setreuid_neg1(self):
|
||||
# Needs to accept -1. We run this in a subprocess to avoid
|
||||
# altering the test runner's process state (issue8045).
|
||||
import subprocess
|
||||
subprocess.check_call([
|
||||
sys.executable, '-c',
|
||||
'import os,sys;os.setreuid(-1,-1);sys.exit(0)'])
|
||||
|
@ -754,7 +757,6 @@ if sys.platform != 'win32':
|
|||
def test_setregid_neg1(self):
|
||||
# Needs to accept -1. We run this in a subprocess to avoid
|
||||
# altering the test runner's process state (issue8045).
|
||||
import subprocess
|
||||
subprocess.check_call([
|
||||
sys.executable, '-c',
|
||||
'import os,sys;os.setregid(-1,-1);sys.exit(0)'])
|
||||
|
@ -798,6 +800,63 @@ else:
|
|||
class Pep383Tests(unittest.TestCase):
|
||||
pass
|
||||
|
||||
@unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
|
||||
class Win32KillTests(unittest.TestCase):
|
||||
def _kill(self, sig, *args):
|
||||
# Send a subprocess a signal (or in some cases, just an int to be
|
||||
# the return value)
|
||||
proc = subprocess.Popen(*args)
|
||||
os.kill(proc.pid, sig)
|
||||
self.assertEqual(proc.wait(), sig)
|
||||
|
||||
def test_kill_sigterm(self):
|
||||
# SIGTERM doesn't mean anything special, but make sure it works
|
||||
self._kill(signal.SIGTERM, [sys.executable])
|
||||
|
||||
def test_kill_int(self):
|
||||
# os.kill on Windows can take an int which gets set as the exit code
|
||||
self._kill(100, [sys.executable])
|
||||
|
||||
def _kill_with_event(self, event, name):
|
||||
# Run a script which has console control handling enabled.
|
||||
proc = subprocess.Popen([sys.executable,
|
||||
os.path.join(os.path.dirname(__file__),
|
||||
"win_console_handler.py")],
|
||||
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
|
||||
# Let the interpreter startup before we send signals. See #3137.
|
||||
time.sleep(0.5)
|
||||
os.kill(proc.pid, event)
|
||||
# proc.send_signal(event) could also be done here.
|
||||
# Allow time for the signal to be passed and the process to exit.
|
||||
time.sleep(0.5)
|
||||
if not proc.poll():
|
||||
# Forcefully kill the process if we weren't able to signal it.
|
||||
os.kill(proc.pid, signal.SIGINT)
|
||||
self.fail("subprocess did not stop on {}".format(name))
|
||||
|
||||
@unittest.skip("subprocesses aren't inheriting CTRL+C property")
|
||||
def test_CTRL_C_EVENT(self):
|
||||
from ctypes import wintypes
|
||||
import ctypes
|
||||
|
||||
# Make a NULL value by creating a pointer with no argument.
|
||||
NULL = ctypes.POINTER(ctypes.c_int)()
|
||||
SetConsoleCtrlHandler = ctypes.windll.kernel32.SetConsoleCtrlHandler
|
||||
SetConsoleCtrlHandler.argtypes = (ctypes.POINTER(ctypes.c_int),
|
||||
wintypes.BOOL)
|
||||
SetConsoleCtrlHandler.restype = wintypes.BOOL
|
||||
|
||||
# Calling this with NULL and FALSE causes the calling process to
|
||||
# handle CTRL+C, rather than ignore it. This property is inherited
|
||||
# by subprocesses.
|
||||
SetConsoleCtrlHandler(NULL, 0)
|
||||
|
||||
self._kill_with_event(signal.CTRL_C_EVENT, "CTRL_C_EVENT")
|
||||
|
||||
def test_CTRL_BREAK_EVENT(self):
|
||||
self._kill_with_event(signal.CTRL_BREAK_EVENT, "CTRL_BREAK_EVENT")
|
||||
|
||||
|
||||
def test_main():
|
||||
support.run_unittest(
|
||||
ArgTests,
|
||||
|
@ -812,7 +871,8 @@ def test_main():
|
|||
Win32ErrorTests,
|
||||
TestInvalidFD,
|
||||
PosixUidGidTests,
|
||||
Pep383Tests
|
||||
Pep383Tests,
|
||||
Win32KillTests
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue