blob: a36ac79abc251810ec27135b283cc058c59a5be5 [file] [log] [blame]
# 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))