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