summaryrefslogtreecommitdiff
path: root/Tools/Scripts/webkitpy/w3c/test_parser.py
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@digia.com>2013-09-13 12:51:20 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-19 20:50:05 +0200
commitd441d6f39bb846989d95bcf5caf387b42414718d (patch)
treee367e64a75991c554930278175d403c072de6bb8 /Tools/Scripts/webkitpy/w3c/test_parser.py
parent0060b2994c07842f4c59de64b5e3e430525c4b90 (diff)
downloadqtwebkit-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.py162
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