1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
#!/usr/bin/env python
import os
import signal
import mozinfo
import mozunit
import proctest
from mozprocess import processhandler
here = os.path.dirname(os.path.abspath(__file__))
class ProcTestWait(proctest.ProcTest):
"""Class to test process waits and timeouts"""
def test_normal_finish(self):
"""Process is started, runs to completion while we wait for it"""
p = processhandler.ProcessHandler(
[self.python, self.proclaunch, "process_normal_finish.ini"], cwd=here
)
p.run()
p.wait()
self.determine_status(p)
def test_wait(self):
"""Process is started runs to completion while we wait indefinitely"""
p = processhandler.ProcessHandler(
[self.python, self.proclaunch, "process_waittimeout_10s.ini"], cwd=here
)
p.run()
p.wait()
self.determine_status(p)
def test_timeout(self):
"""Process is started, runs but we time out waiting on it
to complete
"""
p = processhandler.ProcessHandler(
[self.python, self.proclaunch, "process_waittimeout.ini"],
cwd=here,
)
p.run(timeout=10)
p.wait()
if mozinfo.isLinux:
# process was killed, so returncode should be negative
self.assertLess(p.proc.returncode, 0)
self.determine_status(p, False, ["returncode", "didtimeout"])
def test_waittimeout(self):
"""
Process is started, then wait is called and times out.
Process is still running and didn't timeout
"""
p = processhandler.ProcessHandler(
[self.python, self.proclaunch, "process_waittimeout_10s.ini"], cwd=here
)
p.run()
p.wait(timeout=0)
self.determine_status(p, True, ())
def test_waitnotimeout(self):
"""Process is started, runs to completion before our wait times out"""
p = processhandler.ProcessHandler(
[self.python, self.proclaunch, "process_waittimeout_10s.ini"], cwd=here
)
p.run(timeout=30)
p.wait()
self.determine_status(p)
def test_wait_twice_after_kill(self):
"""Bug 968718: Process is started and stopped. wait() twice afterward."""
p = processhandler.ProcessHandler(
[self.python, self.proclaunch, "process_waittimeout.ini"], cwd=here
)
p.run()
p.kill()
returncode1 = p.wait()
returncode2 = p.wait()
self.determine_status(p)
# We killed the process, so the returncode should be non-zero
if mozinfo.isWin:
self.assertGreater(
returncode2, 0, 'Positive returncode expected, got "%s"' % returncode2
)
else:
self.assertLess(
returncode2, 0, 'Negative returncode expected, got "%s"' % returncode2
)
self.assertEqual(
returncode1, returncode2, "Expected both returncodes of wait() to be equal"
)
def test_wait_after_external_kill(self):
"""Process is killed externally, and poll() is called."""
p = processhandler.ProcessHandler(
[self.python, self.proclaunch, "process_normal_finish.ini"], cwd=here
)
p.run()
os.kill(p.pid, signal.SIGTERM)
returncode = p.wait()
# We killed the process, so the returncode should be non-zero
if mozinfo.isWin:
self.assertEqual(
returncode,
signal.SIGTERM,
'Positive returncode expected, got "%s"' % returncode,
)
else:
self.assertEqual(
returncode,
-signal.SIGTERM,
'%s expected, got "%s"' % (-signal.SIGTERM, returncode),
)
self.assertEqual(returncode, p.poll())
self.determine_status(p)
if __name__ == "__main__":
mozunit.main()
|