Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: tools/perf/measurements/page_cycler_unittest.py

Issue 57863002: Update page cycler to differenciate between cold and warm run by default. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adding unit test Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tools/perf/measurements/page_cycler.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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)
OLDNEW
« no previous file with comments | « tools/perf/measurements/page_cycler.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698