Home | History | Annotate | Download | only in desktopui_ScreenLocker
      1 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging
      6 
      7 from autotest_lib.client.bin import test, utils
      8 from autotest_lib.client.common_lib import error
      9 from autotest_lib.client.common_lib.cros import chrome, session_manager
     10 from autotest_lib.client.cros import asan
     11 
     12 import gobject
     13 from dbus.mainloop.glib import DBusGMainLoop
     14 
     15 class desktopui_ScreenLocker(test.test):
     16     """This is a client side test that exercises the screenlocker."""
     17     version = 1
     18 
     19     _SCREEN_IS_LOCKED_TIMEOUT = 30
     20     # TODO(jdufault): Remove this timeout increase for asan bots once we figure
     21     # out what's taking so long to lock the screen. See crbug.com/452599.
     22     if asan.running_on_asan():
     23       _SCREEN_IS_LOCKED_TIMEOUT *= 2
     24 
     25 
     26     def initialize(self):
     27         super(desktopui_ScreenLocker, self).initialize()
     28         DBusGMainLoop(set_as_default=True)
     29 
     30 
     31     @property
     32     def screen_locked(self):
     33         """True if the screen is locked."""
     34         return self._chrome.login_status['isScreenLocked']
     35 
     36 
     37     @property
     38     def screenlocker_visible(self):
     39         """True if the screenlocker screen is visible."""
     40         oobe = self._chrome.browser.oobe
     41         return (oobe and
     42                 oobe.EvaluateJavaScript(
     43                     "(typeof Oobe == 'function') && "
     44                     "(typeof Oobe.authenticateForTesting == 'function') && "
     45                     "($('account-picker') != null)"))
     46 
     47     @property
     48     def error_bubble_visible(self):
     49         """True if the error bubble for bad password is visible."""
     50         return self._chrome.browser.oobe.EvaluateJavaScript(
     51                 "cr.ui.login.DisplayManager.errorMessageWasShownForTesting_;")
     52 
     53 
     54     def attempt_unlock(self, password=''):
     55         """Attempt to unlock a locked screen. The correct password is the empty
     56            string.
     57 
     58         @param password: password to use to attempt the unlock.
     59 
     60         """
     61         self._chrome.browser.oobe.ExecuteJavaScript(
     62                 "Oobe.authenticateForTesting('%s', '%s');"
     63                 % (self._chrome.username, password))
     64 
     65 
     66     def lock_screen(self):
     67         """Lock the screen."""
     68         logging.debug('lock_screen')
     69         if self.screen_locked:
     70             raise error.TestFail('Screen already locked')
     71         signal_listener = session_manager.ScreenIsLockedSignalListener(
     72                 gobject.MainLoop())
     73         ext = self._chrome.autotest_ext
     74         ext.EvaluateJavaScript('chrome.autotestPrivate.lockScreen();')
     75         signal_listener.wait_for_signals(desc='Screen is locked.',
     76                                          timeout=self._SCREEN_IS_LOCKED_TIMEOUT)
     77         utils.poll_for_condition(lambda: self.screenlocker_visible,
     78                 exception=error.TestFail('Screenlock screen not visible'))
     79         if not self.screen_locked:
     80             raise error.TestFail('Screen not locked')
     81 
     82 
     83     def attempt_unlock_bad_password(self):
     84         """Attempt unlock with a bad password."""
     85         logging.debug('attempt_unlock_bad_password')
     86         if self.error_bubble_visible:
     87             raise error.TestFail('Error bubble prematurely visible')
     88         self.attempt_unlock('bad')
     89         utils.poll_for_condition(lambda: self.error_bubble_visible,
     90                 exception=error.TestFail('Bad password bubble did not show'))
     91         if not self.screen_locked:
     92             raise error.TestFail('Screen unlocked with bad password')
     93 
     94 
     95     def unlock_screen(self):
     96         """Unlock the screen with the right password."""
     97         logging.debug('unlock_screen')
     98         self.attempt_unlock()
     99         utils.poll_for_condition(
    100                 lambda: not self._chrome.browser.oobe_exists,
    101                 exception=error.TestFail('Failed to unlock screen'))
    102         if self.screen_locked:
    103             raise error.TestFail('Screen should be unlocked')
    104 
    105 
    106     def run_once(self):
    107         """
    108         This test locks the screen, tries to unlock with a bad password,
    109         then unlocks with the right password.
    110 
    111         """
    112         with chrome.Chrome(autotest_ext=True) as self._chrome:
    113             self.lock_screen()
    114             self.attempt_unlock_bad_password()
    115             self.unlock_screen()
    116 
    117