| Index: chrome/test/webdriver/test/run_webdriver_tests.py
|
| diff --git a/chrome/test/webdriver/test/run_webdriver_tests.py b/chrome/test/webdriver/test/run_webdriver_tests.py
|
| deleted file mode 100755
|
| index e930a27cc8f47262806c04fda1f8f1085c59d8df..0000000000000000000000000000000000000000
|
| --- a/chrome/test/webdriver/test/run_webdriver_tests.py
|
| +++ /dev/null
|
| @@ -1,279 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -import logging
|
| -import optparse
|
| -import os
|
| -import sys
|
| -import types
|
| -import unittest
|
| -
|
| -sys.path.insert(0, os.path.join(
|
| - os.path.dirname(__file__), os.pardir, os.pardir, 'pylib'))
|
| -
|
| -from chromedriver_launcher import ChromeDriverLauncher
|
| -from common import unittest_util
|
| -import test_paths
|
| -
|
| -# Add the PYTHON_BINDINGS first so that our 'test' module is found instead of
|
| -# Python's.
|
| -sys.path = [test_paths.PYTHON_BINDINGS] + sys.path
|
| -
|
| -from selenium.webdriver.remote.webdriver import WebDriver
|
| -
|
| -
|
| -# Implementation inspired from unittest.main()
|
| -class Main(object):
|
| - """Main program for running WebDriver tests."""
|
| -
|
| - _options, _args = None, None
|
| - TESTS_FILENAME = 'WEBDRIVER_TESTS'
|
| - _platform_map = {
|
| - 'win32': 'win',
|
| - 'darwin': 'mac',
|
| - 'linux2': 'linux',
|
| - 'linux3': 'linux',
|
| - }
|
| - TEST_PREFIX = 'selenium.test.selenium.webdriver.common.'
|
| -
|
| - def __init__(self):
|
| - self._ParseArgs()
|
| - self._Run()
|
| -
|
| - def _ParseArgs(self):
|
| - """Parse command line args."""
|
| - parser = optparse.OptionParser()
|
| - parser.add_option(
|
| - '-v', '--verbose', action='store_true', default=False,
|
| - help='Output verbosely.')
|
| - parser.add_option(
|
| - '', '--log-file', type='string', default=None,
|
| - help='Provide a path to a file to which the logger will log')
|
| - parser.add_option(
|
| - '', '--filter', type='string', default='*',
|
| - help='Filter for specifying what tests to run, google test style.')
|
| - parser.add_option(
|
| - '', '--driver-exe', type='string', default=None,
|
| - help='Path to the default ChromeDriver executable to use.')
|
| - parser.add_option(
|
| - '', '--chrome-exe', type='string', default=None,
|
| - help='Path to the default Chrome executable to use.')
|
| - parser.add_option(
|
| - '', '--list', action='store_true', default=False,
|
| - help='List tests instead of running them.')
|
| -
|
| - self._options, self._args = parser.parse_args()
|
| -
|
| - # Setup logging - start with defaults
|
| - level = logging.WARNING
|
| - format = None
|
| -
|
| - if self._options.verbose:
|
| - level=logging.DEBUG
|
| - format='%(asctime)s %(levelname)-8s %(message)s'
|
| -
|
| - logging.basicConfig(level=level, format=format,
|
| - filename=self._options.log_file)
|
| -
|
| - @staticmethod
|
| - def _IsTestClass(obj):
|
| - """Returns whether |obj| is a unittest.TestCase."""
|
| - return isinstance(obj, (type, types.ClassType)) and \
|
| - issubclass(obj, unittest.TestCase)
|
| -
|
| - @staticmethod
|
| - def _GetModuleFromName(test_name):
|
| - """Return the module from the given test name.
|
| -
|
| - Args:
|
| - test_name: dot-separated string for a module, a test case or a test
|
| - method
|
| - Examples: omnibox (a module)
|
| - omnibox.OmniboxTest (a test case)
|
| - omnibox.OmniboxTest.testA (a test method)
|
| -
|
| - Returns:
|
| - tuple with first item corresponding to the module and second item
|
| - corresponding to the parts of the name that did not specify the module
|
| - Example: _GetModuleFromName('my_module.MyClass.testThis') returns
|
| - (my_module, ['MyClass', 'testThis'])
|
| - """
|
| - parts = test_name.split('.')
|
| - parts_copy = parts[:]
|
| - while parts_copy:
|
| - try:
|
| - module = __import__('.'.join(parts_copy))
|
| - break
|
| - except ImportError:
|
| - del parts_copy[-1]
|
| - if not parts_copy: raise
|
| -
|
| - for comp in parts[1:]:
|
| - if type(getattr(module, comp)) is not types.ModuleType:
|
| - break
|
| - module = getattr(module, comp)
|
| - return (module, parts[len(parts_copy):])
|
| -
|
| - @staticmethod
|
| - def _GetTestsFromName(name):
|
| - """Get a list of all test names from the given string.
|
| -
|
| - Args:
|
| - name: dot-separated string for a module, a test case or a test method.
|
| - Examples: omnibox (a module)
|
| - omnibox.OmniboxTest (a test case)
|
| - omnibox.OmniboxTest.testA (a test method)
|
| -
|
| - Returns:
|
| - [omnibox.OmniboxTest.testA, omnibox.OmniboxTest.testB, ...]
|
| - """
|
| - def _GetTestsFromTestCase(class_obj):
|
| - """Return all test method names from given class object."""
|
| - return [class_obj.__name__ + '.' + x for x in dir(class_obj) if
|
| - x.startswith('test') and
|
| - not hasattr(getattr(class_obj, x), 'should_skip')]
|
| -
|
| - def _GetTestsFromModule(module):
|
| - """Return all test method names from the given module object."""
|
| - tests = []
|
| - for name in dir(module):
|
| - obj = getattr(module, name)
|
| - if Main._IsTestClass(obj):
|
| - tests.extend([module.__name__ + '.' + x for x in
|
| - _GetTestsFromTestCase(obj)])
|
| - return tests
|
| - (obj, parts) = Main._GetModuleFromName(name)
|
| - for comp in parts:
|
| - obj = getattr(obj, comp)
|
| -
|
| - if type(obj) == types.ModuleType:
|
| - return _GetTestsFromModule(obj)
|
| - elif Main._IsTestClass(obj):
|
| - return [module.__name__ + '.' + x for x in _GetTestsFromTestCase(obj)]
|
| - elif type(obj) == types.UnboundMethodType:
|
| - return [name]
|
| - else:
|
| - logging.warn('No tests in "%s"' % name)
|
| - return []
|
| -
|
| - @staticmethod
|
| - def _EvalDataFrom(filename):
|
| - """Return eval of python code from given file.
|
| -
|
| - The datastructure used in the file will be preserved.
|
| - """
|
| - data_file = os.path.join(filename)
|
| - contents = open(data_file).read()
|
| - try:
|
| - ret = eval(contents, {'__builtins__': None}, None)
|
| - except:
|
| - print >>sys.stderr, '%s is an invalid data file.' % data_file
|
| - raise
|
| - return ret
|
| -
|
| - def _GetTestNamesFrom(self, filename):
|
| - modules = self._EvalDataFrom(filename)
|
| - all_names = modules.get('all', []) + \
|
| - modules.get(self._platform_map[sys.platform], [])
|
| - args = []
|
| - excluded = []
|
| - # Find all excluded tests. Excluded tests begin with '-'.
|
| - for name in all_names:
|
| - if name.startswith('-'): # Exclude
|
| - excluded.extend(self._GetTestsFromName(self.TEST_PREFIX + name[1:]))
|
| - else:
|
| - args.extend(self._GetTestsFromName(self.TEST_PREFIX + name))
|
| - for name in excluded:
|
| - args.remove(name)
|
| - if excluded:
|
| - logging.debug('Excluded %d test(s): %s' % (len(excluded), excluded))
|
| - return args
|
| -
|
| - def _FakePytestHack(self):
|
| - """Adds a fake 'pytest' module to the system modules.
|
| -
|
| - A single test in text_handling_tests.py depends on the pytest module for
|
| - its test skipping capabilities. Without pytest, we can not run any tests
|
| - in the text_handling_tests.py module.
|
| -
|
| - We are not sure we want to add pytest to chrome's third party dependencies,
|
| - so for now create a fake pytest module so that we can at least import and
|
| - run all the tests that do not depend on it. Those depending on it are
|
| - disabled.
|
| - """
|
| - def skip(func):
|
| - func.should_skip = True
|
| - return func
|
| -
|
| - import imp
|
| - sys.modules['pytest'] = imp.new_module('pytest')
|
| - sys.modules['pytest'].mark = imp.new_module('mark')
|
| - sys.modules['pytest'].mark.ignore_chrome = skip
|
| - sys.modules['pytest'].mark.ignore_opera = lambda x: x
|
| -
|
| - def _Run(self):
|
| - """Run the tests."""
|
| - # TODO(kkania): Remove this hack.
|
| - self._FakePytestHack()
|
| -
|
| - # In the webdriver tree, the python 'test' module is moved under the root
|
| - # 'selenium' one for testing. Here we mimic that by setting the 'selenium'
|
| - # module's 'test' attribute and adding 'selenium.test' to the system
|
| - # modules.
|
| - import selenium
|
| - import test
|
| - selenium.test = test
|
| - sys.modules['selenium.test'] = test
|
| -
|
| - # Load and decide which tests to run.
|
| - test_names = self._GetTestNamesFrom(
|
| - os.path.join(os.path.dirname(__file__), self.TESTS_FILENAME))
|
| - all_tests_suite = unittest.defaultTestLoader.loadTestsFromNames(test_names)
|
| - filtered_suite = unittest_util.FilterTestSuite(
|
| - all_tests_suite, self._options.filter)
|
| -
|
| - if self._options.list is True:
|
| - print '\n'.join(unittest_util.GetTestNamesFromSuite(filtered_suite))
|
| - sys.exit(0)
|
| -
|
| - # The tests expect to run with preset 'driver' and 'webserver' class
|
| - # properties.
|
| - driver_exe = self._options.driver_exe or test_paths.CHROMEDRIVER_EXE
|
| - chrome_exe = self._options.chrome_exe or test_paths.CHROME_EXE
|
| - if driver_exe is None or not os.path.exists(os.path.expanduser(driver_exe)):
|
| - raise RuntimeError('ChromeDriver could not be found')
|
| - if chrome_exe is None or not os.path.exists(os.path.expanduser(chrome_exe)):
|
| - raise RuntimeError('Chrome could not be found')
|
| - driver_exe = os.path.expanduser(driver_exe)
|
| - chrome_exe = os.path.expanduser(chrome_exe)
|
| - # Increase number of http client threads to 10 to prevent hangs.
|
| - # The hang seems to occur because Chrome keeps too many multiple
|
| - # simultaneous connections open to our webserver.
|
| - server = ChromeDriverLauncher(
|
| - os.path.expanduser(driver_exe), test_paths.WEBDRIVER_TEST_DATA,
|
| - http_threads=10).Launch()
|
| - driver = WebDriver(server.GetUrl(),
|
| - {'chrome.binary': os.path.expanduser(chrome_exe)})
|
| - # The tests expect a webserver. Since ChromeDriver also operates as one,
|
| - # just pass this dummy class with the right info.
|
| - class DummyWebserver:
|
| - pass
|
| - webserver = DummyWebserver()
|
| - webserver.port = server.GetPort()
|
| - for test in unittest_util.GetTestsFromSuite(filtered_suite):
|
| - test.__class__.driver = driver
|
| - test.__class__.webserver = webserver
|
| -
|
| - verbosity = 1
|
| - if self._options.verbose:
|
| - verbosity = 2
|
| - result = unittest_util.TextTestRunner(verbosity=verbosity).run(
|
| - filtered_suite)
|
| - server.Kill()
|
| - sys.exit(not result.wasSuccessful())
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - Main()
|
|
|