tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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()