test_kill.py (3795B)
1 #!/usr/bin/env python 2 3 import os 4 import signal 5 import time 6 import unittest 7 8 import mozunit 9 import proctest 10 from mozprocess import processhandler 11 12 here = os.path.dirname(os.path.abspath(__file__)) 13 14 15 class ProcTestKill(proctest.ProcTest): 16 """Class to test various process tree killing scenatios""" 17 18 def test_kill_before_run(self): 19 """Process is not started, and kill() is called""" 20 21 p = processhandler.ProcessHandler([self.python, "-V"]) 22 self.assertRaises(RuntimeError, p.kill) 23 24 def test_process_kill(self): 25 """Process is started, we kill it""" 26 27 p = processhandler.ProcessHandler( 28 [self.python, self.proclaunch, "process_normal_finish.ini"], cwd=here 29 ) 30 p.run() 31 p.kill() 32 33 self.determine_status(p, expectedfail=("returncode",)) 34 35 def test_process_kill_deep(self): 36 """Process is started, we kill it, we use a deep process tree""" 37 38 p = processhandler.ProcessHandler( 39 [self.python, self.proclaunch, "process_normal_deep.ini"], cwd=here 40 ) 41 p.run() 42 p.kill() 43 44 self.determine_status(p, expectedfail=("returncode",)) 45 46 def test_process_kill_deep_wait(self): 47 """Process is started, we use a deep process tree, we let it spawn 48 for a bit, we kill it""" 49 50 p = processhandler.ProcessHandler( 51 [self.python, self.proclaunch, "process_normal_deep.ini"], 52 cwd=here, 53 ) 54 p.run() 55 # Let the tree spawn a bit, before attempting to kill 56 time.sleep(3) 57 p.kill() 58 59 self.determine_status(p, expectedfail=("returncode",)) 60 61 def test_process_kill_broad(self): 62 """Process is started, we kill it, we use a broad process tree""" 63 64 p = processhandler.ProcessHandler( 65 [self.python, self.proclaunch, "process_normal_broad.ini"], cwd=here 66 ) 67 p.run() 68 p.kill() 69 70 self.determine_status(p, expectedfail=("returncode",)) 71 72 def test_process_kill_broad_delayed(self): 73 """Process is started, we use a broad process tree, we let it spawn 74 for a bit, we kill it""" 75 76 p = processhandler.ProcessHandler( 77 [self.python, self.proclaunch, "process_normal_broad.ini"], 78 cwd=here, 79 ) 80 p.run() 81 # Let the tree spawn a bit, before attempting to kill 82 time.sleep(3) 83 p.kill() 84 85 self.determine_status(p, expectedfail=("returncode",)) 86 87 @unittest.skipUnless(processhandler.isPosix, "posix only") 88 def test_process_kill_with_sigterm(self): 89 script = os.path.join(here, "scripts", "infinite_loop.py") 90 p = processhandler.ProcessHandler([self.python, script]) 91 92 p.run() 93 p.kill() 94 95 self.assertEqual(p.proc.returncode, -signal.SIGTERM) 96 97 @unittest.skipUnless(processhandler.isPosix, "posix only") 98 def test_process_kill_with_sigint_if_needed(self): 99 script = os.path.join(here, "scripts", "infinite_loop.py") 100 p = processhandler.ProcessHandler([self.python, script, "deadlock"]) 101 102 p.run() 103 time.sleep(1) 104 p.kill() 105 106 self.assertEqual(p.proc.returncode, -signal.SIGKILL) 107 108 @unittest.skipUnless(processhandler.isPosix, "posix only") 109 def test_process_kill_with_timeout(self): 110 script = os.path.join(here, "scripts", "ignore_sigterm.py") 111 p = processhandler.ProcessHandler([self.python, script]) 112 113 p.run() 114 time.sleep(1) 115 t0 = time.time() 116 p.kill(sig=signal.SIGTERM, timeout=2) 117 self.assertEqual(p.proc.returncode, None) 118 self.assertGreaterEqual(time.time(), t0 + 2) 119 120 p.kill(sig=signal.SIGKILL) 121 self.assertEqual(p.proc.returncode, -signal.SIGKILL) 122 123 124 if __name__ == "__main__": 125 mozunit.main()