OLD | NEW |
1 # Copyright (C) 2012 Google Inc. All rights reserved. | 1 # Copyright (C) 2012 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 19 matching lines...) Expand all Loading... |
30 import logging | 30 import logging |
31 import re | 31 import re |
32 | 32 |
33 from webkitpy.layout_tests.models import test_expectations | 33 from webkitpy.layout_tests.models import test_expectations |
34 | 34 |
35 | 35 |
36 _log = logging.getLogger(__name__) | 36 _log = logging.getLogger(__name__) |
37 | 37 |
38 | 38 |
39 class LayoutTestFinder(object): | 39 class LayoutTestFinder(object): |
| 40 |
40 def __init__(self, port, options): | 41 def __init__(self, port, options): |
41 self._port = port | 42 self._port = port |
42 self._options = options | 43 self._options = options |
43 self._filesystem = self._port.host.filesystem | 44 self._filesystem = self._port.host.filesystem |
44 self.LAYOUT_TESTS_DIRECTORY = 'LayoutTests' | 45 self.LAYOUT_TESTS_DIRECTORY = 'LayoutTests' |
45 | 46 |
46 def find_tests(self, options, args): | 47 def find_tests(self, options, args): |
47 paths = self._strip_test_dir_prefixes(args) | 48 paths = self._strip_test_dir_prefixes(args) |
48 if options.test_list: | 49 if options.test_list: |
49 paths += self._strip_test_dir_prefixes(self._read_test_names_from_fi
le(options.test_list, self._port.TEST_PATH_SEPARATOR)) | 50 paths += self._strip_test_dir_prefixes( |
| 51 self._read_test_names_from_file( |
| 52 options.test_list, |
| 53 self._port.TEST_PATH_SEPARATOR)) |
50 test_files = self._port.tests(paths) | 54 test_files = self._port.tests(paths) |
51 return (paths, test_files) | 55 return (paths, test_files) |
52 | 56 |
53 def _strip_test_dir_prefixes(self, paths): | 57 def _strip_test_dir_prefixes(self, paths): |
54 return [self._strip_test_dir_prefix(path) for path in paths if path] | 58 return [self._strip_test_dir_prefix(path) for path in paths if path] |
55 | 59 |
56 def _strip_test_dir_prefix(self, path): | 60 def _strip_test_dir_prefix(self, path): |
57 # Handle both "LayoutTests/foo/bar.html" and "LayoutTests\foo\bar.html"
if | 61 # Handle both "LayoutTests/foo/bar.html" and "LayoutTests\foo\bar.html"
if |
58 # the filesystem uses '\\' as a directory separator. | 62 # the filesystem uses '\\' as a directory separator. |
59 if path.startswith(self.LAYOUT_TESTS_DIRECTORY + self._port.TEST_PATH_SE
PARATOR): | 63 if path.startswith(self.LAYOUT_TESTS_DIRECTORY + self._port.TEST_PATH_SE
PARATOR): |
60 return path[len(self.LAYOUT_TESTS_DIRECTORY + self._port.TEST_PATH_S
EPARATOR):] | 64 return path[len(self.LAYOUT_TESTS_DIRECTORY + self._port.TEST_PATH_S
EPARATOR):] |
61 if path.startswith(self.LAYOUT_TESTS_DIRECTORY + self._filesystem.sep): | 65 if path.startswith(self.LAYOUT_TESTS_DIRECTORY + self._filesystem.sep): |
62 return path[len(self.LAYOUT_TESTS_DIRECTORY + self._filesystem.sep):
] | 66 return path[len(self.LAYOUT_TESTS_DIRECTORY + self._filesystem.sep):
] |
63 return path | 67 return path |
64 | 68 |
65 def _read_test_names_from_file(self, filenames, test_path_separator): | 69 def _read_test_names_from_file(self, filenames, test_path_separator): |
66 fs = self._filesystem | 70 fs = self._filesystem |
67 tests = [] | 71 tests = [] |
68 for filename in filenames: | 72 for filename in filenames: |
69 try: | 73 try: |
70 if test_path_separator != fs.sep: | 74 if test_path_separator != fs.sep: |
71 filename = filename.replace(test_path_separator, fs.sep) | 75 filename = filename.replace(test_path_separator, fs.sep) |
72 file_contents = fs.read_text_file(filename).split('\n') | 76 file_contents = fs.read_text_file(filename).split('\n') |
73 for line in file_contents: | 77 for line in file_contents: |
74 line = self._strip_comments(line) | 78 line = self._strip_comments(line) |
75 if line: | 79 if line: |
76 tests.append(line) | 80 tests.append(line) |
77 except IOError, e: | 81 except IOError as e: |
78 if e.errno == errno.ENOENT: | 82 if e.errno == errno.ENOENT: |
79 _log.critical('') | 83 _log.critical('') |
80 _log.critical('--test-list file "%s" not found' % file) | 84 _log.critical('--test-list file "%s" not found' % file) |
81 raise | 85 raise |
82 return tests | 86 return tests |
83 | 87 |
84 @staticmethod | 88 @staticmethod |
85 def _strip_comments(line): | 89 def _strip_comments(line): |
86 commentIndex = line.find('//') | 90 commentIndex = line.find('//') |
87 if commentIndex is -1: | 91 if commentIndex is -1: |
(...skipping 25 matching lines...) Expand all Loading... |
113 | 117 |
114 def split_into_chunks(self, test_names): | 118 def split_into_chunks(self, test_names): |
115 """split into a list to run and a set to skip, based on --run-chunk and
--run-part.""" | 119 """split into a list to run and a set to skip, based on --run-chunk and
--run-part.""" |
116 if not self._options.run_chunk and not self._options.run_part: | 120 if not self._options.run_chunk and not self._options.run_part: |
117 return test_names, set() | 121 return test_names, set() |
118 | 122 |
119 # If the user specifies they just want to run a subset of the tests, | 123 # If the user specifies they just want to run a subset of the tests, |
120 # just grab a subset of the non-skipped tests. | 124 # just grab a subset of the non-skipped tests. |
121 chunk_value = self._options.run_chunk or self._options.run_part | 125 chunk_value = self._options.run_chunk or self._options.run_part |
122 try: | 126 try: |
123 (chunk_num, chunk_len) = chunk_value.split(":") | 127 (chunk_num, chunk_len) = chunk_value.split(':') |
124 chunk_num = int(chunk_num) | 128 chunk_num = int(chunk_num) |
125 assert(chunk_num >= 0) | 129 assert(chunk_num >= 0) |
126 test_size = int(chunk_len) | 130 test_size = int(chunk_len) |
127 assert(test_size > 0) | 131 assert(test_size > 0) |
128 except AssertionError: | 132 except AssertionError: |
129 _log.critical("invalid chunk '%s'" % chunk_value) | 133 _log.critical("invalid chunk '%s'" % chunk_value) |
130 return (None, None) | 134 return (None, None) |
131 | 135 |
132 # Get the number of tests | 136 # Get the number of tests |
133 num_tests = len(test_names) | 137 num_tests = len(test_names) |
(...skipping 28 matching lines...) Expand all Loading... |
162 _log.debug('chunk slice [%d:%d] of %d is %d tests' % (slice_start, slice
_end, num_tests, (slice_end - slice_start))) | 166 _log.debug('chunk slice [%d:%d] of %d is %d tests' % (slice_start, slice
_end, num_tests, (slice_end - slice_start))) |
163 | 167 |
164 # If we reached the end and we don't have enough tests, we run some | 168 # If we reached the end and we don't have enough tests, we run some |
165 # from the beginning. | 169 # from the beginning. |
166 if slice_end - slice_start < chunk_len: | 170 if slice_end - slice_start < chunk_len: |
167 extra = chunk_len - (slice_end - slice_start) | 171 extra = chunk_len - (slice_end - slice_start) |
168 _log.debug(' last chunk is partial, appending [0:%d]' % extra) | 172 _log.debug(' last chunk is partial, appending [0:%d]' % extra) |
169 tests_to_run.extend(test_names[0:extra]) | 173 tests_to_run.extend(test_names[0:extra]) |
170 | 174 |
171 return (tests_to_run, set(test_names) - set(tests_to_run)) | 175 return (tests_to_run, set(test_names) - set(tests_to_run)) |
OLD | NEW |