| 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 |