12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file. 4a3f7b4e666c476898878fa745f637129375cd889Ben Murdochimport collections 5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)import glob 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import logging 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import sys 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochimport tempfile 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import time 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import traceback 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import random 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)from telemetry.core import browser_finder 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)from telemetry.core import exceptions 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import util 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import wpr_modes 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from telemetry.core.platform.profiler import profiler_finder 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_filter as page_filter_module 204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochfrom telemetry.page import page_measurement_results 21a3f7b4e666c476898878fa745f637129375cd889Ben Murdochfrom telemetry.page import page_runner_repeat 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_test 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _RunState(object): 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self): 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.browser = None 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.tab = None 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._append_to_existing_wpr = False 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._last_archive_path = None 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._first_browser = True 33a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.first_page = collections.defaultdict(lambda: True) 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch self.profiler_dir = None 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) def StartBrowser(self, test, page_set, page, possible_browser, 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) credentials_path, archive_path): 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Create a browser. 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not self.browser: 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) assert not self.tab 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser = possible_browser.Create() 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser.credentials.credentials_path = credentials_path 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test.WillStartBrowser(self.browser) 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) self.browser.Start() 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test.DidStartBrowser(self.browser) 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if self._first_browser: 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._first_browser = False 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser.credentials.WarnIfMissingCredentials(page_set) 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Set up WPR path on the new browser. 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser.SetReplayArchivePath(archive_path, 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self._append_to_existing_wpr, 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch page_set.make_javascript_deterministic) 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._last_archive_path = page.archive_path 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else: 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Set up WPR path if it changed. 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if page.archive_path and self._last_archive_path != page.archive_path: 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.browser.SetReplayArchivePath( 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch page.archive_path, 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self._append_to_existing_wpr, 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch page_set.make_javascript_deterministic) 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._last_archive_path = page.archive_path 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if self.browser.supports_tab_control: 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Create a tab if there's none. 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if len(self.browser.tabs) == 0: 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser.tabs.New() 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Ensure only one tab is open. 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while len(self.browser.tabs) > 1: 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser.tabs[-1].Close() 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not self.tab: 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.tab = self.browser.tabs[0] 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if self.first_page[page]: 79a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.first_page[page] = False 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) def StopBrowser(self): 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.tab: 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.tab.Disconnect() 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.tab = None 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.browser: 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.browser.Close() 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.browser = None 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Restarting the state will also restart the wpr server. If we're 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # recording, we need to continue adding into the same wpr archive, 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # not overwrite it. 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._append_to_existing_wpr = True 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) def StartProfiling(self, page, options): 96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if not self.profiler_dir: 97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch self.profiler_dir = tempfile.mkdtemp() 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch output_file = os.path.join(self.profiler_dir, page.url_as_file_safe_name) 99a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if options.repeat_options.IsRepeating(): 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_file = _GetSequentialFileName(output_file) 101a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.browser.StartProfiling(options.profiler, output_file) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) def StopProfiling(self): 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser.StopProfiling() 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class PageState(object): 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) def __init__(self): 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._did_login = False 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch def PreparePage(self, page, tab, test=None): 1124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if page.is_file: 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) serving_dirs, filename = page.serving_dirs_and_file 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if tab.browser.SetHTTPServerDirectories(serving_dirs) and test: 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test.DidStartHTTPServer(tab) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_side_url = tab.browser.http_server.UrlOf(filename) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_side_url = page.url 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if page.credentials: 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if not tab.browser.credentials.LoginNeeded(tab, page.credentials): 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) raise page_test.Failure('Login as ' + page.credentials + ' failed') 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._did_login = True 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if test: 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if test.clear_cache_before_each_run: 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tab.ClearCache() 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test.WillNavigateToPage(page, tab) 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tab.Navigate(target_side_url, page.script_to_evaluate_on_commit) 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if test: 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test.DidNavigateToPage(page, tab) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch page.WaitToLoad(tab, 60) 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tab.WaitForDocumentReadyStateToBeInteractiveOrBetter() 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) def CleanUpPage(self, page, tab): 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if page.credentials and self._did_login: 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab.browser.credentials.LoginNoLongerNeeded(tab, page.credentials) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def AddCommandLineOptions(parser): 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_filter_module.PageFilter.AddCommandLineOptions(parser) 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochdef _LogStackTrace(title, browser): 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if browser: 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) stack_trace = browser.GetStackTrace() 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) else: 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) stack_trace = 'Browser object is empty, no stack trace.' 150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch stack_trace = (('\nStack Trace:\n') + 151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ('*' * 80) + 152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch '\n\t' + stack_trace.replace('\n', '\n\t') + '\n' + 153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ('*' * 80)) 154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch logging.warning('%s%s', title, stack_trace) 155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 157a3f7b4e666c476898878fa745f637129375cd889Ben Murdochdef _PrepareAndRunPage(test, page_set, expectations, options, page, 158a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch credentials_path, possible_browser, results, state): 159a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if options.wpr_mode != wpr_modes.WPR_RECORD: 160a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if page.archive_path and os.path.isfile(page.archive_path): 161a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch possible_browser.options.wpr_mode = wpr_modes.WPR_REPLAY 162a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch else: 163a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch possible_browser.options.wpr_mode = wpr_modes.WPR_OFF 164a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch results_for_current_run = results 165a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if state.first_page[page] and test.discard_first_result: 166a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch # If discarding results, substitute a dummy object. 1674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch results_for_current_run = page_measurement_results.PageMeasurementResults() 168a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch results_for_current_run.StartTest(page) 169a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch tries = 3 170a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch while tries: 171a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch try: 172a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StartBrowser(test, page_set, page, possible_browser, 173a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch credentials_path, page.archive_path) 174a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 175a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _WaitForThermalThrottlingIfNeeded(state.browser.platform) 176a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 177a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if options.profiler: 178a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StartProfiling(page, options) 179a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 180a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch expectation = expectations.GetExpectationForPage( 181a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.browser.platform, page) 182a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 183a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch try: 184a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _RunPage(test, page, state.tab, expectation, 185a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch results_for_current_run, options) 186a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _CheckThermalThrottling(state.browser.platform) 187a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch except exceptions.TabCrashException: 188a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _LogStackTrace('Tab crashed: %s' % page.url, state.browser) 189a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StopBrowser() 190a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 191a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if options.profiler: 192a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StopProfiling() 193a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 194a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if test.NeedsBrowserRestartAfterEachRun(state.tab): 195a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StopBrowser() 196a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 197a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch break 198a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch except exceptions.BrowserGoneException: 199a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _LogStackTrace('Browser crashed', state.browser) 200a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch logging.warning('Lost connection to browser. Retrying.') 201a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StopBrowser() 202a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch tries -= 1 203a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if not tries: 204a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch logging.error('Lost connection to browser 3 times. Failing.') 205a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch raise 206a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch results_for_current_run.StopTest(page) 207a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 208a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochdef Run(test, page_set, expectations, options): 2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) """Runs a given test against a given page_set with the given options.""" 2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results = test.PrepareResults(options) 2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Create a possible_browser with the given options. 2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test.CustomizeBrowserOptions(options) 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if options.profiler: 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) profiler_class = profiler_finder.FindProfiler(options.profiler) 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) profiler_class.CustomizeBrowserOptions(options) 218bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch try: 219bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch possible_browser = browser_finder.FindBrowser(options) 220bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch except browser_finder.BrowserTypeRequiredException, e: 221bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch sys.stderr.write(str(e) + '\n') 222bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch sys.exit(1) 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not possible_browser: 224bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch sys.stderr.write( 225bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 'No browser found. Available browsers:\n' + 226bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch '\n'.join(browser_finder.GetAllAvailableBrowserTypes(options)) + '\n') 227bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch sys.exit(1) 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Reorder page set based on options. 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages = _ShuffleAndFilterPageSet(page_set, options) 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (not options.allow_live_sites and 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.wpr_mode != wpr_modes.WPR_RECORD): 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages = _CheckArchives(page_set, pages, results) 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Verify credentials path. 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) credentials_path = None 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if page_set.credentials_path: 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) credentials_path = os.path.join(os.path.dirname(page_set.file_path), 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_set.credentials_path) 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not os.path.exists(credentials_path): 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) credentials_path = None 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Set up user agent. 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if page_set.user_agent_type: 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.browser_user_agent_type = page_set.user_agent_type 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for page in pages: 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test.CustomizeBrowserOptionsForPage(page, possible_browser.options) 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 251a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch for page in list(pages): 252a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if not test.CanRunForPage(page): 253a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch logging.warning('Skipping test: it cannot run for %s', page.url) 254a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch results.AddSkip(page, 'Test cannot run') 255a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch pages.remove(page) 256a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 257a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if not pages: 258a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return results 259a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) state = _RunState() 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # TODO(dtu): Move results creation and results_for_current_run into RunState. 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) try: 264a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch test.WillRunTest(state.tab) 265a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch repeat_state = page_runner_repeat.PageRunnerRepeatState( 2664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch options.repeat_options) 267a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 268a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch repeat_state.WillRunPageSet() 269a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch while repeat_state.ShouldRepeatPageSet(): 270a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch for page in pages: 271a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch repeat_state.WillRunPage() 272a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch while repeat_state.ShouldRepeatPage(): 273a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch # execute test on page 274a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _PrepareAndRunPage(test, page_set, expectations, options, page, 275a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch credentials_path, possible_browser, results, state) 276a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch repeat_state.DidRunPage() 277a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch repeat_state.DidRunPageSet() 278a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 279a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch test.DidRunTest(state.tab, results) 2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) finally: 2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) state.StopBrowser() 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return results 2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def _ShuffleAndFilterPageSet(page_set, options): 2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if options.pageset_shuffle_order_file and not options.pageset_shuffle: 2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) raise Exception('--pageset-shuffle-order-file requires --pageset-shuffle.') 2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if options.pageset_shuffle_order_file: 2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return page_set.ReorderPageSet(options.pageset_shuffle_order_file) 2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_filter = page_filter_module.PageFilter(options) 2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages = [page for page in page_set.pages[:] 2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not page.disabled and page_filter.IsSelected(page)] 2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if options.pageset_shuffle: 2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) random.Random().shuffle(pages) 299a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 300a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return pages 3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def _CheckArchives(page_set, pages, results): 3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) """Returns a subset of pages that are local or have WPR archives. 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Logs warnings if any are missing.""" 3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_set_has_live_sites = False 3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for page in pages: 3094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if not page.is_local: 3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_set_has_live_sites = True 3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break 3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Potential problems with the entire page set. 3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if page_set_has_live_sites: 3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not page_set.archive_data_file: 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('The page set is missing an "archive_data_file" ' 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'property. Skipping any live sites. To include them, ' 3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'pass the flag --allow-live-sites.') 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not page_set.wpr_archive_info: 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('The archive info file is missing. ' 3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'To fix this, either add svn-internal to your ' 3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) '.gclient using http://goto/read-src-internal, ' 3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'or create a new archive using record_wpr.') 3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Potential problems with individual pages. 3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_path = [] 3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_data = [] 3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for page in pages: 3304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if page.is_local: 3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not page.archive_path: 3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_path.append(page) 335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch elif not os.path.isfile(page.archive_path): 3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_data.append(page) 3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if pages_missing_archive_path: 3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('The page set archives for some pages do not exist. ' 3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'Skipping those pages. To fix this, record those pages ' 3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'using record_wpr. To ignore this warning and run ' 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'against live sites, pass the flag --allow-live-sites.') 3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if pages_missing_archive_data: 3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('The page set archives for some pages are missing. ' 3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'Someone forgot to check them in, or they were deleted. ' 3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'Skipping those pages. To fix this, record those pages ' 3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'using record_wpr. To ignore this warning and run ' 3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'against live sites, pass the flag --allow-live-sites.') 3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for page in pages_missing_archive_path + pages_missing_archive_data: 3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.StartTest(page) 3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.AddErrorMessage(page, 'Page set archive doesn\'t exist.') 3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.StopTest(page) 3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return [page for page in pages if page not in 3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_path + pages_missing_archive_data] 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 359ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochdef _RunPage(test, page, tab, expectation, results, options): 3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.info('Running %s' % page.url) 3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_state = PageState() 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) try: 3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_state.PreparePage(page, tab, test) 3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test.Run(options, page, tab, results) 3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util.CloseConnections(tab) 3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) except page_test.Failure: 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('%s:\n%s', page.url, traceback.format_exc()) 370ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if expectation == 'fail': 371ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch logging.info('Failure was expected\n') 372ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch results.AddSuccess(page) 373ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch else: 374ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch results.AddFailure(page, sys.exc_info()) 375558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch except (util.TimeoutException, exceptions.LoginException, 376558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch exceptions.ProfilingException): 3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.error('%s:\n%s', page.url, traceback.format_exc()) 3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.AddError(page, sys.exc_info()) 3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) except (exceptions.TabCrashException, exceptions.BrowserGoneException): 3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.error('%s:\n%s', page.url, traceback.format_exc()) 3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.AddError(page, sys.exc_info()) 3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Run() catches these exceptions to relaunch the tab/browser, so re-raise. 3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) raise 3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) except Exception: 3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) raise 3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else: 387ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if expectation == 'fail': 388ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch logging.warning('%s was expected to fail, but passed.\n', page.url) 3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.AddSuccess(page) 3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) finally: 3917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_state.CleanUpPage(page, tab) 3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def _GetSequentialFileName(base_name): 3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) """Returns the next sequential file name based on |base_name| and the 3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) existing files.""" 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index = 0 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while True: 3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_name = '%s_%03d' % (base_name, index) 4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not glob.glob(output_name + '.*'): 4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break 4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index = index + 1 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return output_name 4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def _WaitForThermalThrottlingIfNeeded(platform): 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not platform.CanMonitorThermalThrottling(): 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return 4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thermal_throttling_retry = 0 4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (platform.IsThermallyThrottled() and 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thermal_throttling_retry < 3): 4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('Thermally throttled, waiting (%d)...', 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thermal_throttling_retry) 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thermal_throttling_retry += 1 4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) time.sleep(thermal_throttling_retry * 2) 4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if thermal_throttling_retry and platform.IsThermallyThrottled(): 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.error('Device is thermally throttled before running ' 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'performance tests, results will vary.') 4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def _CheckThermalThrottling(platform): 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not platform.CanMonitorThermalThrottling(): 4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if platform.HasBeenThermallyThrottled(): 4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.error('Device has been thermally throttled during ' 4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'performance tests, results will vary.') 428