diff options
author | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2013-09-13 12:51:20 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 20:50:05 +0200 |
commit | d441d6f39bb846989d95bcf5caf387b42414718d (patch) | |
tree | e367e64a75991c554930278175d403c072de6bb8 /Tools/Scripts/webkitpy/w3c/test_parser.py | |
parent | 0060b2994c07842f4c59de64b5e3e430525c4b90 (diff) | |
download | qtwebkit-d441d6f39bb846989d95bcf5caf387b42414718d.tar.gz |
Import Qt5x2 branch of QtWebkit for Qt 5.2
Importing a new snapshot of webkit.
Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'Tools/Scripts/webkitpy/w3c/test_parser.py')
-rw-r--r-- | Tools/Scripts/webkitpy/w3c/test_parser.py | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/Tools/Scripts/webkitpy/w3c/test_parser.py b/Tools/Scripts/webkitpy/w3c/test_parser.py new file mode 100644 index 000000000..bb66fdae6 --- /dev/null +++ b/Tools/Scripts/webkitpy/w3c/test_parser.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python + +# Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above +# copyright notice, this list of conditions and the following +# disclaimer. +# 2. Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials +# provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +import logging +import re + +from webkitpy.common.host import Host +from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup as Parser + + +_log = logging.getLogger(__name__) + + +class TestParser(object): + + def __init__(self, options, filename): + self.options = options + self.filename = filename + self.host = Host() + self.filesystem = self.host.filesystem + + self.test_doc = None + self.ref_doc = None + self.load_file(filename) + + def load_file(self, filename): + if self.filesystem.isfile(filename): + try: + self.test_doc = Parser(self.filesystem.read_binary_file(filename)) + except: + # FIXME: Figure out what to do if we can't parse the file. + _log.error("Failed to parse %s", filename) + self.test_doc is None + else: + if self.filesystem.isdir(filename): + # FIXME: Figure out what is triggering this and what to do about it. + _log.error("Trying to load %s, which is a directory", filename) + self.test_doc = None + self.ref_doc = None + + def analyze_test(self, test_contents=None, ref_contents=None): + """ Analyzes a file to determine if it's a test, what type of test, and what reference or support files it requires. Returns all of the test info """ + + test_info = None + + if test_contents is None and self.test_doc is None: + return test_info + + if test_contents is not None: + self.test_doc = Parser(test_contents) + + if ref_contents is not None: + self.ref_doc = Parser(ref_contents) + + # First check if it's a reftest + + matches = self.reference_links_of_type('match') + self.reference_links_of_type('mismatch') + if matches: + if len(matches) > 1: + # FIXME: Is this actually true? We should fix this. + _log.warning('Multiple references are not supported. Importing the first ref defined in %s', + self.filesystem.basename(self.filename)) + + try: + ref_file = self.filesystem.join(self.filesystem.dirname(self.filename), matches[0]['href']) + except KeyError as e: + # FIXME: Figure out what to do w/ invalid test files. + _log.error('%s has a reference link but is missing the "href"', self.filesystem) + return None + + if self.ref_doc is None: + self.ref_doc = self.load_file(ref_file) + + test_info = {'test': self.filename, 'reference': ref_file} + + # If the ref file path is relative, we need to check it for + # relative paths also because when it lands in WebKit, it will be + # moved down into the test dir. + # + # Note: The test files themselves are not checked for support files + # outside their directories as the convention in the CSSWG is to + # put all support files in the same dir or subdir as the test. + # + # All non-test files in the test's directory tree are normally + # copied as part of the import as they are assumed to be required + # support files. + # + # *But*, there is exactly one case in the entire css2.1 suite where + # a test depends on a file that lives in a different directory, + # which depends on another file that lives outside of its + # directory. This code covers that case :) + if matches[0]['href'].startswith('..'): + support_files = self.support_files(self.ref_doc) + test_info['refsupport'] = support_files + + elif self.is_jstest(): + test_info = {'test': self.filename, 'jstest': True} + elif self.options['all'] is True and not('-ref' in self.filename) and not('reference' in self.filename): + test_info = {'test': self.filename} + + return test_info + + def reference_links_of_type(self, reftest_type): + return self.test_doc.findAll(rel=reftest_type) + + def is_jstest(self): + """Returns whether the file appears to be a jstest, by searching for usage of W3C-style testharness paths.""" + return bool(self.test_doc.find(src=re.compile('[\'\"/]?/resources/testharness'))) + + def support_files(self, doc): + """ Searches the file for all paths specified in url()'s, href or src attributes.""" + support_files = [] + + if doc is None: + return support_files + + elements_with_src_attributes = doc.findAll(src=re.compile('.*')) + elements_with_href_attributes = doc.findAll(href=re.compile('.*')) + + url_pattern = re.compile('url\(.*\)') + urls = [] + for url in doc.findAll(text=url_pattern): + url = re.search(url_pattern, url) + url = re.sub('url\([\'\"]?', '', url.group(0)) + url = re.sub('[\'\"]?\)', '', url) + urls.append(url) + + src_paths = [src_tag['src'] for src_tag in elements_with_src_attributes] + href_paths = [href_tag['href'] for href_tag in elements_with_href_attributes] + + paths = src_paths + href_paths + urls + for path in paths: + if not(path.startswith('http:')) and not(path.startswith('mailto:')): + support_files.append(path) + + return support_files |