Changeset 90770 in webkit


Ignore:
Timestamp:
Jul 11, 2011, 11:51:13 AM (14 years ago)
Author:
abarth@webkit.org
Message:

Add a webkit-patch command for rebaselining an individual test
https://bugs.webkit.org/show_bug.cgi?id=64246

Reviewed by Eric Seidel.

This patch introduces a command that's able to rebaseline a single
test. Currently, the command works only with the build.chromium.org
buildbots, but extending it to work with the build.webkit.org bots
shouldn't be that hard.

A complete rebaseling tool should also include an "optimize baselines"
command (which moves/deletes baselines in order to reduce the number of
expected results files), but that will come in a future patch.

Really BuilderToPort should be merged into builders.py, but I'm going
to save that for a future patch as well. (We need to stop shaving yaks
at some point.)

  • Scripts/webkitpy/tool/commands/rebaseline.py:
Location:
trunk/Tools
Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r90762 r90770  
     12011-07-11  Adam Barth  <abarth@webkit.org>
     2
     3        Add a webkit-patch command for rebaselining an individual test
     4        https://bugs.webkit.org/show_bug.cgi?id=64246
     5
     6        Reviewed by Eric Seidel.
     7
     8        This patch introduces a command that's able to rebaseline a single
     9        test.  Currently, the command works only with the build.chromium.org
     10        buildbots, but extending it to work with the build.webkit.org bots
     11        shouldn't be that hard.
     12
     13        A complete rebaseling tool should also include an "optimize baselines"
     14        command (which moves/deletes baselines in order to reduce the number of
     15        expected results files), but that will come in a future patch.
     16
     17        Really BuilderToPort should be merged into builders.py, but I'm going
     18        to save that for a future patch as well.  (We need to stop shaving yaks
     19        at some point.)
     20
     21        * Scripts/webkitpy/tool/commands/rebaseline.py:
     22
    1232011-07-11  Adam Barth  <abarth@webkit.org>
    224
  • trunk/Tools/Scripts/webkitpy/common/host.py

    r85768 r90770  
    3232from webkitpy.common.checkout.scm import default_scm
    3333from webkitpy.common.config.ports import WebKitPort
    34 from webkitpy.common.net import bugzilla, buildbot, statusserver
     34from webkitpy.common.net import bugzilla, buildbot, statusserver, web
    3535from webkitpy.common.net.irc import ircproxy
    3636from webkitpy.common.system import executive, filesystem, platforminfo, user, workspace
     
    4343        self.buildbot = buildbot.BuildBot()
    4444        self.executive = executive.Executive()
     45        self.web = web.Web()
    4546        self._irc = None
    4647        self.filesystem = filesystem.FileSystem()
  • trunk/Tools/Scripts/webkitpy/common/net/buildbot/buildbot.py

    r90513 r90770  
    6969    def results_url(self):
    7070        return "%s/results/%s" % (self._buildbot.buildbot_url, self.url_encoded_name())
     71
     72    # In addition to per-build results, the build.chromium.org builders also
     73    # keep a directory that accumulates test results over many runs.
     74    def accumulated_results_url(self):
     75        return None
    7176
    7277    def url_encoded_name(self):
     
    281286
    282287class BuildBot(object):
    283     def __init__(self, url=config_urls.buildbot_url):
    284         self.buildbot_url = url
     288    _builder_factory = Builder
     289    _default_url = config_urls.buildbot_url
     290
     291    def __init__(self, url=None):
     292        self.buildbot_url = url if url else self._default_url
    285293        self._builder_by_name = {}
    286294
     
    441449        builder = self._builder_by_name.get(name)
    442450        if not builder:
    443             builder = Builder(name, self)
     451            builder = self._builder_factory(name, self)
    444452            self._builder_by_name[name] = builder
    445453        return builder
  • trunk/Tools/Scripts/webkitpy/layout_tests/port/builders.py

    r89965 r90770  
    3131
    3232
    33 def _path_from_name(name):
    34     return re.sub(r'[\s().]', '_', name)
     33def builder_path_from_name(builder_name):
     34    return re.sub(r'[\s().]', '_', builder_name)
     35
    3536
    3637# Compiled manually from http://build.chromium.org/p/chromium/json/builders/help?as_text=1
     
    3940# FIXME Make the values in this map into lists.
    4041CHROMIUM_PORT_TO_BUILDER_NAME = {
    41     'chromium-gpu-linux': _path_from_name('Webkit Linux - GPU'),
     42    'chromium-gpu-linux': builder_path_from_name('Webkit Linux - GPU'),
    4243
    43     'chromium-gpu-mac-snowleopard': _path_from_name('Webkit Mac10.6 - GPU'),
    44     'chromium-gpu-mac-leopard': _path_from_name('Webkit Mac10.5 - GPU'),
     44    'chromium-gpu-mac-snowleopard': builder_path_from_name('Webkit Mac10.6 - GPU'),
     45    'chromium-gpu-mac-leopard': builder_path_from_name('Webkit Mac10.5 - GPU'),
    4546
    46     'chromium-gpu-win-xp': _path_from_name('Webkit Win - GPU'),
    47     'chromium-gpu-win-vista': _path_from_name('Webkit Vista - GPU'),
    48     'chromium-gpu-win-win7': _path_from_name('Webkit Win7 - GPU'),
     47    'chromium-gpu-win-xp': builder_path_from_name('Webkit Win - GPU'),
     48    'chromium-gpu-win-vista': builder_path_from_name('Webkit Vista - GPU'),
     49    'chromium-gpu-win-win7': builder_path_from_name('Webkit Win7 - GPU'),
    4950
    50     'chromium-linux-x86_64': _path_from_name('Linux Tests x64'),
    51     'chromium-linux-x86': _path_from_name('Linux Tests (dbg)(1)'),
     51    'chromium-linux-x86_64': builder_path_from_name('Linux Tests x64'),
     52    'chromium-linux-x86': builder_path_from_name('Linux Tests (dbg)(1)'),
    5253
    53     'chromium-mac-leopard': _path_from_name('Mac10.5 Tests (1)'),
    54     'chromium-mac-snowleopard': _path_from_name('Mac 10.6 Tests (dbg)(1)'),
     54    'chromium-mac-leopard': builder_path_from_name('Mac10.5 Tests (1)'),
     55    'chromium-mac-snowleopard': builder_path_from_name('Mac 10.6 Tests (dbg)(1)'),
    5556
    56     'chromium-win-xp': _path_from_name('XP Tests (dbg)(5)'),
    57     'chromium-win-vista': _path_from_name('Vista Tests (dbg)(1)'),
     57    'chromium-win-xp': builder_path_from_name('XP Tests (dbg)(5)'),
     58    'chromium-win-vista': builder_path_from_name('Vista Tests (dbg)(1)'),
    5859    'chromium-win-win7': None,
    5960
  • trunk/Tools/Scripts/webkitpy/layout_tests/port/builders_unittest.py

    r85040 r90770  
    3939        }
    4040        for name, expected in tests.items():
    41             self.assertEquals(expected, builders._path_from_name(name))
     41            self.assertEquals(expected, builders.builder_path_from_name(name))
    4242
    4343if __name__ == '__main__':
  • trunk/Tools/Scripts/webkitpy/tool/commands/rebaseline.py

    r90532 r90770  
    3232import urllib
    3333
     34import webkitpy.common.config.urls as config_urls
    3435from webkitpy.common.net.buildbot import BuildBot
     36from webkitpy.common.net.buildbot.chromiumbuildbot import ChromiumBuildBot
    3537from webkitpy.common.net.layouttestresults import LayoutTestResults
    3638from webkitpy.common.system.user import User
     
    4143
    4244
    43 # FIXME: I'm not sure where this logic should go in the end.
    44 # For now it's here, until we have a second need for it.
     45# FIXME: This logic should be moved to builders.py.
    4546class BuilderToPort(object):
    4647    _builder_name_to_port_name = {
     48        # These builders are on build.webkit.org.
    4749        r"SnowLeopard": "mac-snowleopard",
    4850        r"Leopard": "mac-leopard",
     
    5355        r"Chromium Linux": "chromium-linux",
    5456        r"Chromium Win": "chromium-win",
     57
     58        # These builders are on build.chromium.org.
     59        r"Webkit Win": "chromium-win-xp",
     60        r"Webkit Vista": "chromium-win-vista",
     61        r"Webkit Win7": "chromium-win-win7",
     62        r"Webkit Win (dbg)(1)": "chromium-win-win7",  # FIXME: Is this correct?
     63        r"Webkit Win (dbg)(2)": "chromium-win-win7",  # FIXME: Is this correct?
     64        r"Webkit Linux": "chromium-linux-x86_64",
     65        r"Webkit Linux 32": "chromium-linux-x86",
     66        r"Webkit Linux (dbg)(1)": "chromium-linux-x86_64",
     67        r"Webkit Linux (dbg)(2)": "chromium-linux-x86_64",
     68        r"Webkit Mac10\.5": "chromium-mac-leopard",
     69        r"Webkit Mac10\.5 (dbg)(1)": "chromium-mac-leopard",
     70        r"Webkit Mac10\.5 (dbg)(2)": "chromium-mac-leopard",
     71        r"Webkit Mac10\.6": "chromium-mac-snowleopard",
     72        r"Webkit Mac10\.6 (dbg)": "chromium-mac-snowleopard",
    5573    }
    5674
     
    6684        assert(port)  # Need to update _builder_name_to_port_name
    6785        return port
     86
     87
     88class RebaselineTest(AbstractDeclarativeCommand):
     89    name = "rebaseline-test"
     90    help_text = "Rebaseline a single test from a buildbot.  (Currently works only with build.chromium.org buildbots.)"
     91    argument_names = "BUILDER_NAME TEST_NAME SUFFIX"
     92
     93    def _results_url(self, builder_name):
     94        # FIXME: Generalize this command to work with non-build.chromium.org builders.
     95        # FIXME: We should really get the buildbot from the tool!
     96        builder = ChromiumBuildBot().builder_with_name(builder_name)
     97        return builder.accumulated_results_url()
     98
     99    def _baseline_directory(self, builder_name):
     100        port = BuilderToPort().port_for_builder(builder_name)
     101        return port.baseline_path()
     102
     103    def _save_baseline(self, data, target_baseline):
     104        self._tool.filesystem.write_binary_file(target_baseline, data)
     105        if not self._tool.scm().exists(target_baseline):
     106            self._tool.scm().add(target_baseline)
     107
     108    def _test_root(self, test_name):
     109        return os.path.splitext(test_name)[0]
     110
     111    def _file_name_for_actual_result(self, test_name, suffix):
     112        return "%s-actual.%s" % (self._test_root(test_name), suffix)
     113
     114    def _file_name_for_expected_result(self, test_name, suffix):
     115        return "%s-expected.%s" % (self._test_root(test_name), suffix)
     116
     117    def _rebaseline_test(self, builder_name, test_name, suffix):
     118        results_url = self._results_url(builder_name)
     119        baseline_directory = self._baseline_directory(builder_name)
     120
     121        source_baseline = "%s/%s" % (results_url, self._file_name_for_actual_result(test_name, suffix))
     122        target_baseline = os.path.join(baseline_directory, self._file_name_for_expected_result(test_name, suffix))
     123
     124        print "Retrieving %s ..." % source_baseline
     125        self._save_baseline(self._tool.web.get_binary(source_baseline), target_baseline)
     126
     127    def execute(self, options, args, tool):
     128        self._rebaseline_test(args[0], args[1], args[2])
    68129
    69130
  • trunk/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py

    r74927 r90770  
    3131from webkitpy.common.system.outputcapture import OutputCapture
    3232from webkitpy.thirdparty.mock import Mock
    33 from webkitpy.tool.commands.rebaseline import BuilderToPort, Rebaseline
     33from webkitpy.tool.commands.rebaseline import *
    3434from webkitpy.tool.mocktool import MockTool
    3535
    3636
    37 class RebaselineTest(unittest.TestCase):
     37class TestRebaseline(unittest.TestCase):
    3838    # This just makes sure the code runs without exceptions.
    3939    def test_tests_to_update(self):
     
    4444
    4545
     46class TestRebaselineTest(unittest.TestCase):
     47    def test_tests_to_update(self):
     48        command = RebaselineTest()
     49        command.bind_to_tool(MockTool())
     50        build = Mock()
     51        expected_stdout = "Retrieving http://build.chromium.org/f/chromium/layout_test_results/Webkit_Linux/results/layout-test-results/userscripts/another-test-actual.txt ...\n"
     52        OutputCapture().assert_outputs(self, command._rebaseline_test, ["Webkit Linux", "userscripts/another-test.html", "txt"], expected_stdout=expected_stdout)
     53
     54
    4655class BuilderToPortTest(unittest.TestCase):
    4756    def test_port_for_builder(self):
  • trunk/Tools/Scripts/webkitpy/tool/mocktool.py

    r90543 r90770  
    748748
    749749
     750class MockWeb(object):
     751    def get_binary(self, url):
     752        return "MOCK Web result"
     753
     754
    750755class MockTool(object):
    751756
     
    755760        self.buildbot = MockBuildBot()
    756761        self.executive = MockExecutive(should_log=log_executive)
     762        self.web = MockWeb()
    757763        self.filesystem = MockFileSystem()
    758764        self.workspace = MockWorkspace()
Note: See TracChangeset for help on using the changeset viewer.