1a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone# Use of this source code is governed by a BSD-style license that can be
3a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone# found in the LICENSE file.
4a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
564170f8e7053f92f4bbad501c61a352fdabf6d82Chris Masonefrom dbus.mainloop.glib import DBusGMainLoop
664170f8e7053f92f4bbad501c61a352fdabf6d82Chris Masone
7a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masonefrom autotest_lib.client.bin import test
8a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masonefrom autotest_lib.client.common_lib import error
9a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masonefrom autotest_lib.client.common_lib.cros import session_manager
10a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masonefrom autotest_lib.client.cros import cros_ui, cryptohome
11a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
12a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
13a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masoneclass login_RetrieveActiveSessions(test.test):
14a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone    """Ensure that the session_manager correctly tracks active sessions.
15a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone    """
16a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone    version = 1
17a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
18a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
19a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone    def initialize(self):
20a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        super(login_RetrieveActiveSessions, self).initialize()
21a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        cros_ui.restart()
22a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
23a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
24a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone    def run_once(self):
2564170f8e7053f92f4bbad501c61a352fdabf6d82Chris Masone        bus_loop = DBusGMainLoop(set_as_default=True)
2664170f8e7053f92f4bbad501c61a352fdabf6d82Chris Masone        sm = session_manager.connect(bus_loop)
27a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
2864170f8e7053f92f4bbad501c61a352fdabf6d82Chris Masone        cryptohome_proxy = cryptohome.CryptohomeProxy(bus_loop)
29a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        users = ['first_user@nowhere.com', 'second_user@nowhere.com']
30a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        for user in users:
3164170f8e7053f92f4bbad501c61a352fdabf6d82Chris Masone            cryptohome_proxy.ensure_clean_cryptohome_for(user)
32a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
33a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        if not sm.StartSession(users[0], ''):
34a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone            raise error.TestError('Could not start session for ' + users[0])
35a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        self.__check_for_users_in_actives(users[:1],
36a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone                                          sm.RetrieveActiveSessions())
37a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
38a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        if not sm.StartSession(users[1], ''):
39a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone            raise error.TestError('Could not start session for ' + users[1])
40a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        self.__check_for_users_in_actives(users, sm.RetrieveActiveSessions())
41a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
42a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
43a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone    def __check_for_users_in_actives(self, users, actives):
44a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        """Checks that only members of users are in actives.
45a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
46a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        If there are too many (or too few) entries in actives, this method
47a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        raises.  Also, if each member of users is not present in the keys of
48a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        actives, then the method also raises.
49a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
50a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        @param users: iterable of user names to be checked for.
51a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        @param actives: a dictionary of {user: userhash}, the keys of which
52a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone                        are expected to match users.
53a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
54a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        @raises error.TestFail: if one of the above criteria is not met.
55a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        """
56a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        expected_sessions = len(users)
57a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        if len(actives) != expected_sessions:
58a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone            raise error.TestFail("%d session(s) should be active, not: %s" %
59a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone                                 (expected_sessions, str(actives)))
60a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
61a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        if set(users) != set(actives.keys()):
62a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone            raise error.TestFail("Expected sessions for %s, got %s" %
63a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone                                 (users, actives))
64a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
65a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone
66a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone    def cleanup(self):
671e3510a040383790a25e8e54dbcc0e43fc440741Chris Masone        # Bounce UI, without waiting for the browser to come back. Best effort.
681e3510a040383790a25e8e54dbcc0e43fc440741Chris Masone        cros_ui.stop(allow_fail=True)
69a7c9796f6315ce09669847ad754c065d88a2a3bbChris Masone        cros_ui.start(allow_fail=True, wait_for_login_prompt=False)
70