1 # Copyright (c) 2012 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.
7 from telemetry.core import wpr_modes
8 from telemetry.page import page_measurement
9 from telemetry.page import page_measurement_unittest_base
10 from telemetry.page import page as page_module
11 from telemetry.page import page_set
12 from telemetry.page import page_set_archive_info
13 from telemetry.page.actions import all_page_actions
14 from telemetry.page.actions import page_action
15 from telemetry.unittest import options_for_unittests
17 class MeasurementThatFails(page_measurement.PageMeasurement):
18 def MeasurePage(self, page, tab, results):
19 raise page_measurement.MeasurementFailure('Intentional failure.')
21 class MeasurementThatHasDefaults(page_measurement.PageMeasurement):
22 def AddCommandLineOptions(self, parser):
23 parser.add_option('-x', dest='x', default=3)
25 def MeasurePage(self, page, tab, results):
26 assert self.options.x == 3
27 results.Add('x', 'ms', 7)
29 class MeasurementForBlank(page_measurement.PageMeasurement):
30 def MeasurePage(self, page, tab, results):
31 contents = tab.EvaluateJavaScript('document.body.textContent')
32 assert contents.strip() == 'Hello world'
34 class MeasurementForReplay(page_measurement.PageMeasurement):
35 def MeasurePage(self, page, tab, results):
36 # Web Page Replay returns '404 Not found' if a page is not in the archive.
37 contents = tab.EvaluateJavaScript('document.body.textContent')
38 if '404 Not Found' in contents.strip():
39 raise page_measurement.MeasurementFailure('Page not in archive.')
41 class MeasurementQueryParams(page_measurement.PageMeasurement):
42 def MeasurePage(self, page, tab, results):
43 query = tab.EvaluateJavaScript('window.location.search')
44 assert query.strip() == '?foo=1'
46 class MeasurementWithAction(page_measurement.PageMeasurement):
48 super(MeasurementWithAction, self).__init__('test_action')
50 def MeasurePage(self, page, tab, results):
53 class PageMeasurementUnitTest(
54 page_measurement_unittest_base.PageMeasurementUnitTestBase):
57 self._options = options_for_unittests.GetCopy()
58 self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF
60 def testGotToBlank(self):
61 ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
62 measurement = MeasurementForBlank()
63 all_results = self.RunMeasurement(measurement, ps, options=self._options)
64 self.assertEquals(0, len(all_results.failures))
66 def disabled_testGotQueryParams(self):
67 # Disabled due to http://crbug.com/288631
68 ps = self.CreatePageSet('file://blank.html?foo=1')
69 measurement = MeasurementQueryParams()
70 ps.pages[-1].query_params = '?foo=1'
71 all_results = self.RunMeasurement(measurement, ps, options=self._options)
72 self.assertEquals(0, len(all_results.failures))
74 def testFailure(self):
75 ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
76 measurement = MeasurementThatFails()
77 all_results = self.RunMeasurement(measurement, ps, options=self._options)
78 self.assertEquals(1, len(all_results.failures))
80 def testDefaults(self):
81 ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
82 measurement = MeasurementThatHasDefaults()
83 all_results = self.RunMeasurement(measurement, ps, options=self._options)
84 self.assertEquals(len(all_results.page_results), 1)
86 all_results.page_results[0].FindValueByTraceName('x').value, 7)
88 def disabled_testRecordAndReplay(self):
89 # This test is disabled because it runs against live sites, and needs to be
90 # fixed. crbug.com/179038
91 test_archive = '/tmp/google.wpr'
92 google_url = 'http://www.google.com/'
93 foo_url = 'http://www.foo.com/'
94 archive_info_template = ("""
102 ps = page_set.PageSet()
103 measurement = MeasurementForReplay()
105 # First record an archive with only www.google.com.
106 self._options.browser_options.wpr_mode = wpr_modes.WPR_RECORD
108 ps.wpr_archive_info = page_set_archive_info.PageSetArchiveInfo(
109 '', '', json.loads(archive_info_template %
110 (test_archive, google_url)))
111 ps.pages = [page_module.Page(google_url, ps)]
112 all_results = self.RunMeasurement(measurement, ps, options=self._options)
113 self.assertEquals(0, len(all_results.failures))
115 # Now replay it and verify that google.com is found but foo.com is not.
116 self._options.browser_options.wpr_mode = wpr_modes.WPR_REPLAY
118 ps.wpr_archive_info = page_set_archive_info.PageSetArchiveInfo(
119 '', '', json.loads(archive_info_template % (test_archive, foo_url)))
120 ps.pages = [page_module.Page(foo_url, ps)]
121 all_results = self.RunMeasurement(measurement, ps, options=self._options)
122 self.assertEquals(1, len(all_results.failures))
124 ps.wpr_archive_info = page_set_archive_info.PageSetArchiveInfo(
125 '', '', json.loads(archive_info_template %
126 (test_archive, google_url)))
127 ps.pages = [page_module.Page(google_url, ps)]
128 all_results = self.RunMeasurement(measurement, ps, options=self._options)
129 self.assertEquals(0, len(all_results.failures))
131 self.assertTrue(os.path.isfile(test_archive))
134 if os.path.isfile(test_archive):
135 os.remove(test_archive)
137 def testActions(self):
138 action_called = [False]
139 class MockAction(page_action.PageAction):
140 def RunAction(self, page, tab, previous_action):
141 action_called[0] = True
142 all_page_actions.RegisterClassForTest('mock', MockAction)
144 ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
145 setattr(ps.pages[0], 'test_action', {'action': 'mock'})
146 measurement = MeasurementWithAction()
147 self.RunMeasurement(measurement, ps, options=self._options)
148 self.assertTrue(action_called[0])