summaryrefslogtreecommitdiffstats
path: root/testing/mozbase/mozprocess/tests/test_poll.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mozbase/mozprocess/tests/test_poll.py')
-rw-r--r--testing/mozbase/mozprocess/tests/test_poll.py150
1 files changed, 150 insertions, 0 deletions
diff --git a/testing/mozbase/mozprocess/tests/test_poll.py b/testing/mozbase/mozprocess/tests/test_poll.py
new file mode 100644
index 0000000000..475c61576c
--- /dev/null
+++ b/testing/mozbase/mozprocess/tests/test_poll.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python
+
+import os
+import signal
+import sys
+import time
+import unittest
+
+import mozinfo
+import mozunit
+import proctest
+from mozprocess import processhandler
+
+here = os.path.dirname(os.path.abspath(__file__))
+
+
+class ProcTestPoll(proctest.ProcTest):
+ """Class to test process poll."""
+
+ def test_poll_before_run(self):
+ """Process is not started, and poll() is called."""
+ p = processhandler.ProcessHandler(
+ [self.python, self.proclaunch, "process_normal_finish.ini"], cwd=here
+ )
+ self.assertRaises(RuntimeError, p.poll)
+
+ def test_poll_while_running(self):
+ """Process is started, and poll() is called."""
+ 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):
+ """Process is killed, and poll() is called."""
+ p = processhandler.ProcessHandler(
+ [self.python, self.proclaunch, "process_normal_finish.ini"], cwd=here
+ )
+ p.run()
+ returncode = p.kill()
+
+ # We killed the process, so the returncode should be non-zero
+ 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):
+ """Process (no group) is killed, and poll() is called."""
+ p = processhandler.ProcessHandler(
+ [
+ self.python,
+ self.proclaunch,
+ "process_normal_finish_no_process_group.ini",
+ ],
+ cwd=here,
+ ignore_children=True,
+ )
+ p.run()
+ returncode = p.kill()
+
+ # We killed the process, so the returncode should be non-zero
+ 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):
+ """Process is killed twice, and poll() is called."""
+ p = processhandler.ProcessHandler(
+ [self.python, self.proclaunch, "process_normal_finish.ini"], cwd=here
+ )
+ p.run()
+ p.kill()
+ returncode = p.kill()
+
+ # We killed the process, so the returncode should be non-zero
+ 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):
+ """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)
+
+ # Allow the output reader thread to finish processing remaining data
+ for i in range(0, 100):
+ time.sleep(processhandler.INTERVAL_PROCESS_ALIVE_CHECK)
+ returncode = p.poll()
+ if returncode is not None:
+ break
+
+ # 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.wait())
+
+ self.determine_status(p)
+
+
+if __name__ == "__main__":
+ mozunit.main()