Changeset 185859 in webkit


Ignore:
Timestamp:
Jun 22, 2015 8:47:24 PM (9 years ago)
Author:
commit-queue@webkit.org
Message:

Get rid of factory json files in benchmark_runner
https://bugs.webkit.org/show_bug.cgi?id=146175

Patch by Dewei Zhu <Dewei Zhu> on 2015-06-22
Reviewed by Ryosuke Niwa.

Get rid of factory json files in benchmark_runner and refactoring the code.

  • Scripts/webkitpy/benchmark_runner/benchmark_builder/init.py:

(benchmark_builder_loader):

  • Scripts/webkitpy/benchmark_runner/benchmark_builder/benchmark_builder_factory.py:

(BenchmarkBuilderFactory):

  • Scripts/webkitpy/benchmark_runner/benchmark_builder/benchmark_builders.json: Removed.
  • Scripts/webkitpy/benchmark_runner/benchmark_builder/generic_benchmark_builder.py:

(GenericBenchmarkBuilder):

  • Scripts/webkitpy/benchmark_runner/benchmark_runner.py:

(BenchmarkRunner.init):
(BenchmarkRunner.execute):

  • Scripts/webkitpy/benchmark_runner/browser_driver/init.py:

(browser_driver_loader):

  • Scripts/webkitpy/benchmark_runner/browser_driver/browser_driver.py:

(BrowserDriver):

  • Scripts/webkitpy/benchmark_runner/browser_driver/browser_driver_factory.py:

(BrowserDriverFactory):
(BrowserDriverFactory.available_platforms):
(BrowserDriverFactory.available_browsers):
(BrowserDriverFactory.add_browser_driver):
(BrowserDriverFactory.create):

  • Scripts/webkitpy/benchmark_runner/browser_driver/browser_drivers.json: Removed.
  • Scripts/webkitpy/benchmark_runner/browser_driver/osx_browser_driver.py:

(OSXBrowserDriver):
(OSXBrowserDriver.prepareEnv):
(OSXBrowserDriver.terminateProcesses):
(OSXBrowserDriver.screenSize):

  • Scripts/webkitpy/benchmark_runner/browser_driver/osx_chrome_driver.py:

(OSXChromeDriver):
(OSXChromeCanaryDriver):

  • Scripts/webkitpy/benchmark_runner/browser_driver/osx_firefox_driver.py:

(OSXFirefoxDriver):
(OSXFirefoxNightlyDriver):

  • Scripts/webkitpy/benchmark_runner/browser_driver/osx_safari_driver.py:

(OSXSafariDriver):

  • Scripts/webkitpy/benchmark_runner/generic_factory.py:

(GenericFactory.create):
(GenericFactory.add):
(GenericFactory.iterateGetItem): Deleted.

  • Scripts/webkitpy/benchmark_runner/http_server_driver/init.py:

(http_server_driver_loader):

  • Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver.py:

(HTTPServerDriver):

  • Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver_factory.py:

(HTTPServerDriverFactory):

  • Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_drivers.json: Removed.
  • Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py:

(SimpleHTTPServerDriver):

  • Scripts/webkitpy/benchmark_runner/utils.py:

(is_subclass):
(load_subclasses):
(ModuleNotFoundError): Deleted.
(loadModule): Deleted.
(loadJSONFromFile): Deleted.

