| Index: tools/telemetry/telemetry/record_wpr.py
|
| diff --git a/tools/telemetry/telemetry/record_wpr.py b/tools/telemetry/telemetry/record_wpr.py
|
| deleted file mode 100644
|
| index 6c2c966a14d7e1f52e529d34c55bf7800e6655c3..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/record_wpr.py
|
| +++ /dev/null
|
| @@ -1,286 +0,0 @@
|
| -# Copyright 2012 The Chromium Authors. All rights reserved.
|
| -# 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
|
| -
|
| -from telemetry import benchmark
|
| -from telemetry import story
|
| -from telemetry.core import discover
|
| -from telemetry.core import util
|
| -from telemetry.internal.browser import browser_options
|
| -from telemetry.internal.results import results_options
|
| -from telemetry.internal import story_runner
|
| -from telemetry.internal.util import binary_manager
|
| -from telemetry.internal.util import command_line
|
| -from telemetry.page import page_test
|
| -from telemetry.util import wpr_modes
|
| -from telemetry.web_perf import timeline_based_measurement
|
| -from telemetry.web_perf import timeline_based_page_test
|
| -
|
| -
|
| -class RecorderPageTest(page_test.PageTest):
|
| - def __init__(self):
|
| - super(RecorderPageTest, self).__init__()
|
| - self.page_test = None
|
| -
|
| - def CustomizeBrowserOptions(self, options):
|
| - if self.page_test:
|
| - self.page_test.CustomizeBrowserOptions(options)
|
| -
|
| - def WillStartBrowser(self, browser):
|
| - if self.page_test:
|
| - self.page_test.WillStartBrowser(browser)
|
| -
|
| - def DidStartBrowser(self, browser):
|
| - if self.page_test:
|
| - self.page_test.DidStartBrowser(browser)
|
| -
|
| - def WillNavigateToPage(self, page, tab):
|
| - """Override to ensure all resources are fetched from network."""
|
| - tab.ClearCache(force=False)
|
| - if self.page_test:
|
| - self.page_test.WillNavigateToPage(page, tab)
|
| -
|
| - def DidNavigateToPage(self, page, tab):
|
| - if self.page_test:
|
| - self.page_test.DidNavigateToPage(page, tab)
|
| - tab.WaitForDocumentReadyStateToBeComplete()
|
| - util.WaitFor(tab.HasReachedQuiescence, 30)
|
| -
|
| - def CleanUpAfterPage(self, page, tab):
|
| - if self.page_test:
|
| - self.page_test.CleanUpAfterPage(page, tab)
|
| -
|
| - def ValidateAndMeasurePage(self, page, tab, results):
|
| - if self.page_test:
|
| - self.page_test.ValidateAndMeasurePage(page, tab, results)
|
| -
|
| - def RunNavigateSteps(self, page, tab):
|
| - if self.page_test:
|
| - self.page_test.RunNavigateSteps(page, tab)
|
| - else:
|
| - super(RecorderPageTest, self).RunNavigateSteps(page, tab)
|
| -
|
| -
|
| -def _GetSubclasses(base_dir, cls):
|
| - """Returns all subclasses of |cls| in |base_dir|.
|
| -
|
| - Args:
|
| - cls: a class
|
| -
|
| - Returns:
|
| - dict of {underscored_class_name: benchmark class}
|
| - """
|
| - 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 = _GetSubclasses(base_dir, cls)
|
| - return classes[target]() if target in classes else None
|
| -
|
| -
|
| -def _PrintAllImpl(all_items, item_name, output_stream):
|
| - output_stream.write('Available %s\' names with descriptions:\n' % item_name)
|
| - keys = sorted(all_items.keys())
|
| - key_description = [(k, all_items[k].Description()) for k in keys]
|
| - _PrintPairs(key_description, output_stream)
|
| - output_stream.write('\n')
|
| -
|
| -
|
| -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.
|
| - _PrintAllImpl(_GetSubclasses(base_dir, benchmark.Benchmark), 'benchmarks',
|
| - output_stream)
|
| -
|
| -
|
| -def _PrintAllStories(base_dir, output_stream):
|
| - # TODO: actually print all stories once record_wpr support general
|
| - # stories recording.
|
| - _PrintAllImpl(_GetSubclasses(base_dir, story.StorySet), 'story sets',
|
| - output_stream)
|
| -
|
| -
|
| -def _PrintPairs(pairs, output_stream, prefix=''):
|
| - """Prints a list of string pairs with alignment."""
|
| - first_column_length = max(len(a) for a, _ in pairs)
|
| - format_string = '%s%%-%ds %%s\n' % (prefix, first_column_length)
|
| - for a, b in pairs:
|
| - output_stream.write(format_string % (a, b.strip()))
|
| -
|
| -
|
| -class WprRecorder(object):
|
| -
|
| - def __init__(self, base_dir, target, args=None):
|
| - self._base_dir = base_dir
|
| - self._record_page_test = RecorderPageTest()
|
| - self._options = self._CreateOptions()
|
| -
|
| - self._benchmark = _MaybeGetInstanceOfClass(target, base_dir,
|
| - benchmark.Benchmark)
|
| - self._parser = self._options.CreateParser(usage='See %prog --help')
|
| - self._AddCommandLineArgs()
|
| - self._ParseArgs(args)
|
| - self._ProcessCommandLineArgs()
|
| - if self._benchmark is not None:
|
| - test = self._benchmark.CreatePageTest(self.options)
|
| - if isinstance(test, timeline_based_measurement.TimelineBasedMeasurement):
|
| - test = timeline_based_page_test.TimelineBasedPageTest(test)
|
| - # This must be called after the command line args are added.
|
| - self._record_page_test.page_test = test
|
| -
|
| - self._page_set_base_dir = (
|
| - self._options.page_set_base_dir if self._options.page_set_base_dir
|
| - else self._base_dir)
|
| - self._story_set = self._GetStorySet(target)
|
| -
|
| - @property
|
| - def options(self):
|
| - return self._options
|
| -
|
| - def _CreateOptions(self):
|
| - options = browser_options.BrowserFinderOptions()
|
| - options.browser_options.wpr_mode = wpr_modes.WPR_RECORD
|
| - options.browser_options.no_proxy_server = True
|
| - return options
|
| -
|
| - def CreateResults(self):
|
| - if self._benchmark is not None:
|
| - benchmark_metadata = self._benchmark.GetMetadata()
|
| - else:
|
| - benchmark_metadata = benchmark.BenchmarkMetadata('record_wpr')
|
| -
|
| - return results_options.CreateResults(benchmark_metadata, self._options)
|
| -
|
| - def _AddCommandLineArgs(self):
|
| - self._parser.add_option('--page-set-base-dir', action='store',
|
| - type='string')
|
| - story_runner.AddCommandLineArgs(self._parser)
|
| - if self._benchmark is not None:
|
| - self._benchmark.AddCommandLineArgs(self._parser)
|
| - self._benchmark.SetArgumentDefaults(self._parser)
|
| - self._parser.add_option('--upload', action='store_true')
|
| - self._SetArgumentDefaults()
|
| -
|
| - def _SetArgumentDefaults(self):
|
| - self._parser.set_defaults(**{'output_formats': ['none']})
|
| -
|
| - def _ParseArgs(self, args=None):
|
| - args_to_parse = sys.argv[1:] if args is None else args
|
| - self._parser.parse_args(args_to_parse)
|
| -
|
| - def _ProcessCommandLineArgs(self):
|
| - story_runner.ProcessCommandLineArgs(self._parser, self._options)
|
| -
|
| - if self._options.use_live_sites:
|
| - self._parser.error("Can't --use-live-sites while recording")
|
| -
|
| - if self._benchmark is not None:
|
| - self._benchmark.ProcessCommandLineArgs(self._parser, self._options)
|
| -
|
| - def _GetStorySet(self, target):
|
| - if self._benchmark is not None:
|
| - return self._benchmark.CreateStorySet(self._options)
|
| - story_set = _MaybeGetInstanceOfClass(target, self._page_set_base_dir,
|
| - story.StorySet)
|
| - if story_set is None:
|
| - sys.stderr.write('Target %s is neither benchmark nor story set.\n'
|
| - % target)
|
| - if not self._HintMostLikelyBenchmarksStories(target):
|
| - sys.stderr.write(
|
| - 'Found no similar benchmark or story. Please use '
|
| - '--list-benchmarks or --list-stories to list candidates.\n')
|
| - self._parser.print_usage()
|
| - sys.exit(1)
|
| - return story_set
|
| -
|
| - def _HintMostLikelyBenchmarksStories(self, target):
|
| - def _Impl(all_items, category_name):
|
| - candidates = command_line.GetMostLikelyMatchedObject(
|
| - all_items.iteritems(), target, name_func=lambda kv: kv[1].Name())
|
| - if candidates:
|
| - sys.stderr.write('\nDo you mean any of those %s below?\n' %
|
| - category_name)
|
| - _PrintPairs([(k, v.Description()) for k, v in candidates], sys.stderr)
|
| - return True
|
| - return False
|
| -
|
| - has_benchmark_hint = _Impl(
|
| - _GetSubclasses(self._base_dir, benchmark.Benchmark), 'benchmarks')
|
| - has_story_hint = _Impl(
|
| - _GetSubclasses(self._base_dir, story.StorySet), 'stories')
|
| - return has_benchmark_hint or has_story_hint
|
| -
|
| - def Record(self, results):
|
| - assert self._story_set.wpr_archive_info, (
|
| - 'Pageset archive_data_file path must be specified.')
|
| - self._story_set.wpr_archive_info.AddNewTemporaryRecording()
|
| - self._record_page_test.CustomizeBrowserOptions(self._options)
|
| - story_runner.Run(self._record_page_test, self._story_set,
|
| - self._options, results)
|
| -
|
| - def HandleResults(self, results, upload_to_cloud_storage):
|
| - if results.failures or results.skipped_values:
|
| - logging.warning('Some pages failed and/or were skipped. The recording '
|
| - 'has not been updated for these pages.')
|
| - results.PrintSummary()
|
| - self._story_set.wpr_archive_info.AddRecordedStories(
|
| - results.pages_that_succeeded,
|
| - upload_to_cloud_storage)
|
| -
|
| -
|
| -# TODO(nednguyen): use benchmark.Environment instead of base_dir for discovering
|
| -# benchmark & story classes.
|
| -def Main(base_dir):
|
| -
|
| - parser = argparse.ArgumentParser(
|
| - usage='Record a benchmark or a story (page set).')
|
| - parser.add_argument(
|
| - 'benchmark',
|
| - help=('benchmark name. This argument is optional. If both benchmark name '
|
| - 'and story name are specified, this takes precedence as the '
|
| - 'target of the recording.'),
|
| - nargs='?')
|
| - parser.add_argument('--story', help='story (page set) name')
|
| - parser.add_argument('--list-stories', dest='list_stories',
|
| - action='store_true', help='list all 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 or args.list_stories:
|
| - if args.list_benchmarks:
|
| - _PrintAllBenchmarks(base_dir, sys.stderr)
|
| - if args.list_stories:
|
| - _PrintAllStories(base_dir, sys.stderr)
|
| - return 0
|
| -
|
| - target = args.benchmark or args.story
|
| -
|
| - if not target:
|
| - sys.stderr.write('Please specify target (benchmark or story). Please refer '
|
| - 'usage below\n\n')
|
| - parser.print_help()
|
| - return 0
|
| -
|
| - # TODO(aiolos): We should add getting the client config from the
|
| - # benchmark.Environment once it's added. Not currently needed though.
|
| - binary_manager.InitDependencyManager(None)
|
| -
|
| - # TODO(nednguyen): update WprRecorder so that it handles the difference
|
| - # between recording a benchmark vs recording a 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, args.upload)
|
| - return min(255, len(results.failures))
|
|
|