page_runner.py revision f2477e01787aa58f445919b809d89e252beef54f
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 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochfrom telemetry.page import page_measurement_results 21a3f7b4e666c476898878fa745f637129375cd889Ben Murdochfrom telemetry.page import page_runner_repeat 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_test 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.page import results_options 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.page.actions import navigate 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _RunState(object): 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self): 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.browser = None 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._append_to_existing_wpr = False 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._last_archive_path = None 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._first_browser = True 34a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.first_page = collections.defaultdict(lambda: True) 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch self.profiler_dir = None 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) self.repeat_state = None 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) def StartBrowser(self, test, page_set, page, possible_browser, 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) credentials_path, archive_path): 408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) started_browser = not self.browser 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Create a browser. 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not self.browser: 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser = possible_browser.Create() 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser.credentials.credentials_path = credentials_path 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) # Set up WPR path on the new browser. 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.browser.SetReplayArchivePath(archive_path, 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self._append_to_existing_wpr, 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) page_set.make_javascript_deterministic) 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self._last_archive_path = page.archive_path 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test.WillStartBrowser(self.browser) 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) self.browser.Start() 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test.DidStartBrowser(self.browser) 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if self._first_browser: 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._first_browser = False 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser.credentials.WarnIfMissingCredentials(page_set) 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if self.browser.supports_system_info: 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) system_info = self.browser.GetSystemInfo() 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if system_info.model_name: 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) logging.info('Model: %s' % system_info.model_name) 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if system_info.gpu: 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for i, device in enumerate(system_info.gpu.devices): 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) logging.info('GPU device %d: %s', i, device) 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if system_info.gpu.aux_attributes: 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) logging.info('GPU Attributes:') 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for k, v in sorted(system_info.gpu.aux_attributes.iteritems()): 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) logging.info(' %-20s: %s', k, v) 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if system_info.gpu.feature_status: 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) logging.info('Feature Status:') 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for k, v in sorted(system_info.gpu.feature_status.iteritems()): 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) logging.info(' %-20s: %s', k, v) 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) else: 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) logging.info('No GPU devices') 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else: 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Set up WPR path if it changed. 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if page.archive_path and self._last_archive_path != page.archive_path: 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.browser.SetReplayArchivePath( 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch page.archive_path, 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self._append_to_existing_wpr, 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch page_set.make_javascript_deterministic) 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._last_archive_path = page.archive_path 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if self.browser.supports_tab_control and test.close_tabs_before_run: 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Create a tab if there's none. 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if len(self.browser.tabs) == 0: 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self.browser.tabs.New() 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) # Ensure only one tab is open, unless the test is a multi-tab test. 918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if not test.is_multi_tab_test: 928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) while len(self.browser.tabs) > 1: 938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) self.browser.tabs[-1].Close() 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) # Must wait for tab to commit otherwise it can commit after the next 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) # navigation has begun and RenderFrameHostManager::DidNavigateMainFrame() 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) # will cancel the next navigation because it's pending. This manifests as 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) # the first navigation in a PageSet freezing indefinitly because the 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) # navigation was silently cancelled when |self.browser.tabs[0]| was 1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) # committed. Only do this when we just started the browser, otherwise 1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) # there are cases where previous pages in a PageSet never complete 1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) # loading so we'll wait forever. 1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if started_browser: 1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) self.browser.tabs[0].WaitForDocumentReadyStateToBeComplete() 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 106a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if self.first_page[page]: 107a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.first_page[page] = False 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) def StopBrowser(self): 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.browser: 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.browser.Close() 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.browser = None 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Restarting the state will also restart the wpr server. If we're 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # recording, we need to continue adding into the same wpr archive, 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # not overwrite it. 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._append_to_existing_wpr = True 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) def StartProfiling(self, page, finder_options): 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if not self.profiler_dir: 121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch self.profiler_dir = tempfile.mkdtemp() 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) output_file = os.path.join(self.profiler_dir, page.file_safe_name) 123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if finder_options.repeat_options.IsRepeating(): 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_file = _GetSequentialFileName(output_file) 125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) self.browser.StartProfiling(finder_options.profiler, output_file) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) def StopProfiling(self): 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if self.browser: 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) self.browser.StopProfiling() 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class PageState(object): 1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) def __init__(self, page, tab): 1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self.page = page 1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self.tab = tab 1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._did_login = False 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) def PreparePage(self, test=None): 1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if self.page.is_file: 1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) server_started = self.tab.browser.SetHTTPServerDirectories( 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self.page.page_set.serving_dirs | set([self.page.serving_dir])) 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if server_started and test: 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.DidStartHTTPServer(self.tab) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if self.page.credentials: 1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if not self.tab.browser.credentials.LoginNeeded( 1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self.tab, self.page.credentials): 1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) raise page_test.Failure('Login as ' + self.page.credentials + ' failed') 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) self._did_login = True 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if test: 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if test.clear_cache_before_each_run: 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self.tab.ClearCache() 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) def ImplicitPageNavigation(self, test=None): 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) """Executes the implicit navigation that occurs for every page iteration. 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) This function will be called once per page before any actions are executed. 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) """ 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if test: 1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.WillNavigateToPage(self.page, self.tab) 1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.RunNavigateSteps(self.page, self.tab) 1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.DidNavigateToPage(self.page, self.tab) 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) else: 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) i = navigate.NavigateAction() 1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) i.RunAction(self.page, self.tab, None) 1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) def CleanUpPage(self): 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if self.page.credentials and self._did_login: 1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self.tab.browser.credentials.LoginNoLongerNeeded( 1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self.tab, self.page.credentials) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if self.tab: 1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self.tab.Disconnect() 1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self.tab = None 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def AddCommandLineOptions(parser): 1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_filter_module.PageFilter.AddCommandLineOptions(parser) 1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_options.AddResultsOptions(parser) 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochdef _LogStackTrace(title, browser): 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if browser: 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) stack_trace = browser.GetStackTrace() 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) else: 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) stack_trace = 'Browser object is empty, no stack trace.' 189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch stack_trace = (('\nStack Trace:\n') + 190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ('*' * 80) + 191ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch '\n\t' + stack_trace.replace('\n', '\n\t') + '\n' + 192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ('*' * 80)) 193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch logging.warning('%s%s', title, stack_trace) 194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)def _PrepareAndRunPage(test, page_set, expectations, finder_options, 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser_options, page, credentials_path, 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) possible_browser, results, state): 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if browser_options.wpr_mode != wpr_modes.WPR_RECORD: 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) possible_browser.finder_options.browser_options.wpr_mode = ( 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wpr_modes.WPR_REPLAY 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if page.archive_path and os.path.isfile(page.archive_path) 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) else wpr_modes.WPR_OFF) 204a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch results_for_current_run = results 205a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if state.first_page[page] and test.discard_first_result: 206a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch # If discarding results, substitute a dummy object. 207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch results_for_current_run = page_measurement_results.PageMeasurementResults() 208a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch results_for_current_run.StartTest(page) 209a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch tries = 3 210a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch while tries: 211a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch try: 212a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StartBrowser(test, page_set, page, possible_browser, 213a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch credentials_path, page.archive_path) 214a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) expectation = expectations.GetExpectationForPage(state.browser, page) 2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 217a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _WaitForThermalThrottlingIfNeeded(state.browser.platform) 218a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 219424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if finder_options.profiler: 220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) state.StartProfiling(page, finder_options) 221a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 222a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch try: 2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) _RunPage(test, page, state, expectation, 224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) results_for_current_run, finder_options) 225a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _CheckThermalThrottling(state.browser.platform) 226a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch except exceptions.TabCrashException: 227a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _LogStackTrace('Tab crashed: %s' % page.url, state.browser) 2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if test.is_multi_tab_test: 2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) logging.error('Stopping multi-tab test after tab %s crashed' 2308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) % page.url) 2318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) raise 2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) else: 2338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) state.StopBrowser() 234a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if finder_options.profiler: 236a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StopProfiling() 237a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if test.NeedsBrowserRestartAfterEachRun(state.browser): 239a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StopBrowser() 240a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 241a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch break 242a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch except exceptions.BrowserGoneException: 243a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch _LogStackTrace('Browser crashed', state.browser) 244a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch logging.warning('Lost connection to browser. Retrying.') 245a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch state.StopBrowser() 246a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch tries -= 1 247a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if not tries: 248a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch logging.error('Lost connection to browser 3 times. Failing.') 249a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch raise 2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if test.is_multi_tab_test: 2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) logging.error( 2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 'Lost connection to browser during multi-tab test. Failing.') 2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) raise 254a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch results_for_current_run.StopTest(page) 255a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 256a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)def Run(test, page_set, expectations, finder_options): 2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) """Runs a given test against a given page_set with the given options.""" 259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) results = results_options.PrepareResults(test, finder_options) 26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser_options = finder_options.browser_options 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.ValidatePageSet(page_set) 2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Create a possible_browser with the given options. 265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) test.CustomizeBrowserOptions(finder_options) 266bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch try: 267424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) possible_browser = browser_finder.FindBrowser(finder_options) 268bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch except browser_finder.BrowserTypeRequiredException, e: 269bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch sys.stderr.write(str(e) + '\n') 270bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch sys.exit(1) 2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not possible_browser: 272bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch sys.stderr.write( 273bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 'No browser found. Available browsers:\n' + 274424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) '\n'.join(browser_finder.GetAllAvailableBrowserTypes(finder_options)) + 275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) '\n') 276bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch sys.exit(1) 2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_options.browser_type = possible_browser.browser_type 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Reorder page set based on options. 281424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pages = _ShuffleAndFilterPageSet(page_set, finder_options) 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 283424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (not finder_options.allow_live_sites and 28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser_options.wpr_mode != wpr_modes.WPR_RECORD): 2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages = _CheckArchives(page_set, pages, results) 2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Verify credentials path. 2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) credentials_path = None 2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if page_set.credentials_path: 2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) credentials_path = os.path.join(os.path.dirname(page_set.file_path), 2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_set.credentials_path) 2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not os.path.exists(credentials_path): 2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) credentials_path = None 2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Set up user agent. 2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if page_set.user_agent_type: 29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser_options.browser_user_agent_type = page_set.user_agent_type 2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for page in pages: 300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) test.CustomizeBrowserOptionsForPage(page, possible_browser.finder_options) 3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if finder_options.profiler: 3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) profiler_class = profiler_finder.FindProfiler(finder_options.profiler) 3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) profiler_class.CustomizeBrowserOptions(possible_browser.browser_type, 3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) possible_browser.finder_options) 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 306a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch for page in list(pages): 307a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if not test.CanRunForPage(page): 308a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch logging.warning('Skipping test: it cannot run for %s', page.url) 309a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch results.AddSkip(page, 'Test cannot run') 310a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch pages.remove(page) 311a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 312a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if not pages: 313a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return results 314a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) state = _RunState() 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # TODO(dtu): Move results creation and results_for_current_run into RunState. 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) try: 3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.WillRunTest() 3203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state.repeat_state = page_runner_repeat.PageRunnerRepeatState( 321424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) finder_options.repeat_options) 322a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state.repeat_state.WillRunPageSet() 3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) while state.repeat_state.ShouldRepeatPageSet() and not test.IsExiting(): 325a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch for page in pages: 3263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state.repeat_state.WillRunPage() 3271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.WillRunPageRepeats(page) 3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) while state.repeat_state.ShouldRepeatPage(): 329a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch # execute test on page 33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) _PrepareAndRunPage(test, page_set, expectations, finder_options, 33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser_options, page, credentials_path, 33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) possible_browser, results, state) 3333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state.repeat_state.DidRunPage() 3341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.DidRunPageRepeats(page) 3351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if test.IsExiting(): 3361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break 3373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state.repeat_state.DidRunPageSet() 338a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.DidRunTest(state.browser, results) 3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) finally: 3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) state.StopBrowser() 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return results 3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 346424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)def _ShuffleAndFilterPageSet(page_set, finder_options): 347424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (finder_options.pageset_shuffle_order_file and 348424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) not finder_options.pageset_shuffle): 3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) raise Exception('--pageset-shuffle-order-file requires --pageset-shuffle.') 3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 351424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if finder_options.pageset_shuffle_order_file: 352424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return page_set.ReorderPageSet(finder_options.pageset_shuffle_order_file) 3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 354424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) page_filter = page_filter_module.PageFilter(finder_options) 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages = [page for page in page_set.pages[:] 3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not page.disabled and page_filter.IsSelected(page)] 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 358424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if finder_options.pageset_shuffle: 3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) random.Random().shuffle(pages) 360a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 361a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return pages 3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def _CheckArchives(page_set, pages, results): 3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) """Returns a subset of pages that are local or have WPR archives. 3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Logs warnings if any are missing.""" 3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_set_has_live_sites = False 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for page in pages: 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if not page.is_local: 3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_set_has_live_sites = True 3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break 3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Potential problems with the entire page set. 3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if page_set_has_live_sites: 3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not page_set.archive_data_file: 3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('The page set is missing an "archive_data_file" ' 3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'property. Skipping any live sites. To include them, ' 3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'pass the flag --allow-live-sites.') 3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not page_set.wpr_archive_info: 3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('The archive info file is missing. ' 3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'To fix this, either add svn-internal to your ' 3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) '.gclient using http://goto/read-src-internal, ' 3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'or create a new archive using record_wpr.') 3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Potential problems with individual pages. 3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_path = [] 3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_data = [] 3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for page in pages: 391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if page.is_local: 3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue 3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not page.archive_path: 3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_path.append(page) 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch elif not os.path.isfile(page.archive_path): 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_data.append(page) 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if pages_missing_archive_path: 4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('The page set archives for some pages do not exist. ' 4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'Skipping those pages. To fix this, record those pages ' 4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'using record_wpr. To ignore this warning and run ' 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'against live sites, pass the flag --allow-live-sites.') 4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if pages_missing_archive_data: 4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('The page set archives for some pages are missing. ' 4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'Someone forgot to check them in, or they were deleted. ' 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'Skipping those pages. To fix this, record those pages ' 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'using record_wpr. To ignore this warning and run ' 4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'against live sites, pass the flag --allow-live-sites.') 4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for page in pages_missing_archive_path + pages_missing_archive_data: 4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.StartTest(page) 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.AddErrorMessage(page, 'Page set archive doesn\'t exist.') 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.StopTest(page) 4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return [page for page in pages if page not in 4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pages_missing_archive_path + pages_missing_archive_data] 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 420424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)def _RunPage(test, page, state, expectation, results, finder_options): 421424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if expectation == 'skip': 422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) logging.info('Skipped %s' % page.url) 423424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return 424424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.info('Running %s' % page.url) 4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) page_state = PageState(page, test.TabForPage(page, state.browser)) 4283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) def ProcessError(): 4303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) logging.error('%s:\n%s', page.url, traceback.format_exc()) 4313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if expectation == 'fail': 4323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) logging.info('Error was expected\n') 4333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results.AddSuccess(page) 4343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) else: 4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results.AddError(page, sys.exc_info()) 4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) try: 4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) page_state.PreparePage(test) 439424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if state.repeat_state.ShouldNavigate( 440424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) finder_options.skip_navigate_on_repeat): 4411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) page_state.ImplicitPageNavigation(test) 4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test.Run(finder_options, page, page_state.tab, results) 4431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) util.CloseConnections(page_state.tab) 4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) except page_test.Failure: 445ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if expectation == 'fail': 446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) logging.info('%s:\n%s', page.url, traceback.format_exc()) 447ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch logging.info('Failure was expected\n') 448ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch results.AddSuccess(page) 449ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch else: 450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) logging.warning('%s:\n%s', page.url, traceback.format_exc()) 451ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch results.AddFailure(page, sys.exc_info()) 452558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch except (util.TimeoutException, exceptions.LoginException, 453558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch exceptions.ProfilingException): 4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ProcessError() 4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) except (exceptions.TabCrashException, exceptions.BrowserGoneException): 4563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ProcessError() 4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Run() catches these exceptions to relaunch the tab/browser, so re-raise. 4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) raise 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) except Exception: 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) raise 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else: 462ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if expectation == 'fail': 463ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch logging.warning('%s was expected to fail, but passed.\n', page.url) 4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results.AddSuccess(page) 4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) finally: 4661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) page_state.CleanUpPage() 4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def _GetSequentialFileName(base_name): 4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) """Returns the next sequential file name based on |base_name| and the 4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) existing files.""" 4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index = 0 4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while True: 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_name = '%s_%03d' % (base_name, index) 4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not glob.glob(output_name + '.*'): 4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break 4777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index = index + 1 4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return output_name 4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def _WaitForThermalThrottlingIfNeeded(platform): 4827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not platform.CanMonitorThermalThrottling(): 4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return 4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thermal_throttling_retry = 0 4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (platform.IsThermallyThrottled() and 4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thermal_throttling_retry < 3): 4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.warning('Thermally throttled, waiting (%d)...', 4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thermal_throttling_retry) 4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thermal_throttling_retry += 1 4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) time.sleep(thermal_throttling_retry * 2) 4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if thermal_throttling_retry and platform.IsThermallyThrottled(): 4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.error('Device is thermally throttled before running ' 4947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'performance tests, results will vary.') 4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def _CheckThermalThrottling(platform): 4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if not platform.CanMonitorThermalThrottling(): 4997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return 5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if platform.HasBeenThermallyThrottled(): 5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) logging.error('Device has been thermally throttled during ' 5027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 'performance tests, results will vary.') 503