OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 | 4 |
5 import unittest | 5 import os |
| 6 import sys |
6 | 7 |
| 8 from telemetry import benchmark |
| 9 from telemetry.core import util |
| 10 from telemetry.core import wpr_modes |
7 from telemetry.page import page as page_module | 11 from telemetry.page import page as page_module |
| 12 from telemetry.page import page_set as page_set_module |
| 13 from telemetry.page import page_test |
8 from telemetry.page import record_wpr | 14 from telemetry.page import record_wpr |
| 15 from telemetry.unittest import tab_test_case |
9 | 16 |
10 | 17 |
11 class TestPage(page_module.Page): | 18 class MockPage(page_module.Page): |
12 def __init__(self): | 19 def __init__(self, page_set, url): |
13 super(TestPage, self).__init__(url='file://foo.html', | 20 super(MockPage, self).__init__(url=url, |
14 page_set=None, | 21 page_set=page_set, |
15 base_dir=None) | 22 base_dir=util.GetUnittestDataDir()) |
16 self.run_navigate = False | 23 self.func_calls = [] |
17 self.run_foo = False | |
18 self.run_bar = False | |
19 | 24 |
20 def RunNavigateSteps(self, _): | 25 def RunNavigateSteps(self, action_runner): |
21 self.run_navigate = True | 26 self.func_calls.append('RunNavigateSteps') |
| 27 super(MockPage, self).RunNavigateSteps(action_runner) |
22 | 28 |
23 def RunFoo(self, _): | 29 def RunFoo(self, _): |
24 self.run_foo = True | 30 self.func_calls.append('RunFoo') |
25 | 31 |
26 def RunBar(self, _): | 32 def RunBar(self, _): |
27 self.run_bar = True | 33 self.func_calls.append('RunBar') |
| 34 |
| 35 def RunBaz(self, _): |
| 36 self.func_calls.append('RunBaz') |
28 | 37 |
29 | 38 |
30 class FakeFooMeasurement(object): | 39 class MockPageSet(page_set_module.PageSet): |
31 def __init__(self): | 40 def __init__(self, url=''): |
32 self.action_name_to_run = "RunFoo" | 41 super(MockPageSet, self).__init__(archive_data_file='data/test.json') |
| 42 self.AddPage(MockPage(self, url)) |
33 | 43 |
34 | 44 |
35 class FakeBarMeasurement(object): | 45 class MockPageTest(page_test.PageTest): |
36 def __init__(self): | 46 def __init__(self): |
37 self.action_name_to_run = "RunBar" | 47 super(MockPageTest, self).__init__() |
| 48 self._action_name_to_run = "RunBaz" |
| 49 self.func_calls = [] |
| 50 |
| 51 @classmethod |
| 52 def AddCommandLineArgs(cls, parser): |
| 53 parser.add_option('--mock-page-test-option', action="store_true") |
| 54 |
| 55 def WillNavigateToPage(self, page, tab): |
| 56 self.func_calls.append('WillNavigateToPage') |
| 57 |
| 58 def DidNavigateToPage(self, page, tab): |
| 59 self.func_calls.append('DidNavigateToPage') |
| 60 |
| 61 def WillRunActions(self, page, tab): |
| 62 self.func_calls.append('WillRunActions') |
| 63 |
| 64 def DidRunActions(self, page, tab): |
| 65 self.func_calls.append('DidRunActions') |
| 66 |
| 67 def ValidatePage(self, page, tab, results): |
| 68 self.func_calls.append('ValidatePage') |
38 | 69 |
39 | 70 |
40 class FakeTab(object): | 71 class MockBenchmark(benchmark.Benchmark): |
41 def WaitForDocumentReadyStateToBeComplete(self): | 72 test = MockPageTest |
42 pass | 73 |
| 74 @classmethod |
| 75 def AddTestCommandLineArgs(cls, group): |
| 76 group.add_option('', '--mock-benchmark-url', action='store', type='string') |
| 77 |
| 78 def CreatePageSet(self, options): |
| 79 kwargs = {} |
| 80 if (options.mock_benchmark_url): |
| 81 kwargs['url'] = options.mock_benchmark_url |
| 82 return MockPageSet(**kwargs) |
43 | 83 |
44 | 84 |
45 class RecordWprUnitTest(unittest.TestCase): | 85 class RecordWprUnitTests(tab_test_case.TabTestCase): |
46 def setUp(self): | |
47 super(RecordWprUnitTest, self).setUp() | |
48 | 86 |
49 def testRunActions(self): | 87 _base_dir = util.GetUnittestDataDir() |
50 page = TestPage() | 88 _test_data_dir = os.path.join(util.GetUnittestDataDir(), 'page_measurements') |
51 record_runner = record_wpr.RecordPage({1 : FakeFooMeasurement, | |
52 2 : FakeBarMeasurement}) | |
53 record_runner.RunPage(page, tab=FakeTab(), results=None) | |
54 self.assertTrue(page.run_navigate) | |
55 self.assertTrue(page.run_foo) | |
56 self.assertTrue(page.run_bar) | |
57 | 89 |
| 90 @classmethod |
| 91 def setUpClass(cls): |
| 92 sys.path.extend([cls._base_dir, cls._test_data_dir]) |
| 93 super(RecordWprUnitTests, cls).setUpClass() |
| 94 cls._browser.SetHTTPServerDirectories(util.GetUnittestDataDir()) |
| 95 blank_html_path = os.path.join(util.GetUnittestDataDir(), 'blank.html') |
| 96 cls._url = cls._browser.http_server.UrlOf(blank_html_path) |
| 97 |
| 98 # When the RecorderPageTest is created from a PageSet, we do not have a |
| 99 # PageTest to use. In this case, we will record every available action. |
| 100 def testRunPage_AllActions(self): |
| 101 record_page_test = record_wpr.RecorderPageTest(["RunFoo", "RunBar"]) |
| 102 page = MockPage(page_set=MockPageSet(url=self._url), url=self._url) |
| 103 record_page_test.RunPage(page, self._tab, results=None) |
| 104 self.assertTrue('RunFoo' in page.func_calls) |
| 105 self.assertTrue('RunBar' in page.func_calls) |
| 106 self.assertFalse('RunBaz' in page.func_calls) |
| 107 |
| 108 def testRunPage_DontReloadSingleActions(self): |
| 109 record_page_test = record_wpr.RecorderPageTest(["RunFoo"]) |
| 110 page = MockPage(page_set=MockPageSet(url=self._url), url=self._url) |
| 111 record_page_test.RunPage(page, self._tab, results=None) |
| 112 self.assertFalse('RunNavigateSteps' in page.func_calls) |
| 113 |
| 114 def testRunPage_ReloadPageBetweenActions(self): |
| 115 record_page_test = record_wpr.RecorderPageTest(["RunFoo", "RunBar"]) |
| 116 page = MockPage(page_set=MockPageSet(url=self._url), url=self._url) |
| 117 record_page_test.RunPage(page, self._tab, results=None) |
| 118 self.assertTrue('RunNavigateSteps' in page.func_calls) |
| 119 |
| 120 # When the RecorderPageTest is created from a Benchmark, the benchmark will |
| 121 # have a PageTest, specified by its test attribute. |
| 122 def testRunPage_OnlyRunBenchmarkAction(self): |
| 123 record_page_test = record_wpr.RecorderPageTest(["RunFoo"]) |
| 124 record_page_test.page_test = MockBenchmark().test() |
| 125 page = MockPage(page_set=MockPageSet(url=self._url), url=self._url) |
| 126 record_page_test.RunPage(page, self._tab, results=None) |
| 127 self.assertFalse('RunFoo' in page.func_calls) |
| 128 self.assertTrue('RunBaz' in page.func_calls) |
| 129 |
| 130 def testRunPage_CallBenchmarksPageTestsFunctions(self): |
| 131 record_page_test = record_wpr.RecorderPageTest([]) |
| 132 record_page_test.page_test = MockBenchmark().test() |
| 133 page = MockPage(page_set=MockPageSet(url=self._url), url=self._url) |
| 134 record_page_test.RunPage(page, self._tab, results=None) |
| 135 self.assertEqual(3, len(record_page_test.page_test.func_calls)) |
| 136 self.assertEqual('WillRunActions', record_page_test.page_test.func_calls[0]) |
| 137 self.assertEqual('DidRunActions', record_page_test.page_test.func_calls[1]) |
| 138 self.assertEqual('ValidatePage', record_page_test.page_test.func_calls[2]) |
| 139 |
| 140 def testWprRecorderWithPageSet(self): |
| 141 wpr_recorder = record_wpr.WprRecorder(self._test_data_dir, |
| 142 MockPageSet(url=self._url)) |
| 143 results = wpr_recorder.Record() |
| 144 self.assertEquals(1, len(results.successes)) |
| 145 mock_page = results.successes.pop() |
| 146 self.assertTrue('RunFoo' in mock_page.func_calls) |
| 147 self.assertFalse('RunBaz' in mock_page.func_calls) |
| 148 |
| 149 def testWprRecorderWithBenchmark(self): |
| 150 flags = ['--mock-benchmark-url', self._url] |
| 151 wpr_recorder = record_wpr.WprRecorder(self._test_data_dir, MockBenchmark(), |
| 152 flags) |
| 153 results = wpr_recorder.Record() |
| 154 self.assertEquals(1, len(results.successes)) |
| 155 mock_page = results.successes.pop() |
| 156 self.assertFalse('RunFoo' in mock_page.func_calls) |
| 157 self.assertTrue('RunBaz' in mock_page.func_calls) |
| 158 |
| 159 def testCommandLineFlags(self): |
| 160 flags = [ |
| 161 '--page-repeat', '2', |
| 162 '--mock-benchmark-url', self._url, |
| 163 '--mock-page-test-option', |
| 164 ] |
| 165 wpr_recorder = record_wpr.WprRecorder(self._test_data_dir, MockBenchmark(), |
| 166 flags) |
| 167 # page_runner command-line args |
| 168 self.assertEquals(2, wpr_recorder.options.page_repeat) |
| 169 # benchmark command-line args |
| 170 self.assertEquals(self._url, wpr_recorder.options.mock_benchmark_url) |
| 171 # benchmark's page_test command-line args |
| 172 self.assertTrue(wpr_recorder.options.mock_page_test_option) |
| 173 # invalid command-line args |
| 174 self.assertFalse(hasattr(wpr_recorder.options, 'not_a_real_option')) |
| 175 |
| 176 def testRecordingEnabled(self): |
| 177 flags = ['--mock-benchmark-url', self._url] |
| 178 wpr_recorder = record_wpr.WprRecorder(self._test_data_dir, MockBenchmark(), |
| 179 flags) |
| 180 self.assertEqual(wpr_modes.WPR_RECORD, |
| 181 wpr_recorder.options.browser_options.wpr_mode) |
| 182 |
| 183 def testFindAllActionNames(self): |
| 184 # The src/tools/telemetry/unittest_data/page_measurements/ has been |
| 185 # populated with three simple Page Measurement classes, the first two of |
| 186 # which have action_name_to_run defined. |
| 187 action_names_to_run = record_wpr.FindAllActionNames(self._test_data_dir) |
| 188 self.assertTrue('RunFoo' in action_names_to_run) |
| 189 self.assertTrue('RunBar' in action_names_to_run) |
| 190 self.assertFalse('RunBaz' in action_names_to_run) |
OLD | NEW |