Location:
trunk/Tools
Files:
3 deleted
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r185857 r185859  
     12015-06-22  Dewei Zhu  <dewei_zhu@apple.com>
     2
     3        Get rid of factory json files in benchmark_runner
     4        https://bugs.webkit.org/show_bug.cgi?id=146175
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Get rid of factory json files in benchmark_runner and refactoring the code.
     9
     10        * Scripts/webkitpy/benchmark_runner/benchmark_builder/__init__.py:
     11        (benchmark_builder_loader):
     12        * Scripts/webkitpy/benchmark_runner/benchmark_builder/benchmark_builder_factory.py:
     13        (BenchmarkBuilderFactory):
     14        * Scripts/webkitpy/benchmark_runner/benchmark_builder/benchmark_builders.json: Removed.
     15        * Scripts/webkitpy/benchmark_runner/benchmark_builder/generic_benchmark_builder.py:
     16        (GenericBenchmarkBuilder):
     17        * Scripts/webkitpy/benchmark_runner/benchmark_runner.py:
     18        (BenchmarkRunner.__init__):
     19        (BenchmarkRunner.execute):
     20        * Scripts/webkitpy/benchmark_runner/browser_driver/__init__.py:
     21        (browser_driver_loader):
     22        * Scripts/webkitpy/benchmark_runner/browser_driver/browser_driver.py:
     23        (BrowserDriver):
     24        * Scripts/webkitpy/benchmark_runner/browser_driver/browser_driver_factory.py:
     25        (BrowserDriverFactory):
     26        (BrowserDriverFactory.available_platforms):
     27        (BrowserDriverFactory.available_browsers):
     28        (BrowserDriverFactory.add_browser_driver):
     29        (BrowserDriverFactory.create):
     30        * Scripts/webkitpy/benchmark_runner/browser_driver/browser_drivers.json: Removed.
     31        * Scripts/webkitpy/benchmark_runner/browser_driver/osx_browser_driver.py:
     32        (OSXBrowserDriver):
     33        (OSXBrowserDriver.prepareEnv):
     34        (OSXBrowserDriver.terminateProcesses):
     35        (OSXBrowserDriver.screenSize):
     36        * Scripts/webkitpy/benchmark_runner/browser_driver/osx_chrome_driver.py:
     37        (OSXChromeDriver):
     38        (OSXChromeCanaryDriver):
     39        * Scripts/webkitpy/benchmark_runner/browser_driver/osx_firefox_driver.py:
     40        (OSXFirefoxDriver):
     41        (OSXFirefoxNightlyDriver):
     42        * Scripts/webkitpy/benchmark_runner/browser_driver/osx_safari_driver.py:
     43        (OSXSafariDriver):
     44        * Scripts/webkitpy/benchmark_runner/generic_factory.py:
     45        (GenericFactory.create):
     46        (GenericFactory.add):
     47        (GenericFactory.iterateGetItem): Deleted.
     48        * Scripts/webkitpy/benchmark_runner/http_server_driver/__init__.py:
     49        (http_server_driver_loader):
     50        * Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver.py:
     51        (HTTPServerDriver):
     52        * Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver_factory.py:
     53        (HTTPServerDriverFactory):
     54        * Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_drivers.json: Removed.
     55        * Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py:
     56        (SimpleHTTPServerDriver):
     57        * Scripts/webkitpy/benchmark_runner/utils.py:
     58        (is_subclass):
     59        (load_subclasses):
     60        (ModuleNotFoundError): Deleted.
     61        (loadModule): Deleted.
     62        (loadJSONFromFile): Deleted.
     63
    1642015-06-22  Simon Fraser  <simon.fraser@apple.com>
    265
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_builder/__init__.py

    r183443 r185859  
    1212# allows different callers to choose different initialization code,
    1313# as necessary.
     14import os
     15
     16from webkitpy.benchmark_runner.utils import load_subclasses
     17from benchmark_builder_factory import BenchmarkBuilderFactory
     18
     19
     20def benchmark_builder_loader(benchmark_builder_class):
     21    if benchmark_builder_class.builder_name:
     22        BenchmarkBuilderFactory.add(benchmark_builder_class.builder_name, benchmark_builder_class)
     23
     24
     25load_subclasses(
     26    dirname=os.path.dirname(os.path.abspath(__file__)),
     27    base_class_name='GenericBenchmarkBuilder',
     28    loader=benchmark_builder_loader)
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_builder/benchmark_builder_factory.py

    r183309 r185859  
    66
    77from webkitpy.benchmark_runner.generic_factory import GenericFactory
    8 from webkitpy.benchmark_runner.utils import loadJSONFromFile
    9 
    10 
    11 builderFileName = 'benchmark_builders.json'
    128
    139
    1410class BenchmarkBuilderFactory(GenericFactory):
    1511
    16     products = loadJSONFromFile(os.path.join(os.path.dirname(__file__), builderFileName))
     12    products = {}
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_builder/generic_benchmark_builder.py

    r185371 r185859  
    1616
    1717class GenericBenchmarkBuilder(object):
     18
     19    builder_name = 'GenericBenchmarkBuilder'
    1820
    1921    def prepare(self, name, plan):
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_runner.py

    r185732 r185859  
    1717from browser_driver.browser_driver_factory import BrowserDriverFactory
    1818from http_server_driver.http_server_driver_factory import HTTPServerDriverFactory
    19 from utils import loadModule, getPathFromProjectRoot
     19from utils import getPathFromProjectRoot
    2020from utils import timeout
    2121
     
    3838                if httpServerDriverOverride:
    3939                    self.plan['http_server_driver'] = httpServerDriverOverride
    40                 self.browserDriver = BrowserDriverFactory.create([platform, browser])
    41                 self.httpServerDriver = HTTPServerDriverFactory.create([self.plan['http_server_driver']])
     40                self.browserDriver = BrowserDriverFactory.create(platform, browser)
     41                self.httpServerDriver = HTTPServerDriverFactory.create(self.plan['http_server_driver'])
    4242                self.httpServerDriver.setDeviceID(deviceID)
    4343                self.buildDir = os.path.abspath(buildDir) if buildDir else None
     
    6666        _log.info('Start a new benchmark')
    6767        results = []
    68         self.benchmarkBuilder = BenchmarkBuilderFactory.create([self.plan['benchmark_builder']])
     68        self.benchmarkBuilder = BenchmarkBuilderFactory.create(self.plan['benchmark_builder'])
    6969
    7070        webRoot = self.benchmarkBuilder.prepare(self.planName, self.plan)
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/__init__.py

    r183443 r185859  
    1212# allows different callers to choose different initialization code,
    1313# as necessary.
     14import os
     15
     16from webkitpy.benchmark_runner.utils import load_subclasses
     17from browser_driver_factory import BrowserDriverFactory
     18
     19
     20def browser_driver_loader(browser_driver_class):
     21    if browser_driver_class.platform and browser_driver_class.browser_name:
     22        BrowserDriverFactory.add_browser_driver(browser_driver_class.platform, browser_driver_class.browser_name, browser_driver_class)
     23
     24
     25load_subclasses(
     26    dirname=os.path.dirname(os.path.abspath(__file__)),
     27    base_class_name='BrowserDriver',
     28    loader=browser_driver_loader)
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/browser_driver.py

    r185732 r185859  
    55
    66class BrowserDriver(object):
     7    platform = None
     8    browser_name = None
    79
    810    @abc.abstractmethod
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/browser_driver_factory.py

    r184044 r185859  
    55import os
    66
    7 from webkitpy.benchmark_runner.generic_factory import GenericFactory
    8 from webkitpy.benchmark_runner.utils import loadJSONFromFile
    97
     8class BrowserDriverFactory(object):
    109
    11 driverFileName = 'browser_drivers.json'
     10    browser_drivers = {}
     11    platforms = set()
     12    browsers = set()
    1213
    13 
    14 class BrowserDriverFactory(GenericFactory):
    15 
    16     products = loadJSONFromFile(os.path.join(os.path.dirname(__file__), driverFileName))
    1714
    1815    @classmethod
    1916    def available_platforms(cls):
    20         return cls.products.keys()
     17        return list(cls.platforms)
    2118
    2219    @classmethod
    2320    def available_browsers(cls):
    24         browsers = []
    25         for platform in cls.products.values():
    26             for browser in platform:
    27                 browsers.append(browser)
    28         return browsers
     21        return list(cls.browsers)
     22
     23    @classmethod
     24    def add_browser_driver(cls, platform, browser_name, browser_driver_class):
     25        cls.platforms.add(platform)
     26        cls.browsers.add(browser_name)
     27        if platform not in cls.browser_drivers:
     28            cls.browser_drivers[platform] = {}
     29        cls.browser_drivers[platform][browser_name] = browser_driver_class
     30
     31    @classmethod
     32    def create(cls, platform, browser_name):
     33        return cls.browser_drivers[platform][browser_name]()
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/osx_browser_driver.py

    r185732 r185859  
    44import subprocess
    55
    6 from AppKit import NSRunningApplication
    7 from AppKit import NSScreen
    8 from Quartz import CGWarpMouseCursorPosition
    96from browser_driver import BrowserDriver
    107
     
    1512class OSXBrowserDriver(BrowserDriver):
    1613    bundleIdentifier = None
     14    platform = 'osx'
    1715
    1816    def prepareEnv(self, deviceID):
    1917        self.closeBrowsers()
     18        from Quartz import CGWarpMouseCursorPosition
    2019        CGWarpMouseCursorPosition((10, 0))
    2120
     
    3837    def terminateProcesses(cls, bundleIdentifier):
    3938        _log.info('Closing all terminating all processes with the bundle identifier %s' % bundleIdentifier)
     39        from AppKit import NSRunningApplication
    4040        processes = NSRunningApplication.runningApplicationsWithBundleIdentifier_(bundleIdentifier)
    4141        for process in processes:
     
    5050    @classmethod
    5151    def screenSize(cls):
     52        from AppKit import NSScreen
    5253        return NSScreen.mainScreen().frame().size
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/osx_chrome_driver.py

    r185483 r185859  
    1414class OSXChromeDriver(OSXBrowserDriver):
    1515    bundleIdentifier = 'com.google.Chrome'
     16    browser_name = 'chrome'
    1617
    1718    def launchUrl(self, url, browserBuildPath):
     
    2122class OSXChromeCanaryDriver(OSXBrowserDriver):
    2223    bundleIdentifier = 'com.google.Chrome.canary'
     24    browser_name = 'chrome-canary'
    2325
    2426    def launchUrl(self, url, browserBuildPath):
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/osx_firefox_driver.py

    r185483 r185859  
    1414class OSXFirefoxDriver(OSXBrowserDriver):
    1515    bundleIdentifier = 'org.mozilla.firefox'
     16    browser_name = 'firefox'
    1617
    1718    def launchUrl(self, url, browserBuildPath):
     
    2122class OSXFirefoxNightlyDriver(OSXBrowserDriver):
    2223    bundleIdentifier = 'org.mozilla.nightly'
     24    browser_name = 'firefox-nightly'
    2325
    2426    def launchUrl(self, url, browserBuildPath):
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/osx_safari_driver.py

    r185785 r185859  
    1616class OSXSafariDriver(OSXBrowserDriver):
    1717    bundleIdentifier = 'com.apple.Safari'
     18    browser_name = 'safari'
    1819
    1920    def prepareEnv(self, deviceID):
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/generic_factory.py

    r185243 r185859  
    33import logging
    44import os
    5 
    6 from utils import loadModule, ModuleNotFoundError
    75
    86
     
    1513
    1614    @classmethod
    17     def iterateGetItem(cls, options, keys):
    18         ret = options
    19         for key in keys:
    20             try:
    21                 ret = ret.__getitem__(key)
    22             except KeyError:
    23                 raise
    24         return ret
     15    def create(cls, description):
     16        return cls.products[description]()
    2517
    2618    @classmethod
    27     def create(cls, descriptions):
    28         try:
    29             return loadModule(cls.iterateGetItem(cls.products, descriptions))()
    30         except Exception:
    31             raise
     19    def add(cls, description, product):
     20        cls.products[description] = product
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/__init__.py

    r183443 r185859  
    1212# allows different callers to choose different initialization code,
    1313# as necessary.
     14import os
     15import imp
     16
     17from webkitpy.benchmark_runner.utils import load_subclasses
     18from http_server_driver_factory import HTTPServerDriverFactory
     19
     20
     21def http_server_driver_loader(http_server_driver_class):
     22    if http_server_driver_class.name:
     23        HTTPServerDriverFactory.add(http_server_driver_class.name, http_server_driver_class)
     24
     25
     26load_subclasses(
     27    dirname=os.path.dirname(os.path.abspath(__file__)),
     28    base_class_name='HTTPServerDriver',
     29    loader=http_server_driver_loader)
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver.py

    r185732 r185859  
    55
    66class HTTPServerDriver(object):
     7    name = None
    78    @abstractmethod
    89    def serve(self, webRoot):
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver_factory.py

    r183309 r185859  
    66
    77from webkitpy.benchmark_runner.generic_factory import GenericFactory
    8 from webkitpy.benchmark_runner.utils import loadJSONFromFile
    9 
    10 
    11 driverFileName = 'http_server_drivers.json'
    128
    139
    1410class HTTPServerDriverFactory(GenericFactory):
    15 
    16     products = loadJSONFromFile(os.path.join(os.path.dirname(__file__), driverFileName))
     11    products = {}
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py

    r185244 r185859  
    1919    """This class depends on unix environment, need to be modified to achieve crossplatform compability
    2020    """
     21    name = 'SimpleHTTPServerDriver'
    2122
    2223    def __init__(self):
  • trunk/Tools/Scripts/webkitpy/benchmark_runner/utils.py

    r185732 r185859  
    11#!/usr/bin/env python
    22
    3 import json
     3import imp
     4import inspect
    45import logging
    56import os
    67import signal
    78import shutil
     9import sys
    810
    911
     
    1113
    1214
    13 class ModuleNotFoundError(Exception):
    14     pass
     15# Borrow following code from stackoverflow
     16# Link: http://stackoverflow.com/questions/11461356/issubclass-returns-flase-on-the-same-class-imported-from-different-paths
     17def is_subclass(child, parent_name):
     18    return inspect.isclass(child) and parent_name in [cls.__name__ for cls in inspect.getmro(child)]
    1519
    1620
    17 def loadModule(moduleDesc):
    18     try:
    19         ret = getattr(__import__(moduleDesc['filePath'], globals(), locals(), moduleDesc['moduleName'], -1), moduleDesc['moduleName'])
    20         return ret
    21     except Exception as error:
    22         raise ModuleNotFoundError('Error loading module (%s) with path(%s): {%s}' % (moduleDesc['moduleName'], moduleDesc['filePath'], error))
     21def load_subclasses(dirname, base_class_name, loader):
     22    for filename in os.listdir(dirname):
     23        if not filename.endswith('.py') or filename in ['__init__.py']:
     24            continue
     25        module_name = filename[:-3]
     26        module = imp.load_source(module_name, os.path.join(dirname, filename))
     27        for item_name in dir(module):
     28            item = getattr(module, item_name)
     29            if is_subclass(item, base_class_name):
     30                loader(item)
    2331
    2432
     
    2836    # and return an absolute path
    2937    return os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), relativePathToProjectRoot))
    30 
    31 
    32 def loadJSONFromFile(filePath):
    33     try:
    34         jsonObject = json.load(open(filePath, 'r'))
    35         assert(jsonObject)
    36         return jsonObject
    37     except Exception as error:
    38         raise Exception("Invalid json format or empty json was found in %s - Error: %s" % (filePath, error))
    3938
    4039
Note: See TracChangeset for help on using the changeset viewer.