Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1120)

Unified Diff: third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py

Issue 2633933002: Directly use TestImporter in DepsUpdater instead of invoking script. (Closed)
Patch Set: imported -> external Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
index d2a67bc7a17ffe2fbee16fcdedb7b50e4abc04c9..d7e0e43df2c12899996bb29c10476cf7babbc680 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
@@ -25,125 +25,43 @@
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
-"""This script imports a directory of W3C tests into Blink.
-
-This script takes a source repository directory, which it searches for files,
-then converts and copies files over to a destination directory.
-
-Rules for importing:
-
- * By default, only reference tests and JS tests are imported, (because pixel
- tests take longer to run). This can be overridden with the --all flag.
-
- * By default, if test files by the same name already exist in the destination
- directory, they are overwritten. This is because this script is used to
- refresh files periodically. This can be overridden with the --no-overwrite flag.
-
- * All files are converted to work in Blink:
- 1. All CSS properties requiring the -webkit- vendor prefix are prefixed
- (the list of what needs prefixes is read from Source/core/css/CSSProperties.in).
- 2. Each reftest has its own copy of its reference file following
- the naming conventions new-run-webkit-tests expects.
- 3. If a reference files lives outside the directory of the test that
- uses it, it is checked for paths to support files as it will be
- imported into a different relative position to the test file
- (in the same directory).
- 4. Any tags with the class "instructions" have style="display:none" added
- to them. Some w3c tests contain instructions to manual testers which we
- want to strip out (the test result parser only recognizes pure testharness.js
- output and not those instructions).
-
- * Upon completion, script outputs the total number tests imported,
- broken down by test type.
-
- * Also upon completion, if we are not importing the files in place, each
- directory where files are imported will have a w3c-import.log file written with
- a timestamp, the list of CSS properties used that require prefixes, the list
- of imported files, and guidance for future test modification and maintenance.
- On subsequent imports, this file is read to determine if files have been
- removed in the newer changesets. The script removes these files accordingly.
+"""Logic for converting and copying files from a W3C repo.
+
+This module is responsible for modifying and copying a subset of the tests from
+a local W3C repository source directory into a destination directory.
"""
import logging
import mimetypes
-import re
-import optparse
import os
-import sys
+import re
-from webkitpy.common.host import Host
from webkitpy.common.webkit_finder import WebKitFinder
from webkitpy.layout_tests.models.test_expectations import TestExpectationParser
from webkitpy.w3c.test_parser import TestParser
from webkitpy.w3c.test_converter import convert_for_webkit
-
# Maximum length of import path starting from top of source repository.
# This limit is here because the Windows builders cannot create paths that are
# longer than the Windows max path length (260). See http://crbug.com/609871.
MAX_PATH_LENGTH = 125
-
_log = logging.getLogger(__name__)
-def main(_argv, _stdout, _stderr):
- options, args = parse_args()
- host = Host()
- source_repo_path = host.filesystem.normpath(os.path.abspath(args[0]))
-
- if not host.filesystem.exists(source_repo_path):
- sys.exit('Repository directory %s not found!' % source_repo_path)
-
- configure_logging()
- test_importer = TestImporter(host, source_repo_path, options)
- test_importer.do_import()
-
-
-def configure_logging():
- class LogHandler(logging.StreamHandler):
-
- def format(self, record):
- if record.levelno > logging.INFO:
- return "%s: %s" % (record.levelname, record.getMessage())
- return record.getMessage()
-
- logger = logging.getLogger()
- logger.setLevel(logging.INFO)
- handler = LogHandler()
- handler.setLevel(logging.INFO)
- logger.addHandler(handler)
- return handler
-
-
-def parse_args():
- parser = optparse.OptionParser(usage='usage: %prog [options] source_repo_path')
- parser.add_option('-n', '--no-overwrite', dest='overwrite', action='store_false', default=True,
- help=('Flag to prevent duplicate test files from overwriting existing tests. '
- 'By default, they will be overwritten.'))
- parser.add_option('-a', '--all', action='store_true', default=False,
- help=('Import all tests including reftests, JS tests, and manual/pixel tests. '
- 'By default, only reftests and JS tests are imported.'))
- parser.add_option('-d', '--dest-dir', dest='destination', default='w3c',
- help=('Import into a specified directory relative to the LayoutTests root. '
- 'By default, files are imported under LayoutTests/w3c.'))
- parser.add_option('--ignore-expectations', action='store_true', default=False,
- help='Ignore the W3CImportExpectations file and import everything.')
- parser.add_option('--dry-run', action='store_true', default=False,
- help='Dry run only (don\'t actually write any results).')
-
- options, args = parser.parse_args()
- if len(args) != 1:
- parser.error('Incorrect number of arguments; source repo path is required.')
- return options, args
-
-
class TestImporter(object):
- def __init__(self, host, source_repo_path, options):
+ def __init__(self, host, source_repo_path, dest_dir_name='external'):
+ """Initializes variables to prepare for copying and converting files.
+
+ Args:
+ source_repo_path: Path to the local checkout of a WPT
+ """
self.host = host
+
+ assert self.host.filesystem.exists(source_repo_path)
self.source_repo_path = source_repo_path
- self.options = options
+ self.dest_dir_name = dest_dir_name
self.filesystem = self.host.filesystem
self.webkit_finder = WebKitFinder(self.filesystem)
@@ -152,7 +70,7 @@ class TestImporter(object):
self.destination_directory = self.filesystem.normpath(
self.filesystem.join(
self.layout_tests_dir,
- options.destination,
+ dest_dir_name,
self.filesystem.basename(self.source_repo_path)))
self.import_in_place = (self.source_repo_path == self.destination_directory)
self.dir_above_repo = self.filesystem.dirname(self.source_repo_path)
@@ -197,12 +115,12 @@ class TestImporter(object):
dirs.remove(name)
for path in paths_to_skip:
- path_base = path.replace(self.options.destination + '/', '')
+ path_base = path.replace(self.dest_dir_name + '/', '')
path_base = path_base.replace(cur_dir, '')
path_full = self.filesystem.join(root, path_base)
if path_base in dirs:
dirs.remove(path_base)
- if not self.options.dry_run and self.import_in_place:
+ if self.import_in_place:
_log.info(" pruning %s", path_base)
self.filesystem.rmtree(path_full)
else:
@@ -215,7 +133,7 @@ class TestImporter(object):
path_base = path_full.replace(self.source_repo_path + '/', '')
path_base = self.destination_directory.replace(self.layout_tests_dir + '/', '') + '/' + path_base
if path_base in paths_to_skip:
- if not self.options.dry_run and self.import_in_place:
+ if self.import_in_place:
_log.info(" pruning %s", path_base)
self.filesystem.remove(path_full)
continue
@@ -291,19 +209,12 @@ class TestImporter(object):
total_tests += 1
copy_list.append({'src': fullpath, 'dest': filename, 'is_jstest': True})
- elif self.options.all:
- total_tests += 1
- copy_list.append({'src': fullpath, 'dest': filename})
-
if copy_list:
# Only add this directory to the list if there's something to import
self.import_list.append({'dirname': root, 'copy_list': copy_list,
'reftests': reftests, 'jstests': jstests, 'total_tests': total_tests})
def find_paths_to_skip(self):
- if self.options.ignore_expectations:
- return set()
-
paths_to_skip = set()
port = self.host.port_factory.get()
w3c_import_expectations_path = self.webkit_finder.path_from_webkit_base('LayoutTests', 'W3CImportExpectations')
@@ -387,23 +298,17 @@ class TestImporter(object):
_log.error('%s not found. Possible error in the test.', source_path)
return None
- if file_to_copy.get('reference_support_info'):
- reference_support_info = file_to_copy['reference_support_info']
- else:
- reference_support_info = None
+ reference_support_info = file_to_copy.get('reference_support_info') or None
if not self.filesystem.exists(self.filesystem.dirname(dest_path)):
- if not self.import_in_place and not self.options.dry_run:
+ if not self.import_in_place:
self.filesystem.maybe_make_directory(self.filesystem.dirname(dest_path))
relpath = self.filesystem.relpath(dest_path, self.layout_tests_dir)
- if not self.options.overwrite and self.filesystem.exists(dest_path):
- _log.info(' skipping %s', relpath)
- else:
- # FIXME: Maybe doing a file diff is in order here for existing files?
- # In other words, there's no sense in overwriting identical files, but
- # there's no harm in copying the identical thing.
- _log.info(' %s', relpath)
+ # FIXME: Maybe doing a file diff is in order here for existing files?
+ # In other words, there's no sense in overwriting identical files, but
+ # there's no harm in copying the identical thing.
+ _log.info(' %s', relpath)
if self.should_try_to_convert(file_to_copy, source_path, dest_dir):
converted_file = convert_for_webkit(
@@ -414,10 +319,9 @@ class TestImporter(object):
self._prefixed_properties.setdefault(prefixed_property, 0)
self._prefixed_properties[prefixed_property] += 1
- if not self.options.dry_run:
- self.filesystem.write_text_file(dest_path, converted_file[1])
+ self.filesystem.write_text_file(dest_path, converted_file[1])
else:
- if not self.import_in_place and not self.options.dry_run:
+ if not self.import_in_place:
self.filesystem.copyfile(source_path, dest_path)
if self.filesystem.read_binary_file(source_path)[:2] == '#!':
self.filesystem.make_executable(dest_path)

Powered by Google App Engine
This is Rietveld 408576698