1// Copyright 2013 The Chromium 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
5#include "chrome/browser/ui/ash/session_state_delegate_chromeos.h"
6
7#include <string>
8#include <vector>
9
10#include "chrome/browser/chromeos/login/fake_user_manager.h"
11#include "chrome/test/base/testing_profile_manager.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14
15class SessionStateDelegateChromeOSTest : public testing::Test {
16 protected:
17  SessionStateDelegateChromeOSTest() : user_manager_(NULL) {
18  }
19
20  virtual ~SessionStateDelegateChromeOSTest() {
21  }
22
23  virtual void SetUp() OVERRIDE {
24    // Initialize the UserManager singleton to a fresh FakeUserManager instance.
25    user_manager_ = new chromeos::FakeUserManager;
26    user_manager_enabler_.reset(
27        new chromeos::ScopedUserManagerEnabler(user_manager_));
28
29    // Create our SessionStateDelegate to experiment with.
30    session_state_delegate_.reset(new SessionStateDelegateChromeos());
31    testing::Test::SetUp();
32  }
33
34  virtual void TearDown() OVERRIDE {
35    testing::Test::TearDown();
36    session_state_delegate_.reset();
37    user_manager_enabler_.reset();
38    user_manager_ = NULL;
39  }
40
41  // Add and log in a user to the session.
42  void UserAddedToSession(std::string user) {
43    user_manager()->AddUser(user);
44    user_manager()->LoginUser(user);
45  }
46
47  // Get the active user.
48  const std::string& GetActiveUser() {
49    return chromeos::UserManager::Get()->GetActiveUser()->email();
50  }
51
52  chromeos::FakeUserManager* user_manager() { return user_manager_; }
53  SessionStateDelegateChromeos* session_state_delegate() {
54    return session_state_delegate_.get();
55  }
56
57 private:
58  scoped_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_;
59  scoped_ptr<SessionStateDelegateChromeos> session_state_delegate_;
60
61  // Not owned.
62  chromeos::FakeUserManager* user_manager_;
63
64  DISALLOW_COPY_AND_ASSIGN(SessionStateDelegateChromeOSTest);
65};
66
67// Make sure that cycling one user does not cause any harm.
68TEST_F(SessionStateDelegateChromeOSTest, CyclingOneUser) {
69  UserAddedToSession("firstuser@test.com");
70
71  EXPECT_EQ("firstuser@test.com", GetActiveUser());
72  session_state_delegate()->CycleActiveUser(
73      ash::SessionStateDelegate::CYCLE_TO_NEXT_USER);
74  EXPECT_EQ("firstuser@test.com", GetActiveUser());
75  session_state_delegate()->CycleActiveUser(
76      ash::SessionStateDelegate::CYCLE_TO_PREVIOUS_USER);
77  EXPECT_EQ("firstuser@test.com", GetActiveUser());
78}
79
80// Cycle three users forwards and backwards to see that it works.
81TEST_F(SessionStateDelegateChromeOSTest, CyclingThreeUsers) {
82  UserAddedToSession("firstuser@test.com");
83  UserAddedToSession("seconduser@test.com");
84  UserAddedToSession("thirduser@test.com");
85  const ash::SessionStateDelegate::CycleUser forward =
86      ash::SessionStateDelegate::CYCLE_TO_NEXT_USER;
87
88  // Cycle forward.
89  EXPECT_EQ("firstuser@test.com", GetActiveUser());
90  session_state_delegate()->CycleActiveUser(forward);
91  EXPECT_EQ("seconduser@test.com", GetActiveUser());
92  session_state_delegate()->CycleActiveUser(forward);
93  EXPECT_EQ("thirduser@test.com", GetActiveUser());
94  session_state_delegate()->CycleActiveUser(forward);
95  EXPECT_EQ("firstuser@test.com", GetActiveUser());
96
97  // Cycle backwards.
98  const ash::SessionStateDelegate::CycleUser backward =
99      ash::SessionStateDelegate::CYCLE_TO_PREVIOUS_USER;
100  session_state_delegate()->CycleActiveUser(backward);
101  EXPECT_EQ("thirduser@test.com", GetActiveUser());
102  session_state_delegate()->CycleActiveUser(backward);
103  EXPECT_EQ("seconduser@test.com", GetActiveUser());
104  session_state_delegate()->CycleActiveUser(backward);
105  EXPECT_EQ("firstuser@test.com", GetActiveUser());
106}
107