Changeset 254929 in webkit


Ignore:
Timestamp:
Jan 22, 2020 10:55:45 AM (4 years ago)
Author:
Jonathan Bedard
Message:

webkitpy: Make logging during ImageDiff crashes accurate
https://bugs.webkit.org/show_bug.cgi?id=206542

Reviewed by Aakash Jain.

When ImageDiff crashes, the generated logs are not accurate, they
reference a crash in test output when the test will actually fail
with an Image failure. The owner of a ServerProcess should be able
to customize this error message.

  • Scripts/webkitpy/port/image_diff.py:

(ImageDiffer._start): Pass ImageDiff specific crash message.

  • Scripts/webkitpy/port/port_testcase.py:

(PortTestCase.test_diff_image.make_proc): Match ImageDiff calcite.
(PortTestCase.test_diff_image_passed): Ditto.
(PortTestCase.test_diff_image_failed): Ditto.
(PortTestCase.test_diff_image_crashed.make_proc): Ditto.

  • Scripts/webkitpy/port/server_process.py:

(ServerProcess.init): Support a custom message when the process crashes.
(ServerProcess.write): Ditto.
(ServerProcess._wait_for_data_and_update_buffers_using_select): Ditto.
(ServerProcess.has_crashed): Ditto.

  • Scripts/webkitpy/port/server_process_mock.py:

(MockServerProcess.init): Match the ServerProcess constructor.

  • Scripts/webkitpy/port/simulator_process.py:

(SimulatorProcess.init): Support a custom message when the process crashes.

