| Index: tools/telemetry/telemetry/page/page_runner.py
|
| diff --git a/tools/telemetry/telemetry/page/page_runner.py b/tools/telemetry/telemetry/page/page_runner.py
|
| index e06261e5e6590dceac75ac559663500065c25ff2..5064c64ece4719b7213bbd29f41b3571ce4a190f 100644
|
| --- a/tools/telemetry/telemetry/page/page_runner.py
|
| +++ b/tools/telemetry/telemetry/page/page_runner.py
|
| @@ -1,4 +1,4 @@
|
| -# Copyright 2014 The Chromium Authors. All rights reserved.
|
| +# Copyright 2014 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.
|
|
|
| @@ -27,8 +27,10 @@ from telemetry.value import skip
|
|
|
|
|
| class _RunState(object):
|
| - def __init__(self, test):
|
| + def __init__(self, test, finder_options):
|
| self.browser = None
|
| + self._finder_options = finder_options
|
| + self._possible_browser = self._GetPossibleBrowser(test, finder_options)
|
|
|
| # TODO(slamm): Remove _append_to_existing_wpr when replay lifetime changes.
|
| self._append_to_existing_wpr = False
|
| @@ -38,10 +40,49 @@ class _RunState(object):
|
| self._current_page = None
|
| self._current_tab = None
|
|
|
| - def _PrepareWpr(self, finder_options, network_controller, archive_path,
|
| + def _GetPossibleBrowser(self, test, finder_options):
|
| + ''' Return a possible_browser with the given options. '''
|
| + possible_browser = browser_finder.FindBrowser(finder_options)
|
| + if not possible_browser:
|
| + raise browser_finder.BrowserFinderException(
|
| + 'No browser found.\n\nAvailable browsers:\n%s\n' %
|
| + '\n'.join(browser_finder.GetAllAvailableBrowserTypes(finder_options)))
|
| + finder_options.browser_options.browser_type = (
|
| + possible_browser.browser_type)
|
| +
|
| + if (not decorators.IsEnabled(test, possible_browser) and
|
| + not finder_options.run_disabled_tests):
|
| + logging.warning('You are trying to run a disabled test.')
|
| + logging.warning('Pass --also-run-disabled-tests to squelch this message.')
|
| + sys.exit(0)
|
| +
|
| + if possible_browser.IsRemote():
|
| + possible_browser.RunRemote()
|
| + sys.exit(0)
|
| + return possible_browser
|
| +
|
| + def WillRunPage(self, page):
|
| + if self._finder_options.profiler:
|
| + self._StartProfiling(self._current_page)
|
| + self._current_page = page
|
| +
|
| + def DidRunPage(self):
|
| + if self._finder_options.profiler:
|
| + self._StopProfiling()
|
| +
|
| + if self._test.StopBrowserAfterPage(self.browser, self._current_page):
|
| + self.StopBrowser()
|
| + self._current_page = None
|
| + self._current_tab = None
|
| +
|
| + @property
|
| + def platform(self):
|
| + return self._possible_browser.platform
|
| +
|
| + def _PrepareWpr(self, network_controller, archive_path,
|
| make_javascript_deterministic):
|
| - browser_options = finder_options.browser_options
|
| - if finder_options.use_live_sites:
|
| + browser_options = self._finder_options.browser_options
|
| + if self._finder_options.use_live_sites:
|
| browser_options.wpr_mode = wpr_modes.WPR_OFF
|
| elif browser_options.wpr_mode != wpr_modes.WPR_RECORD:
|
| browser_options.wpr_mode = (
|
| @@ -60,30 +101,28 @@ class _RunState(object):
|
| archive_path, wpr_mode, browser_options.netsim,
|
| browser_options.extra_wpr_args, make_javascript_deterministic)
|
|
|
| - def StartBrowserIfNeeded(self, test, page_set, page, possible_browser,
|
| - finder_options):
|
| + def StartBrowserIfNeeded(self, test, page_set, page):
|
| started_browser = not self.browser
|
| - self._PrepareWpr(
|
| - finder_options, possible_browser.platform.network_controller,
|
| - page.archive_path, page_set.make_javascript_deterministic)
|
| + self._PrepareWpr(self.platform.network_controller, page.archive_path,
|
| + page_set.make_javascript_deterministic)
|
| if self.browser:
|
| # Set new credential path for browser.
|
| self.browser.credentials.credentials_path = page.credentials_path
|
| - self.browser.platform.network_controller.UpdateReplayForExistingBrowser()
|
| + self.platform.network_controller.UpdateReplayForExistingBrowser()
|
| else:
|
| - test.CustomizeBrowserOptionsForSinglePage(page, finder_options)
|
| - possible_browser.SetCredentialsPath(page.credentials_path)
|
| + test.CustomizeBrowserOptionsForSinglePage(page, self._finder_options)
|
| + self._possible_browser.SetCredentialsPath(page.credentials_path)
|
|
|
| - test.WillStartBrowser(possible_browser.platform)
|
| - self.browser = possible_browser.Create(finder_options)
|
| + test.WillStartBrowser(self.platform)
|
| + self.browser = self._possible_browser.Create(self._finder_options)
|
| test.DidStartBrowser(self.browser)
|
|
|
| if self._first_browser:
|
| self._first_browser = False
|
| self.browser.credentials.WarnIfMissingCredentials(page)
|
| logging.info('OS: %s %s',
|
| - self.browser.platform.GetOSName(),
|
| - self.browser.platform.GetOSVersionName())
|
| + self.platform.GetOSName(),
|
| + self.platform.GetOSVersionName())
|
| if self.browser.supports_system_info:
|
| system_info = self.browser.GetSystemInfo()
|
| if system_info.model_name:
|
| @@ -129,9 +168,8 @@ class _RunState(object):
|
| if started_browser:
|
| self.browser.tabs[0].WaitForDocumentReadyStateToBeComplete()
|
|
|
| - def PreparePage(self, page):
|
| - self._current_page = page
|
| - self._current_tab = self._test.TabForPage(page, self.browser)
|
| + def PreparePage(self):
|
| + self._current_tab = self._test.TabForPage(self._current_page, self.browser)
|
| if self._current_page.is_file:
|
| self.browser.SetHTTPServerDirectories(
|
| self._current_page.page_set.serving_dirs |
|
| @@ -164,8 +202,6 @@ class _RunState(object):
|
| if self._current_page.credentials and self._did_login_for_current_page:
|
| self.browser.credentials.LoginNoLongerNeeded(
|
| self._current_tab, self._current_page.credentials)
|
| - self._current_page = None
|
| - self._current_tab = None
|
|
|
| def StopBrowser(self):
|
| if self.browser:
|
| @@ -177,18 +213,19 @@ class _RunState(object):
|
| # not overwrite it.
|
| self._append_to_existing_wpr = True
|
|
|
| - def StartProfiling(self, page, finder_options):
|
| - output_file = os.path.join(finder_options.output_dir, page.file_safe_name)
|
| - is_repeating = (finder_options.page_repeat != 1 or
|
| - finder_options.pageset_repeat != 1)
|
| + def _StartProfiling(self, page):
|
| + output_file = os.path.join(self._finder_options.output_dir,
|
| + page.file_safe_name)
|
| + is_repeating = (self._finder_options.page_repeat != 1 or
|
| + self._finder_options.pageset_repeat != 1)
|
| if is_repeating:
|
| output_file = util.GetSequentialFileName(output_file)
|
| - self.browser.platform.profiling_controller.Start(
|
| - finder_options.profiler, output_file)
|
| + self.platform.profiling_controller.Start(
|
| + self._finder_options.profiler, output_file)
|
|
|
| - def StopProfiling(self):
|
| + def _StopProfiling(self):
|
| if self.browser:
|
| - self.browser.platform.profiling_controller.Stop()
|
| + self.platform.profiling_controller.Stop()
|
|
|
|
|
| def AddCommandLineArgs(parser):
|
| @@ -242,8 +279,8 @@ def ProcessCommandLineArgs(parser, args):
|
| parser.error('--pageset-repeat must be a positive integer.')
|
|
|
|
|
| -def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options,
|
| - page, possible_browser, results, state):
|
| +def _RunPageAndRetryRunIfNeeded(test, page_set, expectations,
|
| + page, results, state):
|
| max_attempts = test.attempts
|
| attempt_num = 0
|
| while attempt_num < max_attempts:
|
| @@ -255,8 +292,7 @@ def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options,
|
| state.StopBrowser()
|
| # If we are restarting the browser for each page customize the per page
|
| # options for just the current page before starting the browser.
|
| - state.StartBrowserIfNeeded(
|
| - test, page_set, page, possible_browser, finder_options)
|
| + state.StartBrowserIfNeeded(test, page_set, page)
|
| if not page.CanRunOnBrowser(browser_info.BrowserInfo(state.browser)):
|
| logging.info('Skip test for page %s because browser is not supported.'
|
| % page.url)
|
| @@ -264,14 +300,13 @@ def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options,
|
|
|
| expectation = expectations.GetExpectationForPage(state.browser, page)
|
|
|
| - _WaitForThermalThrottlingIfNeeded(state.browser.platform)
|
| + _WaitForThermalThrottlingIfNeeded(state.platform)
|
|
|
| - if finder_options.profiler:
|
| - state.StartProfiling(page, finder_options)
|
| + state.WillRunPage(page)
|
|
|
| try:
|
| _RunPageAndProcessErrorIfNeeded(page, state, expectation, results)
|
| - _CheckThermalThrottling(state.browser.platform)
|
| + _CheckThermalThrottling(state.platform)
|
| except exceptions.TabCrashException as e:
|
| if test.is_multi_tab_test:
|
| logging.error('Aborting multi-tab test after tab %s crashed',
|
| @@ -279,13 +314,7 @@ def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options,
|
| raise
|
| logging.warning(str(e))
|
| state.StopBrowser()
|
| -
|
| - if finder_options.profiler:
|
| - state.StopProfiling()
|
| -
|
| - if (test.StopBrowserAfterPage(state.browser, page)):
|
| - state.StopBrowser()
|
| -
|
| + state.DidRunPage()
|
| return
|
| except exceptions.BrowserGoneException as e:
|
| state.StopBrowser()
|
| @@ -325,32 +354,9 @@ def Run(test, page_set, expectations, finder_options, results):
|
| """Runs a given test against a given page_set with the given options."""
|
| test.ValidatePageSet(page_set)
|
|
|
| - # Create a possible_browser with the given options.
|
| - try:
|
| - possible_browser = browser_finder.FindBrowser(finder_options)
|
| - except browser_finder.BrowserTypeRequiredException, e:
|
| - sys.stderr.write(str(e) + '\n')
|
| - sys.exit(-1)
|
| - if not possible_browser:
|
| - sys.stderr.write(
|
| - 'No browser found. Available browsers:\n%s\n' %
|
| - '\n'.join(browser_finder.GetAllAvailableBrowserTypes(finder_options)))
|
| - sys.exit(-1)
|
| -
|
| browser_options = finder_options.browser_options
|
| - browser_options.browser_type = possible_browser.browser_type
|
| test.CustomizeBrowserOptions(browser_options)
|
|
|
| - if (not decorators.IsEnabled(test, possible_browser) and
|
| - not finder_options.run_disabled_tests):
|
| - logging.warning('You are trying to run a disabled test.')
|
| - logging.warning('Pass --also-run-disabled-tests to squelch this message.')
|
| - return
|
| -
|
| - if possible_browser.IsRemote():
|
| - possible_browser.RunRemote()
|
| - sys.exit(0)
|
| -
|
| # Reorder page set based on options.
|
| pages = _ShuffleAndFilterPageSet(page_set, finder_options)
|
|
|
| @@ -378,7 +384,7 @@ def Run(test, page_set, expectations, finder_options, results):
|
| if not pages:
|
| return
|
|
|
| - state = _RunState(test)
|
| + state = _RunState(test, finder_options)
|
| pages_with_discarded_first_result = set()
|
| max_failures = finder_options.max_failures # command-line gets priority
|
| if max_failures is None:
|
| @@ -394,8 +400,7 @@ def Run(test, page_set, expectations, finder_options, results):
|
| results.WillRunPage(page)
|
| try:
|
| _RunPageAndRetryRunIfNeeded(
|
| - test, page_set, expectations, finder_options, page,
|
| - possible_browser, results, state)
|
| + test, page_set, expectations, page, results, state)
|
| finally:
|
| discard_run = (test.discard_first_result and
|
| page not in pages_with_discarded_first_result)
|
| @@ -482,7 +487,7 @@ def _RunPageAndProcessErrorIfNeeded(page, state, expectation, results):
|
| exception_formatter.PrintFormattedException(msg=msg)
|
|
|
| try:
|
| - state.PreparePage(page)
|
| + state.PreparePage()
|
| state.ImplicitPageNavigation()
|
| state.RunPage(results)
|
| except page_test.TestNotSupportedOnPlatformFailure:
|
|
|