Index: chrome/browser/profiles/profile_attributes_storage_unittest.cc |
diff --git a/chrome/browser/profiles/profile_attributes_storage_unittest.cc b/chrome/browser/profiles/profile_attributes_storage_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b3668121d249b0c1db37cf2f84bbbca2681054f2 |
--- /dev/null |
+++ b/chrome/browser/profiles/profile_attributes_storage_unittest.cc |
@@ -0,0 +1,356 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/strings/stringprintf.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "chrome/browser/profiles/profile_info_cache.h" |
+#include "chrome/browser/profiles/profile_manager.h" |
+#include "chrome/browser/supervised_user/supervised_user_constants.h" |
+#include "chrome/test/base/testing_browser_process.h" |
+#include "chrome/test/base/testing_profile_manager.h" |
+#include "content/public/test/test_browser_thread_bundle.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+// The ProfileMetadataEntry accessors aren't just plain old accessors to local |
+// members so they'll be tested. The following helpers will make the testing |
+// code less verbose. |
+#define TEST_ACCESSORS(entry_type, entry, member, first_value, second_value) \ |
+ TestAccessors(&entry, \ |
+ &entry_type::Get ## member, \ |
+ &entry_type::Set ## member, \ |
+ first_value, \ |
+ second_value); |
+ |
+#define TEST_STRING16_ACCESSORS(entry_type, entry, member) \ |
+ TEST_ACCESSORS(entry_type, entry, member, \ |
+ base::ASCIIToUTF16("first_" #member "_value"), \ |
+ base::ASCIIToUTF16("second_" #member "_value")); |
+ |
+#define TEST_STRING_ACCESSORS(entry_type, entry, member) \ |
+ TEST_ACCESSORS(entry_type, entry, member, \ |
+ std::string("first_" #member "_value"), \ |
+ std::string("second_" #member "_value")); |
+ |
+#define TEST_BOOL_ACCESSORS(entry_type, entry, member) \ |
+TestAccessors(&entry, \ |
+ &entry_type::member, \ |
+ &entry_type::Set ## member, \ |
+ false, \ |
+ true); |
+ |
+template<typename TValue, typename TGetter, typename TSetter> |
+void TestAccessors(ProfileAttributesEntry** entry, |
+ TGetter getter_func, |
+ TSetter setter_func, |
+ TValue first_value, |
+ TValue second_value) { |
+ (*entry->*setter_func)(first_value); |
+ EXPECT_EQ(first_value, (*entry->*getter_func)()); |
+ (*entry->*setter_func)(second_value); |
+ EXPECT_EQ(second_value, (*entry->*getter_func)()); |
+} |
+} // namespace |
+ |
+class ProfileAttributesStorageTest : public testing::Test { |
+ public: |
+ ProfileAttributesStorageTest() |
+ : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {} |
+ ~ProfileAttributesStorageTest() override {} |
+ |
+ protected: |
+ void SetUp() override { |
+ ASSERT_TRUE(testing_profile_manager_.SetUp()); |
+ } |
+ |
+ void TearDown() override { |
+ } |
+ |
+ base::FilePath GetProfilePath(const std::string& base_name) { |
+ return testing_profile_manager_.profile_manager()->user_data_dir(). |
+ AppendASCII(base_name); |
+ } |
+ |
+ ProfileAttributesStorage* storage() { |
+ return profile_info_cache(); |
+ } |
+ |
+ ProfileInfoCache* profile_info_cache() { |
+ return testing_profile_manager_.profile_info_cache(); |
+ } |
+ |
+ void AddTestingProfile() { |
+ unsigned long number_of_profiles = |
+ static_cast<unsigned long>(storage()->GetNumberOfProfiles()); |
+ |
+ storage()->AddProfile( |
+ GetProfilePath( |
+ base::StringPrintf("testing_profile_path%lu", number_of_profiles)), |
+ base::ASCIIToUTF16( |
+ base::StringPrintf("testing_profile_name%lu", number_of_profiles)), |
+ std::string( |
+ base::StringPrintf("testing_profile_gaia%lu", number_of_profiles)), |
+ base::ASCIIToUTF16( |
+ base::StringPrintf("testing_profile_user%lu", number_of_profiles)), |
+ number_of_profiles, |
+ std::string("")); |
+ |
+ EXPECT_EQ(number_of_profiles + 1, storage()->GetNumberOfProfiles()); |
+ } |
+ |
+ private: |
+ TestingProfileManager testing_profile_manager_; |
+ content::TestBrowserThreadBundle thread_bundle_; |
+}; |
+ |
+TEST_F(ProfileAttributesStorageTest, ProfileNotFound) { |
+ EXPECT_EQ(0U, storage()->GetNumberOfProfiles()); |
+ |
+ ProfileAttributesEntry* entry; |
+ ASSERT_FALSE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &entry)); |
+ |
+ AddTestingProfile(); |
+ EXPECT_EQ(1U, storage()->GetNumberOfProfiles()); |
+ |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &entry)); |
+ ASSERT_FALSE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path1"), &entry)); |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, AddProfile) { |
+ EXPECT_EQ(0U, storage()->GetNumberOfProfiles()); |
+ |
+ storage()->AddProfile(GetProfilePath("new_profile_path_1"), |
+ base::ASCIIToUTF16("new_profile_name_1"), |
+ std::string("new_profile_gaia_1"), |
+ base::ASCIIToUTF16("new_profile_username_1"), |
+ 1, |
+ std::string("")); |
+ |
+ EXPECT_EQ(1U, storage()->GetNumberOfProfiles()); |
+ |
+ ProfileAttributesEntry* entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("new_profile_path_1"), &entry)); |
+ EXPECT_EQ(base::ASCIIToUTF16("new_profile_name_1"), entry->GetName()); |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, RemoveProfile) { |
+ EXPECT_EQ(0U, storage()->GetNumberOfProfiles()); |
+ |
+ ProfileAttributesEntry* entry; |
+ ASSERT_FALSE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &entry)); |
+ |
+ AddTestingProfile(); |
+ EXPECT_EQ(1U, storage()->GetNumberOfProfiles()); |
+ |
+ // Deleting an existing profile should make it un-retrievable. |
+ storage()->RemoveProfile(GetProfilePath("testing_profile_path0")); |
+ EXPECT_EQ(0U, storage()->GetNumberOfProfiles()); |
+ |
+ ASSERT_FALSE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path1"), &entry)); |
+ ASSERT_FALSE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path1"), &entry)); |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, MultipleProfiles) { |
+ EXPECT_EQ(0U, storage()->GetNumberOfProfiles()); |
+ |
+ for (size_t i = 0; i < 5; ++i) { |
+ AddTestingProfile(); |
+ EXPECT_EQ(i + 1, storage()->GetNumberOfProfiles()); |
+ std::vector<ProfileAttributesEntry*> entries = |
+ storage()->GetAllProfilesAttributes(); |
+ EXPECT_EQ(i + 1, entries.size()); |
+ } |
+ |
+ EXPECT_EQ(5U, storage()->GetNumberOfProfiles()); |
+ |
+ ProfileAttributesEntry* entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &entry)); |
+ EXPECT_EQ(base::ASCIIToUTF16("testing_profile_name0"), entry->GetName()); |
+ |
+ storage()->RemoveProfile(GetProfilePath("testing_profile_path0")); |
+ ASSERT_FALSE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &entry)); |
+ EXPECT_EQ(4U, storage()->GetNumberOfProfiles()); |
+ |
+ std::vector<ProfileAttributesEntry*> entries = |
+ storage()->GetAllProfilesAttributes(); |
+ for (auto& entry: entries) { |
+ EXPECT_NE(GetProfilePath("testing_profile_path0"), entry->GetPath()); |
+ } |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, InitialValues) { |
+ AddTestingProfile(); |
+ |
+ ProfileAttributesEntry* entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &entry)); |
+ EXPECT_EQ(GetProfilePath("testing_profile_path0"), entry->GetPath()); |
+ EXPECT_EQ(base::ASCIIToUTF16("testing_profile_name0"), entry->GetName()); |
+ EXPECT_EQ(std::string("testing_profile_gaia0"), entry->GetGAIAId()); |
+ EXPECT_EQ(base::ASCIIToUTF16("testing_profile_user0"), entry->GetUserName()); |
+ EXPECT_EQ(0U, entry->GetAvatarIconIndex()); |
+ EXPECT_EQ(std::string(""), entry->GetSupervisedUserId()); |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, EntryAccessors) { |
+ AddTestingProfile(); |
+ |
+ ProfileAttributesEntry* entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &entry)); |
+ |
+ EXPECT_EQ(GetProfilePath("testing_profile_path0"), entry->GetPath()); |
+ |
+ TEST_STRING16_ACCESSORS(ProfileAttributesEntry, entry, Name); |
+ TEST_STRING16_ACCESSORS(ProfileAttributesEntry, entry, ShortcutName); |
+ TEST_STRING_ACCESSORS(ProfileAttributesEntry, entry, LocalAuthCredentials); |
+ TEST_STRING_ACCESSORS( |
+ ProfileAttributesEntry, entry, PasswordChangeDetectionToken); |
+ TEST_ACCESSORS(ProfileAttributesEntry, entry, BackgroundStatus, false, true); |
+ TEST_STRING16_ACCESSORS(ProfileAttributesEntry, entry, GAIAName); |
+ TEST_STRING16_ACCESSORS(ProfileAttributesEntry, entry, GAIAGivenName); |
+ TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsUsingGAIAPicture); |
+ TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsOmitted); |
+ TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsSigninRequired); |
+ TEST_STRING_ACCESSORS(ProfileAttributesEntry, entry, SupervisedUserId); |
+ TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsEphemeral); |
+ TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsUsingDefaultName); |
+ TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsUsingDefaultAvatar); |
+ TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsAuthError); |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, AuthInfo) { |
+ AddTestingProfile(); |
+ |
+ ProfileAttributesEntry* entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &entry)); |
+ |
+ entry->SetAuthInfo("", base::string16()); |
+ ASSERT_FALSE(entry->IsAuthenticated()); |
+ EXPECT_EQ(base::string16(), entry->GetUserName()); |
+ EXPECT_EQ("", entry->GetGAIAId()); |
+ |
+ entry->SetAuthInfo("foo", base::ASCIIToUTF16("bar")); |
+ ASSERT_TRUE(entry->IsAuthenticated()); |
+ EXPECT_EQ(base::ASCIIToUTF16("bar"), entry->GetUserName()); |
+ EXPECT_EQ("foo", entry->GetGAIAId()); |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, SupervisedUsersAccessors) { |
+ AddTestingProfile(); |
+ |
+ ProfileAttributesEntry* entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &entry)); |
+ |
+ entry->SetSupervisedUserId(""); |
+ ASSERT_FALSE(entry->IsSupervised()); |
+ ASSERT_FALSE(entry->IsChild()); |
+ ASSERT_FALSE(entry->IsLegacySupervised()); |
+ |
+ entry->SetSupervisedUserId("some_supervised_user_id"); |
+ ASSERT_TRUE(entry->IsSupervised()); |
+ ASSERT_FALSE(entry->IsChild()); |
+ ASSERT_TRUE(entry->IsLegacySupervised()); |
+ |
+ entry->SetSupervisedUserId(supervised_users::kChildAccountSUID); |
+ ASSERT_TRUE(entry->IsSupervised()); |
+ ASSERT_TRUE(entry->IsChild()); |
+ ASSERT_FALSE(entry->IsLegacySupervised()); |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, ReSortTriggered) { |
+ storage()->AddProfile(GetProfilePath("alpha_path"), |
+ base::ASCIIToUTF16("alpha"), |
+ std::string("alpha_gaia"), |
+ base::ASCIIToUTF16("alpha_username"), |
+ 1, |
+ std::string("")); |
+ |
+ storage()->AddProfile(GetProfilePath("lima_path"), |
+ base::ASCIIToUTF16("lima"), |
+ std::string("lima_gaia"), |
+ base::ASCIIToUTF16("lima_username"), |
+ 1, |
+ std::string("")); |
+ |
+ ProfileAttributesEntry* entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("alpha_path"), &entry)); |
+ |
+ // Trigger a ProfileInfoCache re-sort. |
+ entry->SetName(base::ASCIIToUTF16("zulu_name")); |
+ EXPECT_EQ(GetProfilePath("alpha_path"), entry->GetPath()); |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, RemoveOtherProfile) { |
+ AddTestingProfile(); |
+ AddTestingProfile(); |
+ AddTestingProfile(); |
+ |
+ EXPECT_EQ(3U, storage()->GetNumberOfProfiles()); |
+ |
+ ProfileAttributesEntry* first_entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &first_entry)); |
+ |
+ ProfileAttributesEntry* second_entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path1"), &second_entry)); |
+ |
+ EXPECT_EQ( |
+ base::ASCIIToUTF16("testing_profile_name0"),first_entry->GetName()); |
+ |
+ storage()->RemoveProfile(GetProfilePath("testing_profile_path1")); |
+ ASSERT_FALSE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path1"), &second_entry)); |
+ |
+ EXPECT_EQ(GetProfilePath("testing_profile_path0"), first_entry->GetPath()); |
+ EXPECT_EQ( |
+ base::ASCIIToUTF16("testing_profile_name0"), first_entry->GetName()); |
+ |
+ // Deleting through the ProfileInfoCache should be reflected in the |
+ // ProfileAttributesStorage as well. |
+ profile_info_cache()->RemoveProfile( |
+ GetProfilePath("testing_profile_path2")); |
+ ASSERT_FALSE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path2"), &second_entry)); |
+} |
+ |
+TEST_F(ProfileAttributesStorageTest, AccessFromElsewhere) { |
+ AddTestingProfile(); |
+ |
+ ProfileAttributesEntry* first_entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &first_entry)); |
+ |
+ ProfileAttributesEntry* second_entry; |
+ ASSERT_TRUE(storage()->GetProfileAttributesWithPath( |
+ GetProfilePath("testing_profile_path0"), &second_entry)); |
+ |
+ first_entry->SetName(base::ASCIIToUTF16("NewName")); |
+ EXPECT_EQ(base::ASCIIToUTF16("NewName"), second_entry->GetName()); |
+ EXPECT_EQ(first_entry, second_entry); |
+ |
+ // The ProfileInfoCache should also reflect the changes and its changes |
+ // should be reflected by the ProfileAttributesStorage. |
+ size_t index = profile_info_cache()->GetIndexOfProfileWithPath( |
+ GetProfilePath("testing_profile_path0")); |
+ EXPECT_EQ(base::ASCIIToUTF16("NewName"), |
+ profile_info_cache()->GetNameOfProfileAtIndex(index)); |
+ |
+ profile_info_cache()->SetNameOfProfileAtIndex( |
+ index, base::ASCIIToUTF16("OtherNewName")); |
+ EXPECT_EQ(base::ASCIIToUTF16("OtherNewName"), first_entry->GetName()); |
+} |