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 import unittest | 4 import unittest |
5 | 5 |
6 from measurements import page_cycler | 6 from measurements import page_cycler |
7 from telemetry.core import browser_options | 7 from telemetry.core import browser_options |
8 from telemetry.page import page_measurement_results | 8 from telemetry.page import page_measurement_results |
9 from telemetry.unittest import simple_mock | 9 from telemetry.unittest import simple_mock |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 | 22 |
23 def Stop(self, page, tab): | 23 def Stop(self, page, tab): |
24 pass | 24 pass |
25 | 25 |
26 def AddResults(self, tab, results): | 26 def AddResults(self, tab, results): |
27 pass | 27 pass |
28 | 28 |
29 def AddSummaryResults(self, tab, results): | 29 def AddSummaryResults(self, tab, results): |
30 pass | 30 pass |
31 | 31 |
| 32 # Used to mock loading a page. |
| 33 class FakePage(object): |
| 34 def __init__(self, url): |
| 35 self.url = url |
| 36 |
| 37 # Used to mock a browser tab. |
| 38 class FakeTab(object): |
| 39 def __init__(self): |
| 40 self.clear_cache_calls = 0 |
| 41 def ClearCache(self): |
| 42 self.clear_cache_calls += 1 |
| 43 def EvaluateJavaScript(self, _): |
| 44 return 1 |
| 45 def WaitForJavaScriptExpression(self, _, __): |
| 46 pass |
| 47 |
32 class PageCyclerUnitTest(unittest.TestCase): | 48 class PageCyclerUnitTest(unittest.TestCase): |
33 | 49 |
34 # TODO(tonyg): Remove this backfill when we can assume python 2.7 everywhere. | 50 # TODO(tonyg): Remove this backfill when we can assume python 2.7 everywhere. |
35 def assertIn(self, first, second, _=None): | 51 def assertIn(self, first, second, _=None): |
36 self.assertTrue(first in second, | 52 self.assertTrue(first in second, |
37 msg="'%s' not found in '%s'" % (first, second)) | 53 msg="'%s' not found in '%s'" % (first, second)) |
38 | 54 |
39 def setupCycler(self, args): | 55 def setupCycler(self, args, setup_memory_module=False): |
40 cycler = page_cycler.PageCycler() | 56 cycler = page_cycler.PageCycler() |
41 options = browser_options.BrowserFinderOptions() | 57 options = browser_options.BrowserFinderOptions() |
42 parser = options.CreateParser() | 58 parser = options.CreateParser() |
43 cycler.AddCommandLineOptions(parser) | 59 cycler.AddCommandLineOptions(parser) |
44 parser.parse_args(args) | 60 parser.parse_args(args) |
45 cycler.CustomizeBrowserOptions(options) | 61 cycler.CustomizeBrowserOptions(options) |
46 | 62 |
| 63 if setup_memory_module: |
| 64 # Mock out memory metrics; the real ones require a real browser. |
| 65 mock_memory_metric = MockMemoryMetric() |
| 66 |
| 67 mock_memory_module = simple_mock.MockObject() |
| 68 mock_memory_module.ExpectCall( |
| 69 'MemoryMetric').WithArgs(simple_mock.DONT_CARE).WillReturn( |
| 70 mock_memory_metric) |
| 71 |
| 72 real_memory_module = page_cycler.memory |
| 73 try: |
| 74 page_cycler.memory = mock_memory_module |
| 75 cycler.DidStartBrowser(None) |
| 76 finally: |
| 77 page_cycler.memory = real_memory_module |
| 78 |
47 return cycler | 79 return cycler |
48 | 80 |
49 def testOptionsColdLoadNoArgs(self): | 81 def testOptionsColdLoadNoArgs(self): |
50 cycler = self.setupCycler([]) | 82 cycler = self.setupCycler([]) |
51 | 83 |
52 self.assertFalse(cycler._cold_runs_requested) | 84 self.assertEquals(cycler._cold_run_start_index, 10) |
53 self.assertEqual(cycler._number_warm_runs, 9) | |
54 | 85 |
55 def testOptionsColdLoadPagesetRepeat(self): | 86 def testOptionsColdLoadPagesetRepeat(self): |
56 cycler = self.setupCycler(['--pageset-repeat=20', '--page-repeat=2']) | 87 cycler = self.setupCycler(['--pageset-repeat=20', '--page-repeat=2']) |
57 | 88 |
58 self.assertFalse(cycler._cold_runs_requested) | 89 self.assertEquals(cycler._cold_run_start_index, 40) |
59 self.assertEqual(cycler._number_warm_runs, 38) | |
60 | 90 |
61 def testOptionsColdLoadRequested(self): | 91 def testOptionsColdLoadRequested(self): |
62 cycler = self.setupCycler(['--pageset-repeat=21', '--page-repeat=2', | 92 cycler = self.setupCycler(['--pageset-repeat=21', '--page-repeat=2', |
63 '--cold-load-percent=40']) | 93 '--cold-load-percent=40']) |
64 | 94 |
65 self.assertTrue(cycler._cold_runs_requested) | 95 self.assertEquals(cycler._cold_run_start_index, 26) |
66 self.assertEqual(cycler._number_warm_runs, 24) | |
67 | 96 |
68 def testIncompatibleOptions(self): | 97 def testIncompatibleOptions(self): |
69 exception_seen = False | 98 exception_seen = False |
70 try: | 99 try: |
71 self.setupCycler(['--pageset-repeat=20s', '--page-repeat=2s', | 100 self.setupCycler(['--pageset-repeat=20s', '--page-repeat=2s', |
72 '--cold-load-percent=40']) | 101 '--cold-load-percent=40']) |
73 except Exception as e: | 102 except Exception as e: |
74 exception_seen = True | 103 exception_seen = True |
75 self.assertEqual('--cold-load-percent is incompatible with ' | 104 self.assertEqual('--cold-load-percent is incompatible with ' |
76 'timed repeat', e.args[0]) | 105 'timed repeat', e.args[0]) |
77 | 106 |
78 self.assertTrue(exception_seen) | 107 self.assertTrue(exception_seen) |
79 | 108 |
80 def testCacheHandled(self): | 109 def testCacheHandled(self): |
81 cycler = self.setupCycler(['--pageset-repeat=5', | 110 cycler = self.setupCycler(['--pageset-repeat=5', |
82 '--cold-load-percent=50']) | 111 '--cold-load-percent=50'], |
83 | 112 True) |
84 # Mock out memory metrics; the real ones require a real browser. | |
85 mock_memory_metric = MockMemoryMetric() | |
86 | |
87 mock_memory_module = simple_mock.MockObject() | |
88 mock_memory_module.ExpectCall( | |
89 'MemoryMetric').WithArgs(simple_mock.DONT_CARE).WillReturn( | |
90 mock_memory_metric) | |
91 | |
92 real_memory_module = page_cycler.memory | |
93 try: | |
94 page_cycler.memory = mock_memory_module | |
95 cycler.DidStartBrowser(None) | |
96 finally: | |
97 page_cycler.memory = real_memory_module | |
98 | |
99 class FakePage(object): | |
100 def __init__(self, url): | |
101 self.url = url | |
102 | |
103 class FakeTab(object): | |
104 def __init__(self): | |
105 self.clear_cache_calls = 0 | |
106 def ClearCache(self): | |
107 self.clear_cache_calls += 1 | |
108 def EvaluateJavaScript(self, _): | |
109 return 1 | |
110 def WaitForJavaScriptExpression(self, _, __): | |
111 pass | |
112 | 113 |
113 url_name = "http://fakepage.com" | 114 url_name = "http://fakepage.com" |
114 page = FakePage(url_name) | 115 page = FakePage(url_name) |
115 tab = FakeTab() | 116 tab = FakeTab() |
116 results = page_measurement_results.PageMeasurementResults() | 117 results = page_measurement_results.PageMeasurementResults() |
117 | 118 |
118 for i in range(5): | 119 for i in range(5): |
119 cycler.WillNavigateToPage(page, tab) | 120 cycler.WillNavigateToPage(page, tab) |
120 self.assertEqual(max(0, i - 2), tab.clear_cache_calls, | 121 self.assertEqual(max(0, i - 2), tab.clear_cache_calls, |
121 "Iteration %d tab.clear_cache_calls %d" % | 122 "Iteration %d tab.clear_cache_calls %d" % |
122 (i, tab.clear_cache_calls)) | 123 (i, tab.clear_cache_calls)) |
123 results.WillMeasurePage(page) | 124 results.WillMeasurePage(page) |
124 cycler.MeasurePage(page, tab, results) | 125 cycler.MeasurePage(page, tab, results) |
125 | 126 |
126 values = results.page_specific_values_for_current_page | 127 values = results.page_specific_values_for_current_page |
127 results.DidMeasurePage() | 128 results.DidMeasurePage() |
128 | 129 |
129 self.assertEqual(1, len(values)) | 130 self.assertEqual(1, len(values)) |
130 self.assertEqual(values[0].page, page) | 131 self.assertEqual(values[0].page, page) |
131 | 132 |
132 chart_name = 'warm_times' if i > 3 else 'cold_times' | 133 chart_name = 'cold_times' if i == 0 or i > 2 else 'warm_times' |
133 print values[0].name | |
134 self.assertEqual(values[0].name, '%s.page_load_time' % chart_name) | 134 self.assertEqual(values[0].name, '%s.page_load_time' % chart_name) |
135 self.assertEqual(values[0].units, 'ms') | 135 self.assertEqual(values[0].units, 'ms') |
136 | 136 |
137 cycler.DidNavigateToPage(page, tab) | 137 cycler.DidNavigateToPage(page, tab) |
| 138 |
| 139 def testColdWarm(self): |
| 140 cycler = self.setupCycler(['--pageset-repeat=3'], True) |
| 141 pages = [FakePage("http://fakepage1.com"), FakePage("http://fakepage2.com")] |
| 142 tab = FakeTab() |
| 143 results = page_measurement_results.PageMeasurementResults() |
| 144 for i in range(3): |
| 145 for page in pages: |
| 146 cycler.WillNavigateToPage(page, tab) |
| 147 results.WillMeasurePage(page) |
| 148 cycler.MeasurePage(page, tab, results) |
| 149 |
| 150 values = results.page_specific_values_for_current_page |
| 151 results.DidMeasurePage() |
| 152 |
| 153 self.assertEqual(1, len(values)) |
| 154 self.assertEqual(values[0].page, page) |
| 155 |
| 156 chart_name = 'cold_times' if i == 0 else 'warm_times' |
| 157 self.assertEqual(values[0].name, '%s.page_load_time' % chart_name) |
| 158 |
| 159 cycler.DidNavigateToPage(page, tab) |
OLD | NEW |