| OLD | NEW |
| 1 # Copyright 2012 The Chromium Authors. All rights reserved. | 1 # Copyright 2012 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 argparse |
| 5 import logging | 6 import logging |
| 6 import sys | 7 import sys |
| 7 | 8 |
| 8 from telemetry import benchmark | 9 from telemetry import benchmark |
| 9 from telemetry.core import browser_options | 10 from telemetry.core import browser_options |
| 10 from telemetry.core import discover | 11 from telemetry.core import discover |
| 11 from telemetry.core import util | 12 from telemetry.core import util |
| 12 from telemetry.core import wpr_modes | 13 from telemetry.core import wpr_modes |
| 13 from telemetry.internal import story_runner | 14 from telemetry.internal import story_runner |
| 14 from telemetry.page import page_set | 15 from telemetry.page import page_set |
| 15 from telemetry.page import page_test | 16 from telemetry.page import page_test |
| 16 from telemetry.page import test_expectations | 17 from telemetry.page import test_expectations |
| 17 from telemetry.results import results_options | 18 from telemetry.results import results_options |
| 18 | 19 |
| 19 class RecorderPageTest(page_test.PageTest): # pylint: disable=W0223 | 20 |
| 21 class RecorderPageTest(page_test.PageTest): |
| 20 def __init__(self): | 22 def __init__(self): |
| 21 super(RecorderPageTest, self).__init__() | 23 super(RecorderPageTest, self).__init__() |
| 22 self.page_test = None | 24 self.page_test = None |
| 23 | 25 |
| 24 def CustomizeBrowserOptions(self, options): | 26 def CustomizeBrowserOptions(self, options): |
| 25 if self.page_test: | 27 if self.page_test: |
| 26 self.page_test.CustomizeBrowserOptions(options) | 28 self.page_test.CustomizeBrowserOptions(options) |
| 27 | 29 |
| 28 def WillStartBrowser(self, browser): | 30 def WillStartBrowser(self, browser): |
| 29 if self.page_test: | 31 if self.page_test: |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 | 63 |
| 62 super(RecorderPageTest, self).RunPage(page, tab, results) | 64 super(RecorderPageTest, self).RunPage(page, tab, results) |
| 63 | 65 |
| 64 def RunNavigateSteps(self, page, tab): | 66 def RunNavigateSteps(self, page, tab): |
| 65 if self.page_test: | 67 if self.page_test: |
| 66 self.page_test.RunNavigateSteps(page, tab) | 68 self.page_test.RunNavigateSteps(page, tab) |
| 67 else: | 69 else: |
| 68 super(RecorderPageTest, self).RunNavigateSteps(page, tab) | 70 super(RecorderPageTest, self).RunNavigateSteps(page, tab) |
| 69 | 71 |
| 70 | 72 |
| 73 def _GetSubclasses(base_dir, cls): |
| 74 """ Return all subclasses of |cls| in |base_dir|. |
| 75 Args: |
| 76 cls: a class |
| 77 Returns: |
| 78 |
| 79 """ |
| 80 return discover.DiscoverClasses(base_dir, base_dir, cls, |
| 81 index_by_class_name=True) |
| 82 |
| 83 |
| 71 def _MaybeGetInstanceOfClass(target, base_dir, cls): | 84 def _MaybeGetInstanceOfClass(target, base_dir, cls): |
| 72 if isinstance(target, cls): | 85 if isinstance(target, cls): |
| 73 return target | 86 return target |
| 74 classes = discover.DiscoverClasses(base_dir, base_dir, cls, | 87 classes = _GetSubclasses(base_dir, cls) |
| 75 index_by_class_name=True) | |
| 76 return classes[target]() if target in classes else None | 88 return classes[target]() if target in classes else None |
| 77 | 89 |
| 78 | 90 |
| 91 def _PrintAllBenchmarks(base_dir, output_stream): |
| 92 # TODO: reuse the logic of finding supported benchmarks in benchmark_runner.py |
| 93 # so this only prints out benchmarks that are supported by the recording |
| 94 # platform. |
| 95 classes = _GetSubclasses(base_dir, benchmark.Benchmark) |
| 96 output_stream.write('Available benchmarks\' names:\n\n') |
| 97 for k in classes: |
| 98 output_stream.write('%s\n' % k) |
| 99 |
| 100 |
| 101 def _PrintAllUserStories(base_dir, output_stream): |
| 102 output_stream.write('Available page sets\' names:\n\n') |
| 103 # TODO: actually print all user stories once record_wpr support general |
| 104 # user stories recording. |
| 105 classes = _GetSubclasses(base_dir, page_set.PageSet) |
| 106 for k in classes: |
| 107 output_stream.write('%s\n' % k) |
| 108 |
| 109 |
| 79 class WprRecorder(object): | 110 class WprRecorder(object): |
| 80 | 111 |
| 81 def __init__(self, base_dir, target, args=None): | 112 def __init__(self, base_dir, target, args=None): |
| 82 self._record_page_test = RecorderPageTest() | 113 self._record_page_test = RecorderPageTest() |
| 83 self._options = self._CreateOptions() | 114 self._options = self._CreateOptions() |
| 84 | 115 |
| 85 self._benchmark = _MaybeGetInstanceOfClass(target, base_dir, | 116 self._benchmark = _MaybeGetInstanceOfClass(target, base_dir, |
| 86 benchmark.Benchmark) | 117 benchmark.Benchmark) |
| 87 self._parser = self._options.CreateParser(usage='%prog <PageSet|Benchmark>') | 118 self._parser = self._options.CreateParser(usage='See %prog --help') |
| 88 self._AddCommandLineArgs() | 119 self._AddCommandLineArgs() |
| 89 self._ParseArgs(args) | 120 self._ParseArgs(args) |
| 90 self._ProcessCommandLineArgs() | 121 self._ProcessCommandLineArgs() |
| 91 if self._benchmark is not None: | 122 if self._benchmark is not None: |
| 92 # This must be called after the command line args are added. | 123 # This must be called after the command line args are added. |
| 93 self._record_page_test.page_test = self._benchmark.CreatePageTest( | 124 self._record_page_test.page_test = self._benchmark.CreatePageTest( |
| 94 self.options) | 125 self.options) |
| 95 | 126 |
| 96 if self._options.page_set_base_dir: | 127 if self._options.page_set_base_dir: |
| 97 page_set_base_dir = self._options.page_set_base_dir | 128 page_set_base_dir = self._options.page_set_base_dir |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 def HandleResults(self, results, upload_to_cloud_storage): | 190 def HandleResults(self, results, upload_to_cloud_storage): |
| 160 if results.failures or results.skipped_values: | 191 if results.failures or results.skipped_values: |
| 161 logging.warning('Some pages failed and/or were skipped. The recording ' | 192 logging.warning('Some pages failed and/or were skipped. The recording ' |
| 162 'has not been updated for these pages.') | 193 'has not been updated for these pages.') |
| 163 results.PrintSummary() | 194 results.PrintSummary() |
| 164 self._page_set.wpr_archive_info.AddRecordedUserStories( | 195 self._page_set.wpr_archive_info.AddRecordedUserStories( |
| 165 results.pages_that_succeeded, | 196 results.pages_that_succeeded, |
| 166 upload_to_cloud_storage) | 197 upload_to_cloud_storage) |
| 167 | 198 |
| 168 | 199 |
| 200 # TODO(nednguyen): use benchmark.Environment instead of base_dir for discovering |
| 201 # benchmark & user story classes. |
| 169 def Main(base_dir): | 202 def Main(base_dir): |
| 170 quick_args = [] | |
| 171 upload_to_cloud_storage = False | |
| 172 | 203 |
| 173 for a in sys.argv[1:]: | 204 parser = argparse.ArgumentParser( |
| 174 if not a.startswith('-'): | 205 usage='Record a benchmark or a user story (page set).') |
| 175 quick_args.append(a) | 206 parser.add_argument( |
| 176 elif a == '--upload': | 207 'benchmark', type=str, |
| 177 upload_to_cloud_storage = True | 208 help=('benchmark name. This argument is optional. If both benchmark name ' |
| 209 'and user story name are specified, this takes precedence as the ' |
| 210 'target of the recording.'), |
| 211 nargs='?') |
| 212 parser.add_argument('--story', dest='story', type=str, |
| 213 help='user story (page set) name') |
| 214 parser.add_argument('--list-stories', dest='list_stories', |
| 215 action='store_true', help='list all user story names.') |
| 216 parser.add_argument('--list-benchmarks', dest='list_benchmarks', |
| 217 action='store_true', help='list all benchmark names.') |
| 218 parser.add_argument('--upload', action='store_true', |
| 219 help='upload to cloud storage.') |
| 220 args, extra_args = parser.parse_known_args() |
| 178 | 221 |
| 179 if len(quick_args) != 1: | 222 if args.list_benchmarks: |
| 180 print >> sys.stderr, 'Usage: record_wpr <PageSet|Benchmark> [--upload]\n' | 223 _PrintAllBenchmarks(base_dir, sys.stderr) |
| 181 sys.exit(1) | 224 elif args.list_stories: |
| 182 target = quick_args.pop() | 225 _PrintAllUserStories(base_dir, sys.stderr) |
| 183 wpr_recorder = WprRecorder(base_dir, target) | 226 |
| 227 target = args.benchmark or args.story |
| 228 |
| 229 if not target: |
| 230 return 0 |
| 231 |
| 232 # TODO(nednguyen): update WprRecorder so that it handles the difference |
| 233 # between recording a benchmark vs recording a user story better based on |
| 234 # the distinction between args.benchmark & args.story |
| 235 wpr_recorder = WprRecorder(base_dir, target, extra_args) |
| 184 results = wpr_recorder.CreateResults() | 236 results = wpr_recorder.CreateResults() |
| 185 wpr_recorder.Record(results) | 237 wpr_recorder.Record(results) |
| 186 wpr_recorder.HandleResults(results, upload_to_cloud_storage) | 238 wpr_recorder.HandleResults(results, args.upload) |
| 187 return min(255, len(results.failures)) | 239 return min(255, len(results.failures)) |
| OLD | NEW |