| OLD | NEW |
| (Empty) |
| 1 # Copyright (C) 2011 Google Inc. All rights reserved. | |
| 2 # | |
| 3 # Redistribution and use in source and binary forms, with or without | |
| 4 # modification, are permitted provided that the following conditions are | |
| 5 # met: | |
| 6 # | |
| 7 # * Redistributions of source code must retain the above copyright | |
| 8 # notice, this list of conditions and the following disclaimer. | |
| 9 # * Redistributions in binary form must reproduce the above | |
| 10 # copyright notice, this list of conditions and the following disclaimer | |
| 11 # in the documentation and/or other materials provided with the | |
| 12 # distribution. | |
| 13 # * Neither the name of Google Inc. nor the names of its | |
| 14 # contributors may be used to endorse or promote products derived from | |
| 15 # this software without specific prior written permission. | |
| 16 # | |
| 17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 28 | |
| 29 import unittest | |
| 30 | |
| 31 from webkitpy.common.checkout.baselineoptimizer import BaselineOptimizer | |
| 32 from webkitpy.common.host_mock import MockHost | |
| 33 from webkitpy.common.webkit_finder import WebKitFinder | |
| 34 | |
| 35 | |
| 36 class BaselineOptimizerTest(unittest.TestCase): | |
| 37 | |
| 38 # Protected method _move_baselines is tested below - pylint: disable=protect
ed-access | |
| 39 def test_move_baselines(self): | |
| 40 host = MockHost() | |
| 41 host.filesystem.write_text_file('/mock-checkout/third_party/WebKit/Layou
tTests/VirtualTestSuites', '[]') | |
| 42 host.filesystem.write_binary_file( | |
| 43 '/mock-checkout/third_party/WebKit/LayoutTests/platform/win/another/
test-expected.txt', 'result A') | |
| 44 host.filesystem.write_binary_file( | |
| 45 '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac/another/
test-expected.txt', 'result A') | |
| 46 host.filesystem.write_binary_file('/mock-checkout/third_party/WebKit/Lay
outTests/another/test-expected.txt', 'result B') | |
| 47 baseline_optimizer = BaselineOptimizer( | |
| 48 host, host.port_factory.get(), host.port_factory.all_port_names()) | |
| 49 baseline_optimizer._move_baselines( | |
| 50 'another/test-expected.txt', | |
| 51 { | |
| 52 '/mock-checkout/third_party/WebKit/LayoutTests/platform/win': 'a
aa', | |
| 53 '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac': 'a
aa', | |
| 54 '/mock-checkout/third_party/WebKit/LayoutTests': 'bbb', | |
| 55 }, | |
| 56 { | |
| 57 '/mock-checkout/third_party/WebKit/LayoutTests': 'aaa', | |
| 58 }) | |
| 59 self.assertEqual(host.filesystem.read_binary_file( | |
| 60 '/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected
.txt'), 'result A') | |
| 61 | |
| 62 def test_move_baselines_skip_scm_commands(self): | |
| 63 host = MockHost() | |
| 64 host.filesystem.write_text_file('/mock-checkout/third_party/WebKit/Layou
tTests/VirtualTestSuites', '[]') | |
| 65 host.filesystem.write_binary_file( | |
| 66 '/mock-checkout/third_party/WebKit/LayoutTests/platform/win/another/
test-expected.txt', 'result A') | |
| 67 host.filesystem.write_binary_file( | |
| 68 '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac/another/
test-expected.txt', 'result A') | |
| 69 host.filesystem.write_binary_file('/mock-checkout/third_party/WebKit/Lay
outTests/another/test-expected.txt', 'result B') | |
| 70 baseline_optimizer = BaselineOptimizer(host, host.port_factory.get( | |
| 71 ), host.port_factory.all_port_names()) | |
| 72 baseline_optimizer._move_baselines( | |
| 73 'another/test-expected.txt', | |
| 74 { | |
| 75 '/mock-checkout/third_party/WebKit/LayoutTests/platform/win': 'a
aa', | |
| 76 '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac': 'a
aa', | |
| 77 '/mock-checkout/third_party/WebKit/LayoutTests': 'bbb', | |
| 78 }, | |
| 79 { | |
| 80 '/mock-checkout/third_party/WebKit/LayoutTests/platform/linux':
'bbb', | |
| 81 '/mock-checkout/third_party/WebKit/LayoutTests': 'aaa', | |
| 82 }) | |
| 83 self.assertEqual( | |
| 84 host.filesystem.read_binary_file( | |
| 85 '/mock-checkout/third_party/WebKit/LayoutTests/another/test-expe
cted.txt'), | |
| 86 'result A') | |
| 87 | |
| 88 def _assertOptimization(self, results_by_directory, expected_new_results_by_
directory, | |
| 89 baseline_dirname='', host=None): | |
| 90 if not host: | |
| 91 host = MockHost() | |
| 92 fs = host.filesystem | |
| 93 webkit_base = WebKitFinder(fs).webkit_base() | |
| 94 baseline_name = 'mock-baseline-expected.txt' | |
| 95 fs.write_text_file(fs.join(webkit_base, 'LayoutTests', 'VirtualTestSuite
s'), | |
| 96 '[{"prefix": "gpu", "base": "fast/canvas", "args": ["
--foo"]}]') | |
| 97 | |
| 98 for dirname, contents in results_by_directory.items(): | |
| 99 path = fs.join(webkit_base, 'LayoutTests', dirname, baseline_name) | |
| 100 fs.write_binary_file(path, contents) | |
| 101 | |
| 102 baseline_optimizer = BaselineOptimizer(host, host.port_factory.get( | |
| 103 ), host.port_factory.all_port_names()) | |
| 104 self.assertTrue(baseline_optimizer.optimize(fs.join(baseline_dirname, ba
seline_name))) | |
| 105 | |
| 106 for dirname, contents in expected_new_results_by_directory.items(): | |
| 107 path = fs.join(webkit_base, 'LayoutTests', dirname, baseline_name) | |
| 108 if contents is not None: | |
| 109 self.assertEqual(fs.read_binary_file(path), contents) | |
| 110 | |
| 111 def test_linux_redundant_with_win(self): | |
| 112 self._assertOptimization( | |
| 113 { | |
| 114 'platform/win': '1', | |
| 115 'platform/linux': '1', | |
| 116 }, | |
| 117 { | |
| 118 'platform/win': '1', | |
| 119 }) | |
| 120 | |
| 121 def test_covers_mac_win_linux(self): | |
| 122 self._assertOptimization( | |
| 123 { | |
| 124 'platform/mac': '1', | |
| 125 'platform/win': '1', | |
| 126 'platform/linux': '1', | |
| 127 '': None, | |
| 128 }, | |
| 129 { | |
| 130 '': '1', | |
| 131 }) | |
| 132 | |
| 133 def test_overwrites_root(self): | |
| 134 self._assertOptimization( | |
| 135 { | |
| 136 'platform/mac': '1', | |
| 137 'platform/win': '1', | |
| 138 'platform/linux': '1', | |
| 139 '': '2', | |
| 140 }, | |
| 141 { | |
| 142 '': '1', | |
| 143 }) | |
| 144 | |
| 145 def test_no_new_common_directory(self): | |
| 146 self._assertOptimization( | |
| 147 { | |
| 148 'platform/mac': '1', | |
| 149 'platform/linux': '1', | |
| 150 '': '2', | |
| 151 }, | |
| 152 { | |
| 153 'platform/mac': '1', | |
| 154 'platform/linux': '1', | |
| 155 '': '2', | |
| 156 }) | |
| 157 | |
| 158 def test_local_optimization(self): | |
| 159 self._assertOptimization( | |
| 160 { | |
| 161 'platform/mac': '1', | |
| 162 'platform/linux': '1', | |
| 163 'platform/linux-precise': '1', | |
| 164 }, | |
| 165 { | |
| 166 'platform/mac': '1', | |
| 167 'platform/linux': '1', | |
| 168 }) | |
| 169 | |
| 170 def test_local_optimization_skipping_a_port_in_the_middle(self): | |
| 171 self._assertOptimization( | |
| 172 { | |
| 173 'platform/mac-snowleopard': '1', | |
| 174 'platform/win': '1', | |
| 175 'platform/linux': '1', | |
| 176 'platform/linux-precise': '1', | |
| 177 }, | |
| 178 { | |
| 179 'platform/mac-snowleopard': '1', | |
| 180 'platform/win': '1', | |
| 181 }) | |
| 182 | |
| 183 def test_baseline_redundant_with_root(self): | |
| 184 self._assertOptimization( | |
| 185 { | |
| 186 'platform/mac': '1', | |
| 187 'platform/win': '2', | |
| 188 '': '2', | |
| 189 }, | |
| 190 { | |
| 191 'platform/mac': '1', | |
| 192 '': '2', | |
| 193 }) | |
| 194 | |
| 195 def test_root_baseline_unused(self): | |
| 196 self._assertOptimization( | |
| 197 { | |
| 198 'platform/mac': '1', | |
| 199 'platform/win': '2', | |
| 200 '': '3', | |
| 201 }, | |
| 202 { | |
| 203 'platform/mac': '1', | |
| 204 'platform/win': '2', | |
| 205 }) | |
| 206 | |
| 207 def test_root_baseline_unused_and_non_existant(self): | |
| 208 self._assertOptimization( | |
| 209 { | |
| 210 'platform/mac': '1', | |
| 211 'platform/win': '2', | |
| 212 }, | |
| 213 { | |
| 214 'platform/mac': '1', | |
| 215 'platform/win': '2', | |
| 216 }) | |
| 217 | |
| 218 def test_virtual_root_redundant_with_actual_root(self): | |
| 219 self._assertOptimization( | |
| 220 { | |
| 221 'virtual/gpu/fast/canvas': '2', | |
| 222 'fast/canvas': '2', | |
| 223 }, | |
| 224 { | |
| 225 'virtual/gpu/fast/canvas': None, | |
| 226 'fast/canvas': '2', | |
| 227 }, | |
| 228 baseline_dirname='virtual/gpu/fast/canvas') | |
| 229 | |
| 230 def test_virtual_root_redundant_with_ancestors(self): | |
| 231 self._assertOptimization( | |
| 232 { | |
| 233 'virtual/gpu/fast/canvas': '2', | |
| 234 'platform/mac/fast/canvas': '2', | |
| 235 'platform/win/fast/canvas': '2', | |
| 236 }, | |
| 237 { | |
| 238 'virtual/gpu/fast/canvas': None, | |
| 239 'fast/canvas': '2', | |
| 240 }, | |
| 241 baseline_dirname='virtual/gpu/fast/canvas') | |
| 242 | |
| 243 def test_virtual_root_redundant_with_ancestors_skip_scm_commands(self): | |
| 244 self._assertOptimization( | |
| 245 { | |
| 246 'virtual/gpu/fast/canvas': '2', | |
| 247 'platform/mac/fast/canvas': '2', | |
| 248 'platform/win/fast/canvas': '2', | |
| 249 }, | |
| 250 { | |
| 251 'virtual/gpu/fast/canvas': None, | |
| 252 'fast/canvas': '2', | |
| 253 }, | |
| 254 baseline_dirname='virtual/gpu/fast/canvas') | |
| 255 | |
| 256 def test_virtual_root_redundant_with_ancestors_skip_scm_commands_with_file_n
ot_in_scm(self): | |
| 257 self._assertOptimization( | |
| 258 { | |
| 259 'virtual/gpu/fast/canvas': '2', | |
| 260 'platform/mac/fast/canvas': '2', | |
| 261 'platform/win/fast/canvas': '2', | |
| 262 }, | |
| 263 { | |
| 264 'virtual/gpu/fast/canvas': None, | |
| 265 'fast/canvas': '2', | |
| 266 }, | |
| 267 baseline_dirname='virtual/gpu/fast/canvas', | |
| 268 host=MockHost()) | |
| 269 | |
| 270 def test_virtual_root_not_redundant_with_ancestors(self): | |
| 271 self._assertOptimization( | |
| 272 { | |
| 273 'virtual/gpu/fast/canvas': '2', | |
| 274 'platform/mac/fast/canvas': '1', | |
| 275 }, | |
| 276 { | |
| 277 'virtual/gpu/fast/canvas': '2', | |
| 278 'platform/mac/fast/canvas': '1', | |
| 279 }, | |
| 280 baseline_dirname='virtual/gpu/fast/canvas') | |
| OLD | NEW |