Changeset 133328 in webkit


Ignore:
Timestamp:
Nov 2, 2012, 12:02:30 PM (13 years ago)
Author:
dpranke@chromium.org
Message:

webkit-patch analyze-baselines output is weak
https://bugs.webkit.org/show_bug.cgi?id=100998

Reviewed by Ojan Vafai.

Currently analyze-baselines prints a list of baselines that have
the same checksum per line, but the format is hard to read;
this patch cleans up the output to print by directory instead
and use the same format I recently added for debugging optimize-baselines,
then refactors the code so that we share and adds tests for
analyze-baselines (which was untested).

Also, I got rid of a couple of unnecessarily-hardcoded port names,
and modified the baseline optimizer to log the current world when
optimize fails.

  • Scripts/webkitpy/common/checkout/baselineoptimizer.py:

(BaselineOptimizer.read_results_by_directory):
(BaselineOptimizer.write_by_directory):
(BaselineOptimizer.optimize):

  • Scripts/webkitpy/tool/commands/rebaseline.py:

(OptimizeBaselines.execute):
(AnalyzeBaselines.init):
(AnalyzeBaselines._write):
(AnalyzeBaselines._analyze_baseline):
(AnalyzeBaselines.execute):

  • Scripts/webkitpy/tool/commands/rebaseline_unittest.py:

(_FakeOptimizer):
(_FakeOptimizer.read_results_by_directory):
(TestAnalyzeBaselines):
(TestAnalyzeBaselines.setUp):
(TestAnalyzeBaselines.test_default):
(TestAnalyzeBaselines.test_missing_baselines):

