from __future__ import absolute_import
import os
import signal
import sys
import unittest
import mozinfo
import mozunit
import proctest
import time
from mozprocess import processhandler
here = os.path.dirname(os.path.abspath(__file__))
class ProcTestPoll(proctest.ProcTest):
def test_poll_before_run(self):
p = processhandler.ProcessHandler([self.python, self.proclaunch,
"process_normal_finish.ini"],
cwd=here)
self.assertRaises(RuntimeError, p.poll)
def test_poll_while_running(self):
p = processhandler.ProcessHandler([self.python, self.proclaunch,
"process_normal_finish.ini"],
cwd=here)
p.run()
returncode = p.poll()
self.assertEqual(returncode, None)
self.determine_status(p, True)
p.kill()
def test_poll_after_kill(self):
p = processhandler.ProcessHandler([self.python, self.proclaunch,
"process_normal_finish.ini"],
cwd=here)
p.run()
returncode = p.kill()
if mozinfo.isWin:
self.assertGreater(returncode, 0,
'Positive returncode expected, got "%s"' % returncode)
else:
self.assertLess(returncode, 0,
'Negative returncode expected, got "%s"' % returncode)
self.assertEqual(returncode, p.poll())
self.determine_status(p)
def test_poll_after_kill_no_process_group(self):
p = processhandler.ProcessHandler([self.python, self.proclaunch,
"process_normal_finish_no_process_group.ini"],
cwd=here,
ignore_children=True
)
p.run()
returncode = p.kill()
if mozinfo.isWin:
self.assertGreater(returncode, 0,
'Positive returncode expected, got "%s"' % returncode)
else:
self.assertLess(returncode, 0,
'Negative returncode expected, got "%s"' % returncode)
self.assertEqual(returncode, p.poll())
self.determine_status(p)
def test_poll_after_double_kill(self):
p = processhandler.ProcessHandler([self.python, self.proclaunch,
"process_normal_finish.ini"],
cwd=here)
p.run()
p.kill()
returncode = p.kill()
if mozinfo.isWin:
self.assertGreater(returncode, 0,
'Positive returncode expected, got "%s"' % returncode)
else:
self.assertLess(returncode, 0,
'Negative returncode expected, got "%s"' % returncode)
self.assertEqual(returncode, p.poll())
self.determine_status(p)
@unittest.skipIf(sys.platform.startswith("win"), "Bug 1493796")
def test_poll_after_external_kill(self):
p = processhandler.ProcessHandler([self.python, self.proclaunch,
"process_normal_finish.ini"],
cwd=here)
p.run()
os.kill(p.pid, signal.SIGTERM)
for i in range(0, 100):
time.sleep(processhandler.INTERVAL_PROCESS_ALIVE_CHECK)
returncode = p.poll()
if returncode is not None:
break
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.wait())
self.determine_status(p)
if __name__ == '__main__':
mozunit.main()