| # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """ |
| Run a pre-defined set of pages on the DUT for Chrome profile collection. |
| |
| The purpose of this test is to exercise chrome with a meaningful set |
| of pages while a profile of Chrome is captured. It also aims at using |
| the minimum set of functionality from Telemetry since Telemetry is not |
| very stable on ChromeOS at this point. |
| |
| This test is designed to be called from the telemetry_AFDOGenerate |
| server test. The server test will start the "perf" profiling tool on |
| the DUT before starting this test. It will also capture the chrome |
| profile and upload it to Google Storage to be used for an optimized |
| build of Chrome. |
| """ |
| |
| import logging |
| import os |
| import sys |
| import time |
| import traceback |
| |
| from autotest_lib.client.common_lib.cros import chrome |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.cros import httpd |
| |
| # List of page cycler pages to use for Chrome profiling |
| PAGE_CYCLER_BENCHMARKS = [ |
| 'alexa_us', |
| 'bloat', |
| 'dhtml', |
| 'dom', |
| 'intl1', |
| 'intl2', |
| 'morejs', |
| 'morejsnp', |
| 'moz', |
| 'moz2' ] |
| |
| HTTP_PORT = 8000 |
| FILE_URL_PREFIX = 'http://localhost:%d/test_src/' % HTTP_PORT |
| |
| class telemetry_AFDOGenerateClient(test.test): |
| """ |
| Run a set of pre-defined set of pages to exercise Chrome so that |
| we can capture a Chrome profile. |
| """ |
| version = 1 |
| |
| |
| def initialize(self): |
| """Setup required DEPS and start the http listener.""" |
| dep = 'page_cycler_dep' |
| dep_dir = os.path.join(self.autodir, 'deps', dep) |
| self.job.install_pkg(dep, 'dep', dep_dir) |
| self.listener = httpd.HTTPListener(HTTP_PORT, docroot=dep_dir) |
| self.listener.run() |
| |
| |
| def cleanup(self): |
| """Stop the active http listener.""" |
| self.listener.stop() |
| |
| |
| def run_once(self): |
| """Display predetermined set of pages so that we can profile Chrome.""" |
| with chrome.Chrome() as cr: |
| for benchmark in PAGE_CYCLER_BENCHMARKS: |
| self._try_page_cycler(cr, benchmark) |
| |
| def _try_page_cycler(self, cr, benchmark): |
| """Try executing a page cycler and recover if browser dies. |
| |
| Navigates to the specified page_cycler, checks if the browser |
| died while executing it and waits until browser recovers. |
| |
| @param cr: instance of chrome.Chrome class to control chrome. |
| @param benchmark: page_cycler page to display. |
| """ |
| if cr.did_browser_crash( |
| lambda: self._navigate_page_cycler(cr, benchmark)): |
| logging.info('Browser died while navigating %s', benchmark) |
| logging.info('Trying to continue...') |
| cr.wait_for_browser_to_come_up() |
| |
| |
| def _navigate_page_cycler(self, cr, benchmark): |
| """Navigate to a specific page_cycler page. |
| |
| Navigates to the specified page_cycler and waits for the value |
| of the __pc_done cookie to indicate it is done. |
| |
| @param cr: instance of chrome.Chrome class to control chrome. |
| @param benchmark: page_cycler page to display. |
| """ |
| PC_START_PAGE = 'data/page_cycler/%s/start.html?auto=1' |
| PC_DONE_EXP = 'window.document.cookie.indexOf("__pc_done=1") >= 0' |
| tab = cr.browser.tabs.New() |
| try: |
| tab.Activate() |
| logging.info('Navigating to page cycler %s', benchmark) |
| start_time = time.time() |
| benchmark_start_page = PC_START_PAGE % benchmark |
| tab.Navigate(FILE_URL_PREFIX + benchmark_start_page) |
| tab.WaitForDocumentReadyStateToBeComplete(timeout=180) |
| tab.WaitForJavaScriptCondition(PC_DONE_EXP, timeout=600) |
| tab.Close() |
| end_time = time.time() |
| logging.info('Completed page cycler %s in %f seconds', |
| benchmark, end_time - start_time) |
| except Exception as unk_exc: |
| end_time = time.time() |
| logging.info('After navigating %s for %f seconds got exception %s', |
| benchmark, end_time - start_time, str(unk_exc)) |
| traceback.print_exc(file=sys.stdout) |
| raise |