1 // Copyright 2014 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 <stddef.h>
6
7 #include "base/compiler_specific.h"
8 #include "base/memory/ptr_util.h"
9 #include "base/stl_util.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "chrome/browser/chromeos/login/screens/user_selection_screen.h"
12 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
13 #include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h"
14 #include "chrome/browser/chromeos/login/users/multi_profile_user_controller_delegate.h"
15 #include "chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.h"
16 #include "chrome/test/base/testing_browser_process.h"
17 #include "chrome/test/base/testing_profile_manager.h"
18 #include "chromeos/components/proximity_auth/screenlock_bridge.h"
19 #include "components/account_id/account_id.h"
20 #include "components/user_manager/scoped_user_manager.h"
21 #include "components/user_manager/user.h"
22 #include "content/public/test/browser_task_environment.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24
25 namespace {
26
27 const size_t kMaxUsers = 50; // same as in user_selection_screen.cc
28 const char* kOwner = "owner@gmail.com";
29 const char* kUsersPublic[] = {"public0@gmail.com", "public1@gmail.com"};
30
GenerateUserEmail(int number)31 std::string GenerateUserEmail(int number) {
32 return "a" + base::NumberToString(number) + "@gmail.com";
33 }
34
35 } // namespace
36
37 namespace chromeos {
38
39 class SigninPrepareUserListTest : public testing::Test,
40 public MultiProfileUserControllerDelegate {
41 public:
SigninPrepareUserListTest()42 SigninPrepareUserListTest()
43 : fake_user_manager_(new FakeChromeUserManager()),
44 user_manager_enabler_(base::WrapUnique(fake_user_manager_)) {}
45
~SigninPrepareUserListTest()46 ~SigninPrepareUserListTest() override {}
47
48 // testing::Test:
SetUp()49 void SetUp() override {
50 testing::Test::SetUp();
51 profile_manager_.reset(
52 new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
53 ASSERT_TRUE(profile_manager_->SetUp());
54 controller_ = std::make_unique<MultiProfileUserController>(
55 this, TestingBrowserProcess::GetGlobal()->local_state());
56 fake_user_manager_->set_multi_profile_user_controller(controller_.get());
57
58 for (size_t i = 0; i < base::size(kUsersPublic); ++i)
59 fake_user_manager_->AddPublicAccountUser(
60 AccountId::FromUserEmail(kUsersPublic[i]));
61
62 for (size_t i = 0; i < kMaxUsers + 1; ++i) {
63 fake_user_manager_->AddUser(
64 AccountId::FromUserEmail(GenerateUserEmail(i)));
65 // Insert owner second to last.
66 if (i == kMaxUsers - 1)
67 fake_user_manager_->AddUser(AccountId::FromUserEmail(kOwner));
68 }
69
70 fake_user_manager_->set_owner_id(AccountId::FromUserEmail(kOwner));
71 }
72
TearDown()73 void TearDown() override {
74 controller_.reset();
75 profile_manager_.reset();
76 testing::Test::TearDown();
77 }
78
79 // MultiProfileUserControllerDelegate:
OnUserNotAllowed(const std::string & user_email)80 void OnUserNotAllowed(const std::string& user_email) override {}
81
user_manager()82 FakeChromeUserManager* user_manager() { return fake_user_manager_; }
83
84 private:
85 content::BrowserTaskEnvironment task_environment_;
86 ScopedCrosSettingsTestHelper cros_settings_test_helper_;
87 FakeChromeUserManager* fake_user_manager_;
88 user_manager::ScopedUserManager user_manager_enabler_;
89 std::unique_ptr<TestingProfileManager> profile_manager_;
90 std::map<std::string, proximity_auth::mojom::AuthType> user_auth_type_map;
91 std::unique_ptr<MultiProfileUserController> controller_;
92
93 DISALLOW_COPY_AND_ASSIGN(SigninPrepareUserListTest);
94 };
95
TEST_F(SigninPrepareUserListTest,AlwaysKeepOwnerInList)96 TEST_F(SigninPrepareUserListTest, AlwaysKeepOwnerInList) {
97 EXPECT_LT(kMaxUsers, user_manager()->GetUsers().size());
98 user_manager::UserList users_to_send =
99 UserSelectionScreen::PrepareUserListForSending(
100 user_manager()->GetUsers(), AccountId::FromUserEmail(kOwner),
101 true /* is_signin_to_add */);
102
103 EXPECT_EQ(kMaxUsers, users_to_send.size());
104 EXPECT_EQ(kOwner, users_to_send.back()->GetAccountId().GetUserEmail());
105
106 user_manager()->RemoveUserFromList(AccountId::FromUserEmail("a16@gmail.com"));
107 user_manager()->RemoveUserFromList(AccountId::FromUserEmail("a17@gmail.com"));
108 users_to_send = UserSelectionScreen::PrepareUserListForSending(
109 user_manager()->GetUsers(), AccountId::FromUserEmail(kOwner),
110 true /* is_signin_to_add */);
111
112 EXPECT_EQ(kMaxUsers, users_to_send.size());
113 EXPECT_EQ(GenerateUserEmail(kMaxUsers),
114 users_to_send.back()->GetAccountId().GetUserEmail());
115 EXPECT_EQ(kOwner,
116 users_to_send[kMaxUsers - 2]->GetAccountId().GetUserEmail());
117 }
118
TEST_F(SigninPrepareUserListTest,PublicAccounts)119 TEST_F(SigninPrepareUserListTest, PublicAccounts) {
120 user_manager::UserList users_to_send =
121 UserSelectionScreen::PrepareUserListForSending(
122 user_manager()->GetUsers(), AccountId::FromUserEmail(kOwner),
123 true /* is_signin_to_add */);
124
125 EXPECT_EQ(kMaxUsers, users_to_send.size());
126 EXPECT_EQ("a0@gmail.com",
127 users_to_send.front()->GetAccountId().GetUserEmail());
128
129 users_to_send = UserSelectionScreen::PrepareUserListForSending(
130 user_manager()->GetUsers(), AccountId::FromUserEmail(kOwner),
131 false /* is_signin_to_add */);
132
133 EXPECT_EQ(kMaxUsers, users_to_send.size());
134 EXPECT_EQ("public0@gmail.com",
135 users_to_send.front()->GetAccountId().GetUserEmail());
136 }
137
138 } // namespace chromeos
139