# Copyright (c) 2012 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. import logging import pprint import sys import time from autotest_lib.client.bin import test, utils from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib.cros import chrome from autotest_lib.client.cros import constants, cros_logging from autotest_lib.client.cros import httpd class desktopui_FlashSanityCheck(test.test): """ Sanity test that ensures flash instance is launched when a swf is played. """ version = 4 _messages_log_reader = None _ui_log_reader = None _test_url = None _testServer = None def initialize(self): logging.info('initialize() - Run html server.') self._test_url = 'http://localhost:8000/index.html' self._testServer = httpd.HTTPListener(8000, docroot=self.bindir) self._testServer.run() logging.info('initialize() - Wait 5 seconds for server to run.') time.sleep(5) def cleanup(self): if self._testServer is not None: self._testServer.stop() def run_flash_sanity_test(self, browser, time_to_wait_secs): """Run the Flash sanity test. @param browser: The Browser object to run the test with. @param time_to_wait_secs: wait time for swf file to load. """ tab = None # BUG(485108): Work around a telemetry timing out after login. try: logging.info('Getting tab from telemetry...') tab = browser.tabs[0] except: logging.warning('Unexpected exception getting tab: %s', pprint.pformat(sys.exc_info()[0])) if tab is None: return False logging.info('Initialize reading system logs.') self._messages_log_reader = cros_logging.LogReader() self._messages_log_reader.set_start_by_current() self._ui_log_reader = cros_logging.LogReader('/var/log/ui/ui.LATEST') self._ui_log_reader.set_start_by_current() logging.info('Done initializing system logs.') # Ensure that the swf got pulled. pulled = False try: latch = self._testServer.add_wait_url('/Trivial.swf') tab.Navigate(self._test_url) tab.WaitForDocumentReadyStateToBeComplete() logging.info('Waiting up to %ds for document.', time_to_wait_secs) latch.wait(time_to_wait_secs) pulled = True except: logging.warning('Unexpected exception wating for document: %s', pprint.pformat(sys.exc_info()[0])) if not pulled: return False logging.info('Waiting for Pepper process.') # Verify that we see a ppapi process and assume it is Flash. ppapi = utils.wait_for_value_changed( lambda: (utils.get_process_list('chrome', '--type=ppapi')), old_value=[], timeout_sec=5) logging.info('ppapi process list at start: %s', ', '.join(ppapi)) if not ppapi: msg = 'flash/platform/pepper/pep_' if not self._ui_log_reader.can_find(msg): raise error.TestFail( 'Flash did not start (logs) and no ppapi process found.') # There is a chrome bug where the command line of the ppapi and # other processes is shown as "type=zygote". Bail out if we see more # than 2. Notice, we already did the waiting, so there is no need to # do more of it. zygote = utils.get_process_list('chrome', '--type=zygote') if len(zygote) > 2: logging.warning('Flash probably launched by Chrome as zygote: ' '<%s>.', ', '.join(zygote)) return False # We have a ppapi process. Let it run for a little and see if it is # still alive. logging.info('Running Flash content for a little while.') time.sleep(5) logging.info('Verifying the Pepper process is still around.') ppapi = utils.wait_for_value_changed( lambda: (utils.get_process_list('chrome', '--type=ppapi')), old_value=[], timeout_sec=3) # Notice that we are not checking for equality of ppapi on purpose. logging.info('PPapi process list found: <%s>', ', '.join(ppapi)) # Any better pattern matching? msg = ' Received crash notification for ' + constants.BROWSER if self._messages_log_reader.can_find(msg): raise error.TestFail('Browser crashed during test.') if not ppapi: raise error.TestFail('Pepper process disappeared during test.') # At a minimum Flash identifies itself during process start. msg = 'flash/platform/pepper/pep_' if not self._ui_log_reader.can_find(msg): raise error.TestFail('Saw ppapi process but no Flash output.') return True def run_once(self, time_to_wait_secs=5): utils.verify_flash_installed() retries = 10 flash_tested = False while not flash_tested and retries > 0: retries = retries - 1 with chrome.Chrome() as cr: flash_tested = self.run_flash_sanity_test(cr.browser, time_to_wait_secs) if not flash_tested: raise error.TestFail('Unable to test Flash due to other problems.')