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 logging | 5 import logging |
6 import optparse | 6 import optparse |
7 import os | 7 import os |
8 import shutil | 8 import shutil |
9 import sys | 9 import sys |
10 import zipfile | 10 import zipfile |
11 | 11 |
12 from telemetry import decorators | 12 from telemetry import decorators |
13 from telemetry import page | 13 from telemetry import page |
14 from telemetry.core import browser_finder | 14 from telemetry.core import browser_finder |
15 from telemetry.core import command_line | 15 from telemetry.core import command_line |
16 from telemetry.core import util | 16 from telemetry.core import util |
17 from telemetry.user_story import user_story_runner | 17 from telemetry.user_story import user_story_runner |
18 from telemetry.page import page_set | 18 from telemetry.page import page_set |
19 from telemetry.page import page_test | 19 from telemetry.page import page_test |
20 from telemetry.page import test_expectations | 20 from telemetry.page import test_expectations |
21 from telemetry.results import results_options | 21 from telemetry.results import results_options |
22 from telemetry.util import cloud_storage | 22 from telemetry.util import cloud_storage |
23 from telemetry.util import exception_formatter | 23 from telemetry.util import exception_formatter |
| 24 from telemetry.web_perf import timeline_based_measurement |
24 | 25 |
25 Disabled = decorators.Disabled | 26 Disabled = decorators.Disabled |
26 Enabled = decorators.Enabled | 27 Enabled = decorators.Enabled |
27 | 28 |
28 | 29 |
29 class InvalidOptionsError(Exception): | 30 class InvalidOptionsError(Exception): |
30 """Raised for invalid benchmark options.""" | 31 """Raised for invalid benchmark options.""" |
31 pass | 32 pass |
32 | 33 |
33 | 34 |
34 class BenchmarkMetadata(object): | 35 class BenchmarkMetadata(object): |
35 def __init__(self, name, description=''): | 36 def __init__(self, name, description=''): |
36 self._name = name | 37 self._name = name |
37 self._description = description | 38 self._description = description |
38 | 39 |
39 @property | 40 @property |
40 def name(self): | 41 def name(self): |
41 return self._name | 42 return self._name |
42 | 43 |
43 @property | 44 @property |
44 def description(self): | 45 def description(self): |
45 return self._description | 46 return self._description |
46 | 47 |
47 | 48 |
48 class Benchmark(command_line.Command): | 49 class Benchmark(command_line.Command): |
49 """Base class for a Telemetry benchmark. | 50 """Base class for a Telemetry benchmark. |
50 | 51 |
51 A test packages a PageTest and a PageSet together. | 52 A benchmark packages a measurement and a PageSet together. |
| 53 Benchmarks default to using TBM unless you override the value of |
| 54 Benchmark.test, or override the CreatePageTest method. |
| 55 |
| 56 New benchmarks should override CreateUserStorySet. |
52 """ | 57 """ |
53 options = {} | 58 options = {} |
| 59 test = timeline_based_measurement.TimelineBasedMeasurement |
54 | 60 |
55 def __init__(self, max_failures=None): | 61 def __init__(self, max_failures=None): |
56 """Creates a new Benchmark. | 62 """Creates a new Benchmark. |
57 | 63 |
58 Args: | 64 Args: |
59 max_failures: The number of user story run's failures before bailing | 65 max_failures: The number of user story run's failures before bailing |
60 from executing subsequent page runs. If None, we never bail. | 66 from executing subsequent page runs. If None, we never bail. |
61 """ | 67 """ |
62 self._max_failures = max_failures | 68 self._max_failures = max_failures |
| 69 self._has_original_tbm_options = ( |
| 70 self.CreateTimelineBasedMeasurementOptions.__func__ == |
| 71 Benchmark.CreateTimelineBasedMeasurementOptions.__func__) |
| 72 has_original_create_page_test = ( |
| 73 self.CreatePageTest.__func__ == Benchmark.CreatePageTest.__func__) |
| 74 assert self._has_original_tbm_options or has_original_create_page_test, ( |
| 75 'Cannot override both CreatePageTest and ' |
| 76 'CreateTimelineBasedMeasurementOptions.') |
63 | 77 |
64 @classmethod | 78 @classmethod |
65 def Name(cls): | 79 def Name(cls): |
66 name = cls.__module__.split('.')[-1] | 80 name = cls.__module__.split('.')[-1] |
67 if hasattr(cls, 'tag'): | 81 if hasattr(cls, 'tag'): |
68 name += '.' + cls.tag | 82 name += '.' + cls.tag |
69 if hasattr(cls, 'page_set'): | 83 if hasattr(cls, 'page_set'): |
70 name += '.' + cls.page_set.Name() | 84 name += '.' + cls.page_set.Name() |
71 return name | 85 return name |
72 | 86 |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 if os.path.exists(extracted_profile_dir_path): | 214 if os.path.exists(extracted_profile_dir_path): |
201 shutil.rmtree(extracted_profile_dir_path) | 215 shutil.rmtree(extracted_profile_dir_path) |
202 logging.error("Error extracting profile directory zip file: %s", e) | 216 logging.error("Error extracting profile directory zip file: %s", e) |
203 sys.exit(-1) | 217 sys.exit(-1) |
204 | 218 |
205 # Run with freshly extracted profile directory. | 219 # Run with freshly extracted profile directory. |
206 logging.info("Using profile archive directory: %s", | 220 logging.info("Using profile archive directory: %s", |
207 extracted_profile_dir_path) | 221 extracted_profile_dir_path) |
208 options.browser_options.profile_dir = extracted_profile_dir_path | 222 options.browser_options.profile_dir = extracted_profile_dir_path |
209 | 223 |
210 def CreatePageTest(self, options): # pylint: disable=W0613 | 224 def CreateTimelineBasedMeasurementOptions(self): |
211 """Get the PageTest for this Benchmark. | 225 """Return the TimelineBasedMeasurementOptions for this Benchmark. |
212 | 226 |
213 By default, it will create a page test from the test's test attribute. | 227 Override this method to configure a TimelineBasedMeasurement benchmark. |
214 Override to generate a custom page test. | 228 Otherwise, override CreatePageTest for PageTest tests. Do not override |
| 229 both methods. |
215 """ | 230 """ |
216 if not hasattr(self, 'test'): | 231 return timeline_based_measurement.Options() |
217 raise NotImplementedError('This test has no "test" attribute.') | |
218 if not issubclass(self.test, page_test.PageTest): | |
219 raise TypeError('"%s" is not a PageTest.' % self.test.__name__) | |
220 return self.test() | |
221 | 232 |
222 def CreatePageSet(self, options): # pylint: disable=W0613 | 233 def CreatePageTest(self, options): # pylint: disable=unused-argument |
| 234 """Return the PageTest for this Benchmark. |
| 235 |
| 236 Override this method for PageTest tests. |
| 237 Override, override CreateTimelineBasedMeasurementOptions to configure |
| 238 TimelineBasedMeasurement tests. Do not override both methods. |
| 239 |
| 240 Args: |
| 241 options: a browser_options.BrowserFinderOptions instance |
| 242 Returns: |
| 243 |test()| if |test| is a PageTest class. |
| 244 Otherwise, a TimelineBasedMeasurement instance. |
| 245 """ |
| 246 is_page_test = issubclass(self.test, page_test.PageTest) |
| 247 is_tbm = self.test == timeline_based_measurement.TimelineBasedMeasurement |
| 248 if not is_page_test and not is_tbm: |
| 249 raise TypeError('"%s" is not a PageTest or a TimelineBasedMeasurement.' % |
| 250 self.test.__name__) |
| 251 if is_page_test: |
| 252 assert self._has_original_tbm_options, ( |
| 253 'Cannot override CreateTimelineBasedMeasurementOptions ' |
| 254 'with a PageTest.') |
| 255 return self.test() # pylint: disable=no-value-for-parameter |
| 256 return timeline_based_measurement.TimelineBasedMeasurement( |
| 257 self.CreateTimelineBasedMeasurementOptions()) |
| 258 |
| 259 def CreatePageSet(self, options): # pylint: disable=unused-argument |
223 """Get the page set this test will run on. | 260 """Get the page set this test will run on. |
224 | 261 |
225 By default, it will create a page set from the this test's page_set | 262 By default, it will create a page set from the this test's page_set |
226 attribute. Override to generate a custom page set. | 263 attribute. Override to generate a custom page set. |
227 """ | 264 """ |
228 if not hasattr(self, 'page_set'): | 265 if not hasattr(self, 'page_set'): |
229 raise NotImplementedError('This test has no "page_set" attribute.') | 266 raise NotImplementedError('This test has no "page_set" attribute.') |
230 if not issubclass(self.page_set, page_set.PageSet): | 267 if not issubclass(self.page_set, page_set.PageSet): |
231 raise TypeError('"%s" is not a PageSet.' % self.page_set.__name__) | 268 raise TypeError('"%s" is not a PageSet.' % self.page_set.__name__) |
232 return self.page_set() | 269 return self.page_set() |
(...skipping 10 matching lines...) Expand all Loading... |
243 """ | 280 """ |
244 return test_expectations.TestExpectations() | 281 return test_expectations.TestExpectations() |
245 | 282 |
246 | 283 |
247 def AddCommandLineArgs(parser): | 284 def AddCommandLineArgs(parser): |
248 user_story_runner.AddCommandLineArgs(parser) | 285 user_story_runner.AddCommandLineArgs(parser) |
249 | 286 |
250 | 287 |
251 def ProcessCommandLineArgs(parser, args): | 288 def ProcessCommandLineArgs(parser, args): |
252 user_story_runner.ProcessCommandLineArgs(parser, args) | 289 user_story_runner.ProcessCommandLineArgs(parser, args) |
OLD | NEW |