Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Unified Diff: tools/telemetry/telemetry/page/record_wpr.py

Issue 374793002: Refactor of record_wpr.py (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git rebase Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/telemetry/telemetry/page/record_wpr_unittest.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/telemetry/telemetry/page/record_wpr.py
diff --git a/tools/telemetry/telemetry/page/record_wpr.py b/tools/telemetry/telemetry/page/record_wpr.py
index 9491e4d9a8280ef57263c2bb12f2e42089b6dd72..561a7f9d85e95c960bf8b011499dbb4d6415fa92 100755
--- a/tools/telemetry/telemetry/page/record_wpr.py
+++ b/tools/telemetry/telemetry/page/record_wpr.py
@@ -18,20 +18,14 @@ from telemetry.page import page_set
from telemetry.page import page_test
from telemetry.page import profile_creator
from telemetry.page import test_expectations
-from telemetry.page.actions import action_runner as action_runner_module
from telemetry.results import page_measurement_results
-class RecordPage(page_test.PageTest): # pylint: disable=W0223
- def __init__(self, measurements):
- # This class overwrites PageTest.Run, so that the test method name is not
- # really used (except for throwing an exception if it doesn't exist).
- super(RecordPage, self).__init__('Run')
- self._action_names = set(
- [measurement().action_name_to_run
- for measurement in measurements.values()
- if measurement().action_name_to_run])
- self.test = None
+class RecorderPageTest(page_test.PageTest): # pylint: disable=W0223
+ def __init__(self, action_names):
+ super(RecorderPageTest, self).__init__()
+ self._action_names = action_names
+ self.page_test = None
def CanRunForPage(self, page):
return page.url.startswith('http')
@@ -39,14 +33,25 @@ class RecordPage(page_test.PageTest): # pylint: disable=W0223
def WillNavigateToPage(self, page, tab):
"""Override to ensure all resources are fetched from network."""
tab.ClearCache(force=False)
- if self.test:
- self.test.options = self.options
- self.test.WillNavigateToPage(page, tab)
+ if self.page_test:
+ self.page_test.options = self.options
+ self.page_test.WillNavigateToPage(page, tab)
def DidNavigateToPage(self, page, tab):
- """Forward the call to the test."""
- if self.test:
- self.test.DidNavigateToPage(page, tab)
+ if self.page_test:
+ self.page_test.DidNavigateToPage(page, tab)
+
+ def WillRunActions(self, page, tab):
+ if self.page_test:
+ self.page_test.WillRunActions(page, tab)
+
+ def DidRunActions(self, page, tab):
+ if self.page_test:
+ self.page_test.DidRunActions(page, tab)
+
+ def ValidatePage(self, page, tab, results):
+ if self.page_test:
+ self.page_test.ValidatePage(page, tab, results)
def RunPage(self, page, tab, results):
tab.WaitForDocumentReadyStateToBeComplete()
@@ -58,96 +63,138 @@ class RecordPage(page_test.PageTest): # pylint: disable=W0223
# speed index metric.
time.sleep(3)
- # Run the actions for all measurements. Reload the page between
- # actions.
+ # When running record_wpr, results is a GTestTestResults, so we create a
+ # dummy PageMeasurementResults that implements the functions we use.
+ # TODO(chrishenry): Fix the need for a dummy_results object.
+ dummy_results = page_measurement_results.PageMeasurementResults()
+
+ if self.page_test:
+ self._action_name_to_run = self.page_test.action_name_to_run
+ self.page_test.RunPage(page, tab, dummy_results)
+ return
+
should_reload = False
- interactive = self.options and self.options.interactive
+ # Run the actions on the page for all available measurements.
for action_name in self._action_names:
+ # Skip this action if it is not defined
if not hasattr(page, action_name):
continue
+ # Reload the page between actions to start with a clean slate.
if should_reload:
self.RunNavigateSteps(page, tab)
- action_runner = action_runner_module.ActionRunner(tab)
- if interactive:
- action_runner.PauseInteractive()
- else:
- self._RunMethod(page, action_name, action_runner)
+ self._action_name_to_run = action_name
+ super(RecorderPageTest, self).RunPage(page, tab, dummy_results)
should_reload = True
- # Run the PageTest's validator, so that we capture any additional resources
- # that are loaded by the test.
- if self.test:
- dummy_results = page_measurement_results.PageMeasurementResults()
- self.test.ValidatePage(page, tab, dummy_results)
+ def RunNavigateSteps(self, page, tab):
+ if self.page_test:
+ self.page_test.RunNavigateSteps(page, tab)
+ else:
+ super(RecorderPageTest, self).RunNavigateSteps(page, tab)
+
+
+def FindAllActionNames(base_dir):
+ """Returns a set of of all action names used in our measurements."""
+ action_names = set()
+ # Get all PageMeasurements except for ProfileCreators (see crbug.com/319573)
+ for _, cls in discover.DiscoverClasses(
+ base_dir, base_dir, page_measurement.PageMeasurement).items():
+ if not issubclass(cls, profile_creator.ProfileCreator):
+ action_name = cls().action_name_to_run
+ if action_name:
+ action_names.add(action_name)
+ return action_names
+
+
+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)
+ return classes[target]() if target in classes else None
+
+
+class WprRecorder(object):
+
+ def __init__(self, base_dir, target, extra_args=None):
+ action_names_to_run = FindAllActionNames(base_dir)
+ self._record_page_test = RecorderPageTest(action_names_to_run)
+ self._temp_target_wpr_file_path = tempfile.mkstemp()[1]
+ self._options = self._CreateOptions()
+
+ self._benchmark = _MaybeGetInstanceOfClass(target, base_dir,
+ benchmark.Benchmark)
+ if self._benchmark is not None:
+ self._record_page_test.page_test = self._benchmark.test()
+ self._parser = self._options.CreateParser(usage='%prog <PageSet|Benchmark>')
+ self._AddCommandLineArgs()
+ self._ParseArgs(extra_args)
+ self._ProcessCommandLineArgs()
+ self._page_set = self._GetPageSet(base_dir, 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 _AddCommandLineArgs(self):
+ page_runner.AddCommandLineArgs(self._parser)
+ if self._benchmark is not None:
+ self._benchmark.AddCommandLineArgs(self._parser)
+ self._benchmark.SetArgumentDefaults(self._parser)
+
+ def _ParseArgs(self, extra_args=None):
+ args = sys.argv[1:]
+ if extra_args is not None:
+ args += extra_args
+ self._parser.parse_args(args)
+
+ def _ProcessCommandLineArgs(self):
+ page_runner.ProcessCommandLineArgs(self._parser, self._options)
+ if self._benchmark is not None:
+ self._benchmark.ProcessCommandLineArgs(self._parser, self._options)
+
+ def _GetPageSet(self, base_dir, target):
+ if self._benchmark is not None:
+ return self._benchmark.CreatePageSet(self._options)
+ ps = _MaybeGetInstanceOfClass(target, base_dir, page_set.PageSet)
+ if ps is None:
+ self._parser.print_usage()
+ sys.exit(1)
+ return ps
+
+ def Record(self):
+ self._page_set.wpr_archive_info.AddNewTemporaryRecording(
+ self._temp_target_wpr_file_path)
+ self._record_page_test.CustomizeBrowserOptions(self._options)
+ return page_runner.Run(self._record_page_test, self._page_set,
+ test_expectations.TestExpectations(), self._options)
+
+ def HandleResults(self, results):
+ if results.failures or results.skipped:
+ logging.warning('Some pages failed and/or were skipped. The recording '
+ 'has not been updated for these pages.')
+ results.PrintSummary()
+
+ if results.successes:
+ # Update the metadata for the pages which were recorded.
+ self._page_set.wpr_archive_info.AddRecordedPages(results.successes)
+ else:
+ os.remove(self._temp_target_wpr_file_path)
def Main(base_dir):
- measurements = {
- n: cls for n, cls in discover.DiscoverClasses(
- base_dir, base_dir, page_measurement.PageMeasurement).items()
- # Filter out unneeded ProfileCreators (crbug.com/319573).
- if not issubclass(cls, profile_creator.ProfileCreator)
- }
- tests = discover.DiscoverClasses(base_dir, base_dir, benchmark.Benchmark,
- index_by_class_name=True)
-
- options = browser_options.BrowserFinderOptions()
- parser = options.CreateParser('%prog <PageSet|Test|URL>')
- page_runner.AddCommandLineArgs(parser)
-
- recorder = RecordPage(measurements)
- recorder.AddCommandLineArgs(parser)
-
quick_args = [a for a in sys.argv[1:] if not a.startswith('-')]
if len(quick_args) != 1:
- parser.print_usage()
+ print >> sys.stderr, 'Usage: record_wpr <PageSet|Benchmark>\n'
sys.exit(1)
- target = quick_args[0]
- if target in tests:
- recorder.test = tests[target]().test()
- recorder.test.AddCommandLineArgs(parser)
- recorder.test.SetArgumentDefaults(parser)
- parser.parse_args()
- recorder.test.ProcessCommandLineArgs(parser, options)
- ps = tests[target]().CreatePageSet(options)
- elif discover.IsPageSetFile(target):
- parser.parse_args()
- ps = page_set.PageSet.FromFile(target)
- else:
- parser.print_usage()
- sys.exit(1)
-
- page_runner.ProcessCommandLineArgs(parser, options)
- recorder.ProcessCommandLineArgs(parser, options)
-
- expectations = test_expectations.TestExpectations()
-
- # Set the archive path to something temporary.
- temp_target_wpr_file_path = tempfile.mkstemp()[1]
- ps.wpr_archive_info.AddNewTemporaryRecording(temp_target_wpr_file_path)
-
- # Do the actual recording.
- options.browser_options.wpr_mode = wpr_modes.WPR_RECORD
- options.browser_options.no_proxy_server = True
- recorder.CustomizeBrowserOptions(options)
- results = page_runner.Run(recorder, ps, expectations, options)
-
- if results.failures:
- logging.warning('Some pages failed. The recording has not been updated for '
- 'these pages.')
- logging.warning('Failed pages:\n%s', '\n'.join(
- p.display_name for p in results.pages_that_had_failures))
-
- if results.skipped:
- logging.warning('Some pages were skipped. The recording has not been '
- 'updated for these pages.')
- logging.warning('Skipped pages:\n%s', '\n'.join(
- p.display_name for p in zip(*results.skipped)[0]))
-
- if results.successes:
- # Update the metadata for the pages which were recorded.
- ps.wpr_archive_info.AddRecordedPages(results.successes)
- else:
- os.remove(temp_target_wpr_file_path)
-
+ target = quick_args.pop()
+ wpr_recorder = WprRecorder(base_dir, target)
+ results = wpr_recorder.Record()
+ wpr_recorder.HandleResults(results)
return min(255, len(results.failures))
« no previous file with comments | « no previous file | tools/telemetry/telemetry/page/record_wpr_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698