Commit f88052ff authored by nednguyen's avatar nednguyen Committed by Commit bot

[Telemetry] Introduce RunState.SetUpBeforeRunPage and RunState.TearDownAfterRunPage.

This is a step closer to the point of making _RunState --> UserStoryState with
the 4 main methods:

__init__ that does classSetUp
SetUpBeforeRunPage that does setUp before each page run
TearDownAfterRunPage that does tearDown after each page run
TearDownAfterRunPageSet that does final classTearDown

BUG=418278

Review URL: https://codereview.chromium.org/692973003

Cr-Commit-Position: refs/heads/master@{#302695}
parent 844c1557
# 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 # Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file. # found in the LICENSE file.
...@@ -27,8 +27,10 @@ from telemetry.value import skip ...@@ -27,8 +27,10 @@ from telemetry.value import skip
class _RunState(object): class _RunState(object):
def __init__(self, test): def __init__(self, test, finder_options):
self.browser = None 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. # TODO(slamm): Remove _append_to_existing_wpr when replay lifetime changes.
self._append_to_existing_wpr = False self._append_to_existing_wpr = False
...@@ -38,10 +40,49 @@ class _RunState(object): ...@@ -38,10 +40,49 @@ class _RunState(object):
self._current_page = None self._current_page = None
self._current_tab = 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): make_javascript_deterministic):
browser_options = finder_options.browser_options browser_options = self._finder_options.browser_options
if finder_options.use_live_sites: if self._finder_options.use_live_sites:
browser_options.wpr_mode = wpr_modes.WPR_OFF browser_options.wpr_mode = wpr_modes.WPR_OFF
elif browser_options.wpr_mode != wpr_modes.WPR_RECORD: elif browser_options.wpr_mode != wpr_modes.WPR_RECORD:
browser_options.wpr_mode = ( browser_options.wpr_mode = (
...@@ -60,30 +101,28 @@ class _RunState(object): ...@@ -60,30 +101,28 @@ class _RunState(object):
archive_path, wpr_mode, browser_options.netsim, archive_path, wpr_mode, browser_options.netsim,
browser_options.extra_wpr_args, make_javascript_deterministic) browser_options.extra_wpr_args, make_javascript_deterministic)
def StartBrowserIfNeeded(self, test, page_set, page, possible_browser, def StartBrowserIfNeeded(self, test, page_set, page):
finder_options):
started_browser = not self.browser started_browser = not self.browser
self._PrepareWpr( self._PrepareWpr(self.platform.network_controller, page.archive_path,
finder_options, possible_browser.platform.network_controller, page_set.make_javascript_deterministic)
page.archive_path, page_set.make_javascript_deterministic)
if self.browser: if self.browser:
# Set new credential path for browser. # Set new credential path for browser.
self.browser.credentials.credentials_path = page.credentials_path self.browser.credentials.credentials_path = page.credentials_path
self.browser.platform.network_controller.UpdateReplayForExistingBrowser() self.platform.network_controller.UpdateReplayForExistingBrowser()
else: else:
test.CustomizeBrowserOptionsForSinglePage(page, finder_options) test.CustomizeBrowserOptionsForSinglePage(page, self._finder_options)
possible_browser.SetCredentialsPath(page.credentials_path) self._possible_browser.SetCredentialsPath(page.credentials_path)
test.WillStartBrowser(possible_browser.platform) test.WillStartBrowser(self.platform)
self.browser = possible_browser.Create(finder_options) self.browser = self._possible_browser.Create(self._finder_options)
test.DidStartBrowser(self.browser) test.DidStartBrowser(self.browser)
if self._first_browser: if self._first_browser:
self._first_browser = False self._first_browser = False
self.browser.credentials.WarnIfMissingCredentials(page) self.browser.credentials.WarnIfMissingCredentials(page)
logging.info('OS: %s %s', logging.info('OS: %s %s',
self.browser.platform.GetOSName(), self.platform.GetOSName(),
self.browser.platform.GetOSVersionName()) self.platform.GetOSVersionName())
if self.browser.supports_system_info: if self.browser.supports_system_info:
system_info = self.browser.GetSystemInfo() system_info = self.browser.GetSystemInfo()
if system_info.model_name: if system_info.model_name:
...@@ -129,9 +168,8 @@ class _RunState(object): ...@@ -129,9 +168,8 @@ class _RunState(object):
if started_browser: if started_browser:
self.browser.tabs[0].WaitForDocumentReadyStateToBeComplete() self.browser.tabs[0].WaitForDocumentReadyStateToBeComplete()
def PreparePage(self, page): def PreparePage(self):
self._current_page = page self._current_tab = self._test.TabForPage(self._current_page, self.browser)
self._current_tab = self._test.TabForPage(page, self.browser)
if self._current_page.is_file: if self._current_page.is_file:
self.browser.SetHTTPServerDirectories( self.browser.SetHTTPServerDirectories(
self._current_page.page_set.serving_dirs | self._current_page.page_set.serving_dirs |
...@@ -164,8 +202,6 @@ class _RunState(object): ...@@ -164,8 +202,6 @@ class _RunState(object):
if self._current_page.credentials and self._did_login_for_current_page: if self._current_page.credentials and self._did_login_for_current_page:
self.browser.credentials.LoginNoLongerNeeded( self.browser.credentials.LoginNoLongerNeeded(
self._current_tab, self._current_page.credentials) self._current_tab, self._current_page.credentials)
self._current_page = None
self._current_tab = None
def StopBrowser(self): def StopBrowser(self):
if self.browser: if self.browser:
...@@ -177,18 +213,19 @@ class _RunState(object): ...@@ -177,18 +213,19 @@ class _RunState(object):
# not overwrite it. # not overwrite it.
self._append_to_existing_wpr = True self._append_to_existing_wpr = True
def StartProfiling(self, page, finder_options): def _StartProfiling(self, page):
output_file = os.path.join(finder_options.output_dir, page.file_safe_name) output_file = os.path.join(self._finder_options.output_dir,
is_repeating = (finder_options.page_repeat != 1 or page.file_safe_name)
finder_options.pageset_repeat != 1) is_repeating = (self._finder_options.page_repeat != 1 or
self._finder_options.pageset_repeat != 1)
if is_repeating: if is_repeating:
output_file = util.GetSequentialFileName(output_file) output_file = util.GetSequentialFileName(output_file)
self.browser.platform.profiling_controller.Start( self.platform.profiling_controller.Start(
finder_options.profiler, output_file) self._finder_options.profiler, output_file)
def StopProfiling(self): def _StopProfiling(self):
if self.browser: if self.browser:
self.browser.platform.profiling_controller.Stop() self.platform.profiling_controller.Stop()
def AddCommandLineArgs(parser): def AddCommandLineArgs(parser):
...@@ -242,8 +279,8 @@ def ProcessCommandLineArgs(parser, args): ...@@ -242,8 +279,8 @@ def ProcessCommandLineArgs(parser, args):
parser.error('--pageset-repeat must be a positive integer.') parser.error('--pageset-repeat must be a positive integer.')
def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options, def _RunPageAndRetryRunIfNeeded(test, page_set, expectations,
page, possible_browser, results, state): page, results, state):
max_attempts = test.attempts max_attempts = test.attempts
attempt_num = 0 attempt_num = 0
while attempt_num < max_attempts: while attempt_num < max_attempts:
...@@ -255,8 +292,7 @@ def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options, ...@@ -255,8 +292,7 @@ def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options,
state.StopBrowser() state.StopBrowser()
# If we are restarting the browser for each page customize the per page # If we are restarting the browser for each page customize the per page
# options for just the current page before starting the browser. # options for just the current page before starting the browser.
state.StartBrowserIfNeeded( state.StartBrowserIfNeeded(test, page_set, page)
test, page_set, page, possible_browser, finder_options)
if not page.CanRunOnBrowser(browser_info.BrowserInfo(state.browser)): if not page.CanRunOnBrowser(browser_info.BrowserInfo(state.browser)):
logging.info('Skip test for page %s because browser is not supported.' logging.info('Skip test for page %s because browser is not supported.'
% page.url) % page.url)
...@@ -264,14 +300,13 @@ def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options, ...@@ -264,14 +300,13 @@ def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options,
expectation = expectations.GetExpectationForPage(state.browser, page) expectation = expectations.GetExpectationForPage(state.browser, page)
_WaitForThermalThrottlingIfNeeded(state.browser.platform) _WaitForThermalThrottlingIfNeeded(state.platform)
if finder_options.profiler: state.WillRunPage(page)
state.StartProfiling(page, finder_options)
try: try:
_RunPageAndProcessErrorIfNeeded(page, state, expectation, results) _RunPageAndProcessErrorIfNeeded(page, state, expectation, results)
_CheckThermalThrottling(state.browser.platform) _CheckThermalThrottling(state.platform)
except exceptions.TabCrashException as e: except exceptions.TabCrashException as e:
if test.is_multi_tab_test: if test.is_multi_tab_test:
logging.error('Aborting multi-tab test after tab %s crashed', logging.error('Aborting multi-tab test after tab %s crashed',
...@@ -279,13 +314,7 @@ def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options, ...@@ -279,13 +314,7 @@ def _RunPageAndRetryRunIfNeeded(test, page_set, expectations, finder_options,
raise raise
logging.warning(str(e)) logging.warning(str(e))
state.StopBrowser() state.StopBrowser()
state.DidRunPage()
if finder_options.profiler:
state.StopProfiling()
if (test.StopBrowserAfterPage(state.browser, page)):
state.StopBrowser()
return return
except exceptions.BrowserGoneException as e: except exceptions.BrowserGoneException as e:
state.StopBrowser() state.StopBrowser()
...@@ -325,32 +354,9 @@ def Run(test, page_set, expectations, finder_options, results): ...@@ -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.""" """Runs a given test against a given page_set with the given options."""
test.ValidatePageSet(page_set) 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 = finder_options.browser_options
browser_options.browser_type = possible_browser.browser_type
test.CustomizeBrowserOptions(browser_options) 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. # Reorder page set based on options.
pages = _ShuffleAndFilterPageSet(page_set, finder_options) pages = _ShuffleAndFilterPageSet(page_set, finder_options)
...@@ -378,7 +384,7 @@ def Run(test, page_set, expectations, finder_options, results): ...@@ -378,7 +384,7 @@ def Run(test, page_set, expectations, finder_options, results):
if not pages: if not pages:
return return
state = _RunState(test) state = _RunState(test, finder_options)
pages_with_discarded_first_result = set() pages_with_discarded_first_result = set()
max_failures = finder_options.max_failures # command-line gets priority max_failures = finder_options.max_failures # command-line gets priority
if max_failures is None: if max_failures is None:
...@@ -394,8 +400,7 @@ def Run(test, page_set, expectations, finder_options, results): ...@@ -394,8 +400,7 @@ def Run(test, page_set, expectations, finder_options, results):
results.WillRunPage(page) results.WillRunPage(page)
try: try:
_RunPageAndRetryRunIfNeeded( _RunPageAndRetryRunIfNeeded(
test, page_set, expectations, finder_options, page, test, page_set, expectations, page, results, state)
possible_browser, results, state)
finally: finally:
discard_run = (test.discard_first_result and discard_run = (test.discard_first_result and
page not in pages_with_discarded_first_result) page not in pages_with_discarded_first_result)
...@@ -482,7 +487,7 @@ def _RunPageAndProcessErrorIfNeeded(page, state, expectation, results): ...@@ -482,7 +487,7 @@ def _RunPageAndProcessErrorIfNeeded(page, state, expectation, results):
exception_formatter.PrintFormattedException(msg=msg) exception_formatter.PrintFormattedException(msg=msg)
try: try:
state.PreparePage(page) state.PreparePage()
state.ImplicitPageNavigation() state.ImplicitPageNavigation()
state.RunPage(results) state.RunPage(results)
except page_test.TestNotSupportedOnPlatformFailure: except page_test.TestNotSupportedOnPlatformFailure:
......
...@@ -687,9 +687,9 @@ class RunStateTest(unittest.TestCase): ...@@ -687,9 +687,9 @@ class RunStateTest(unittest.TestCase):
# pylint: disable=W0212 # pylint: disable=W0212
def TestUseLiveSitesFlag(self, options, expected_wpr_mode): def TestUseLiveSitesFlag(self, options, expected_wpr_mode):
with tempfile.NamedTemporaryFile() as f: with tempfile.NamedTemporaryFile() as f:
run_state = page_runner._RunState(DummyTest()) run_state = page_runner._RunState(DummyTest(), options)
fake_network_controller = FakeNetworkController() fake_network_controller = FakeNetworkController()
run_state._PrepareWpr(options, fake_network_controller, f.name, None) run_state._PrepareWpr(fake_network_controller, f.name, None)
self.assertEquals(fake_network_controller.wpr_mode, expected_wpr_mode) self.assertEquals(fake_network_controller.wpr_mode, expected_wpr_mode)
self.assertEquals(fake_network_controller.archive_path, f.name) self.assertEquals(fake_network_controller.archive_path, f.name)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment