Title: [254532] trunk/Tools
Revision
254532
Author
jbed...@apple.com
Date
2020-01-14 13:32:11 -0800 (Tue, 14 Jan 2020)

Log Message

webkitpy: Pass ImageDiff commands in a single write
https://bugs.webkit.org/show_bug.cgi?id=206194
<rdar://problem/58578775>

Reviewed by Stephanie Lewis.

ImageDiff can encounter race conditions if it is fed content in multiple writes,
instead of in a single block.

* Scripts/webkitpy/port/image_diff.py:
(ImageDiffer.diff_image): Pass ImageDiff data in a single write command.
* Scripts/webkitpy/port/port_testcase.py:
(PortTestCase.test_diff_image__missing_both): diff_image only accepts byte arrays.
(PortTestCase.test_diff_image__missing_actual): Ditto.
(PortTestCase.test_diff_image__missing_expected): Ditto.
(PortTestCase.test_diff_image): Ditto.
(PortTestCase.test_diff_image_passed): Ditto.
(PortTestCase.test_diff_image_failed): Ditto.
(PortTestCase.test_diff_image_crashed): Ditto.

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (254531 => 254532)


--- trunk/Tools/ChangeLog	2020-01-14 21:24:01 UTC (rev 254531)
+++ trunk/Tools/ChangeLog	2020-01-14 21:32:11 UTC (rev 254532)
@@ -1,3 +1,25 @@
+2020-01-14  Jonathan Bedard  <jbed...@apple.com>
+
+        webkitpy: Pass ImageDiff commands in a single write
+        https://bugs.webkit.org/show_bug.cgi?id=206194
+        <rdar://problem/58578775>
+
+        Reviewed by Stephanie Lewis.
+
+        ImageDiff can encounter race conditions if it is fed content in multiple writes,
+        instead of in a single block.
+
+        * Scripts/webkitpy/port/image_diff.py:
+        (ImageDiffer.diff_image): Pass ImageDiff data in a single write command.
+        * Scripts/webkitpy/port/port_testcase.py:
+        (PortTestCase.test_diff_image__missing_both): diff_image only accepts byte arrays.
+        (PortTestCase.test_diff_image__missing_actual): Ditto.
+        (PortTestCase.test_diff_image__missing_expected): Ditto.
+        (PortTestCase.test_diff_image): Ditto.
+        (PortTestCase.test_diff_image_passed): Ditto.
+        (PortTestCase.test_diff_image_failed): Ditto.
+        (PortTestCase.test_diff_image_crashed): Ditto.
+
 2020-01-14  Antti Koivisto  <an...@apple.com>
 
         [LFC][Integration] Support the feature flag in DumpRenderTree

Modified: trunk/Tools/Scripts/webkitpy/port/image_diff.py (254531 => 254532)


--- trunk/Tools/Scripts/webkitpy/port/image_diff.py	2020-01-14 21:24:01 UTC (rev 254531)
+++ trunk/Tools/Scripts/webkitpy/port/image_diff.py	2020-01-14 21:32:11 UTC (rev 254532)
@@ -35,7 +35,7 @@
 import time
 
 from webkitpy.port import server_process
-from webkitpy.common.unicode_compatibility import decode_for
+from webkitpy.common.unicode_compatibility import BytesIO, decode_for, encode_if_necessary
 
 
 _log = logging.getLogger(__name__)
@@ -58,10 +58,12 @@
             if not self._process:
                 self._start(tolerance)
             # Note that although we are handed 'old', 'new', ImageDiff wants 'new', 'old'.
-            self._process.write('Content-Length: {}\n'.format(len(actual_contents)))
-            self._process.write(actual_contents)
-            self._process.write('Content-Length: {}\n'.format(len(expected_contents)))
-            self._process.write(expected_contents)
+            buffer = BytesIO()
+            buffer.write(encode_if_necessary('Content-Length: {}\n'.format(len(actual_contents))))
+            buffer.write(actual_contents)
+            buffer.write(encode_if_necessary('Content-Length: {}\n'.format(len(expected_contents))))
+            buffer.write(expected_contents)
+            self._process.write(buffer.getvalue())
             return self._read()
         except IOError as exception:
             return (None, 0, "Failed to compute an image diff: %s" % str(exception))

Modified: trunk/Tools/Scripts/webkitpy/port/port_testcase.py (254531 => 254532)


--- trunk/Tools/Scripts/webkitpy/port/port_testcase.py	2020-01-14 21:24:01 UTC (rev 254531)
+++ trunk/Tools/Scripts/webkitpy/port/port_testcase.py	2020-01-14 21:32:11 UTC (rev 254532)
@@ -259,20 +259,20 @@
     def test_diff_image__missing_both(self):
         port = self.make_port()
         self.assertFalse(port.diff_image(None, None)[0])
-        self.assertFalse(port.diff_image(None, '')[0])
-        self.assertFalse(port.diff_image('', None)[0])
+        self.assertFalse(port.diff_image(None, b'')[0])
+        self.assertFalse(port.diff_image(b'', None)[0])
 
