# Copyright 2017 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 gobject import logging import os import time from autotest_lib.client.bin import test from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib.cros import chrome, session_manager from autotest_lib.client.cros import cryptohome from autotest_lib.client.cros.graphics import graphics_utils from dbus.mainloop.glib import DBusGMainLoop class desktopui_ChromeSanity(test.test): """Performs basic integration testing for Chrome. This test performs very basic tests to verify that Chrome is somewhat usable in conjunction with the rest of the system. """ version = 1 _CHECK_CHROME_TIMEOUT_SEC = 30 _SESSION_START_TIMEOUT_SEC = 20 _TEST_FILENAME = 'test.html' _TEST_CONTENT = 'Page loaded successfully.' _SCREENSHOT_DIR = '/usr/local/autotest/results/default/' \ 'desktopui_ChromeSanity/results/' def initialize(self): super(desktopui_ChromeSanity, self).initialize() def run_once(self): """ Runs the test. """ dbus_loop = DBusGMainLoop(set_as_default=True) listener = session_manager.SessionSignalListener(gobject.MainLoop()) listener.listen_for_session_state_change('started') logging.info('Logging in...') with chrome.Chrome(init_network_controller=True) as cr: # Check that Chrome asks session_manager to start a session. listener.wait_for_signals( desc=('SessionStateChanged "started" D-Bus signal from ' 'session_manager'), timeout=self._SESSION_START_TIMEOUT_SEC) logging.info('Successfully logged in as "%s"', cr.username) # Check that the user's encrypted home directory was mounted. if not cryptohome.is_vault_mounted(user=cr.username, allow_fail=False): raise error.TestFail( 'Didn\'t find mounted cryptohome for "%s"' % cr.username) # Check that Chrome is able to load a web page. cr.browser.platform.SetHTTPServerDirectories(self.bindir) url = cr.browser.platform.http_server.UrlOf( os.path.join(self.bindir, self._TEST_FILENAME)) logging.info('Loading %s...', url) try: tab = cr.browser.tabs.New() tab.Navigate(url) tab.WaitForDocumentReadyStateToBeComplete() content = tab.EvaluateJavaScript( 'document.documentElement.innerText') if content != self._TEST_CONTENT: raise error.TestFail( 'Expected page content "%s" but got "%s"' % (self._TEST_CONTENT, content)) logging.info('Saw expected content') except Exception as e: prefix = 'screenshot-%s' % time.strftime('%Y%m%d-%H%M%S') logging.info( 'Got exception; saving screenshot to %s/%s', self._SCREENSHOT_DIR, prefix) if not os.path.exists(self._SCREENSHOT_DIR): os.makedirs(self._SCREENSHOT_DIR) graphics_utils.take_screenshot(self._SCREENSHOT_DIR, prefix) if isinstance(e, error.TestFail): raise e else: raise error.TestFail(str(e))