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