test_process_reader.py (3675B)
1 import subprocess 2 import sys 3 import unittest 4 5 import mozunit 6 from mozprocess.processhandler import ProcessReader, StoreOutput 7 8 9 def run_python(str_code, stdout=subprocess.PIPE, stderr=subprocess.PIPE): 10 cmd = [sys.executable, "-c", str_code] 11 return subprocess.Popen(cmd, stdout=stdout, stderr=stderr) 12 13 14 class TestProcessReader(unittest.TestCase): 15 def setUp(self): 16 self.out = StoreOutput() 17 self.err = StoreOutput() 18 self.finished = False 19 20 def on_finished(): 21 self.finished = True 22 23 self.timeout = False 24 25 def on_timeout(): 26 self.timeout = True 27 28 self.reader = ProcessReader( 29 stdout_callback=self.out, 30 stderr_callback=self.err, 31 finished_callback=on_finished, 32 timeout_callback=on_timeout, 33 ) 34 35 def test_stdout_callback(self): 36 proc = run_python("print(1); print(2)") 37 self.reader.start(proc) 38 self.reader.thread.join() 39 40 self.assertEqual([x.decode("utf8") for x in self.out.output], ["1", "2"]) 41 self.assertEqual(self.err.output, []) 42 43 def test_stderr_callback(self): 44 proc = run_python('import sys; sys.stderr.write("hello world\\n")') 45 self.reader.start(proc) 46 self.reader.thread.join() 47 48 self.assertEqual(self.out.output, []) 49 self.assertEqual([x.decode("utf8") for x in self.err.output], ["hello world"]) 50 51 def test_stdout_and_stderr_callbacks(self): 52 proc = run_python( 53 'import sys; sys.stderr.write("hello world\\n"); print(1); print(2)' 54 ) 55 self.reader.start(proc) 56 self.reader.thread.join() 57 58 self.assertEqual([x.decode("utf8") for x in self.out.output], ["1", "2"]) 59 self.assertEqual([x.decode("utf8") for x in self.err.output], ["hello world"]) 60 61 def test_finished_callback(self): 62 self.assertFalse(self.finished) 63 proc = run_python("") 64 self.reader.start(proc) 65 self.reader.thread.join() 66 self.assertTrue(self.finished) 67 68 def test_timeout(self): 69 self.reader.timeout = 0.05 70 self.assertFalse(self.timeout) 71 proc = run_python("import time; time.sleep(0.1)") 72 self.reader.start(proc) 73 self.reader.thread.join() 74 self.assertTrue(self.timeout) 75 self.assertFalse(self.finished) 76 77 def test_output_timeout(self): 78 self.reader.output_timeout = 0.05 79 self.assertFalse(self.timeout) 80 proc = run_python("import time; time.sleep(0.1)") 81 self.reader.start(proc) 82 self.reader.thread.join() 83 self.assertTrue(self.timeout) 84 self.assertFalse(self.finished) 85 86 def test_read_without_eol(self): 87 proc = run_python('import sys; sys.stdout.write("1")') 88 self.reader.start(proc) 89 self.reader.thread.join() 90 self.assertEqual([x.decode("utf8") for x in self.out.output], ["1"]) 91 92 def test_read_with_strange_eol(self): 93 proc = run_python('import sys; sys.stdout.write("1\\r\\r\\r\\n")') 94 self.reader.start(proc) 95 self.reader.thread.join() 96 self.assertEqual([x.decode("utf8") for x in self.out.output], ["1"]) 97 98 def test_mixed_stdout_stderr(self): 99 proc = run_python( 100 'import sys; sys.stderr.write("hello world\\n"); print(1); print(2)', 101 stderr=subprocess.STDOUT, 102 ) 103 self.reader.start(proc) 104 self.reader.thread.join() 105 106 self.assertEqual( 107 sorted([x.decode("utf8") for x in self.out.output]), 108 sorted(["1", "2", "hello world"]), 109 ) 110 self.assertEqual(self.err.output, []) 111 112 113 if __name__ == "__main__": 114 mozunit.main()