OLD | NEW |
1 # Copyright (C) 2010 Google Inc. All rights reserved. | 1 # Copyright (C) 2010 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 from webkitpy.layout_tests.layout_package.bot_test_expectations import BotTestEx
pectationsFactory | 50 from webkitpy.layout_tests.layout_package.bot_test_expectations import BotTestEx
pectationsFactory |
51 from webkitpy.layout_tests.models import test_run_results | 51 from webkitpy.layout_tests.models import test_run_results |
52 from webkitpy.layout_tests.models.test_configuration import TestConfiguration | 52 from webkitpy.layout_tests.models.test_configuration import TestConfiguration |
53 from webkitpy.layout_tests.models.test_expectations import SKIP | 53 from webkitpy.layout_tests.models.test_expectations import SKIP |
54 from webkitpy.layout_tests.port import driver | 54 from webkitpy.layout_tests.port import driver |
55 from webkitpy.layout_tests.port import server_process | 55 from webkitpy.layout_tests.port import server_process |
56 from webkitpy.layout_tests.port.factory import PortFactory | 56 from webkitpy.layout_tests.port.factory import PortFactory |
57 from webkitpy.layout_tests.servers import apache_http | 57 from webkitpy.layout_tests.servers import apache_http |
58 from webkitpy.layout_tests.servers import pywebsocket | 58 from webkitpy.layout_tests.servers import pywebsocket |
59 from webkitpy.layout_tests.servers import wptserve | 59 from webkitpy.layout_tests.servers import wptserve |
| 60 from webkitpy.w3c.wpt_manifest import WPTManifest |
60 | 61 |
61 _log = logging.getLogger(__name__) | 62 _log = logging.getLogger(__name__) |
62 | 63 |
63 | 64 |
64 # FIXME: This class should merge with WebKitPort now that Chromium behaves mostl
y like other webkit ports. | 65 # FIXME: This class should merge with WebKitPort now that Chromium behaves mostl
y like other webkit ports. |
65 class Port(object): | 66 class Port(object): |
66 """Abstract class for Port-specific hooks for the layout_test package.""" | 67 """Abstract class for Port-specific hooks for the layout_test package.""" |
67 | 68 |
68 # Subclasses override this. This should indicate the basic implementation | 69 # Subclasses override this. This should indicate the basic implementation |
69 # part of the port name, e.g., 'mac', 'win', 'gtk'; there is probably (?) | 70 # part of the port name, e.g., 'mac', 'win', 'gtk'; there is probably (?) |
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 if self._filesystem.exists(path): | 662 if self._filesystem.exists(path): |
662 reftest_list.append((expectation, path)) | 663 reftest_list.append((expectation, path)) |
663 if reftest_list: | 664 if reftest_list: |
664 return reftest_list | 665 return reftest_list |
665 | 666 |
666 # Try to extract information from MANIFEST.json. | 667 # Try to extract information from MANIFEST.json. |
667 match = re.match(r'external/wpt/(.*)', test_name) | 668 match = re.match(r'external/wpt/(.*)', test_name) |
668 if not match: | 669 if not match: |
669 return [] | 670 return [] |
670 path_in_wpt = match.group(1) | 671 path_in_wpt = match.group(1) |
671 all_items = self._wpt_manifest()['items'] | 672 for expectation, ref_path_in_wpt in self._wpt_manifest().extract_referen
ce_list(path_in_wpt): |
672 if path_in_wpt not in all_items['reftest']: | 673 ref_absolute_path = self._filesystem.join(self.layout_tests_dir(), '
external/wpt' + ref_path_in_wpt) |
673 return [] | 674 reftest_list.append((expectation, ref_absolute_path)) |
674 for item in all_items['reftest'][path_in_wpt]: | |
675 for ref_path_in_wpt, expectation in item[1]: | |
676 ref_absolute_path = self._filesystem.join(self.layout_tests_dir(
), 'external/wpt' + ref_path_in_wpt) | |
677 reftest_list.append((expectation, ref_absolute_path)) | |
678 return reftest_list | 675 return reftest_list |
679 | 676 |
680 def tests(self, paths): | 677 def tests(self, paths): |
681 """Return the list of tests found matching paths.""" | 678 """Return the list of tests found matching paths.""" |
682 tests = self.real_tests(paths) | 679 tests = self.real_tests(paths) |
683 | 680 |
684 suites = self.virtual_test_suites() | 681 suites = self.virtual_test_suites() |
685 if paths: | 682 if paths: |
686 tests.extend(self._virtual_tests_matching_paths(paths, suites)) | 683 tests.extend(self._virtual_tests_matching_paths(paths, suites)) |
687 else: | 684 else: |
(...skipping 28 matching lines...) Expand all Loading... |
716 extension = filesystem.splitext(filename)[1] | 713 extension = filesystem.splitext(filename)[1] |
717 return extension in Port._supported_file_extensions | 714 return extension in Port._supported_file_extensions |
718 | 715 |
719 def is_test_file(self, filesystem, dirname, filename): | 716 def is_test_file(self, filesystem, dirname, filename): |
720 match = re.search(r'[/\\]external[/\\]wpt([/\\].*)?$', dirname) | 717 match = re.search(r'[/\\]external[/\\]wpt([/\\].*)?$', dirname) |
721 if match: | 718 if match: |
722 if match.group(1): | 719 if match.group(1): |
723 path_in_wpt = match.group(1)[1:].replace('\\', '/') + '/' + file
name | 720 path_in_wpt = match.group(1)[1:].replace('\\', '/') + '/' + file
name |
724 else: | 721 else: |
725 path_in_wpt = filename | 722 path_in_wpt = filename |
726 return self._manifest_items_for_path(path_in_wpt) is not None | 723 return self._wpt_manifest().is_test_file(path_in_wpt) |
727 if 'inspector-unit' in dirname: | 724 if 'inspector-unit' in dirname: |
728 return filesystem.splitext(filename)[1] == '.js' | 725 return filesystem.splitext(filename)[1] == '.js' |
729 return Port._has_supported_extension( | 726 return Port._has_supported_extension( |
730 filesystem, filename) and not Port.is_reference_html_file(filesystem
, dirname, filename) | 727 filesystem, filename) and not Port.is_reference_html_file(filesystem
, dirname, filename) |
731 | 728 |
732 def _convert_wpt_file_paths_to_url_paths(self, files): | 729 def _convert_wpt_file_paths_to_url_paths(self, files): |
733 tests = [] | 730 tests = [] |
734 for file_path in files: | 731 for file_path in files: |
735 # Path separators are normalized by relative_test_filename(). | 732 # Path separators are normalized by relative_test_filename(). |
736 match = re.search(r'external/wpt/(.*)$', file_path) | 733 match = re.search(r'external/wpt/(.*)$', file_path) |
737 if not match: | 734 if not match: |
738 tests.append(file_path) | 735 tests.append(file_path) |
739 continue | 736 continue |
740 path_in_wpt = match.group(1) | 737 urls = self._wpt_manifest().file_path_to_url_paths(match.group(1)) |
741 manifest_items = self._manifest_items_for_path(path_in_wpt) | 738 for url in urls: |
742 assert manifest_items is not None | 739 tests.append(file_path[0:match.start(1)] + url) |
743 if len(manifest_items) != 1: | |
744 continue | |
745 url = manifest_items[0][0] | |
746 if url[1:] != path_in_wpt: | |
747 # TODO(tkent): foo.any.js and bar.worker.js should be accessed | |
748 # as foo.any.html, foo.any.worker, and bar.worker with WPTServe. | |
749 continue | |
750 tests.append(file_path) | |
751 return tests | 740 return tests |
752 | 741 |
753 @memoized | 742 @memoized |
754 def _wpt_manifest(self): | 743 def _wpt_manifest(self): |
755 path = self._filesystem.join(self.layout_tests_dir(), 'external', 'wpt',
'MANIFEST.json') | 744 manifest_path = self._filesystem.join(self.layout_tests_dir(), 'external
', 'wpt', 'MANIFEST.json') |
756 return json.loads(self._filesystem.read_text_file(path)) | 745 return WPTManifest(self._filesystem.read_text_file(manifest_path)) |
757 | |
758 def _manifest_items_for_path(self, path_in_wpt): | |
759 """Returns a manifest item for the given WPT path, or None if not found. | |
760 | |
761 The format of a manifest item depends on | |
762 https://github.com/w3c/wpt-tools/blob/master/manifest/item.py | |
763 and is assumed to be a list of the format [url, extras], | |
764 or [url, references, extras] for reftests, or None if not found. | |
765 | |
766 For most testharness tests, the returned manifest_items is expected | |
767 to look like this:: [["/some/test/path.html", {}]] | |
768 """ | |
769 items = self._wpt_manifest()['items'] | |
770 if path_in_wpt in items['manual']: | |
771 return items['manual'][path_in_wpt] | |
772 elif path_in_wpt in items['reftest']: | |
773 return items['reftest'][path_in_wpt] | |
774 elif path_in_wpt in items['testharness']: | |
775 return items['testharness'][path_in_wpt] | |
776 return None | |
777 | |
778 @staticmethod | |
779 def _get_extras_from_manifest_item(item): | |
780 return item[-1] | |
781 | 746 |
782 def is_slow_wpt_test(self, test_file): | 747 def is_slow_wpt_test(self, test_file): |
783 match = re.match(r'external/wpt/(.*)', test_file) | 748 match = re.match(r'external/wpt/(.*)', test_file) |
784 if not match: | 749 if not match: |
785 return False | 750 return False |
786 items = self._manifest_items_for_path(match.group(1)) | 751 return self._wpt_manifest().is_slow_test(match.group(1)) |
787 if not items: | |
788 return False | |
789 extras = Port._get_extras_from_manifest_item(items[0]) | |
790 return 'timeout' in extras and extras['timeout'] == 'long' | |
791 | 752 |
792 ALL_TEST_TYPES = ['audio', 'harness', 'pixel', 'ref', 'text', 'unknown'] | 753 ALL_TEST_TYPES = ['audio', 'harness', 'pixel', 'ref', 'text', 'unknown'] |
793 | 754 |
794 def test_type(self, test_name): | 755 def test_type(self, test_name): |
795 fs = self._filesystem | 756 fs = self._filesystem |
796 if fs.exists(self.expected_filename(test_name, '.png')): | 757 if fs.exists(self.expected_filename(test_name, '.png')): |
797 return 'pixel' | 758 return 'pixel' |
798 if fs.exists(self.expected_filename(test_name, '.wav')): | 759 if fs.exists(self.expected_filename(test_name, '.wav')): |
799 return 'audio' | 760 return 'audio' |
800 if self.reference_files(test_name): | 761 if self.reference_files(test_name): |
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1664 | 1625 |
1665 def __init__(self, base, args, reference_args=None): | 1626 def __init__(self, base, args, reference_args=None): |
1666 self.name = base | 1627 self.name = base |
1667 self.base = base | 1628 self.base = base |
1668 self.args = args | 1629 self.args = args |
1669 self.reference_args = args if reference_args is None else reference_args | 1630 self.reference_args = args if reference_args is None else reference_args |
1670 self.tests = set() | 1631 self.tests = set() |
1671 | 1632 |
1672 def __repr__(self): | 1633 def __repr__(self): |
1673 return "PhysicalTestSuite('%s', '%s', %s, %s)" % (self.name, self.base,
self.args, self.reference_args) | 1634 return "PhysicalTestSuite('%s', '%s', %s, %s)" % (self.name, self.base,
self.args, self.reference_args) |
OLD | NEW |