OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import unittest | 5 import unittest |
6 | 6 |
7 from telemetry.core import browser_options | 7 from telemetry.core import browser_options |
8 from telemetry.page import page_runner | 8 from telemetry.page import page_runner |
9 from telemetry.results import page_test_results | 9 from telemetry.results import page_test_results |
10 from telemetry.unittest import simple_mock | 10 from telemetry.unittest import simple_mock |
(...skipping 20 matching lines...) Expand all Loading... |
31 pass | 31 pass |
32 | 32 |
33 def AddSummaryResults(self, tab, results): | 33 def AddSummaryResults(self, tab, results): |
34 pass | 34 pass |
35 | 35 |
36 | 36 |
37 class FakePage(object): | 37 class FakePage(object): |
38 """Used to mock loading a page.""" | 38 """Used to mock loading a page.""" |
39 def __init__(self, url): | 39 def __init__(self, url): |
40 self.url = url | 40 self.url = url |
| 41 self.is_file = url.startswith('file://') |
41 | 42 |
42 | 43 |
43 class FakeTab(object): | 44 class FakeTab(object): |
44 """Used to mock a browser tab.""" | 45 """Used to mock a browser tab.""" |
45 def __init__(self): | 46 def __init__(self): |
46 self.clear_cache_calls = 0 | 47 self.clear_cache_calls = 0 |
| 48 self.navigated_urls = [] |
47 def ClearCache(self, force=False): | 49 def ClearCache(self, force=False): |
48 assert force | 50 assert force |
49 self.clear_cache_calls += 1 | 51 self.clear_cache_calls += 1 |
50 def EvaluateJavaScript(self, _): | 52 def EvaluateJavaScript(self, _): |
51 return 1 | 53 return 1 |
| 54 def Navigate(self, url): |
| 55 self.navigated_urls.append(url) |
52 def WaitForJavaScriptExpression(self, _, __): | 56 def WaitForJavaScriptExpression(self, _, __): |
53 pass | 57 pass |
54 @property | 58 @property |
55 def browser(self): | 59 def browser(self): |
56 return FakeBrowser() | 60 return FakeBrowser() |
57 | 61 |
58 class FakeBrowser(object): | 62 class FakeBrowser(object): |
59 _iteration = 0 | 63 _iteration = 0 |
60 | 64 |
61 @property | 65 @property |
62 def cpu_stats(self): | 66 def cpu_stats(self): |
63 FakeBrowser._iteration += 1 | 67 FakeBrowser._iteration += 1 |
64 return { | 68 return { |
65 'Browser': {'CpuProcessTime': FakeBrowser._iteration, | 69 'Browser': {'CpuProcessTime': FakeBrowser._iteration, |
66 'TotalTime': FakeBrowser._iteration * 2}, | 70 'TotalTime': FakeBrowser._iteration * 2}, |
67 'Renderer': {'CpuProcessTime': FakeBrowser._iteration, | 71 'Renderer': {'CpuProcessTime': FakeBrowser._iteration, |
68 'TotalTime': FakeBrowser._iteration * 3}, | 72 'TotalTime': FakeBrowser._iteration * 3}, |
69 'Gpu': {'CpuProcessTime': FakeBrowser._iteration, | 73 'Gpu': {'CpuProcessTime': FakeBrowser._iteration, |
70 'TotalTime': FakeBrowser._iteration * 4} | 74 'TotalTime': FakeBrowser._iteration * 4} |
71 } | 75 } |
72 @property | 76 @property |
73 def platform(self): | 77 def platform(self): |
74 return FakePlatform() | 78 return FakePlatform() |
75 | 79 |
| 80 @property |
| 81 def http_server(self): |
| 82 class FakeHttpServer(object): |
| 83 def UrlOf(self, url_path): |
| 84 return 'http://fakeserver:99999/%s' % url_path |
| 85 return FakeHttpServer() |
| 86 |
76 | 87 |
77 class FakePlatform(object): | 88 class FakePlatform(object): |
78 def GetOSName(self): | 89 def GetOSName(self): |
79 return 'fake' | 90 return 'fake' |
80 def CanMonitorPower(self): | 91 def CanMonitorPower(self): |
81 return False | 92 return False |
82 | 93 |
83 | 94 |
84 class PageCyclerUnitTest(unittest.TestCase): | 95 class PageCyclerUnitTest(unittest.TestCase): |
85 | 96 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 self.assertEqual(values[0].name, '%s.page_load_time' % chart_name) | 217 self.assertEqual(values[0].name, '%s.page_load_time' % chart_name) |
207 self.assertEqual(values[0].units, 'ms') | 218 self.assertEqual(values[0].units, 'ms') |
208 | 219 |
209 for value, expected in zip(values[1:], ['gpu', 'renderer', 'browser']): | 220 for value, expected in zip(values[1:], ['gpu', 'renderer', 'browser']): |
210 self.assertEqual(value.page, page) | 221 self.assertEqual(value.page, page) |
211 self.assertEqual(value.name, | 222 self.assertEqual(value.name, |
212 'cpu_utilization.cpu_utilization_%s' % expected) | 223 'cpu_utilization.cpu_utilization_%s' % expected) |
213 self.assertEqual(value.units, '%') | 224 self.assertEqual(value.units, '%') |
214 | 225 |
215 cycler.DidNavigateToPage(page, tab) | 226 cycler.DidNavigateToPage(page, tab) |
| 227 |
| 228 def testLegacyPagesAvoidCrossRenderNavigation(self): |
| 229 # For legacy page cyclers with file URLs, verify that WillNavigateToPage |
| 230 # does an initial navigate to avoid paying for a cross-renderer navigation. |
| 231 cycler = self.SetUpCycler([], True) |
| 232 pages = [FakePage('file://fakepage1.com'), FakePage('file://fakepage2.com')] |
| 233 tab = FakeTab() |
| 234 |
| 235 self.assertEqual([], tab.navigated_urls) |
| 236 for page in pages * 2: |
| 237 cycler.WillNavigateToPage(page, tab) |
| 238 self.assertEqual( |
| 239 ['http://fakeserver:99999/nonexistent.html'], tab.navigated_urls) |
OLD | NEW |