| OLD | NEW |
| 1 # Copyright (C) 2011 Google Inc. All rights reserved. | 1 # Copyright (C) 2011 Google Inc. All rights reserved. |
| 2 # | 2 # |
| 3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
| 4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
| 5 # met: | 5 # met: |
| 6 # | 6 # |
| 7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
| 8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
| 9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
| 10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 import unittest | 31 import unittest |
| 32 | 32 |
| 33 from webkitpy.layout_tests.port.factory import PortFactory | 33 from webkitpy.layout_tests.port.factory import PortFactory |
| 34 from webkitpy.layout_tests.port import server_process | 34 from webkitpy.layout_tests.port import server_process |
| 35 from webkitpy.common.system.systemhost import SystemHost | 35 from webkitpy.common.system.systemhost import SystemHost |
| 36 from webkitpy.common.system.systemhost_mock import MockSystemHost | 36 from webkitpy.common.system.systemhost_mock import MockSystemHost |
| 37 from webkitpy.common.system.outputcapture import OutputCapture | 37 from webkitpy.common.system.outputcapture import OutputCapture |
| 38 | 38 |
| 39 | 39 |
| 40 class TrivialMockPort(object): | 40 class TrivialMockPort(object): |
| 41 |
| 41 def __init__(self): | 42 def __init__(self): |
| 42 self.host = MockSystemHost() | 43 self.host = MockSystemHost() |
| 43 self.host.executive.kill_process = lambda x: None | 44 self.host.executive.kill_process = lambda x: None |
| 44 self.host.executive.kill_process = lambda x: None | 45 self.host.executive.kill_process = lambda x: None |
| 45 | 46 |
| 46 def results_directory(self): | 47 def results_directory(self): |
| 47 return "/mock-results" | 48 return '/mock-results' |
| 48 | 49 |
| 49 def process_kill_time(self): | 50 def process_kill_time(self): |
| 50 return 1 | 51 return 1 |
| 51 | 52 |
| 52 | 53 |
| 53 class MockFile(object): | 54 class MockFile(object): |
| 55 |
| 54 def __init__(self, server_process): | 56 def __init__(self, server_process): |
| 55 self._server_process = server_process | 57 self._server_process = server_process |
| 56 self.closed = False | 58 self.closed = False |
| 57 | 59 |
| 58 def fileno(self): | 60 def fileno(self): |
| 59 return 1 | 61 return 1 |
| 60 | 62 |
| 61 def write(self, line): | 63 def write(self, line): |
| 62 self._server_process.broken_pipes.append(self) | 64 self._server_process.broken_pipes.append(self) |
| 63 raise IOError | 65 raise IOError |
| 64 | 66 |
| 65 def close(self): | 67 def close(self): |
| 66 self.closed = True | 68 self.closed = True |
| 67 | 69 |
| 68 | 70 |
| 69 class MockProc(object): | 71 class MockProc(object): |
| 72 |
| 70 def __init__(self, server_process): | 73 def __init__(self, server_process): |
| 71 self.stdin = MockFile(server_process) | 74 self.stdin = MockFile(server_process) |
| 72 self.stdout = MockFile(server_process) | 75 self.stdout = MockFile(server_process) |
| 73 self.stderr = MockFile(server_process) | 76 self.stderr = MockFile(server_process) |
| 74 self.pid = 1 | 77 self.pid = 1 |
| 75 | 78 |
| 76 def poll(self): | 79 def poll(self): |
| 77 return 1 | 80 return 1 |
| 78 | 81 |
| 79 def wait(self): | 82 def wait(self): |
| 80 return 0 | 83 return 0 |
| 81 | 84 |
| 82 | 85 |
| 83 class FakeServerProcess(server_process.ServerProcess): | 86 class FakeServerProcess(server_process.ServerProcess): |
| 87 |
| 84 def _start(self): | 88 def _start(self): |
| 85 self._proc = MockProc(self) | 89 self._proc = MockProc(self) |
| 86 self.stdin = self._proc.stdin | 90 self.stdin = self._proc.stdin |
| 87 self.stdout = self._proc.stdout | 91 self.stdout = self._proc.stdout |
| 88 self.stderr = self._proc.stderr | 92 self.stderr = self._proc.stderr |
| 89 self._pid = self._proc.pid | 93 self._pid = self._proc.pid |
| 90 self.broken_pipes = [] | 94 self.broken_pipes = [] |
| 91 | 95 |
| 92 | 96 |
| 93 class TestServerProcess(unittest.TestCase): | 97 class TestServerProcess(unittest.TestCase): |
| 98 |
| 94 def test_basic(self): | 99 def test_basic(self): |
| 95 cmd = [sys.executable, '-c', 'import sys; import time; time.sleep(0.02);
print "stdout"; sys.stdout.flush(); print >>sys.stderr, "stderr"'] | 100 cmd = [ |
| 101 sys.executable, |
| 102 '-c', |
| 103 'import sys; import time; time.sleep(0.02); print "stdout"; sys.stdo
ut.flush(); print >>sys.stderr, "stderr"'] |
| 96 host = SystemHost() | 104 host = SystemHost() |
| 97 factory = PortFactory(host) | 105 factory = PortFactory(host) |
| 98 port = factory.get() | 106 port = factory.get() |
| 99 now = time.time() | 107 now = time.time() |
| 100 proc = server_process.ServerProcess(port, 'python', cmd) | 108 proc = server_process.ServerProcess(port, 'python', cmd) |
| 101 proc.write('') | 109 proc.write('') |
| 102 | 110 |
| 103 self.assertEqual(proc.poll(), None) | 111 self.assertEqual(proc.poll(), None) |
| 104 self.assertFalse(proc.has_crashed()) | 112 self.assertFalse(proc.has_crashed()) |
| 105 | 113 |
| 106 # check that doing a read after an expired deadline returns | 114 # check that doing a read after an expired deadline returns |
| 107 # nothing immediately. | 115 # nothing immediately. |
| 108 line = proc.read_stdout_line(now - 1) | 116 line = proc.read_stdout_line(now - 1) |
| 109 self.assertEqual(line, None) | 117 self.assertEqual(line, None) |
| 110 | 118 |
| 111 # FIXME: This part appears to be flaky. line should always be non-None. | 119 # FIXME: This part appears to be flaky. line should always be non-None. |
| 112 # FIXME: https://bugs.webkit.org/show_bug.cgi?id=88280 | 120 # FIXME: https://bugs.webkit.org/show_bug.cgi?id=88280 |
| 113 line = proc.read_stdout_line(now + 1.0) | 121 line = proc.read_stdout_line(now + 1.0) |
| 114 if line: | 122 if line: |
| 115 self.assertEqual(line.strip(), "stdout") | 123 self.assertEqual(line.strip(), 'stdout') |
| 116 | 124 |
| 117 line = proc.read_stderr_line(now + 1.0) | 125 line = proc.read_stderr_line(now + 1.0) |
| 118 if line: | 126 if line: |
| 119 self.assertEqual(line.strip(), "stderr") | 127 self.assertEqual(line.strip(), 'stderr') |
| 120 | 128 |
| 121 proc.stop(0) | 129 proc.stop(0) |
| 122 | 130 |
| 123 def test_cleanup(self): | 131 def test_cleanup(self): |
| 124 port_obj = TrivialMockPort() | 132 port_obj = TrivialMockPort() |
| 125 server_process = FakeServerProcess(port_obj=port_obj, name="test", cmd=[
"test"]) | 133 server_process = FakeServerProcess(port_obj=port_obj, name='test', cmd=[
'test']) |
| 126 server_process._start() | 134 server_process._start() |
| 127 server_process.stop() | 135 server_process.stop() |
| 128 self.assertTrue(server_process.stdin.closed) | 136 self.assertTrue(server_process.stdin.closed) |
| 129 self.assertTrue(server_process.stdout.closed) | 137 self.assertTrue(server_process.stdout.closed) |
| 130 self.assertTrue(server_process.stderr.closed) | 138 self.assertTrue(server_process.stderr.closed) |
| 131 | 139 |
| 132 def test_broken_pipe(self): | 140 def test_broken_pipe(self): |
| 133 port_obj = TrivialMockPort() | 141 port_obj = TrivialMockPort() |
| 134 | 142 |
| 135 port_obj.host.platform.os_name = 'win' | 143 port_obj.host.platform.os_name = 'win' |
| 136 server_process = FakeServerProcess(port_obj=port_obj, name="test", cmd=[
"test"]) | 144 server_process = FakeServerProcess(port_obj=port_obj, name='test', cmd=[
'test']) |
| 137 server_process.write("should break") | 145 server_process.write('should break') |
| 138 self.assertTrue(server_process.has_crashed()) | 146 self.assertTrue(server_process.has_crashed()) |
| 139 self.assertIsNotNone(server_process.pid()) | 147 self.assertIsNotNone(server_process.pid()) |
| 140 self.assertIsNone(server_process._proc) | 148 self.assertIsNone(server_process._proc) |
| 141 self.assertEqual(server_process.broken_pipes, [server_process.stdin]) | 149 self.assertEqual(server_process.broken_pipes, [server_process.stdin]) |
| 142 | 150 |
| 143 port_obj.host.platform.os_name = 'mac' | 151 port_obj.host.platform.os_name = 'mac' |
| 144 server_process = FakeServerProcess(port_obj=port_obj, name="test", cmd=[
"test"]) | 152 server_process = FakeServerProcess(port_obj=port_obj, name='test', cmd=[
'test']) |
| 145 server_process.write("should break") | 153 server_process.write('should break') |
| 146 self.assertTrue(server_process.has_crashed()) | 154 self.assertTrue(server_process.has_crashed()) |
| 147 self.assertIsNone(server_process._proc) | 155 self.assertIsNone(server_process._proc) |
| 148 self.assertEqual(server_process.broken_pipes, [server_process.stdin]) | 156 self.assertEqual(server_process.broken_pipes, [server_process.stdin]) |
| 149 | 157 |
| 150 | 158 |
| 151 class TestQuoteData(unittest.TestCase): | 159 class TestQuoteData(unittest.TestCase): |
| 160 |
| 152 def test_plain(self): | 161 def test_plain(self): |
| 153 qd = server_process.quote_data | 162 qd = server_process.quote_data |
| 154 self.assertEqual(qd("foo"), ["foo"]) | 163 self.assertEqual(qd('foo'), ['foo']) |
| 155 | 164 |
| 156 def test_trailing_spaces(self): | 165 def test_trailing_spaces(self): |
| 157 qd = server_process.quote_data | 166 qd = server_process.quote_data |
| 158 self.assertEqual(qd("foo "), | 167 self.assertEqual(qd('foo '), |
| 159 ["foo\x20\x20"]) | 168 ['foo\x20\x20']) |
| 160 | 169 |
| 161 def test_newlines(self): | 170 def test_newlines(self): |
| 162 qd = server_process.quote_data | 171 qd = server_process.quote_data |
| 163 self.assertEqual(qd("foo \nbar\n"), | 172 self.assertEqual(qd('foo \nbar\n'), |
| 164 ["foo\x20\\n", "bar\\n"]) | 173 ['foo\x20\\n', 'bar\\n']) |
| 165 | 174 |
| 166 def test_binary_data(self): | 175 def test_binary_data(self): |
| 167 qd = server_process.quote_data | 176 qd = server_process.quote_data |
| 168 self.assertEqual(qd("\x00\x01ab"), | 177 self.assertEqual(qd('\x00\x01ab'), |
| 169 ["\\x00\\x01ab"]) | 178 ['\\x00\\x01ab']) |
| OLD | NEW |