1c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone# Copyright 2014 The Chromium OS Authors. All rights reserved. 2c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone# Use of this source code is governed by a BSD-style license that can be 3c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone# found in the LICENSE file. 4c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 5c877cb93a811f68374c3f0d81827e27607ffa3a4Chris Masoneimport gobject, logging 6c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masonefrom dbus.exceptions import DBusException 7c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masonefrom dbus.mainloop.glib import DBusGMainLoop 8c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 9c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masonefrom autotest_lib.client.bin import test, utils 10c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masonefrom autotest_lib.client.common_lib import error 11c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masonefrom autotest_lib.client.common_lib.cros import chrome, session_manager 12e0b08e6170b57f90262726eb7f04e059cb47419cHsinyu Chaofrom autotest_lib.client.cros import constants 13c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 14c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 15c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masoneclass desktopui_ExitOnSupervisedUserCrash(test.test): 16c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone """Sign in, indicate that a supervised user is being created, then crash.""" 17c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone version = 1 18c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 19c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone _SESSION_STOP_TIMEOUT = 60 20c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 21c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 22c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone def initialize(self): 23c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone super(desktopui_ExitOnSupervisedUserCrash, self).initialize() 24c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 25c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 26c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone def run_once(self): 27c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone listener = session_manager.SessionSignalListener(gobject.MainLoop()) 28c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone with chrome.Chrome(): 29c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone sm = session_manager.connect(DBusGMainLoop(set_as_default=True)) 30c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone # Tell session_manager that we're going all the way through 31c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone # creating a supervised user. 32c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone sm.HandleSupervisedUserCreationStarting() 33c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone sm.HandleSupervisedUserCreationFinished() 34c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone # Crashing the browser should not end the session, as creating the 35c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone # user is finished. 36c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone utils.nuke_process_by_name(constants.BROWSER) 37c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 38c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone # We should still be able to talk to the session_manager, 39c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone # and it should indicate that we're still inside a user session. 40c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone try: 41c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone state = sm.RetrieveSessionState() 42c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone except DBusException as e: 43c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone raise error.TestError('Failed to retrieve session state: ', e) 44c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone if state != 'started': 45c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone raise error.TestFail('Session should not have ended: ', state) 46c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 47c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone # Start listening to stop signal before the session gets killed. 48c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone listener.listen_for_session_state_change('stopped') 49c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 50c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone # Tell session_manager that a supervised user is being set up, 51c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone # and kill it in the middle. Session should die. 52c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone sm.HandleSupervisedUserCreationStarting() 53c877cb93a811f68374c3f0d81827e27607ffa3a4Chris Masone nuke_browser_error = None 54c877cb93a811f68374c3f0d81827e27607ffa3a4Chris Masone try: 55c877cb93a811f68374c3f0d81827e27607ffa3a4Chris Masone utils.nuke_process_by_name(constants.BROWSER) 56c877cb93a811f68374c3f0d81827e27607ffa3a4Chris Masone except error.AutoservPidAlreadyDeadError as e: 57c877cb93a811f68374c3f0d81827e27607ffa3a4Chris Masone nuke_browser_error = e 58c877cb93a811f68374c3f0d81827e27607ffa3a4Chris Masone logging.warning('Browser may have crashed untimely: ', e) 59c6eb352e4cfe1123a6e36a6bf4727eeb17e97cb1Chris Masone 603e5df182dffdaee9c320bded819239e23d9eb16bChris Masone try: 613e5df182dffdaee9c320bded819239e23d9eb16bChris Masone listener.wait_for_signals(desc='Session stopped.', 623e5df182dffdaee9c320bded819239e23d9eb16bChris Masone timeout=self._SESSION_STOP_TIMEOUT) 633e5df182dffdaee9c320bded819239e23d9eb16bChris Masone except utils.TimeoutError as actual_problem: 643e5df182dffdaee9c320bded819239e23d9eb16bChris Masone if nuke_browser_error is not None: 653e5df182dffdaee9c320bded819239e23d9eb16bChris Masone actual_problem = nuke_browser_error 663e5df182dffdaee9c320bded819239e23d9eb16bChris Masone raise error.TestFail(actual_problem) 67