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
3 # found in the LICENSE file.
6 from measurements
import page_cycler
7 from telemetry
.core
import browser_options
8 from telemetry
.page
import page_measurement_results
9 from telemetry
.unittest
import simple_mock
11 # Allow testing protected members in the unit test.
12 # pylint: disable=W0212
14 # Used instead of simple_mock.MockObject so that the precise order and
15 # number of calls need not be specified.
16 class MockMemoryMetric(object):
20 def Start(self
, page
, tab
):
23 def Stop(self
, page
, tab
):
26 def AddResults(self
, tab
, results
):
29 def AddSummaryResults(self
, tab
, results
):
32 class PageCyclerUnitTest(unittest
.TestCase
):
34 # TODO(tonyg): Remove this backfill when we can assume python 2.7 everywhere.
35 def assertIn(self
, first
, second
, msg
=None):
36 self
.assertTrue(first
in second
,
37 msg
="'%s' not found in '%s'" % (first
, second
))
39 def setupCycler(self
, args
):
40 cycler
= page_cycler
.PageCycler()
41 options
= browser_options
.BrowserFinderOptions()
42 parser
= options
.CreateParser()
43 cycler
.AddCommandLineOptions(parser
)
44 parser
.parse_args(args
)
45 cycler
.CustomizeBrowserOptions(options
)
49 def testOptionsColdLoadNoArgs(self
):
50 cycler
= self
.setupCycler([])
52 self
.assertFalse(cycler
._cold
_runs
_requested
)
53 self
.assertEqual(cycler
._number
_warm
_runs
, 9)
55 def testOptionsColdLoadPagesetRepeat(self
):
56 cycler
= self
.setupCycler(['--pageset-repeat=20', '--page-repeat=2'])
58 self
.assertFalse(cycler
._cold
_runs
_requested
)
59 self
.assertEqual(cycler
._number
_warm
_runs
, 38)
61 def testOptionsColdLoadRequested(self
):
62 cycler
= self
.setupCycler(['--pageset-repeat=21', '--page-repeat=2',
63 '--cold-load-percent=40'])
65 self
.assertTrue(cycler
._cold
_runs
_requested
)
66 self
.assertEqual(cycler
._number
_warm
_runs
, 24)
68 def testIncompatibleOptions(self
):
69 exception_seen
= False
71 self
.setupCycler(['--pageset-repeat=20s', '--page-repeat=2s',
72 '--cold-load-percent=40'])
73 except Exception as e
:
75 self
.assertEqual('--cold-load-percent is incompatible with '
76 'timed repeat', e
.args
[0])
78 self
.assertTrue(exception_seen
)
80 def testCacheHandled(self
):
81 cycler
= self
.setupCycler(['--pageset-repeat=5',
82 '--cold-load-percent=50'])
84 # Mock out memory metrics; the real ones require a real browser.
85 mock_memory_metric
= MockMemoryMetric()
87 mock_memory_module
= simple_mock
.MockObject()
88 mock_memory_module
.ExpectCall(
89 'MemoryMetric').WithArgs(simple_mock
.DONT_CARE
).WillReturn(
92 real_memory_module
= page_cycler
.memory
94 page_cycler
.memory
= mock_memory_module
95 cycler
.DidStartBrowser(None)
97 page_cycler
.memory
= real_memory_module
99 class FakePage(object):
100 def __init__(self
, url
):
103 class FakeTab(object):
105 self
.clear_cache_calls
= 0
106 def ClearCache(self
):
107 self
.clear_cache_calls
+= 1
108 def EvaluateJavaScript(self
, _
):
111 url_name
= "http://fakepage.com"
112 page
= FakePage(url_name
)
114 results
= page_measurement_results
.PageMeasurementResults()
117 cycler
.WillNavigateToPage(page
, tab
)
118 self
.assertEqual(max(0, i
- 2), tab
.clear_cache_calls
,
119 "Iteration %d tab.clear_cache_calls %d" %
120 (i
, tab
.clear_cache_calls
))
121 num_results
= len(results
.page_results
)
122 results
.WillMeasurePage(page
)
123 cycler
.MeasurePage(page
, tab
, results
)
124 results
.DidMeasurePage()
125 self
.assertEqual(num_results
+1, len(results
.page_results
))
127 self
.assertEqual(result
.page
, page
)
128 self
.assertEqual(1, len(result
.values
))
129 self
.assertEqual(result
.values
[0].trace_name
, 'page_load_time')
130 self
.assertEqual(result
.values
[0].units
, 'ms')
131 self
.assertEqual(result
.values
[0].chart_name
,
132 'warm_times' if i
< 3 else 'cold_times')
133 cycler
.DidNavigateToPage(page
, tab
)