Index: tools/telemetry/telemetry/record_wpr.py |
diff --git a/tools/telemetry/telemetry/record_wpr.py b/tools/telemetry/telemetry/record_wpr.py |
index 6d0ecbf70181f96f125f1d43d0ef20e321f2b721..8ce19746f37e05e8a86ebd6576768d163205de6b 100644 |
--- a/tools/telemetry/telemetry/record_wpr.py |
+++ b/tools/telemetry/telemetry/record_wpr.py |
@@ -2,6 +2,7 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
+import argparse |
import logging |
import sys |
@@ -16,7 +17,8 @@ from telemetry.page import page_test |
from telemetry.page import test_expectations |
from telemetry.results import results_options |
-class RecorderPageTest(page_test.PageTest): # pylint: disable=W0223 |
+ |
+class RecorderPageTest(page_test.PageTest): |
def __init__(self): |
super(RecorderPageTest, self).__init__() |
self.page_test = None |
@@ -68,14 +70,43 @@ class RecorderPageTest(page_test.PageTest): # pylint: disable=W0223 |
super(RecorderPageTest, self).RunNavigateSteps(page, tab) |
+def _GetSubclasses(base_dir, cls): |
+ """ Return all subclasses of |cls| in |base_dir|. |
+ Args: |
+ cls: a class |
+ Returns: |
+ |
+ """ |
+ return discover.DiscoverClasses(base_dir, base_dir, cls, |
+ index_by_class_name=True) |
+ |
+ |
def _MaybeGetInstanceOfClass(target, base_dir, cls): |
if isinstance(target, cls): |
return target |
- classes = discover.DiscoverClasses(base_dir, base_dir, cls, |
- index_by_class_name=True) |
+ classes = _GetSubclasses(base_dir, cls) |
return classes[target]() if target in classes else None |
+def _PrintAllBenchmarks(base_dir, output_stream): |
+ # TODO: reuse the logic of finding supported benchmarks in benchmark_runner.py |
+ # so this only prints out benchmarks that are supported by the recording |
+ # platform. |
+ classes = _GetSubclasses(base_dir, benchmark.Benchmark) |
+ output_stream.write('Available benchmarks\' names:\n\n') |
+ for k in classes: |
+ output_stream.write('%s\n' % k) |
+ |
+ |
+def _PrintAllUserStories(base_dir, output_stream): |
+ output_stream.write('Available page sets\' names:\n\n') |
+ # TODO: actually print all user stories once record_wpr support general |
+ # user stories recording. |
+ classes = _GetSubclasses(base_dir, page_set.PageSet) |
+ for k in classes: |
+ output_stream.write('%s\n' % k) |
+ |
+ |
class WprRecorder(object): |
def __init__(self, base_dir, target, args=None): |
@@ -84,7 +115,7 @@ class WprRecorder(object): |
self._benchmark = _MaybeGetInstanceOfClass(target, base_dir, |
benchmark.Benchmark) |
- self._parser = self._options.CreateParser(usage='%prog <PageSet|Benchmark>') |
+ self._parser = self._options.CreateParser(usage='See %prog --help') |
self._AddCommandLineArgs() |
self._ParseArgs(args) |
self._ProcessCommandLineArgs() |
@@ -166,22 +197,43 @@ class WprRecorder(object): |
upload_to_cloud_storage) |
+# TODO(nednguyen): use benchmark.Environment instead of base_dir for discovering |
+# benchmark & user story classes. |
def Main(base_dir): |
- quick_args = [] |
- upload_to_cloud_storage = False |
- |
- for a in sys.argv[1:]: |
- if not a.startswith('-'): |
- quick_args.append(a) |
- elif a == '--upload': |
- upload_to_cloud_storage = True |
- |
- if len(quick_args) != 1: |
- print >> sys.stderr, 'Usage: record_wpr <PageSet|Benchmark> [--upload]\n' |
- sys.exit(1) |
- target = quick_args.pop() |
- wpr_recorder = WprRecorder(base_dir, target) |
+ |
+ parser = argparse.ArgumentParser( |
+ usage='Record a benchmark or a user story (page set).') |
+ parser.add_argument( |
+ 'benchmark', type=str, |
+ help=('benchmark name. This argument is optional. If both benchmark name ' |
+ 'and user story name are specified, this takes precedence as the ' |
+ 'target of the recording.'), |
+ nargs='?') |
+ parser.add_argument('--story', dest='story', type=str, |
+ help='user story (page set) name') |
+ parser.add_argument('--list-stories', dest='list_stories', |
+ action='store_true', help='list all user story names.') |
+ parser.add_argument('--list-benchmarks', dest='list_benchmarks', |
+ action='store_true', help='list all benchmark names.') |
+ parser.add_argument('--upload', action='store_true', |
+ help='upload to cloud storage.') |
+ args, extra_args = parser.parse_known_args() |
+ |
+ if args.list_benchmarks: |
+ _PrintAllBenchmarks(base_dir, sys.stderr) |
+ elif args.list_stories: |
+ _PrintAllUserStories(base_dir, sys.stderr) |
+ |
+ target = args.benchmark or args.story |
+ |
+ if not target: |
+ return 0 |
+ |
+ # TODO(nednguyen): update WprRecorder so that it handles the difference |
+ # between recording a benchmark vs recording a user story better based on |
+ # the distinction between args.benchmark & args.story |
+ wpr_recorder = WprRecorder(base_dir, target, extra_args) |
results = wpr_recorder.CreateResults() |
wpr_recorder.Record(results) |
- wpr_recorder.HandleResults(results, upload_to_cloud_storage) |
+ wpr_recorder.HandleResults(results, args.upload) |
return min(255, len(results.failures)) |