| OLD | NEW |
| 1 # Copyright (C) 2011, Google Inc. All rights reserved. | 1 # Copyright (C) 2011, 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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 class BaselineOptimizer(object): | 49 class BaselineOptimizer(object): |
| 50 ROOT_LAYOUT_TESTS_DIRECTORY = 'LayoutTests' | 50 ROOT_LAYOUT_TESTS_DIRECTORY = 'LayoutTests' |
| 51 | 51 |
| 52 def __init__(self, host, port, port_names): | 52 def __init__(self, host, port, port_names): |
| 53 self._filesystem = host.filesystem | 53 self._filesystem = host.filesystem |
| 54 self._default_port = port | 54 self._default_port = port |
| 55 self._ports = {} | 55 self._ports = {} |
| 56 for port_name in port_names: | 56 for port_name in port_names: |
| 57 self._ports[port_name] = host.port_factory.get(port_name) | 57 self._ports[port_name] = host.port_factory.get(port_name) |
| 58 | 58 |
| 59 self._webkit_base = port.webkit_base() | 59 self._blink_base = port.blink_base() |
| 60 self._layout_tests_dir = port.layout_tests_dir() | 60 self._layout_tests_dir = port.layout_tests_dir() |
| 61 | 61 |
| 62 # Only used by unittests. | 62 # Only used by unittests. |
| 63 self.new_results_by_directory = [] | 63 self.new_results_by_directory = [] |
| 64 | 64 |
| 65 def _baseline_root(self, baseline_name): | 65 def _baseline_root(self, baseline_name): |
| 66 virtual_suite = self._virtual_suite(baseline_name) | 66 virtual_suite = self._virtual_suite(baseline_name) |
| 67 if virtual_suite: | 67 if virtual_suite: |
| 68 return self._filesystem.join(self.ROOT_LAYOUT_TESTS_DIRECTORY, virtu
al_suite.name) | 68 return self._filesystem.join(self.ROOT_LAYOUT_TESTS_DIRECTORY, virtu
al_suite.name) |
| 69 return self.ROOT_LAYOUT_TESTS_DIRECTORY | 69 return self.ROOT_LAYOUT_TESTS_DIRECTORY |
| 70 | 70 |
| 71 def _baseline_search_path(self, port, baseline_name): | 71 def _baseline_search_path(self, port, baseline_name): |
| 72 virtual_suite = self._virtual_suite(baseline_name) | 72 virtual_suite = self._virtual_suite(baseline_name) |
| 73 if virtual_suite: | 73 if virtual_suite: |
| 74 return port.virtual_baseline_search_path(baseline_name) | 74 return port.virtual_baseline_search_path(baseline_name) |
| 75 return port.baseline_search_path() | 75 return port.baseline_search_path() |
| 76 | 76 |
| 77 def _virtual_suite(self, baseline_name): | 77 def _virtual_suite(self, baseline_name): |
| 78 return self._default_port.lookup_virtual_suite(baseline_name) | 78 return self._default_port.lookup_virtual_suite(baseline_name) |
| 79 | 79 |
| 80 def _virtual_base(self, baseline_name): | 80 def _virtual_base(self, baseline_name): |
| 81 return self._default_port.lookup_virtual_test_base(baseline_name) | 81 return self._default_port.lookup_virtual_test_base(baseline_name) |
| 82 | 82 |
| 83 def _relative_baseline_search_paths(self, port, baseline_name): | 83 def _relative_baseline_search_paths(self, port, baseline_name): |
| 84 baseline_search_path = self._baseline_search_path(port, baseline_name) | 84 baseline_search_path = self._baseline_search_path(port, baseline_name) |
| 85 baseline_root = self._baseline_root(baseline_name) | 85 baseline_root = self._baseline_root(baseline_name) |
| 86 relative_paths = [self._filesystem.relpath(path, self._webkit_base) for
path in baseline_search_path] | 86 relative_paths = [self._filesystem.relpath(path, self._blink_base) for p
ath in baseline_search_path] |
| 87 return relative_paths + [baseline_root] | 87 return relative_paths + [baseline_root] |
| 88 | 88 |
| 89 def _join_directory(self, directory, baseline_name): | 89 def _join_directory(self, directory, baseline_name): |
| 90 # This code is complicated because both the directory name and the basel
ine_name have the virtual | 90 # This code is complicated because both the directory name and the basel
ine_name have the virtual |
| 91 # test suite in the name and the virtual baseline name is not a strict s
uperset of the non-virtual name. | 91 # test suite in the name and the virtual baseline name is not a strict s
uperset of the non-virtual name. |
| 92 # For example, virtual/gpu/fast/canvas/foo-expected.png corresponds to f
ast/canvas/foo-expected.png and | 92 # For example, virtual/gpu/fast/canvas/foo-expected.png corresponds to f
ast/canvas/foo-expected.png and |
| 93 # the baseline directories are like platform/mac/virtual/gpu/fast/canvas
. So, to get the path | 93 # the baseline directories are like platform/mac/virtual/gpu/fast/canvas
. So, to get the path |
| 94 # to the baseline in the platform directory, we need to append just foo-
expected.png to the directory. | 94 # to the baseline in the platform directory, we need to append just foo-
expected.png to the directory. |
| 95 virtual_suite = self._virtual_suite(baseline_name) | 95 virtual_suite = self._virtual_suite(baseline_name) |
| 96 if virtual_suite: | 96 if virtual_suite: |
| 97 baseline_name_without_virtual = baseline_name[len(virtual_suite.name
) + 1:] | 97 baseline_name_without_virtual = baseline_name[len(virtual_suite.name
) + 1:] |
| 98 else: | 98 else: |
| 99 baseline_name_without_virtual = baseline_name | 99 baseline_name_without_virtual = baseline_name |
| 100 return self._filesystem.join(self._webkit_base, directory, baseline_name
_without_virtual) | 100 return self._filesystem.join(self._blink_base, directory, baseline_name_
without_virtual) |
| 101 | 101 |
| 102 def read_results_by_directory(self, baseline_name): | 102 def read_results_by_directory(self, baseline_name): |
| 103 results_by_directory = {} | 103 results_by_directory = {} |
| 104 directories = reduce(set.union, map(set, [self._relative_baseline_search
_paths( | 104 directories = reduce(set.union, map(set, [self._relative_baseline_search
_paths( |
| 105 port, baseline_name) for port in self._ports.values()])) | 105 port, baseline_name) for port in self._ports.values()])) |
| 106 | 106 |
| 107 for directory in directories: | 107 for directory in directories: |
| 108 path = self._join_directory(directory, baseline_name) | 108 path = self._join_directory(directory, baseline_name) |
| 109 if self._filesystem.exists(path): | 109 if self._filesystem.exists(path): |
| 110 results_by_directory[directory] = self._filesystem.sha1(path) | 110 results_by_directory[directory] = self._filesystem.sha1(path) |
| 111 return results_by_directory | 111 return results_by_directory |
| 112 | 112 |
| 113 def _results_by_port_name(self, results_by_directory, baseline_name): | 113 def _results_by_port_name(self, results_by_directory, baseline_name): |
| 114 results_by_port_name = {} | 114 results_by_port_name = {} |
| 115 for port_name, port in self._ports.items(): | 115 for port_name, port in self._ports.items(): |
| 116 for directory in self._relative_baseline_search_paths(port, baseline
_name): | 116 for directory in self._relative_baseline_search_paths(port, baseline
_name): |
| 117 if directory in results_by_directory: | 117 if directory in results_by_directory: |
| 118 results_by_port_name[port_name] = results_by_directory[direc
tory] | 118 results_by_port_name[port_name] = results_by_directory[direc
tory] |
| 119 break | 119 break |
| 120 return results_by_port_name | 120 return results_by_port_name |
| 121 | 121 |
| 122 @memoized | 122 @memoized |
| 123 def _directories_immediately_preceding_root(self, baseline_name): | 123 def _directories_immediately_preceding_root(self, baseline_name): |
| 124 directories = set() | 124 directories = set() |
| 125 for port in self._ports.values(): | 125 for port in self._ports.values(): |
| 126 directory = self._filesystem.relpath(self._baseline_search_path(port
, baseline_name)[-1], self._webkit_base) | 126 directory = self._filesystem.relpath(self._baseline_search_path(port
, baseline_name)[-1], self._blink_base) |
| 127 directories.add(directory) | 127 directories.add(directory) |
| 128 return directories | 128 return directories |
| 129 | 129 |
| 130 def _optimize_result_for_root(self, new_results_by_directory, baseline_name)
: | 130 def _optimize_result_for_root(self, new_results_by_directory, baseline_name)
: |
| 131 # The root directory (i.e. LayoutTests) is the only one that doesn't cor
respond | 131 # The root directory (i.e. LayoutTests) is the only one that doesn't cor
respond |
| 132 # to a specific platform. As such, it's the only one where the baseline
in fallback directories | 132 # to a specific platform. As such, it's the only one where the baseline
in fallback directories |
| 133 # immediately before it can be promoted up, i.e. if win and mac | 133 # immediately before it can be promoted up, i.e. if win and mac |
| 134 # have the same baseline, then it can be promoted up to be the LayoutTes
ts baseline. | 134 # have the same baseline, then it can be promoted up to be the LayoutTes
ts baseline. |
| 135 # All other baselines can only be removed if they're redundant with a ba
seline earlier | 135 # All other baselines can only be removed if they're redundant with a ba
seline earlier |
| 136 # in the fallback order. They can never promoted up. | 136 # in the fallback order. They can never promoted up. |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 def _find_in_fallbackpath(self, fallback_path, current_result, results_by_di
rectory): | 203 def _find_in_fallbackpath(self, fallback_path, current_result, results_by_di
rectory): |
| 204 for index, directory in enumerate(fallback_path): | 204 for index, directory in enumerate(fallback_path): |
| 205 if directory in results_by_directory and (results_by_directory[direc
tory] == current_result): | 205 if directory in results_by_directory and (results_by_directory[direc
tory] == current_result): |
| 206 return index, directory | 206 return index, directory |
| 207 assert False, "result %s not found in fallback_path %s, %s" % (current_r
esult, fallback_path, results_by_directory) | 207 assert False, "result %s not found in fallback_path %s, %s" % (current_r
esult, fallback_path, results_by_directory) |
| 208 | 208 |
| 209 def _platform(self, filename): | 209 def _platform(self, filename): |
| 210 platform_dir = self.ROOT_LAYOUT_TESTS_DIRECTORY + self._filesystem.sep +
'platform' + self._filesystem.sep | 210 platform_dir = self.ROOT_LAYOUT_TESTS_DIRECTORY + self._filesystem.sep +
'platform' + self._filesystem.sep |
| 211 if filename.startswith(platform_dir): | 211 if filename.startswith(platform_dir): |
| 212 return filename.replace(platform_dir, '').split(self._filesystem.sep
)[0] | 212 return filename.replace(platform_dir, '').split(self._filesystem.sep
)[0] |
| 213 platform_dir = self._filesystem.join(self._webkit_base, platform_dir) | 213 platform_dir = self._filesystem.join(self._blink_base, platform_dir) |
| 214 if filename.startswith(platform_dir): | 214 if filename.startswith(platform_dir): |
| 215 return filename.replace(platform_dir, '').split(self._filesystem.sep
)[0] | 215 return filename.replace(platform_dir, '').split(self._filesystem.sep
)[0] |
| 216 return '(generic)' | 216 return '(generic)' |
| 217 | 217 |
| 218 def _move_baselines(self, baseline_name, results_by_directory, new_results_b
y_directory): | 218 def _move_baselines(self, baseline_name, results_by_directory, new_results_b
y_directory): |
| 219 data_for_result = {} | 219 data_for_result = {} |
| 220 for directory, result in results_by_directory.items(): | 220 for directory, result in results_by_directory.items(): |
| 221 if not result in data_for_result: | 221 if not result in data_for_result: |
| 222 source = self._join_directory(directory, baseline_name) | 222 source = self._join_directory(directory, baseline_name) |
| 223 data_for_result[result] = self._filesystem.read_binary_file(sour
ce) | 223 data_for_result[result] = self._filesystem.read_binary_file(sour
ce) |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 result = self._optimize_subtree(baseline_name) | 320 result = self._optimize_subtree(baseline_name) |
| 321 non_virtual_baseline_name = self._virtual_base(baseline_name) | 321 non_virtual_baseline_name = self._virtual_base(baseline_name) |
| 322 if not non_virtual_baseline_name: | 322 if not non_virtual_baseline_name: |
| 323 return result | 323 return result |
| 324 | 324 |
| 325 self._optimize_virtual_root(baseline_name, non_virtual_baseline_name) | 325 self._optimize_virtual_root(baseline_name, non_virtual_baseline_name) |
| 326 | 326 |
| 327 _log.debug("Optimizing non-virtual fallback path.") | 327 _log.debug("Optimizing non-virtual fallback path.") |
| 328 result |= self._optimize_subtree(non_virtual_baseline_name) | 328 result |= self._optimize_subtree(non_virtual_baseline_name) |
| 329 return result | 329 return result |
| OLD | NEW |