import unittest import subprocess import sys from mozprocess.processhandler import ProcessReader, StoreOutput def run_python(str_code, stdout=subprocess.PIPE, stderr=subprocess.PIPE): cmd = [sys.executable, '-c', str_code] return subprocess.Popen(cmd, stdout=stdout, stderr=stderr) class TestProcessReader(unittest.TestCase): def setUp(self): self.out = StoreOutput() self.err = StoreOutput() self.finished = False def on_finished(): self.finished = True self.timeout = False def on_timeout(): self.timeout = True self.reader = ProcessReader(stdout_callback=self.out, stderr_callback=self.err, finished_callback=on_finished, timeout_callback=on_timeout) def test_stdout_callback(self): proc = run_python('print 1; print 2') self.reader.start(proc) self.reader.thread.join() self.assertEqual(self.out.output, ['1', '2']) self.assertEqual(self.err.output, []) def test_stderr_callback(self): proc = run_python('import sys; sys.stderr.write("hello world\\n")') self.reader.start(proc) self.reader.thread.join() self.assertEqual(self.out.output, []) self.assertEqual(self.err.output, ['hello world']) def test_stdout_and_stderr_callbacks(self): proc = run_python('import sys; sys.stderr.write("hello world\\n"); print 1; print 2') self.reader.start(proc) self.reader.thread.join() self.assertEqual(self.out.output, ['1', '2']) self.assertEqual(self.err.output, ['hello world']) def test_finished_callback(self): self.assertFalse(self.finished) proc = run_python('') self.reader.start(proc) self.reader.thread.join() self.assertTrue(self.finished) def test_timeout(self): self.reader.timeout = 0.05 self.assertFalse(self.timeout) proc = run_python('import time; time.sleep(0.1)') self.reader.start(proc) self.reader.thread.join() self.assertTrue(self.timeout) self.assertFalse(self.finished) def test_output_timeout(self): self.reader.output_timeout = 0.05 self.assertFalse(self.timeout) proc = run_python('import time; time.sleep(0.1)') self.reader.start(proc) self.reader.thread.join() self.assertTrue(self.timeout) self.assertFalse(self.finished) def test_read_without_eol(self): proc = run_python('import sys; sys.stdout.write("1")') self.reader.start(proc) self.reader.thread.join() self.assertEqual(self.out.output, ['1']) def test_read_with_strange_eol(self): proc = run_python('import sys; sys.stdout.write("1\\r\\r\\r\\n")') self.reader.start(proc) self.reader.thread.join() self.assertEqual(self.out.output, ['1']) def test_mixed_stdout_stderr(self): proc = run_python('import sys; sys.stderr.write("hello world\\n"); print 1; print 2', stderr=subprocess.STDOUT) self.reader.start(proc) self.reader.thread.join() self.assertEqual(sorted(self.out.output), sorted(['1', '2', 'hello world'])) self.assertEqual(self.err.output, []) if __name__ == '__main__': unittest.main()