1# Copyright 2014 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 5import gobject, logging 6from dbus.exceptions import DBusException 7from dbus.mainloop.glib import DBusGMainLoop 8 9from autotest_lib.client.bin import test, utils 10from autotest_lib.client.common_lib import error 11from autotest_lib.client.common_lib.cros import chrome, session_manager 12from autotest_lib.client.cros import constants 13 14 15class desktopui_ExitOnSupervisedUserCrash_P(test.test): 16 """Sign in, indicate that a supervised user is being created, then crash.""" 17 version = 1 18 19 _SESSION_STOP_TIMEOUT = 60 20 21 22 def initialize(self): 23 super(desktopui_ExitOnSupervisedUserCrash_P, self).initialize() 24 25 26 def run_once(self, arc_mode=None): 27 listener = session_manager.SessionSignalListener(gobject.MainLoop()) 28 with chrome.Chrome(arc_mode=arc_mode): 29 sm = session_manager.connect(DBusGMainLoop(set_as_default=True)) 30 # Tell session_manager that we're going all the way through 31 # creating a supervised user. 32 sm.HandleSupervisedUserCreationStarting() 33 sm.HandleSupervisedUserCreationFinished() 34 # Crashing the browser should not end the session, as creating the 35 # user is finished. 36 utils.nuke_process_by_name(constants.BROWSER) 37 38 # We should still be able to talk to the session_manager, 39 # and it should indicate that we're still inside a user session. 40 try: 41 state = sm.RetrieveSessionState() 42 except DBusException as e: 43 raise error.TestError('Failed to retrieve session state: ', e) 44 if state != 'started': 45 raise error.TestFail('Session should not have ended: ', state) 46 47 # Start listening to stop signal before the session gets killed. 48 listener.listen_for_session_state_change('stopped') 49 50 # Tell session_manager that a supervised user is being set up, 51 # and kill it in the middle. Session should die. 52 sm.HandleSupervisedUserCreationStarting() 53 nuke_browser_error = None 54 try: 55 utils.nuke_process_by_name(constants.BROWSER) 56 except error.AutoservPidAlreadyDeadError as e: 57 nuke_browser_error = e 58 logging.warning('Browser may have crashed untimely: ', e) 59 60 try: 61 listener.wait_for_signals(desc='Session stopped.', 62 timeout=self._SESSION_STOP_TIMEOUT) 63 except utils.TimeoutError as actual_problem: 64 if nuke_browser_error is not None: 65 actual_problem = nuke_browser_error 66 raise error.TestFail(actual_problem) 67