- Revision
- 244080
- Author
- jbed...@apple.com
- Date
- 2019-04-09 09:14:43 -0700 (Tue, 09 Apr 2019)
Log Message
iOS 12 Simulator Release WK2 frequently timing out while running layout tests
https://bugs.webkit.org/show_bug.cgi?id=196694
<rdar://problem/48388734>
Rubber-stamped by Aakash Jain.
* Scripts/webkitpy/port/image_diff.py:
(ImageDiffer.diff_image): If the ImageDiff process has data, kill it before running again.
* Scripts/webkitpy/port/server_process.py:
(ServerProcess.has_available_stdout): Check if stdout has data in it.
(ServerProcess._wait_for_data_and_update_buffers_using_select):
(ServerProcess._wait_for_data_and_update_buffers_using_win32_apis):
* Scripts/webkitpy/port/server_process_mock.py:
(MockServerProcess.has_available_stdout):
* Scripts/webkitpy/port/server_process_unittest.py:
(TestServerProcess.serial_test_basic):
Modified Paths
Diff
Modified: trunk/Tools/ChangeLog (244079 => 244080)
--- trunk/Tools/ChangeLog 2019-04-09 16:06:48 UTC (rev 244079)
+++ trunk/Tools/ChangeLog 2019-04-09 16:14:43 UTC (rev 244080)
@@ -1,3 +1,22 @@
+2019-04-09 Jonathan Bedard <jbed...@apple.com>
+
+ iOS 12 Simulator Release WK2 frequently timing out while running layout tests
+ https://bugs.webkit.org/show_bug.cgi?id=196694
+ <rdar://problem/48388734>
+
+ Rubber-stamped by Aakash Jain.
+
+ * Scripts/webkitpy/port/image_diff.py:
+ (ImageDiffer.diff_image): If the ImageDiff process has data, kill it before running again.
+ * Scripts/webkitpy/port/server_process.py:
+ (ServerProcess.has_available_stdout): Check if stdout has data in it.
+ (ServerProcess._wait_for_data_and_update_buffers_using_select):
+ (ServerProcess._wait_for_data_and_update_buffers_using_win32_apis):
+ * Scripts/webkitpy/port/server_process_mock.py:
+ (MockServerProcess.has_available_stdout):
+ * Scripts/webkitpy/port/server_process_unittest.py:
+ (TestServerProcess.serial_test_basic):
+
2019-04-09 Jer Noble <jer.no...@apple.com>
Test for: 196095 Inband Text Track cues interspersed with Data cues can display out of order.
Modified: trunk/Tools/Scripts/webkitpy/port/image_diff.py (244079 => 244080)
--- trunk/Tools/Scripts/webkitpy/port/image_diff.py 2019-04-09 16:06:48 UTC (rev 244079)
+++ trunk/Tools/Scripts/webkitpy/port/image_diff.py 2019-04-09 16:14:43 UTC (rev 244080)
@@ -47,7 +47,7 @@
self._process = None
def diff_image(self, expected_contents, actual_contents, tolerance):
- if tolerance != self._tolerance:
+ if tolerance != self._tolerance or (self._process and self._process.has_available_stdout()):
self.stop()
try:
assert(expected_contents)
Modified: trunk/Tools/Scripts/webkitpy/port/server_process.py (244079 => 244080)
--- trunk/Tools/Scripts/webkitpy/port/server_process.py 2019-04-09 16:06:48 UTC (rev 244079)
+++ trunk/Tools/Scripts/webkitpy/port/server_process.py 2019-04-09 16:14:43 UTC (rev 244080)
@@ -203,6 +203,14 @@
def read_stdout_line(self, deadline):
return self._read(deadline, self._pop_stdout_line_if_ready)
+ def has_available_stdout(self):
+ if not self.has_crashed() and self._use_win32_apis:
+ self._wait_for_data_and_update_buffers_using_win32_apis(0)
+ elif not self.has_crashed():
+ self._wait_for_data_and_update_buffers_using_select(0)
+
+ return bool(self._output)
+
def read_stderr_line(self, deadline):
return self._read(deadline, self._pop_stderr_line_if_ready)
@@ -256,7 +264,7 @@
return output
def _wait_for_data_and_update_buffers_using_select(self, deadline, stopping=False):
- if self._proc.stdout.closed or self._proc.stderr.closed:
+ if not self._proc or self._proc.stdout.closed or self._proc.stderr.closed:
# If the process crashed and is using FIFOs, like Chromium Android, the
# stdout and stderr pipes will be closed.
return
@@ -300,12 +308,16 @@
pass
def _wait_for_data_and_update_buffers_using_win32_apis(self, deadline):
+ if not self._proc:
+ return
+
# See http://code.activestate.com/recipes/440554-module-to-allow-asynchronous-subprocess-use-on-win/
# and http://docs.activestate.com/activepython/2.6/pywin32/modules.html
# for documentation on all of these win32-specific modules.
out_fh = msvcrt.get_osfhandle(self._proc.stdout.fileno())
err_fh = msvcrt.get_osfhandle(self._proc.stderr.fileno())
- while time.time() < deadline:
+ checking = True
+ while checking:
output = self._non_blocking_read_win32(out_fh)
error = self._non_blocking_read_win32(err_fh)
if output or error:
@@ -317,6 +329,7 @@
if self._proc.poll() is not None:
return
time.sleep(0.01)
+ checking = time.time() < deadline
def _non_blocking_read_win32(self, handle):
try:
Modified: trunk/Tools/Scripts/webkitpy/port/server_process_mock.py (244079 => 244080)
--- trunk/Tools/Scripts/webkitpy/port/server_process_mock.py 2019-04-09 16:06:48 UTC (rev 244079)
+++ trunk/Tools/Scripts/webkitpy/port/server_process_mock.py 2019-04-09 16:14:43 UTC (rev 244080)
@@ -54,6 +54,11 @@
return None
return self.lines.pop(0) + "\n"
+ def has_available_stdout(self):
+ if self.has_crashed():
+ return False
+ return bool(self.lines)
+
def read_stdout(self, deadline, size):
if self.has_crashed():
return None
Modified: trunk/Tools/Scripts/webkitpy/port/server_process_unittest.py (244079 => 244080)
--- trunk/Tools/Scripts/webkitpy/port/server_process_unittest.py 2019-04-09 16:06:48 UTC (rev 244079)
+++ trunk/Tools/Scripts/webkitpy/port/server_process_unittest.py 2019-04-09 16:14:43 UTC (rev 244080)
@@ -101,7 +101,7 @@
class TestServerProcess(unittest.TestCase):
def serial_test_basic(self):
# Give -u switch to force stdout and stderr to be unbuffered for Windows
- cmd = [sys.executable, '-uc', 'import sys; print "stdout"; print >>sys.stderr, "stderr"; sys.stdin.readline();']
+ cmd = [sys.executable, '-uc', 'import sys; print "stdout"; print "again"; print >>sys.stderr, "stderr"; sys.stdin.readline();']
host = SystemHost()
factory = PortFactory(host)
port = factory.get()
@@ -120,9 +120,15 @@
line = proc.read_stdout_line(now + 1.0)
self.assertEqual(line.strip(), "stdout")
+ self.assertTrue(proc.has_available_stdout())
+
line = proc.read_stderr_line(now + 1.0)
self.assertEqual(line.strip(), "stderr")
+ line = proc.read_stdout_line(now + 1.0)
+ self.assertEqual(line.strip(), "again")
+ self.assertFalse(proc.has_available_stdout())
+
proc.write('End\n')
time.sleep(0.1) # Give process a moment to close.
self.assertEqual(proc.poll(), 0)