1 // Copyright (c) 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 "ash/test/test_session_state_delegate.h"
6
7 #include <algorithm>
8 #include <string>
9
10 #include "ash/session/user_info.h"
11 #include "ash/shell.h"
12 #include "ash/system/user/login_status.h"
13 #include "base/stl_util.h"
14 #include "base/strings/string16.h"
15 #include "base/strings/utf_string_conversions.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 namespace ash {
19 namespace test {
20
21 namespace {
22
23 // The the "canonicalized" user ID from a given |email| address.
GetUserIDFromEmail(const std::string & email)24 std::string GetUserIDFromEmail(const std::string& email) {
25 std::string user_id = email;
26 std::transform(user_id.begin(), user_id.end(), user_id.begin(), ::tolower);
27 return user_id;
28 }
29
30 } // namespace
31
32 class MockUserInfo : public UserInfo {
33 public:
MockUserInfo(const std::string & id)34 explicit MockUserInfo(const std::string& id) : email_(id) {}
~MockUserInfo()35 virtual ~MockUserInfo() {}
36
SetUserImage(const gfx::ImageSkia & user_image)37 void SetUserImage(const gfx::ImageSkia& user_image) {
38 user_image_ = user_image;
39 }
40
GetDisplayName() const41 virtual base::string16 GetDisplayName() const OVERRIDE {
42 return base::UTF8ToUTF16("Über tray Über tray Über tray Über tray");
43 }
44
GetGivenName() const45 virtual base::string16 GetGivenName() const OVERRIDE {
46 return base::UTF8ToUTF16("Über Über Über Über");
47 }
48
GetEmail() const49 virtual std::string GetEmail() const OVERRIDE { return email_; }
50
GetUserID() const51 virtual std::string GetUserID() const OVERRIDE {
52 return GetUserIDFromEmail(GetEmail());
53 }
54
GetImage() const55 virtual const gfx::ImageSkia& GetImage() const OVERRIDE {
56 return user_image_;
57 }
58
59 // A test user image.
60 gfx::ImageSkia user_image_;
61
62 std::string email_;
63
64 DISALLOW_COPY_AND_ASSIGN(MockUserInfo);
65 };
66
TestSessionStateDelegate()67 TestSessionStateDelegate::TestSessionStateDelegate()
68 : has_active_user_(false),
69 active_user_session_started_(false),
70 can_lock_screen_(true),
71 should_lock_screen_before_suspending_(false),
72 screen_locked_(false),
73 user_adding_screen_running_(false),
74 logged_in_users_(1),
75 active_user_index_(0) {
76 user_list_.push_back(
77 new MockUserInfo("First@tray")); // This is intended to be capitalized.
78 user_list_.push_back(
79 new MockUserInfo("Second@tray")); // This is intended to be capitalized.
80 user_list_.push_back(new MockUserInfo("third@tray"));
81 user_list_.push_back(new MockUserInfo("someone@tray"));
82 }
83
~TestSessionStateDelegate()84 TestSessionStateDelegate::~TestSessionStateDelegate() {
85 STLDeleteElements(&user_list_);
86 }
87
AddUser(const std::string user_id)88 void TestSessionStateDelegate::AddUser(const std::string user_id) {
89 user_list_.push_back(new MockUserInfo(user_id));
90 }
91
GetActiveUserInfo() const92 const UserInfo* TestSessionStateDelegate::GetActiveUserInfo() const {
93 return user_list_[active_user_index_];
94 }
95
96 content::BrowserContext*
GetBrowserContextByIndex(MultiProfileIndex index)97 TestSessionStateDelegate::GetBrowserContextByIndex(
98 MultiProfileIndex index) {
99 return NULL;
100 }
101
102 content::BrowserContext*
GetBrowserContextForWindow(aura::Window * window)103 TestSessionStateDelegate::GetBrowserContextForWindow(
104 aura::Window* window) {
105 return NULL;
106 }
107
GetMaximumNumberOfLoggedInUsers() const108 int TestSessionStateDelegate::GetMaximumNumberOfLoggedInUsers() const {
109 return 3;
110 }
111
NumberOfLoggedInUsers() const112 int TestSessionStateDelegate::NumberOfLoggedInUsers() const {
113 // TODO(skuhne): Add better test framework to test multiple profiles.
114 return has_active_user_ ? logged_in_users_ : 0;
115 }
116
IsActiveUserSessionStarted() const117 bool TestSessionStateDelegate::IsActiveUserSessionStarted() const {
118 return active_user_session_started_;
119 }
120
CanLockScreen() const121 bool TestSessionStateDelegate::CanLockScreen() const {
122 return has_active_user_ && can_lock_screen_;
123 }
124
IsScreenLocked() const125 bool TestSessionStateDelegate::IsScreenLocked() const {
126 return screen_locked_;
127 }
128
ShouldLockScreenBeforeSuspending() const129 bool TestSessionStateDelegate::ShouldLockScreenBeforeSuspending() const {
130 return should_lock_screen_before_suspending_;
131 }
132
LockScreen()133 void TestSessionStateDelegate::LockScreen() {
134 if (CanLockScreen())
135 screen_locked_ = true;
136 }
137
UnlockScreen()138 void TestSessionStateDelegate::UnlockScreen() {
139 screen_locked_ = false;
140 }
141
IsUserSessionBlocked() const142 bool TestSessionStateDelegate::IsUserSessionBlocked() const {
143 return !IsActiveUserSessionStarted() || IsScreenLocked() ||
144 user_adding_screen_running_;
145 }
146
GetSessionState() const147 SessionStateDelegate::SessionState TestSessionStateDelegate::GetSessionState()
148 const {
149 if (user_adding_screen_running_)
150 return SESSION_STATE_LOGIN_SECONDARY;
151
152 // Assuming that if session is not active we're at login.
153 return IsActiveUserSessionStarted() ?
154 SESSION_STATE_ACTIVE : SESSION_STATE_LOGIN_PRIMARY;
155 }
156
SetHasActiveUser(bool has_active_user)157 void TestSessionStateDelegate::SetHasActiveUser(bool has_active_user) {
158 has_active_user_ = has_active_user;
159 if (!has_active_user)
160 active_user_session_started_ = false;
161 else
162 Shell::GetInstance()->ShowShelf();
163 }
164
SetActiveUserSessionStarted(bool active_user_session_started)165 void TestSessionStateDelegate::SetActiveUserSessionStarted(
166 bool active_user_session_started) {
167 active_user_session_started_ = active_user_session_started;
168 if (active_user_session_started) {
169 has_active_user_ = true;
170 Shell::GetInstance()->CreateShelf();
171 Shell::GetInstance()->UpdateAfterLoginStatusChange(
172 user::LOGGED_IN_USER);
173 }
174 }
175
SetCanLockScreen(bool can_lock_screen)176 void TestSessionStateDelegate::SetCanLockScreen(bool can_lock_screen) {
177 can_lock_screen_ = can_lock_screen;
178 }
179
SetShouldLockScreenBeforeSuspending(bool should_lock)180 void TestSessionStateDelegate::SetShouldLockScreenBeforeSuspending(
181 bool should_lock) {
182 should_lock_screen_before_suspending_ = should_lock;
183 }
184
SetUserAddingScreenRunning(bool user_adding_screen_running)185 void TestSessionStateDelegate::SetUserAddingScreenRunning(
186 bool user_adding_screen_running) {
187 user_adding_screen_running_ = user_adding_screen_running;
188 }
189
SetUserImage(const gfx::ImageSkia & user_image)190 void TestSessionStateDelegate::SetUserImage(
191 const gfx::ImageSkia& user_image) {
192 user_list_[active_user_index_]->SetUserImage(user_image);
193 }
194
GetUserInfo(MultiProfileIndex index) const195 const UserInfo* TestSessionStateDelegate::GetUserInfo(
196 MultiProfileIndex index) const {
197 int max = static_cast<int>(user_list_.size());
198 return user_list_[index < max ? index : max - 1];
199 }
200
GetUserInfo(content::BrowserContext * context) const201 const UserInfo* TestSessionStateDelegate::GetUserInfo(
202 content::BrowserContext* context) const {
203 return user_list_[active_user_index_];
204 }
205
ShouldShowAvatar(aura::Window * window) const206 bool TestSessionStateDelegate::ShouldShowAvatar(aura::Window* window) const {
207 return !GetActiveUserInfo()->GetImage().isNull();
208 }
209
SwitchActiveUser(const std::string & user_id)210 void TestSessionStateDelegate::SwitchActiveUser(const std::string& user_id) {
211 // Make sure this is a user id and not an email address.
212 EXPECT_EQ(user_id, GetUserIDFromEmail(user_id));
213 active_user_index_ = 0;
214 for (std::vector<MockUserInfo*>::iterator iter = user_list_.begin();
215 iter != user_list_.end();
216 ++iter) {
217 if ((*iter)->GetUserID() == user_id) {
218 active_user_index_ = iter - user_list_.begin();
219 return;
220 }
221 }
222 NOTREACHED() << "Unknown user:" << user_id;
223 }
224
CycleActiveUser(CycleUser cycle_user)225 void TestSessionStateDelegate::CycleActiveUser(CycleUser cycle_user) {
226 SwitchActiveUser("someone@tray");
227 }
228
AddSessionStateObserver(SessionStateObserver * observer)229 void TestSessionStateDelegate::AddSessionStateObserver(
230 SessionStateObserver* observer) {
231 }
232
RemoveSessionStateObserver(SessionStateObserver * observer)233 void TestSessionStateDelegate::RemoveSessionStateObserver(
234 SessionStateObserver* observer) {
235 }
236
237 } // namespace test
238 } // namespace ash
239