-        self.assertFalse(port.diff_image('', '')[0])
+        self.assertFalse(port.diff_image(b'', b'')[0])
 
     def test_diff_image__missing_actual(self):
         port = self.make_port()
-        self.assertTrue(port.diff_image(None, 'foo')[0])
-        self.assertTrue(port.diff_image('', 'foo')[0])
+        self.assertTrue(port.diff_image(None, b'foo')[0])
+        self.assertTrue(port.diff_image(b'', b'foo')[0])
 
     def test_diff_image__missing_expected(self):
         port = self.make_port()
-        self.assertTrue(port.diff_image('foo', None)[0])
-        self.assertTrue(port.diff_image('foo', '')[0])
+        self.assertTrue(port.diff_image(b'foo', None)[0])
+        self.assertTrue(port.diff_image(b'foo', b'')[0])
 
     def test_diff_image(self):
         port = self.make_port()
@@ -292,11 +292,11 @@
         # First test the case of not using the JHBuild wrapper.
         self.assertFalse(port._should_use_jhbuild())
 
-        self.assertEqual(port.diff_image('foo', 'bar'), (b'', 100.0, None))
+        self.assertEqual(port.diff_image(b'foo', b'bar'), (b'', 100.0, None))
         self.assertEqual(self.proc.cmd, [port._path_to_image_diff(), "--tolerance", "0.1"])
-        self.assertEqual(port.diff_image('foo', 'bar', None), (b'', 100.0, None))
+        self.assertEqual(port.diff_image(b'foo', b'bar', None), (b'', 100.0, None))
         self.assertEqual(self.proc.cmd, [port._path_to_image_diff(), "--tolerance", "0.1"])
-        self.assertEqual(port.diff_image('foo', 'bar', 0), (b'', 100.0, None))
+        self.assertEqual(port.diff_image(b'foo', b'bar', 0), (b'', 100.0, None))
         self.assertEqual(self.proc.cmd, [port._path_to_image_diff(), "--tolerance", "0"])
 
         # Now test the case of using JHBuild wrapper.
@@ -303,11 +303,11 @@
         port._filesystem.maybe_make_directory(port.path_from_webkit_base('WebKitBuild', 'Dependencies%s' % port.port_name.upper()))
         self.assertTrue(port._should_use_jhbuild())
 
-        self.assertEqual(port.diff_image('foo', 'bar'), (b'', 100.0, None))
+        self.assertEqual(port.diff_image(b'foo', b'bar'), (b'', 100.0, None))
         self.assertEqual(self.proc.cmd, port._jhbuild_wrapper + [port._path_to_image_diff(), "--tolerance", "0.1"])
-        self.assertEqual(port.diff_image('foo', 'bar', None), (b'', 100.0, None))
+        self.assertEqual(port.diff_image(b'foo', b'bar', None), (b'', 100.0, None))
         self.assertEqual(self.proc.cmd, port._jhbuild_wrapper + [port._path_to_image_diff(), "--tolerance", "0.1"])
-        self.assertEqual(port.diff_image('foo', 'bar', 0), (b'', 100.0, None))
+        self.assertEqual(port.diff_image(b'foo', b'bar', 0), (b'', 100.0, None))
         self.assertEqual(self.proc.cmd, port._jhbuild_wrapper + [port._path_to_image_diff(), "--tolerance", "0"])
 
         port.clean_up_test_run()
@@ -318,13 +318,13 @@
         port = self.make_port()
         port._server_process_constructor = lambda port, nm, cmd, env: MockServerProcess(lines=['diff: 0% passed\n'])
         image_differ = ImageDiffer(port)
-        self.assertEqual(image_differ.diff_image('foo', 'bar', 0.1), (None, 0, None))
+        self.assertEqual(image_differ.diff_image(b'foo', b'bar', 0.1), (None, 0, None))
 
     def test_diff_image_failed(self):
         port = self.make_port()
         port._server_process_constructor = lambda port, nm, cmd, env: MockServerProcess(lines=['diff: 100% failed\n'])
         image_differ = ImageDiffer(port)
-        self.assertEqual(image_differ.diff_image('foo', 'bar', 0.1), (b'', 100.0, None))
+        self.assertEqual(image_differ.diff_image(b'foo', b'bar', 0.1), (b'', 100.0, None))
 
     def test_diff_image_crashed(self):
         port = self.make_port()
@@ -340,7 +340,7 @@
 
         port._server_process_constructor = make_proc
         port.setup_test_run()
-        self.assertEqual(port.diff_image('foo', 'bar'), (b'', 0, 'ImageDiff crashed\n'))
+        self.assertEqual(port.diff_image(b'foo', b'bar'), (b'', 0, 'ImageDiff crashed\n'))
         port.clean_up_test_run()
 
     def integration_test_websocket_server__normal(self):
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to