Location:
trunk/Tools
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r254925 r254929  
     12020-01-22  Jonathan Bedard  <jbedard@apple.com>
     2
     3        webkitpy: Make logging during ImageDiff crashes accurate
     4        https://bugs.webkit.org/show_bug.cgi?id=206542
     5
     6        Reviewed by Aakash Jain.
     7
     8        When ImageDiff crashes, the generated logs are not accurate, they
     9        reference a crash in test output when the test will actually fail
     10        with an Image failure. The owner of a ServerProcess should be able
     11        to customize this error message.
     12
     13        * Scripts/webkitpy/port/image_diff.py:
     14        (ImageDiffer._start): Pass ImageDiff specific crash message.
     15        * Scripts/webkitpy/port/port_testcase.py:
     16        (PortTestCase.test_diff_image.make_proc): Match ImageDiff calcite.
     17        (PortTestCase.test_diff_image_passed): Ditto.
     18        (PortTestCase.test_diff_image_failed): Ditto.
     19        (PortTestCase.test_diff_image_crashed.make_proc): Ditto.
     20        * Scripts/webkitpy/port/server_process.py:
     21        (ServerProcess.__init__): Support a custom message when the process crashes.
     22        (ServerProcess.write): Ditto.
     23        (ServerProcess._wait_for_data_and_update_buffers_using_select): Ditto.
     24        (ServerProcess.has_crashed): Ditto.
     25        * Scripts/webkitpy/port/server_process_mock.py:
     26        (MockServerProcess.__init__): Match the ServerProcess constructor.
     27        * Scripts/webkitpy/port/simulator_process.py:
     28        (SimulatorProcess.__init__): Support a custom message when the process crashes.
     29
    1302020-01-21  Matt Lewis  <jlewis3@apple.com>
    231
  • trunk/Tools/Scripts/webkitpy/port/image_diff.py

    r254532 r254929  
    7474            command = self._port._jhbuild_wrapper + command
    7575        environment = self._port.setup_environ_for_server('ImageDiff')
    76         self._process = self._port._server_process_constructor(self._port, 'ImageDiff', command, environment)
     76        self._process = self._port._server_process_constructor(self._port, 'ImageDiff', command, environment, crash_message='Test marked as failed, ImageDiff crashed')
    7777        self._process.start()
    7878        self._tolerance = tolerance
  • trunk/Tools/Scripts/webkitpy/port/port_testcase.py

    r254532 r254929  
    279279        self.proc = None
    280280
    281         def make_proc(port, nm, cmd, env):
     281        def make_proc(port, nm, cmd, env, crash_message=None):
    282282            self.proc = MockServerProcess(port, nm, cmd, env, lines=['diff: 100% failed\n', 'diff: 100% failed\n'])
    283283            return self.proc
     
    317317    def test_diff_image_passed(self):
    318318        port = self.make_port()
    319         port._server_process_constructor = lambda port, nm, cmd, env: MockServerProcess(lines=['diff: 0% passed\n'])
     319        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['diff: 0% passed\n'])
    320320        image_differ = ImageDiffer(port)
    321321        self.assertEqual(image_differ.diff_image(b'foo', b'bar', 0.1), (None, 0, None))
     
    323323    def test_diff_image_failed(self):
    324324        port = self.make_port()
    325         port._server_process_constructor = lambda port, nm, cmd, env: MockServerProcess(lines=['diff: 100% failed\n'])
     325        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['diff: 100% failed\n'])
    326326        image_differ = ImageDiffer(port)
    327327        self.assertEqual(image_differ.diff_image(b'foo', b'bar', 0.1), (b'', 100.0, None))
     
    331331        self.proc = None
    332332
    333         def make_proc(port, nm, cmd, env):
     333        def make_proc(port, nm, cmd, env, crash_message=None):
    334334            self.proc = MockServerProcess(port, nm, cmd, env, crashed=True)
    335335            return self.proc
  • trunk/Tools/Scripts/webkitpy/port/server_process.py

    r254340 r254929  
    6262    as necessary to keep issuing commands."""
    6363
    64     def __init__(self, port_obj, name, cmd, env=None, universal_newlines=False, treat_no_data_as_crash=False, target_host=None):
     64    def __init__(self, port_obj, name, cmd, env=None, universal_newlines=False, treat_no_data_as_crash=False, target_host=None, crash_message=None):
    6565        self._port = port_obj
    6666        self._name = name  # Should be the command name (e.g. DumpRenderTree, ImageDiff)
    6767        self._cmd = cmd
     68        self._crash_message = crash_message or 'This test marked as a crash'
    6869
    6970        # Windows does not allow unicode values in the environment
     
    187188            # unless we already know that this is a timeout.
    188189            if not ignore_crash:
    189                 _log.debug('This test marked as a crash because of a broken pipe when writing to stdin of the server process.')
     190                _log.debug('{} because of a broken pipe when writing to stdin of the server process.'.format(self._crash_message))
    190191                self._crashed = True
    191192
     
    300301                data = self._proc.stdout.read()
    301302                if not data and not stopping and (self._treat_no_data_as_crash or self._proc.poll()):
    302                     _log.debug('This test marked as a crash because of no data while reading stdout for the server process.')
     303                    _log.debug('{} because of no data while reading stdout for the server process.'.format(self._crash_message))
    303304                    self._crashed = True
    304305                self._output += data
     
    307308                data = self._proc.stderr.read()
    308309                if not data and not stopping and (self._treat_no_data_as_crash or self._proc.poll()):
    309                     _log.debug('This test marked as a crash because of no data while reading stdout for the server process.')
     310                    _log.debug('{} because of no data while reading stdout for the server process.'.format(self._crash_message))
    310311                    self._crashed = True
    311312                self._error += data
     
    352353    def has_crashed(self):
    353354        if not self._crashed and self.poll():
    354             _log.debug('This test marked as a crash because of failure to poll the server process (return code was %s).' % self._proc.returncode)
     355            _log.debug('{} because of failure to poll the server process (return code was {}).'.format(self._crash_message, self._proc.returncode))
    355356            self._crashed = True
    356357            self._handle_possible_interrupt()
  • trunk/Tools/Scripts/webkitpy/port/server_process_mock.py

    r254340 r254929  
    3131
    3232class MockServerProcess(object):
    33     def __init__(self, port_obj=None, name=None, cmd=None, env=None, universal_newlines=False, lines=None, crashed=False, target_host=None):
     33    def __init__(self, port_obj=None, name=None, cmd=None, env=None, universal_newlines=False, lines=None, crashed=False, target_host=None, crash_message=None):
    3434        self.timed_out = False
    3535        self.lines = [encode_if_necessary(line) for line in (lines or [])]
  • trunk/Tools/Scripts/webkitpy/port/simulator_process.py

    r254340 r254929  
    7474            return result
    7575
    76     def __init__(self, port_obj, name, cmd, env=None, universal_newlines=False, treat_no_data_as_crash=False, target_host=None):
     76    def __init__(self, port_obj, name, cmd, env=None, universal_newlines=False, treat_no_data_as_crash=False, target_host=None, crash_message=None):
    7777        env['PORT'] = str(target_host.listening_port())  # The target_host should be a device.
    78         super(SimulatorProcess, self).__init__(port_obj, name, cmd, env, universal_newlines, treat_no_data_as_crash, target_host)
     78        super(SimulatorProcess, self).__init__(port_obj, name, cmd, env, universal_newlines, treat_no_data_as_crash, target_host, crash_message)
    7979
    8080        self._bundle_id = port_obj.app_identifier_from_bundle(cmd[0])
Note: See TracChangeset for help on using the changeset viewer.