michael@0: #!/usr/bin/env python michael@0: michael@0: import os michael@0: import threading michael@0: from time import sleep michael@0: import unittest michael@0: michael@0: import mozrunnertest michael@0: michael@0: michael@0: class RunnerThread(threading.Thread): michael@0: def __init__(self, runner, timeout=10): michael@0: threading.Thread.__init__(self) michael@0: self.runner = runner michael@0: self.timeout = timeout michael@0: michael@0: def run(self): michael@0: sleep(self.timeout) michael@0: self.runner.stop() michael@0: michael@0: michael@0: class MozrunnerInteractiveTestCase(mozrunnertest.MozrunnerTestCase): michael@0: michael@0: def test_run_interactive(self): michael@0: """Bug 965183: Run process in interactive mode and call wait()""" michael@0: pid = self.runner.start(interactive=True) michael@0: self.pids.append(pid) michael@0: michael@0: thread = RunnerThread(self.runner, 5) michael@0: self.threads.append(thread) michael@0: thread.start() michael@0: michael@0: # This is a blocking call. So the process should be killed by the thread michael@0: self.runner.wait() michael@0: thread.join() michael@0: self.assertFalse(self.runner.is_running()) michael@0: michael@0: def test_stop_interactive(self): michael@0: """Bug 965183: Explicitely stop process in interactive mode""" michael@0: pid = self.runner.start(interactive=True) michael@0: self.pids.append(pid) michael@0: michael@0: self.runner.stop() michael@0: michael@0: def test_wait_after_process_finished(self): michael@0: """Wait after the process has been stopped should not raise an error""" michael@0: self.runner.start(interactive=True) michael@0: sleep(5) michael@0: self.runner.process_handler.kill() michael@0: michael@0: returncode = self.runner.wait(1) michael@0: michael@0: self.assertNotIn(returncode, [None, 0]) michael@0: self.assertIsNotNone(self.runner.process_handler)