Location:
trunk/Tools
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r133326 r133328  
     12012-11-02  Dirk Pranke  <dpranke@chromium.org>
     2
     3        webkit-patch analyze-baselines output is weak
     4        https://bugs.webkit.org/show_bug.cgi?id=100998
     5
     6        Reviewed by Ojan Vafai.
     7
     8        Currently analyze-baselines prints a list of baselines that have
     9        the same checksum per line, but the format is hard to read;
     10        this patch cleans up the output to print by directory instead
     11        and use the same format I recently added for debugging optimize-baselines,
     12        then refactors the code so that we share and adds tests for
     13        analyze-baselines (which was untested).
     14
     15        Also, I got rid of a couple of unnecessarily-hardcoded port names,
     16        and modified the baseline optimizer to log the current world when
     17        optimize fails.
     18
     19        * Scripts/webkitpy/common/checkout/baselineoptimizer.py:
     20        (BaselineOptimizer.read_results_by_directory):
     21        (BaselineOptimizer.write_by_directory):
     22        (BaselineOptimizer.optimize):
     23        * Scripts/webkitpy/tool/commands/rebaseline.py:
     24        (OptimizeBaselines.execute):
     25        (AnalyzeBaselines.__init__):
     26        (AnalyzeBaselines._write):
     27        (AnalyzeBaselines._analyze_baseline):
     28        (AnalyzeBaselines.execute):
     29        * Scripts/webkitpy/tool/commands/rebaseline_unittest.py:
     30        (_FakeOptimizer):
     31        (_FakeOptimizer.read_results_by_directory):
     32        (TestAnalyzeBaselines):
     33        (TestAnalyzeBaselines.setUp):
     34        (TestAnalyzeBaselines.test_default):
     35        (TestAnalyzeBaselines.test_missing_baselines):
     36
    1372012-11-02  Adam Barth  <abarth@webkit.org>
    238
  • trunk/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py

    r132959 r133328  
    8282        self._directories = reduce(set.union, map(set, self._hypergraph.values()))
    8383
    84     def _read_results_by_directory(self, baseline_name):
     84    def read_results_by_directory(self, baseline_name):
    8585        results_by_directory = {}
    8686        for directory in self._directories:
     
    123123
    124124    def _find_optimal_result_placement(self, baseline_name):
    125         results_by_directory = self._read_results_by_directory(baseline_name)
     125        results_by_directory = self.read_results_by_directory(baseline_name)
    126126        results_by_port_name = self._results_by_port_name(results_by_directory)
    127127        port_names_by_result = _invert_dictionary(results_by_port_name)
     
    182182        except KeyError as e:
    183183            # FIXME: KeyErrors get raised if we're missing baselines. We should handle this better.
    184             return results_by_directory
     184            return {}
    185185
    186186    def _find_in_fallbackpath(self, fallback_path, current_result, results_by_directory):
     
    241241
    242242    def directories_by_result(self, baseline_name):
    243         results_by_directory = self._read_results_by_directory(baseline_name)
     243        results_by_directory = self.read_results_by_directory(baseline_name)
    244244        return _invert_dictionary(results_by_directory)
     245
     246    def write_by_directory(self, results_by_directory, writer, indent):
     247        for path in sorted(results_by_directory):
     248            writer("%s%s: %s" % (indent, self._platform(path), results_by_directory[path][0:6]))
    245249
    246250    def optimize(self, baseline_name):
     
    251255            if new_results_by_directory:
    252256                _log.debug("  %s: (already optimal)" % basename)
    253                 for path in sorted(results_by_directory):
    254                     result = results_by_directory[path]
    255                     _log.debug("      %s: %s" % (self._platform(path), result[0:6]))
     257                self.write_by_directory(results_by_directory, _log.debug, "    ")
    256258            else:
    257259                _log.debug("  %s: (no baselines found)" % basename)
    258260            return True
    259261        if self._filtered_results_by_port_name(results_by_directory) != self._filtered_results_by_port_name(new_results_by_directory):
    260             _log.warning("Optimization failed")
     262            _log.warning("  %s: optimization failed" % basename)
     263            self.write_by_directory(results_by_directory, _log.warning, "      ")
    261264            return False
    262265
    263266        _log.debug("  %s:" % basename)
    264267        _log.debug("    Before: ")
    265         for path in sorted(results_by_directory):
    266             result = results_by_directory[path]
    267             _log.debug("      %s: %s" % (self._platform(path), result[0:6]))
     268        self.write_by_directory(results_by_directory, _log.debug, "      ")
    268269        _log.debug("    After: ")
    269         for path in sorted(new_results_by_directory):
    270             result = new_results_by_directory[path]
    271             _log.debug("      %s: %s" % (self._platform(path), result[0:6]))
     270        self.write_by_directory(new_results_by_directory, _log.debug, "      ")
    272271
    273272        self._move_baselines(baseline_name, results_by_directory, new_results_by_directory)
  • trunk/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer_unittest.py

    r131699 r133328  
    4343    # We override this method for testing so we don't have to construct an
    4444    # elaborate mock file system.
    45     def _read_results_by_directory(self, baseline_name):
     45    def read_results_by_directory(self, baseline_name):
    4646        return self._mock_results_by_directory
    4747
  • trunk/Tools/Scripts/webkitpy/tool/commands/rebaseline.py

    r133061 r133328  
    209209        self._baseline_suffix_list = options.suffixes.split(',')
    210210        self._baseline_optimizer = BaselineOptimizer(tool)
    211         self._port = tool.port_factory.get("chromium-win-win7")  # FIXME: This should be selectable.
    212 
     211        self._port = tool.port_factory.get()
    213212        for test_name in self._port.tests(args):
    214213            _log.info("Optimizing %s" % test_name)
     
    222221
    223222    def __init__(self):
    224         return super(AnalyzeBaselines, self).__init__(options=[self.suffixes_option])
    225 
    226     def _print(self, baseline_name, directories_by_result):
    227         for result, directories in directories_by_result.items():
    228             if len(directories) <= 1:
    229                 continue
    230             results_names = [self._tool.filesystem.join(directory, baseline_name) for directory in directories]
    231             print ' '.join(results_names)
    232 
    233     def _analyze_baseline(self, test_name):
     223        super(AnalyzeBaselines, self).__init__(options=[
     224            self.suffixes_option,
     225            optparse.make_option('--missing', action='store_true', default=False, help='show missing baselines as well'),
     226            ])
     227        self._optimizer_class = BaselineOptimizer  # overridable for testing
     228
     229    def _write(self, msg):
     230        print msg
     231
     232    def _analyze_baseline(self, options, test_name):
    234233        for suffix in self._baseline_suffix_list:
    235234            baseline_name = _baseline_name(self._tool.filesystem, test_name, suffix)
    236             directories_by_result = self._baseline_optimizer.directories_by_result(baseline_name)
    237             self._print(baseline_name, directories_by_result)
     235            results_by_directory = self._baseline_optimizer.read_results_by_directory(baseline_name)
     236            if results_by_directory:
     237                self._write("%s:" % baseline_name)
     238                self._baseline_optimizer.write_by_directory(results_by_directory, self._write, "  ")
     239            elif options.missing:
     240                self._write("%s: (no baselines found)" % baseline_name)
    238241
    239242    def execute(self, options, args, tool):
    240243        self._baseline_suffix_list = options.suffixes.split(',')
    241         self._baseline_optimizer = BaselineOptimizer(tool)
    242         self._port = tool.port_factory.get("chromium-win-win7")  # FIXME: This should be selectable.
    243 
     244        self._baseline_optimizer = self._optimizer_class(tool)
     245        self._port = tool.port_factory.get()
    244246        for test_name in self._port.tests(args):
    245             self._analyze_baseline(test_name)
     247            self._analyze_baseline(options, test_name)
    246248
    247249
  • trunk/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py

    r133061 r133328  
    3030
    3131from webkitpy.common.system.outputcapture import OutputCapture
     32from webkitpy.common.checkout.baselineoptimizer import BaselineOptimizer
     33from webkitpy.common.net.buildbot.buildbot_mock import MockBuilder
     34from webkitpy.common.system.executive_mock import MockExecutive2
    3235from webkitpy.thirdparty.mock import Mock
    3336from webkitpy.tool.commands.rebaseline import *
    3437from webkitpy.tool.mocktool import MockTool, MockOptions
    35 from webkitpy.common.net.buildbot.buildbot_mock import MockBuilder
    36 from webkitpy.common.system.executive_mock import MockExecutive2
    3738
    3839
     
    361362
    362363
     364class _FakeOptimizer(BaselineOptimizer):
     365    def read_results_by_directory(self, baseline_name):
     366        if baseline_name.endswith('txt'):
     367            return {'LayoutTests/passes/text.html': '123456',
     368                    'LayoutTests/platform/test-mac-leopard/passes/text.html': 'abcdef'}
     369        return {}
     370
     371
     372class TestAnalyzeBaselines(_BaseTestCase):
     373    command_constructor = AnalyzeBaselines
     374
     375    def setUp(self):
     376        super(TestAnalyzeBaselines, self).setUp()
     377        self.port = self.tool.port_factory.get('test')
     378        self.tool.port_factory.get = lambda port_name=None, options=None: self.port
     379        self.lines = []
     380        self.command._optimizer_class = _FakeOptimizer
     381        self.command._write = lambda msg: self.lines.append(msg)
     382
     383    def test_default(self):
     384        self.command.execute(MockOptions(suffixes='txt', missing=False), ['passes/text.html'], self.tool)
     385        self.assertEquals(self.lines,
     386            ['passes/text-expected.txt:',
     387             '  (generic): 123456',
     388             '  test-mac-leopard: abcdef'])
     389
     390    def test_missing_baselines(self):
     391        self.command.execute(MockOptions(suffixes='png,txt', missing=True), ['passes/text.html'], self.tool)
     392        self.assertEquals(self.lines,
     393            ['passes/text-expected.png: (no baselines found)',
     394             'passes/text-expected.txt:',
     395             '  (generic): 123456',
     396             '  test-mac-leopard: abcdef'])
Note: See TracChangeset for help on using the changeset viewer.