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 |