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 8e20cec1ca85975a9e8be541e80b1ecb70fb2d90..9820a18476bde8f306d4dec6b82598bcbdb09b0b 100644 |
--- a/tools/telemetry/telemetry/page/page_runner.py |
+++ b/tools/telemetry/telemetry/page/page_runner.py |
@@ -17,6 +17,7 @@ from telemetry.core import exceptions |
from telemetry.core import util |
from telemetry.core import wpr_modes |
from telemetry.page import page_filter as page_filter_module |
+from telemetry.page import page_runner_repeat |
from telemetry.page import page_test |
@@ -72,7 +73,6 @@ class _RunState(object): |
if self.first_page[page]: |
self.first_page[page] = False |
- test.WillRunPageSet(self.tab) |
def StopBrowser(self): |
if self.tab: |
@@ -92,7 +92,7 @@ class _RunState(object): |
if not self.profiler_dir: |
self.profiler_dir = tempfile.mkdtemp() |
output_file = os.path.join(self.profiler_dir, page.url_as_file_safe_name) |
- if options.page_repeat != 1 or options.pageset_repeat != 1: |
+ if options.repeat_options.IsRepeating(): |
output_file = _GetSequentialFileName(output_file) |
self.browser.StartProfiling(options.profiler, output_file) |
@@ -148,6 +148,58 @@ def _LogStackTrace(title, browser): |
logging.warning('%s%s', title, stack_trace) |
+def _PrepareAndRunPage(test, page_set, expectations, options, page, |
+ credentials_path, possible_browser, results, state): |
+ if options.wpr_mode != wpr_modes.WPR_RECORD: |
+ if page.archive_path and os.path.isfile(page.archive_path): |
+ possible_browser.options.wpr_mode = wpr_modes.WPR_REPLAY |
+ else: |
+ possible_browser.options.wpr_mode = wpr_modes.WPR_OFF |
+ results_for_current_run = results |
+ if state.first_page[page] and test.discard_first_result: |
+ # If discarding results, substitute a dummy object. |
+ results_for_current_run = type(results)() |
+ results_for_current_run.StartTest(page) |
+ tries = 3 |
+ while tries: |
+ try: |
+ state.StartBrowser(test, page_set, page, possible_browser, |
+ credentials_path, page.archive_path) |
+ |
+ _WaitForThermalThrottlingIfNeeded(state.browser.platform) |
+ |
+ if options.profiler: |
+ state.StartProfiling(page, options) |
+ |
+ expectation = expectations.GetExpectationForPage( |
+ state.browser.platform, page) |
+ |
+ try: |
+ _RunPage(test, page, state.tab, expectation, |
+ results_for_current_run, options) |
+ _CheckThermalThrottling(state.browser.platform) |
+ except exceptions.TabCrashException: |
+ _LogStackTrace('Tab crashed: %s' % page.url, state.browser) |
+ state.StopBrowser() |
+ |
+ if options.profiler: |
+ state.StopProfiling() |
+ |
+ if test.NeedsBrowserRestartAfterEachRun(state.tab): |
+ state.StopBrowser() |
+ |
+ break |
+ except exceptions.BrowserGoneException: |
+ _LogStackTrace('Browser crashed', state.browser) |
+ logging.warning('Lost connection to browser. Retrying.') |
+ state.StopBrowser() |
+ tries -= 1 |
+ if not tries: |
+ logging.error('Lost connection to browser 3 times. Failing.') |
+ raise |
+ results_for_current_run.StopTest(page) |
+ |
+ |
def Run(test, page_set, expectations, options): |
"""Runs a given test against a given page_set with the given options.""" |
results = test.PrepareResults(options) |
@@ -181,61 +233,35 @@ def Run(test, page_set, expectations, options): |
for page in pages: |
test.CustomizeBrowserOptionsForPage(page, possible_browser.options) |
+ for page in list(pages): |
+ if not test.CanRunForPage(page): |
+ logging.warning('Skipping test: it cannot run for %s', page.url) |
+ results.AddSkip(page, 'Test cannot run') |
+ pages.remove(page) |
+ |
+ if not pages: |
+ return results |
+ |
state = _RunState() |
# TODO(dtu): Move results creation and results_for_current_run into RunState. |
- results_for_current_run = results |
try: |
- for page in pages: |
- if options.wpr_mode != wpr_modes.WPR_RECORD: |
- if page.archive_path and os.path.isfile(page.archive_path): |
- possible_browser.options.wpr_mode = wpr_modes.WPR_REPLAY |
- else: |
- possible_browser.options.wpr_mode = wpr_modes.WPR_OFF |
- results_for_current_run = results |
- if state.first_page[page] and test.discard_first_result: |
- # If discarding results, substitute a dummy object. |
- results_for_current_run = type(results)() |
- results_for_current_run.StartTest(page) |
- tries = 3 |
- while tries: |
- try: |
- state.StartBrowser(test, page_set, page, possible_browser, |
- credentials_path, page.archive_path) |
- |
- _WaitForThermalThrottlingIfNeeded(state.browser.platform) |
- |
- if options.profiler: |
- state.StartProfiling(page, options) |
- |
- expectation = expectations.GetExpectationForPage( |
- state.browser.platform, page) |
- |
- try: |
- _RunPage(test, page, state.tab, expectation, |
- results_for_current_run, options) |
- _CheckThermalThrottling(state.browser.platform) |
- except exceptions.TabCrashException: |
- _LogStackTrace('Tab crashed: %s' % page.url, state.browser) |
- state.StopBrowser() |
- |
- if options.profiler: |
- state.StopProfiling() |
- |
- if test.NeedsBrowserRestartAfterEachRun(state.tab): |
- state.StopBrowser() |
- |
- break |
- except exceptions.BrowserGoneException: |
- _LogStackTrace('Browser crashed', state.browser) |
- logging.warning('Lost connection to browser. Retrying.') |
- state.StopBrowser() |
- tries -= 1 |
- if not tries: |
- logging.error('Lost connection to browser 3 times. Failing.') |
- raise |
- results_for_current_run.StopTest(page) |
- test.DidRunPageSet(state.tab, results_for_current_run) |
+ test.WillRunTest(state.tab) |
+ repeat_state = page_runner_repeat.PageRunnerRepeatState( |
+ options.repeat_options) |
+ |
+ repeat_state.WillRunPageSet() |
+ while repeat_state.ShouldRepeatPageSet(): |
+ for page in pages: |
+ repeat_state.WillRunPage() |
+ while repeat_state.ShouldRepeatPage(): |
+ # execute test on page |
+ _PrepareAndRunPage(test, page_set, expectations, options, page, |
+ credentials_path, possible_browser, results, state) |
+ repeat_state.DidRunPage() |
+ repeat_state.DidRunPageSet() |
+ |
+ test.DidRunTest(state.tab, results) |
finally: |
state.StopBrowser() |
@@ -255,10 +281,8 @@ def _ShuffleAndFilterPageSet(page_set, options): |
if options.pageset_shuffle: |
random.Random().shuffle(pages) |
- return [page |
- for _ in xrange(int(options.pageset_repeat)) |
- for page in pages |
- for _ in xrange(int(options.page_repeat))] |
+ |
+ return pages |
def _CheckArchives(page_set, pages, results): |
@@ -320,11 +344,6 @@ def _CheckArchives(page_set, pages, results): |
def _RunPage(test, page, tab, expectation, results, options): |
- if not test.CanRunForPage(page): |
- logging.warning('Skipping test: it cannot run for %s', page.url) |
- results.AddSkip(page, 'Test cannot run') |
- return |
- |
logging.info('Running %s' % page.url) |
page_state = PageState() |