- add sources.
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / page / page_measurement_unittest.py
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.
4 import json
5 import os
6
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
16
17 class MeasurementThatFails(page_measurement.PageMeasurement):
18   def MeasurePage(self, page, tab, results):
19     raise page_measurement.MeasurementFailure('Intentional failure.')
20
21 class MeasurementThatHasDefaults(page_measurement.PageMeasurement):
22   def AddCommandLineOptions(self, parser):
23     parser.add_option('-x', dest='x', default=3)
24
25   def MeasurePage(self, page, tab, results):
26     assert self.options.x == 3
27     results.Add('x', 'ms', 7)
28
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'
33
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.')
40
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'
45
46 class MeasurementWithAction(page_measurement.PageMeasurement):
47   def __init__(self):
48     super(MeasurementWithAction, self).__init__('test_action')
49
50   def MeasurePage(self, page, tab, results):
51     pass
52
53 class PageMeasurementUnitTest(
54   page_measurement_unittest_base.PageMeasurementUnitTestBase):
55
56   def setUp(self):
57     self._options = options_for_unittests.GetCopy()
58     self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF
59
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))
65
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))
73
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))
79
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)
85     self.assertEquals(
86       all_results.page_results[0].FindValueByTraceName('x').value, 7)
87
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 = ("""
95 {
96 "archives": {
97   "%s": ["%s"]
98 }
99 }
100 """)
101     try:
102       ps = page_set.PageSet()
103       measurement = MeasurementForReplay()
104
105       # First record an archive with only www.google.com.
106       self._options.browser_options.wpr_mode = wpr_modes.WPR_RECORD
107
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))
114
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
117
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))
123
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))
130
131       self.assertTrue(os.path.isfile(test_archive))
132
133     finally:
134       if os.path.isfile(test_archive):
135         os.remove(test_archive)
136
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)
143
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])