From df73d9b75d65fda969a56f5b550588768cd9dab0 Mon Sep 17 00:00:00 2001 From: "dpranke@chromium.org" Date: Tue, 17 Jan 2012 20:32:59 +0000 Subject: [PATCH] webkitpy: make PortFactory.get() be fully data-driven https://bugs.webkit.org/show_bug.cgi?id=76360 Reviewed by Eric Seidel. Refactor PortFactory.get() to be fully data-driven. * Scripts/webkitpy/layout_tests/port/factory.py: (PortFactory): (PortFactory._default_port): (PortFactory.get): (PortFactory.get.in): * Scripts/webkitpy/layout_tests/port/factory_unittest.py: (FactoryTest.assert_port): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@105184 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- Tools/ChangeLog | 17 +++ .../Scripts/webkitpy/layout_tests/port/factory.py | 131 +++++++-------------- .../webkitpy/layout_tests/port/factory_unittest.py | 34 +++--- 3 files changed, 76 insertions(+), 106 deletions(-) diff --git a/Tools/ChangeLog b/Tools/ChangeLog index a8e212c..bc2dad4 100644 --- a/Tools/ChangeLog +++ b/Tools/ChangeLog @@ -1,5 +1,22 @@ 2012-01-17 Dirk Pranke + webkitpy: make PortFactory.get() be fully data-driven + https://bugs.webkit.org/show_bug.cgi?id=76360 + + Reviewed by Eric Seidel. + + Refactor PortFactory.get() to be fully data-driven. + + * Scripts/webkitpy/layout_tests/port/factory.py: + (PortFactory): + (PortFactory._default_port): + (PortFactory.get): + (PortFactory.get.in): + * Scripts/webkitpy/layout_tests/port/factory_unittest.py: + (FactoryTest.assert_port): + +2012-01-17 Dirk Pranke + webkitpy: add determine_full_port_name(), clean up port.__init__() https://bugs.webkit.org/show_bug.cgi?id=76357 diff --git a/Tools/Scripts/webkitpy/layout_tests/port/factory.py b/Tools/Scripts/webkitpy/layout_tests/port/factory.py index 975e2d7..f0127b0 100644 --- a/Tools/Scripts/webkitpy/layout_tests/port/factory.py +++ b/Tools/Scripts/webkitpy/layout_tests/port/factory.py @@ -41,105 +41,60 @@ class BuilderOptions(object): class PortFactory(object): + PORT_CLASSES = ( + 'chromium_gpu.ChromiumGpuLinuxPort', + 'chromium_gpu.ChromiumGpuMacPort', + 'chromium_gpu.ChromiumGpuWinPort', + 'chromium_linux.ChromiumLinuxPort', + 'chromium_mac.ChromiumMacPort', + 'chromium_win.ChromiumWinPort', + 'dryrun.DryRunPort', + 'efl.EflPort', + 'google_chrome.GoogleChromeLinux32Port', + 'google_chrome.GoogleChromeLinux64Port', + 'google_chrome.GoogleChromeMacPort', + 'google_chrome.GoogleChromeWinPort', + 'gtk.GtkPort', + 'mac.MacPort', + 'mock_drt.MockDRTPort', + 'qt.QtPort', + 'test.TestPort', + 'win.WinPort', + ) + def __init__(self, host): self._host = host - def _port_name_from_arguments_and_options(self, port_name, options, platform): - if port_name == 'chromium-gpu': - if platform.is_win(): - return 'chromium-gpu-win' - if platform.is_linux(): - return 'chromium-gpu-linux' - if platform.is_mac(): - return 'chromium-gpu-mac' - - if port_name: - return port_name - - if platform.is_win(): - if options and hasattr(options, 'chromium') and options.chromium: - return 'chromium-win' - return 'win' - if platform.is_linux(): + def _default_port(self, options): + platform = self._host.platform + if options and hasattr(options, 'chromium') and options.chromium: + return 'chromium-' + platform.os_name + elif platform.is_linux(): return 'chromium-linux' - if platform.is_mac(): - if options and hasattr(options, 'chromium') and options.chromium: - return 'chromium-mac' + elif platform.is_mac(): return 'mac' - - raise NotImplementedError('unknown port; os_name = "%s"' % platform.os_name) + elif platform.is_win(): + return 'win' + raise NotImplementedError('unknown platform: %s' % platform) def get(self, port_name=None, options=None, **kwargs): """Returns an object implementing the Port interface. If port_name is None, this routine attempts to guess at the most appropriate port on this platform.""" - port_to_use = self._port_name_from_arguments_and_options(port_name, options, self._host.platform) - port_name = port_name or port_to_use - if port_to_use.startswith('test'): - import test - maker = test.TestPort - elif port_to_use.startswith('dryrun'): - import dryrun - maker = dryrun.DryRunPort - elif port_to_use.startswith('mock-'): - import mock_drt - maker = mock_drt.MockDRTPort - elif port_to_use.startswith('mac'): - import mac - maker = mac.MacPort - elif port_to_use.startswith('win'): - import win - maker = win.WinPort - elif port_to_use.startswith('gtk'): - import gtk - maker = gtk.GtkPort - elif port_to_use.startswith('qt'): - import qt - maker = qt.QtPort - elif port_to_use.startswith('chromium-gpu-linux'): - import chromium_gpu - port_name = port_to_use - maker = chromium_gpu.ChromiumGpuLinuxPort - elif port_to_use.startswith('chromium-gpu-mac'): - import chromium_gpu - port_name = port_to_use - maker = chromium_gpu.ChromiumGpuMacPort - elif port_to_use.startswith('chromium-gpu-win'): - import chromium_gpu - port_name = port_to_use - maker = chromium_gpu.ChromiumGpuWinPort - elif port_to_use.startswith('chromium-mac'): - import chromium_mac - port_name = port_to_use - maker = chromium_mac.ChromiumMacPort - elif port_to_use.startswith('chromium-linux'): - import chromium_linux - maker = chromium_linux.ChromiumLinuxPort - elif port_to_use.startswith('chromium-win'): - import chromium_win - maker = chromium_win.ChromiumWinPort - elif port_to_use == 'google-chrome-linux32': - import google_chrome - port_name = 'chromium-linux-x86' - maker = google_chrome.GoogleChromeLinux32Port - elif port_to_use == 'google-chrome-linux64': - import google_chrome - port_name = 'chromium-linux-x86_64' - maker = google_chrome.GoogleChromeLinux64Port - elif port_to_use.startswith('google-chrome-win'): - import google_chrome - maker = google_chrome.GoogleChromeWinPort - elif port_to_use.startswith('google-chrome-mac'): - import google_chrome - maker = google_chrome.GoogleChromeMacPort - elif port_to_use.startswith('efl'): - import efl - maker = efl.EflPort - else: - raise NotImplementedError('unsupported port: %s' % port_to_use) + port_name = port_name or self._default_port(options) - port_name = maker.determine_full_port_name(self._host, options, port_name) - return maker(self._host, port_name, options=options, **kwargs) + # FIXME: Remove this when we remove the chromium-gpu ports. + if port_name == 'chromium-gpu': + port_name = port_name + '-' + self._host.platform.os_name + + for port_class in self.PORT_CLASSES: + module_name, class_name = port_class.rsplit('.', 1) + module = __import__(module_name, globals(), locals(), [], -1) + cls = module.__dict__[class_name] + if port_name.startswith(cls.port_name): + port_name = cls.determine_full_port_name(self._host, options, port_name) + return cls(self._host, port_name, options=options, **kwargs) + raise NotImplementedError('unsupported port: %s' % port_name) def all_port_names(self): """Return a list of all valid, fully-specified, "real" port names. diff --git a/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py index b567f73..60f333e 100644 --- a/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py +++ b/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py @@ -30,19 +30,19 @@ import unittest from webkitpy.tool.mocktool import MockOptions from webkitpy.common.system.systemhost_mock import MockSystemHost -from webkitpy.layout_tests.port.factory import PortFactory -import chromium_gpu -import chromium_linux -import chromium_mac -import chromium_win -import dryrun -import google_chrome -import gtk -import mac -import qt -import test -import win +from webkitpy.layout_tests.port import chromium_gpu +from webkitpy.layout_tests.port import chromium_linux +from webkitpy.layout_tests.port import chromium_mac +from webkitpy.layout_tests.port import chromium_win +from webkitpy.layout_tests.port import dryrun +from webkitpy.layout_tests.port import factory +from webkitpy.layout_tests.port import google_chrome +from webkitpy.layout_tests.port import gtk +from webkitpy.layout_tests.port import mac +from webkitpy.layout_tests.port import qt +from webkitpy.layout_tests.port import test +from webkitpy.layout_tests.port import win class FactoryTest(unittest.TestCase): @@ -56,10 +56,8 @@ class FactoryTest(unittest.TestCase): def assert_port(self, port_name=None, os_name=None, os_version=None, options=None, cls=None): host = MockSystemHost(os_name=os_name, os_version=os_version) - port = PortFactory(host).get(port_name, options=options) - # FIXME: This will fail until we finish refactoring factory.py. - # self.assertTrue(isinstance(port, cls)) - self.assertEquals(port.__class__.__name__, cls.__name__) + port = factory.PortFactory(host).get(port_name, options=options) + self.assertTrue(isinstance(port, cls)) def test_mac(self): self.assert_port(port_name='mac', cls=mac.MacPort) @@ -133,10 +131,10 @@ class FactoryTest(unittest.TestCase): cls=chromium_win.ChromiumWinPort) def test_unknown_specified(self): - self.assertRaises(NotImplementedError, PortFactory(MockSystemHost()).get, port_name='unknown') + self.assertRaises(NotImplementedError, factory.PortFactory(MockSystemHost()).get, port_name='unknown') def test_unknown_default(self): - self.assertRaises(NotImplementedError, PortFactory(MockSystemHost(os_name='vms')).get) + self.assertRaises(NotImplementedError, factory.PortFactory(MockSystemHost(os_name='vms')).get) if __name__ == '__main__': -- 2.7.4