164 lines
5.8 KiB
Python
164 lines
5.8 KiB
Python
# Copyright (c) 2013 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
|
|
|
|
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, session_manager
|
|
from autotest_lib.client.cros import asan
|
|
from autotest_lib.client.cros.input_playback import input_playback
|
|
|
|
from datetime import datetime
|
|
from dbus.mainloop.glib import DBusGMainLoop
|
|
|
|
class desktopui_ScreenLocker(test.test):
|
|
"""This is a client side test that exercises the screenlocker."""
|
|
version = 1
|
|
|
|
_SCREEN_IS_LOCKED_TIMEOUT = 30
|
|
# TODO(jdufault): Remove this timeout increase for asan bots once we figure
|
|
# out what's taking so long to lock the screen. See crbug.com/452599.
|
|
if asan.running_on_asan():
|
|
_SCREEN_IS_LOCKED_TIMEOUT *= 2
|
|
|
|
"""Timeout for password authentication."""
|
|
_AUTHENTICATION_TIMEOUT = 30
|
|
|
|
|
|
def initialize(self):
|
|
"""Init method"""
|
|
super(desktopui_ScreenLocker, self).initialize()
|
|
DBusGMainLoop(set_as_default=True)
|
|
self.player = input_playback.InputPlayback()
|
|
self.player.emulate(input_type='keyboard')
|
|
self.player.find_connected_inputs()
|
|
|
|
|
|
def cleanup(self):
|
|
"""Test cleanup."""
|
|
self.player.close()
|
|
|
|
|
|
@property
|
|
def screen_locked(self):
|
|
"""True if the screen is locked."""
|
|
return self._chrome.login_status['isScreenLocked']
|
|
|
|
|
|
@property
|
|
def screen_ready_for_password(self):
|
|
"""True if the screen is ready for password."""
|
|
return self._chrome.login_status['isReadyForPassword']
|
|
|
|
|
|
def lock_screen(self, perf_values):
|
|
"""Lock the screen.
|
|
|
|
@param perf_values: Performance data will be stored inside of this dict.
|
|
|
|
@raises: error.TestFail when screen already locked.
|
|
@raises: error.TestFail when screen not locked.
|
|
|
|
"""
|
|
logging.debug('lock_screen')
|
|
if self.screen_locked:
|
|
raise error.TestFail('Screen already locked')
|
|
signal_listener = session_manager.ScreenIsLockedSignalListener(
|
|
gobject.MainLoop())
|
|
ext = self._chrome.autotest_ext
|
|
|
|
start = datetime.now()
|
|
ext.EvaluateJavaScript('chrome.autotestPrivate.lockScreen();')
|
|
signal_listener.wait_for_signals(desc='Screen is locked.',
|
|
timeout=self._SCREEN_IS_LOCKED_TIMEOUT)
|
|
perf_values['lock_seconds'] = (datetime.now() - start).total_seconds()
|
|
|
|
utils.poll_for_condition(
|
|
lambda: self.screen_locked,
|
|
exception=error.TestFail('Screen not locked'))
|
|
|
|
|
|
def lock_screen_through_keyboard(self):
|
|
"""Lock the screen with keyboard(search+L) .
|
|
|
|
@raises: error.TestFail when screen already locked.
|
|
@raises: error.TestFail if screen not locked after using keyboard
|
|
shortcut.
|
|
|
|
"""
|
|
logging.debug('Locking screen through the keyboard shortcut')
|
|
if self.screen_locked:
|
|
raise error.TestFail('Screen already locked')
|
|
self.player.blocking_playback_of_default_file(
|
|
input_type='keyboard', filename='keyboard_search+L')
|
|
utils.poll_for_condition(
|
|
lambda: self.screen_locked,
|
|
exception=error.TestFail(
|
|
'Screen not locked after using keyboard shortcut'))
|
|
|
|
|
|
def attempt_unlock_bad_password(self):
|
|
"""Attempt unlock with a bad password.
|
|
|
|
@raises: error.TestFail when successfully unlock with bad password.
|
|
|
|
"""
|
|
logging.debug('attempt_unlock_bad_password')
|
|
self.player.blocking_playback_of_default_file(
|
|
input_type='keyboard', filename='keyboard_b+a+d+enter')
|
|
|
|
# Wait for the authentication to complete.
|
|
utils.poll_for_condition(
|
|
lambda: self.screen_ready_for_password,
|
|
exception=error.TestFail(
|
|
'Authentication is not completed after %d seconds',
|
|
self._AUTHENTICATION_TIMEOUT),
|
|
timeout=self._AUTHENTICATION_TIMEOUT)
|
|
if not self.screen_locked:
|
|
raise error.TestFail('Screen unlocked with bad password')
|
|
|
|
|
|
def unlock_screen(self):
|
|
"""Unlock the screen with the right password. The correct password is
|
|
the empty string.
|
|
TODO(crbug.com/792251): Use non-empty password.
|
|
|
|
@raises: error.TestFail if failed to unlock screen.
|
|
|
|
"""
|
|
logging.debug('unlock_screen')
|
|
self.player.blocking_playback_of_default_file(
|
|
input_type='keyboard', filename='keyboard_g+o+o+d+enter')
|
|
utils.poll_for_condition(
|
|
lambda: not self.screen_locked,
|
|
exception=error.TestFail('Failed to unlock screen'),
|
|
timeout=self._AUTHENTICATION_TIMEOUT)
|
|
|
|
|
|
def run_once(self):
|
|
"""
|
|
This test locks the screen, tries to unlock with a bad password,
|
|
then unlocks with the right password.
|
|
|
|
"""
|
|
with chrome.Chrome(autotest_ext=True, password='good') as self._chrome:
|
|
try:
|
|
# Give performance data some initial state that will be reported
|
|
# if the test times out.
|
|
perf_values = { 'lock_seconds': self._SCREEN_IS_LOCKED_TIMEOUT }
|
|
|
|
self.lock_screen(perf_values)
|
|
self.attempt_unlock_bad_password()
|
|
self.unlock_screen()
|
|
self.lock_screen_through_keyboard()
|
|
self.unlock_screen()
|
|
finally:
|
|
self.output_perf_value(
|
|
description='time_to_lock_screen',
|
|
value=perf_values['lock_seconds'],
|
|
units='s',
|
|
higher_is_better=False)
|