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 136 137 138 139 140 141 142 143 144
|
#!/usr/bin/env python
import os
import signal
import sys
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
"""
myenv = None
# On macosx1014, subprocess fails to find `six` when run with python3.
# This ensures that subprocess first looks to sys.path to find `six`.
# See https://bugzilla.mozilla.org/show_bug.cgi?id=1562083
if sys.platform == "darwin" and sys.version_info[0] > 2:
myenv = os.environ.copy()
myenv["PYTHONPATH"] = ":".join(sys.path)
p = processhandler.ProcessHandler(
[self.python, self.proclaunch, "process_waittimeout.ini"],
cwd=here,
env=myenv,
)
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()
|