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

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

Issue 18261009: Have repeats understand "time" (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changes from dennisjeffrey Created 7 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 | « tools/telemetry/telemetry/core/browser_options.py ('k') | tools/telemetry/telemetry/page/page_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 9ec2d348dc654ad955b6ad52f8ae083897ba6601..b29903aad41afcd4e187624cf10914fffc5df00d 100644
--- a/tools/telemetry/telemetry/page/page_runner.py
+++ b/tools/telemetry/telemetry/page/page_runner.py
@@ -71,7 +71,6 @@ class _RunState(object):
if self.first_page:
self.first_page = False
- test.WillRunPageSet(self.tab)
def StopBrowser(self):
self._is_tracing = False
@@ -91,7 +90,8 @@ class _RunState(object):
def StartProfiling(self, page, options):
output_file = os.path.join(options.profiler_dir, page.url_as_file_safe_name)
- if options.page_repeat != 1 or options.pageset_repeat != 1:
+ if (options.page_repeat_iters != 1 or options.pageset_repeat_iters != 1 or
+ options.page_repeat_secs or options.pageset_repeat_secs):
output_file = _GetSequentialFileName(output_file)
self.browser.StartProfiling(options, output_file)
@@ -116,7 +116,8 @@ class _RunState(object):
logging.info('Processing trace...')
trace_file = os.path.join(options.trace_dir, page.url_as_file_safe_name)
- if options.page_repeat != 1 or options.pageset_repeat != 1:
+ if (options.page_repeat_iters != 1 or options.pageset_repeat_iters != 1 or
+ options.page_repeat_secs or options.pageset_repeat_secs):
trace_file = _GetSequentialFileName(trace_file)
trace_file += '.json'
@@ -165,6 +166,95 @@ def AddCommandLineOptions(parser):
page_filter_module.PageFilter.AddCommandLineOptions(parser)
+def _PrepareAndRunPage(test, page_set, 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 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.trace_dir:
+ state.StartTracing()
+ if options.profiler_dir:
+ state.StartProfiling(page, options)
+
+ try:
+ _RunPage(test, page, state.tab, results_for_current_run, options)
+ _CheckThermalThrottling(state.browser.platform)
+ except exceptions.TabCrashException:
+ stdout = ''
+ if not options.show_stdout:
+ stdout = state.browser.GetStandardOutput()
+ stdout = (('\nStandard Output:\n') +
+ ('*' * 80) +
+ '\n\t' + stdout.replace('\n', '\n\t') + '\n' +
+ ('*' * 80))
+ logging.warning('Tab crashed: %s%s', page.url, stdout)
+ state.StopBrowser()
+
+ if options.trace_dir:
+ state.StopTracing(page, options)
+ if options.profiler_dir:
+ state.StopProfiling()
+
+ if test.NeedsBrowserRestartAfterEachRun(state.tab):
+ state.StopBrowser()
+
+ break
+ except exceptions.BrowserGoneException:
+ 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 _RunRepeatLoop(test, page_set, options, credentials_path, possible_browser,
+ results, state, pages):
+ """Repeats each page or pageset for a specified time or iteration limit.
+
+ Uses the '--pageset-repeat' and '--page-repeat' cmd line options.
+ """
+ pageset_start_time = time.time()
+ pageset_iters = 0
+ while True:
+ if (options.pageset_repeat_secs and
+ time.time() - pageset_start_time > options.pageset_repeat_secs):
+ break
+ elif (options.pageset_repeat_iters != 1 and
+ pageset_iters >= options.pageset_repeat_iters):
+ break
+ pageset_iters += 1
+ for page in pages:
+ page_start_time = time.time()
+ page_iters = 0
+ while True:
+ if (options.page_repeat_secs and
+ time.time() - page_start_time > options.page_repeat_secs):
+ break
+ elif (options.page_repeat_iters != 1 and
+ page_iters >= options.page_repeat_iters):
+ break
+ page_iters += 1
+ _PrepareAndRunPage(test, page_set, options, page, credentials_path,
+ possible_browser, results, state)
+
+
def Run(test, page_set, options):
"""Runs a given test against a given page_set with the given options."""
results = test.PrepareResults(options)
@@ -203,65 +293,12 @@ def Run(test, page_set, options):
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 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.trace_dir:
- state.StartTracing()
- if options.profiler_dir:
- state.StartProfiling(page, options)
-
- try:
- _RunPage(test, page, state.tab, results_for_current_run, options)
- _CheckThermalThrottling(state.browser.platform)
- except exceptions.TabCrashException:
- stdout = ''
- if not options.show_stdout:
- stdout = state.browser.GetStandardOutput()
- stdout = (('\nStandard Output:\n') +
- ('*' * 80) +
- '\n\t' + stdout.replace('\n', '\n\t') + '\n' +
- ('*' * 80))
- logging.warning('Tab crashed: %s%s', page.url, stdout)
- state.StopBrowser()
-
- if options.trace_dir:
- state.StopTracing(page, options)
- if options.profiler_dir:
- state.StopProfiling()
-
- if test.NeedsBrowserRestartAfterEachRun(state.tab):
- state.StopBrowser()
-
- break
- except exceptions.BrowserGoneException:
- 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)
+ _RunRepeatLoop(test, page_set, options, credentials_path, possible_browser,
+ results, state, pages)
+ test.DidRunTest(state.tab, results)
finally:
state.StopBrowser()
@@ -281,10 +318,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):
« no previous file with comments | « tools/telemetry/telemetry/core/browser_options.py ('k') | tools/telemetry/telemetry/page/page_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698