Changeset 124801 in webkit
- Timestamp:
- Aug 6, 2012 2:00:29 PM (12 years ago)
- Location:
- trunk/Tools
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Tools/ChangeLog
r124800 r124801 1 2012-08-06 Dirk Pranke <dpranke@chromium.org> 2 3 nrwt: handle errors from image diff better 4 https://bugs.webkit.org/show_bug.cgi?id=92934 5 6 Reviewed by Ojan Vafai. 7 8 Currently if ImageDiff crashes, returns a weird exit code, or 9 produces any stderr output, it's basically swallowed. This 10 change ensures that we log errors to stderr, and also appends 11 the error to the stderr for the test (so it'll show up in 12 results.html). 13 14 Most importantly, it'll cause diff_image() to fail and we'll 15 report ImageHashMismatch ... this may be kinda untrue, but I 16 think it's better than ignoring the error. 17 18 * Scripts/webkitpy/layout_tests/controllers/single_test_runner.py: 19 (SingleTestRunner._compare_image): 20 (SingleTestRunner._compare_output_with_reference): 21 * Scripts/webkitpy/layout_tests/controllers/test_result_writer.py: 22 (write_test_result): 23 * Scripts/webkitpy/layout_tests/controllers/test_result_writer_unittest.py: 24 (TestResultWriterTest.test_reftest_diff_image.ImageDiffTestPort.diff_image): 25 (TestResultWriterTest): 26 * Scripts/webkitpy/layout_tests/port/base.py: 27 (Port.diff_image): 28 * Scripts/webkitpy/layout_tests/port/chromium.py: 29 (ChromiumPort.diff_image): 30 * Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py: 31 (ChromiumPortTestCase.test_diff_image_crashed): 32 * Scripts/webkitpy/layout_tests/port/driver.py: 33 (Driver.run_test): 34 * Scripts/webkitpy/layout_tests/port/image_diff.py: 35 (ImageDiffer.diff_image): 36 (ImageDiffer._read): 37 * Scripts/webkitpy/layout_tests/port/image_diff_unittest.py: 38 (TestImageDiffer.test_diff_image): 39 * Scripts/webkitpy/layout_tests/port/mock_drt_unittest.py: 40 (MockDRTPortTest.test_diff_image_crashed): 41 * Scripts/webkitpy/layout_tests/port/port_testcase.py: 42 (PortTestCase.test_diff_image): 43 (PortTestCase): 44 (PortTestCase.test_diff_image_crashed): 45 (PortTestCase.test_diff_image_crashed.make_proc): 46 * Scripts/webkitpy/layout_tests/port/server_process_mock.py: 47 (MockServerProcess.__init__): 48 * Scripts/webkitpy/layout_tests/port/test.py: 49 (TestPort.diff_image): 50 * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py: 51 (MainTest.test_tolerance.ImageDiffTestPort.diff_image): 52 1 53 2012-08-06 Dirk Pranke <dpranke@chromium.org> 2 54 -
trunk/Tools/Scripts/webkitpy/layout_tests/controllers/single_test_runner.py
r123895 r124801 265 265 elif driver_output.image_hash != expected_driver_output.image_hash: 266 266 diff_result = self._port.diff_image(driver_output.image, expected_driver_output.image) 267 driver_output.image_diff = diff_result[0] 268 if driver_output.image_diff: 269 failures.append(test_failures.FailureImageHashMismatch(diff_result[1])) 267 err_str = diff_result[2] 268 if err_str: 269 _log.warning(' %s : %s' % (self._test_name, err_str)) 270 failures.append(test_failures.FailureImageHashMismatch()) 271 driver_output.error = (driver_output.error or '') + err_str 270 272 else: 271 # See https://bugs.webkit.org/show_bug.cgi?id=69444 for why this isn't a full failure. 272 _log.warning(' %s -> pixel hash failed (but pixel test still passes)' % self._test_name) 273 driver_output.image_diff = diff_result[0] 274 if driver_output.image_diff: 275 failures.append(test_failures.FailureImageHashMismatch(diff_result[1])) 276 else: 277 # See https://bugs.webkit.org/show_bug.cgi?id=69444 for why this isn't a full failure. 278 _log.warning(' %s -> pixel hash failed (but pixel test still passes)' % self._test_name) 273 279 return failures 274 280 … … 318 324 elif driver_output1.image_hash != driver_output2.image_hash: 319 325 failures.append(test_failures.FailureReftestMismatch(reference_filename)) 326 327 # recompute in case we added to stderr during diff_image 328 has_stderr = driver_output1.has_stderr() or driver_output2.has_stderr() 329 320 330 return TestResult(self._test_name, failures, total_test_time, has_stderr) -
trunk/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer.py
r122551 r124801 70 70 # FIXME: We should always have 2 images here. 71 71 if driver_output.image and expected_driver_output.image: 72 diff_image, diff_percent = port.diff_image(driver_output.image, expected_driver_output.image, tolerance=0)72 diff_image, diff_percent, err_str = port.diff_image(driver_output.image, expected_driver_output.image, tolerance=0) 73 73 if diff_image: 74 74 writer.write_image_diff_files(diff_image) -
trunk/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer_unittest.py
r111289 r124801 43 43 def diff_image(self, expected_contents, actual_contents, tolerance=None): 44 44 used_tolerance_values.append(tolerance) 45 return (True, 1 )45 return (True, 1, None) 46 46 47 47 host = MockHost() -
trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py
r124762 r124801 316 316 317 317 def diff_image(self, expected_contents, actual_contents, tolerance=None): 318 """Compare two images and return a tuple of an image diff, a nd a percentage difference (0-100).318 """Compare two images and return a tuple of an image diff, a percentage difference (0-100), and an error string. 319 319 320 320 |tolerance| should be a percentage value (0.0 - 100.0). … … 324 324 """ 325 325 if not actual_contents and not expected_contents: 326 return (None, 0 )326 return (None, 0, None) 327 327 if not actual_contents or not expected_contents: 328 return (True, 0 )328 return (True, 0, None) 329 329 if not self._image_differ: 330 330 self._image_differ = image_diff.ImageDiffer(self) -
trunk/Tools/Scripts/webkitpy/layout_tests/port/chromium.py
r123916 r124801 191 191 192 192 def diff_image(self, expected_contents, actual_contents, tolerance=None): 193 # FIXME: need unit tests for this.194 195 193 # tolerance is not used in chromium. Make sure caller doesn't pass tolerance other than zero or None. 196 194 assert (tolerance is None) or tolerance == 0 … … 198 196 # If only one of them exists, return that one. 199 197 if not actual_contents and not expected_contents: 200 return (None, 0 )198 return (None, 0, None) 201 199 if not actual_contents: 202 return (expected_contents, 0 )200 return (expected_contents, 0, None) 203 201 if not expected_contents: 204 return (actual_contents, 0 )202 return (actual_contents, 0, None) 205 203 206 204 tempdir = self._filesystem.mkdtemp() … … 222 220 223 221 result = None 222 err_str = None 224 223 try: 225 224 exit_code = self._executive.run_command(comand, return_exit_code=True) … … 227 226 # The images are the same. 228 227 result = None 229 elif exit_code != 1: 230 _log.error("image diff returned an exit code of %s" % exit_code) 231 # Returning None here causes the script to think that we 232 # successfully created the diff even though we didn't. 233 # FIXME: Consider raising an exception here, so that the error 234 # is not accidentally overlooked while the test passes. 235 result = None 228 elif exit_code == 1: 229 result = self._filesystem.read_binary_file(native_diff_filename) 230 else: 231 err_str = "image diff returned an exit code of %s" % exit_code 236 232 except OSError, e: 237 if e.errno == errno.ENOENT or e.errno == errno.EACCES: 238 _compare_available = False 239 else: 240 raise 233 err_str = 'error running image diff: %s' % str(e) 241 234 finally: 242 if exit_code == 1:243 result = self._filesystem.read_binary_file(native_diff_filename)244 235 self._filesystem.rmtree(str(tempdir)) 245 return (result, 0) # FIXME: how to get % diff? 236 237 return (result, 0, err_str or None) # FIXME: how to get % diff? 246 238 247 239 def path_from_chromium_base(self, *comps): -
trunk/Tools/Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py
r123916 r124801 159 159 self.assertFalse(exception_raised) 160 160 161 def test_diff_image_crashed(self): 162 port = ChromiumPortTestCase.TestLinuxPort() 163 port._executive = MockExecutive2(exit_code=2) 164 self.assertEquals(port.diff_image("EXPECTED", "ACTUAL"), (None, 0, 'image diff returned an exit code of 2')) 165 161 166 def test_expectations_files(self): 162 167 port = self.make_port() -
trunk/Tools/Scripts/webkitpy/layout_tests/port/image_diff.py
r123893 r124801 63 63 return self._read() 64 64 except IOError as exception: 65 _log.error("Failed to compute an image diff: %s" % str(exception)) 66 return (True, 0) 65 return (None, 0, "Failed to compute an image diff: %s" % str(exception)) 67 66 68 67 def _start(self, tolerance): … … 78 77 output_image = "" 79 78 80 while True:79 while not self._process.timed_out and not self._process.has_crashed(): 81 80 output = self._process.read_stdout_line(deadline) 82 81 if self._process.timed_out or self._process.has_crashed() or not output: … … 94 93 95 94 stderr = self._process.pop_all_buffered_stderr() 95 err_str = '' 96 96 if stderr: 97 _log.warn("ImageDiff produced stderr output:\n" + stderr)97 err_str += "ImageDiff produced stderr output:\n" + stderr 98 98 if self._process.timed_out: 99 _log.error("ImageDiff timed out")99 err_str += "ImageDiff timed out\n" 100 100 if self._process.has_crashed(): 101 _log.error("ImageDiff crashed") 101 err_str += "ImageDiff crashed\n" 102 102 103 # FIXME: There is no need to shut down the ImageDiff server after every diff. 103 104 self._process.stop() … … 110 111 diff_percent = float(m.group(1)) 111 112 112 return (output_image, diff_percent )113 return (output_image, diff_percent, err_str or None) 113 114 114 115 def stop(self): -
trunk/Tools/Scripts/webkitpy/layout_tests/port/image_diff_unittest.py
r123893 r124801 50 50 port = FakePort(['diff: 100% failed\n']) 51 51 image_differ = ImageDiffer(port) 52 self.assertEquals(image_differ.diff_image('foo', 'bar', 0.1), ('', 100.0 ))52 self.assertEquals(image_differ.diff_image('foo', 'bar', 0.1), ('', 100.0, None)) -
trunk/Tools/Scripts/webkitpy/layout_tests/port/mock_drt_unittest.py
r124503 r124801 61 61 pass 62 62 63 def test_diff_image_crashed(self): 64 pass 65 63 66 def test_uses_apache(self): 64 67 pass -
trunk/Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py
r124503 r124801 260 260 port._server_process_constructor = make_proc 261 261 port.setup_test_run() 262 self.assertEquals(port.diff_image('foo', 'bar'), ('', 100.0 ))262 self.assertEquals(port.diff_image('foo', 'bar'), ('', 100.0, None)) 263 263 self.assertEquals(self.proc.cmd[1:3], ["--tolerance", "0.1"]) 264 264 265 self.assertEquals(port.diff_image('foo', 'bar', None), ('', 100.0 ))265 self.assertEquals(port.diff_image('foo', 'bar', None), ('', 100.0, None)) 266 266 self.assertEquals(self.proc.cmd[1:3], ["--tolerance", "0.1"]) 267 267 268 self.assertEquals(port.diff_image('foo', 'bar', 0), ('', 100.0 ))268 self.assertEquals(port.diff_image('foo', 'bar', 0), ('', 100.0, None)) 269 269 self.assertEquals(self.proc.cmd[1:3], ["--tolerance", "0"]) 270 270 … … 272 272 self.assertTrue(self.proc.stopped) 273 273 self.assertEquals(port._image_differ, None) 274 275 def test_diff_image_crashed(self): 276 port = self.make_port() 277 self.proc = None 278 279 def make_proc(port, nm, cmd, env): 280 self.proc = MockServerProcess(port, nm, cmd, env, crashed=True) 281 return self.proc 282 283 port._server_process_constructor = make_proc 284 port.setup_test_run() 285 self.assertEquals(port.diff_image('foo', 'bar'), ('', 0, 'ImageDiff crashed\n')) 286 port.clean_up_test_run() 274 287 275 288 def test_check_wdiff(self): -
trunk/Tools/Scripts/webkitpy/layout_tests/port/server_process_mock.py
r123893 r124801 29 29 30 30 class MockServerProcess(object): 31 def __init__(self, port_obj=None, name=None, cmd=None, env=None, universal_newlines=False, lines=None ):31 def __init__(self, port_obj=None, name=None, cmd=None, env=None, universal_newlines=False, lines=None, crashed=False): 32 32 self.timed_out = False 33 33 self.lines = lines or [] 34 self.crashed = False34 self.crashed = crashed 35 35 self.writes = [] 36 36 self.cmd = cmd -
trunk/Tools/Scripts/webkitpy/layout_tests/port/test.py
r124581 r124801 403 403 diffed = actual_contents != expected_contents 404 404 if diffed: 405 return ["< %s\n---\n> %s\n" % (expected_contents, actual_contents), 1]406 return (None, 0 )405 return ("< %s\n---\n> %s\n" % (expected_contents, actual_contents), 1, None) 406 return (None, 0, None) 407 407 408 408 def layout_tests_dir(self): -
trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py
r124800 r124801 784 784 def diff_image(self, expected_contents, actual_contents, tolerance=None): 785 785 self.tolerance_used_for_diff_image = self._options.tolerance 786 return (True, 1 )786 return (True, 1, None) 787 787 788 788 def get_port_for_run(args):
Note: See TracChangeset
for help on using the changeset viewer.