1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/login/login_state.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace {
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kTestUserHash[] = "testuserhash";
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LoginStateTest : public testing::Test,
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       public LoginState::Observer {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LoginStateTest() : logged_in_user_type_(LoginState::LOGGED_IN_USER_NONE),
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     login_state_changes_count_(0) {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~LoginStateTest() {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // testing::Test
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LoginState::Initialize();
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    LoginState::Get()->set_always_logged_in(false);
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LoginState::Get()->AddObserver(this);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LoginState::Get()->RemoveObserver(this);
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LoginState::Shutdown();
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // LoginState::Observer
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void LoggedInStateChanged() OVERRIDE {
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ++login_state_changes_count_;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    logged_in_user_type_ = LoginState::Get()->GetLoggedInUserType();
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Returns number of times the login state changed since the last call to
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // this method.
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  unsigned int GetNewLoginStateChangesCount() {
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    unsigned int result = login_state_changes_count_;
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    login_state_changes_count_ = 0;
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return result;
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoginState::LoggedInUserType logged_in_user_type_;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  unsigned int login_state_changes_count_;
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LoginStateTest);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(LoginStateTest, TestLoginState) {
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsUserLoggedIn());
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsInSafeMode());
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_NONE, logged_in_user_type_);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_NONE,
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            LoginState::Get()->GetLoggedInUserType());
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Setting login state to ACTIVE.
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoginState::Get()->SetLoggedInState(LoginState::LOGGED_IN_ACTIVE,
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      LoginState::LOGGED_IN_USER_REGULAR);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_REGULAR,
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            LoginState::Get()->GetLoggedInUserType());
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(LoginState::Get()->IsUserLoggedIn());
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsInSafeMode());
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1U, GetNewLoginStateChangesCount());
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_REGULAR, logged_in_user_type_);
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(LoginStateTest, TestSafeModeLoginState) {
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsUserLoggedIn());
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsInSafeMode());
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_NONE, logged_in_user_type_);
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_NONE,
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            LoginState::Get()->GetLoggedInUserType());
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Setting login state to SAFE MODE.
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LoginState::Get()->SetLoggedInState(LoginState::LOGGED_IN_SAFE_MODE,
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      LoginState::LOGGED_IN_USER_NONE);
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_NONE,
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            LoginState::Get()->GetLoggedInUserType());
92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsUserLoggedIn());
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(LoginState::Get()->IsInSafeMode());
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1U, GetNewLoginStateChangesCount());
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_NONE, logged_in_user_type_);
97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Setting login state to ACTIVE.
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LoginState::Get()->SetLoggedInState(LoginState::LOGGED_IN_ACTIVE,
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      LoginState::LOGGED_IN_USER_OWNER);
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_OWNER,
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            LoginState::Get()->GetLoggedInUserType());
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(LoginState::Get()->IsUserLoggedIn());
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsInSafeMode());
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1U, GetNewLoginStateChangesCount());
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_OWNER, logged_in_user_type_);
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(LoginStateTest, TestLoggedInStateChangedObserverOnUserTypeChange) {
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LoginState::Get()->SetLoggedInState(LoginState::LOGGED_IN_ACTIVE,
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      LoginState::LOGGED_IN_USER_REGULAR);
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1u, GetNewLoginStateChangesCount());
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(LoginState::Get()->IsUserLoggedIn());
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_REGULAR, logged_in_user_type_);
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_REGULAR,
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            LoginState::Get()->GetLoggedInUserType());
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Change the user type, without changing the logged in state.
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LoginState::Get()->SetLoggedInState(LoginState::LOGGED_IN_ACTIVE,
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      LoginState::LOGGED_IN_USER_OWNER);
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1u, GetNewLoginStateChangesCount());
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(LoginState::Get()->IsUserLoggedIn());
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_OWNER, logged_in_user_type_);
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_OWNER,
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            LoginState::Get()->GetLoggedInUserType());
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(LoginStateTest, TestPrimaryUser) {
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsUserLoggedIn());
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsInSafeMode());
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_NONE, logged_in_user_type_);
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_NONE,
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            LoginState::Get()->GetLoggedInUserType());
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Setting login state to ACTIVE and setting the primary user.
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoginState::Get()->SetLoggedInStateAndPrimaryUser(
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      LoginState::LOGGED_IN_ACTIVE,
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      LoginState::LOGGED_IN_USER_REGULAR,
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kTestUserHash);
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_REGULAR,
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            LoginState::Get()->GetLoggedInUserType());
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(LoginState::Get()->IsUserLoggedIn());
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(LoginState::Get()->IsInSafeMode());
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kTestUserHash, LoginState::Get()->primary_user_hash());
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1U, GetNewLoginStateChangesCount());
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(LoginState::LOGGED_IN_USER_REGULAR, logged_in_user_type_);
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace chromeos
154