blob: 89a4638756f7fc9725ac87bad899b13b95eef42e [file] [log] [blame]
// Copyright (c) 2012 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 "components/signin/internal/identity_manager/primary_account_manager.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/bind.h"
#include "base/run_loop.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "components/image_fetcher/core/fake_image_decoder.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "components/prefs/testing_pref_service.h"
#include "components/signin/internal/identity_manager/account_fetcher_service.h"
#include "components/signin/internal/identity_manager/account_tracker_service.h"
#include "components/signin/internal/identity_manager/fake_profile_oauth2_token_service_delegate.h"
#include "components/signin/internal/identity_manager/primary_account_policy_manager.h"
#include "components/signin/internal/identity_manager/profile_oauth2_token_service.h"
#include "components/signin/public/base/signin_pref_names.h"
#include "components/signin/public/base/signin_switches.h"
#include "components/signin/public/base/test_signin_client.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "testing/gtest/include/gtest/gtest.h"
#if !BUILDFLAG(IS_CHROMEOS_ASH)
#include "components/signin/internal/identity_manager/primary_account_policy_manager_impl.h"
#endif
using signin::ConsentLevel;
class PrimaryAccountManagerTest : public testing::Test,
public PrimaryAccountManager::Observer {
public:
PrimaryAccountManagerTest()
: test_signin_client_(&user_prefs_),
token_service_(
&user_prefs_,
std::make_unique<FakeProfileOAuth2TokenServiceDelegate>()),
num_successful_signins_(0),
num_unconsented_account_changed_(0) {
AccountFetcherService::RegisterPrefs(user_prefs_.registry());
AccountTrackerService::RegisterPrefs(user_prefs_.registry());
ProfileOAuth2TokenService::RegisterProfilePrefs(user_prefs_.registry());
PrimaryAccountManager::RegisterProfilePrefs(user_prefs_.registry());
PrimaryAccountManager::RegisterPrefs(local_state_.registry());
account_tracker_.Initialize(&user_prefs_, base::FilePath());
account_fetcher_.Initialize(
&test_signin_client_, &token_service_, &account_tracker_,
std::make_unique<image_fetcher::FakeImageDecoder>());
}
~PrimaryAccountManagerTest() override {
if (manager_) {
ShutDownManager();
}
token_service_.Shutdown();
test_signin_client_.Shutdown();
account_tracker_.Shutdown();
account_fetcher_.Shutdown();
}
TestSigninClient* signin_client() { return &test_signin_client_; }
AccountTrackerService* account_tracker() { return &account_tracker_; }
AccountFetcherService* account_fetcher() { return &account_fetcher_; }
PrefService* prefs() { return &user_prefs_; }
// Seed the account tracker with information from logged in user. Normally
// this is done by UI code before calling PrimaryAccountManager.
// Returns the string to use as the account_id.
CoreAccountId AddToAccountTracker(const std::string& gaia_id,
const std::string& email) {
account_tracker_.SeedAccountInfo(gaia_id, email);
return account_tracker_.PickAccountIdForAccount(gaia_id, email);
}
void CreatePrimaryAccountManager() {
DCHECK(!manager_);
// Supply the primary account manager with a policy manager to reflect
// production usage: null on ChromeOS, a PrimaryAccountPolicyManagerImpl on
// other platforms.
std::unique_ptr<PrimaryAccountPolicyManager> policy_manager;
#if !BUILDFLAG(IS_CHROMEOS_ASH)
policy_manager =
std::make_unique<PrimaryAccountPolicyManagerImpl>(&test_signin_client_);
policy_manager_ =
static_cast<PrimaryAccountPolicyManagerImpl*>(policy_manager.get());
#endif
manager_ = std::make_unique<PrimaryAccountManager>(
&test_signin_client_, &token_service_, &account_tracker_,
std::move(policy_manager));
manager_->Initialize(&local_state_);
manager_->AddObserver(this);
}
// Shuts down |manager_|.
void ShutDownManager() {
DCHECK(manager_);
manager_->RemoveObserver(this);
manager_.reset();
}
void ExpectSignInWithRefreshTokenSuccess() {
EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
EXPECT_FALSE(manager_->GetPrimaryAccountId(ConsentLevel::kSync).empty());
EXPECT_FALSE(
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email.empty());
EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(
manager_->GetPrimaryAccountId(ConsentLevel::kSync)));
// Should go into token service and stop.
EXPECT_EQ(1, num_successful_signins_);
}
void OnPrimaryAccountChanged(
const signin::PrimaryAccountChangeEvent& event_details) override {
DCHECK(event_details.GetEventTypeFor(signin::ConsentLevel::kSync) !=
signin::PrimaryAccountChangeEvent::Type::kNone ||
event_details.GetEventTypeFor(signin::ConsentLevel::kNotRequired) !=
signin::PrimaryAccountChangeEvent::Type::kNone)
<< "PrimaryAccountChangeEvent with no change: " << event_details;
switch (event_details.GetEventTypeFor(ConsentLevel::kSync)) {
case signin::PrimaryAccountChangeEvent::Type::kSet:
num_successful_signins_++;
break;
case signin::PrimaryAccountChangeEvent::Type::kCleared:
// ignored
break;
case signin::PrimaryAccountChangeEvent::Type::kNone:
break;
}
switch (event_details.GetEventTypeFor(ConsentLevel::kNotRequired)) {
case signin::PrimaryAccountChangeEvent::Type::kSet:
case signin::PrimaryAccountChangeEvent::Type::kCleared:
num_unconsented_account_changed_++;
break;
case signin::PrimaryAccountChangeEvent::Type::kNone:
break;
}
}
base::test::TaskEnvironment task_environment_;
sync_preferences::TestingPrefServiceSyncable user_prefs_;
TestingPrefServiceSimple local_state_;
TestSigninClient test_signin_client_;
ProfileOAuth2TokenService token_service_;
AccountTrackerService account_tracker_;
AccountFetcherService account_fetcher_;
#if !BUILDFLAG(IS_CHROMEOS_ASH)
PrimaryAccountPolicyManagerImpl* policy_manager_;
#endif
std::unique_ptr<PrimaryAccountManager> manager_;
std::vector<std::string> oauth_tokens_fetched_;
std::vector<std::string> cookies_;
int num_successful_signins_;
int num_unconsented_account_changed_;
};
#if !BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(PrimaryAccountManagerTest, SignOut) {
CreatePrimaryAccountManager();
CoreAccountId main_account_id =
AddToAccountTracker("account_id", "user@gmail.com");
manager_->SetSyncPrimaryAccountInfo(
account_tracker()->GetAccountInfo(main_account_id));
manager_->ClearPrimaryAccount(signin_metrics::SIGNOUT_TEST,
signin_metrics::SignoutDelete::IGNORE_METRIC);
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
EXPECT_TRUE(
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email.empty());
EXPECT_TRUE(manager_->GetPrimaryAccountId(ConsentLevel::kSync).empty());
EXPECT_TRUE(
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).IsEmpty());
// Should not be persisted anymore
ShutDownManager();
CreatePrimaryAccountManager();
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
EXPECT_TRUE(
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email.empty());
EXPECT_TRUE(manager_->GetPrimaryAccountId(ConsentLevel::kSync).empty());
EXPECT_TRUE(
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).IsEmpty());
}
TEST_F(PrimaryAccountManagerTest, SignOutRevoke) {
CreatePrimaryAccountManager();
CoreAccountId main_account_id =
AddToAccountTracker("main_id", "user@gmail.com");
CoreAccountId other_account_id =
AddToAccountTracker("other_id", "other@gmail.com");
token_service_.UpdateCredentials(main_account_id, "token");
token_service_.UpdateCredentials(other_account_id, "token");
manager_->SetSyncPrimaryAccountInfo(
account_tracker()->GetAccountInfo(main_account_id));
EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
EXPECT_EQ(main_account_id,
manager_->GetPrimaryAccountId(ConsentLevel::kSync));
manager_->ClearPrimaryAccount(signin_metrics::SIGNOUT_TEST,
signin_metrics::SignoutDelete::IGNORE_METRIC);
// Tokens are revoked.
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
EXPECT_TRUE(token_service_.GetAccounts().empty());
}
TEST_F(PrimaryAccountManagerTest, SignOutWhileProhibited) {
CreatePrimaryAccountManager();
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
EXPECT_TRUE(
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email.empty());
EXPECT_TRUE(manager_->GetPrimaryAccountId(ConsentLevel::kSync).empty());
CoreAccountId main_account_id =
AddToAccountTracker("gaia_id", "user@gmail.com");
manager_->SetSyncPrimaryAccountInfo(
account_tracker()->GetAccountInfo(main_account_id));
signin_client()->set_is_signout_allowed(false);
manager_->ClearPrimaryAccount(signin_metrics::SIGNOUT_TEST,
signin_metrics::SignoutDelete::IGNORE_METRIC);
EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
signin_client()->set_is_signout_allowed(true);
manager_->ClearPrimaryAccount(signin_metrics::SIGNOUT_TEST,
signin_metrics::SignoutDelete::IGNORE_METRIC);
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
}
TEST_F(PrimaryAccountManagerTest, UnconsentedSignOutWhileProhibited) {
CreatePrimaryAccountManager();
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
EXPECT_TRUE(
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email.empty());
EXPECT_TRUE(manager_->GetPrimaryAccountId(ConsentLevel::kSync).empty());
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
CoreAccountInfo account_info = account_tracker()->GetAccountInfo(account_id);
manager_->SetUnconsentedPrimaryAccountInfo(account_info);
EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
signin_client()->set_is_signout_allowed(false);
manager_->ClearPrimaryAccount(signin_metrics::SIGNOUT_TEST,
signin_metrics::SignoutDelete::IGNORE_METRIC);
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
}
TEST_F(PrimaryAccountManagerTest, ProhibitedAtStartup) {
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString());
local_state_.SetString(prefs::kGoogleServicesUsernamePattern,
".*@google.com");
CreatePrimaryAccountManager();
// Currently signed in user is prohibited by policy, so should be signed out.
EXPECT_EQ("", manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(CoreAccountId(),
manager_->GetPrimaryAccountId(ConsentLevel::kSync));
}
TEST_F(PrimaryAccountManagerTest, ProhibitedAfterStartup) {
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString());
CreatePrimaryAccountManager();
EXPECT_EQ("user@gmail.com",
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(account_id, manager_->GetPrimaryAccountId(ConsentLevel::kSync));
// Update the profile - user should be signed out.
local_state_.SetString(prefs::kGoogleServicesUsernamePattern,
".*@google.com");
EXPECT_EQ("", manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(CoreAccountId(),
manager_->GetPrimaryAccountId(ConsentLevel::kSync));
}
#endif
TEST_F(PrimaryAccountManagerTest, SignIn) {
CreatePrimaryAccountManager();
EXPECT_EQ("", manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(CoreAccountId(),
manager_->GetPrimaryAccountId(ConsentLevel::kSync));
EXPECT_EQ(0, num_successful_signins_);
EXPECT_EQ(0, num_unconsented_account_changed_);
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
manager_->SetSyncPrimaryAccountInfo(
account_tracker()->GetAccountInfo(account_id));
EXPECT_EQ(1, num_successful_signins_);
EXPECT_EQ(1, num_unconsented_account_changed_);
EXPECT_EQ("user@gmail.com",
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(account_id, manager_->GetPrimaryAccountId(ConsentLevel::kSync));
EXPECT_EQ(manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired),
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
}
TEST_F(PrimaryAccountManagerTest,
ExternalSignIn_ReauthShouldNotSendNotification) {
CreatePrimaryAccountManager();
EXPECT_EQ("", manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(CoreAccountId(),
manager_->GetPrimaryAccountId(ConsentLevel::kSync));
EXPECT_EQ(0, num_successful_signins_);
EXPECT_EQ(0, num_unconsented_account_changed_);
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
manager_->SetSyncPrimaryAccountInfo(
account_tracker()->GetAccountInfo(account_id));
EXPECT_EQ(1, num_successful_signins_);
EXPECT_EQ(1, num_unconsented_account_changed_);
EXPECT_EQ("user@gmail.com",
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(account_id, manager_->GetPrimaryAccountId(ConsentLevel::kSync));
manager_->SetSyncPrimaryAccountInfo(
account_tracker()->GetAccountInfo(account_id));
EXPECT_EQ(1, num_successful_signins_);
EXPECT_EQ(1, num_unconsented_account_changed_);
EXPECT_EQ("user@gmail.com",
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(account_id, manager_->GetPrimaryAccountId(ConsentLevel::kSync));
}
#if !BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(PrimaryAccountManagerTest, SigninNotAllowed) {
std::string user("user@google.com");
CoreAccountId account_id = AddToAccountTracker("gaia_id", user);
user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString());
user_prefs_.SetBoolean(prefs::kSigninAllowed, false);
CreatePrimaryAccountManager();
// Currently signing in is prohibited by policy, so should be signed out.
EXPECT_EQ("", manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_TRUE(manager_->GetPrimaryAccountId(ConsentLevel::kSync).empty());
}
#endif
TEST_F(PrimaryAccountManagerTest, GaiaIdMigration) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeature(switches::kAccountIdMigration);
#endif
ASSERT_EQ(AccountTrackerService::MIGRATION_DONE,
account_tracker()->GetMigrationState());
std::string email = "user@gmail.com";
std::string gaia_id = "account_gaia_id";
PrefService* client_prefs = signin_client()->GetPrefs();
client_prefs->SetInteger(prefs::kAccountIdMigrationState,
AccountTrackerService::MIGRATION_NOT_STARTED);
ListPrefUpdate update(client_prefs, prefs::kAccountInfo);
update->Clear();
auto dict = std::make_unique<base::DictionaryValue>();
dict->SetString("account_id", email);
dict->SetString("email", email);
dict->SetString("gaia", gaia_id);
update->Append(std::move(dict));
account_tracker()->Shutdown();
account_tracker()->Initialize(prefs(), base::FilePath());
client_prefs->SetString(prefs::kGoogleServicesAccountId, email);
CreatePrimaryAccountManager();
EXPECT_EQ(CoreAccountId(gaia_id),
manager_->GetPrimaryAccountId(ConsentLevel::kSync));
EXPECT_EQ(gaia_id, user_prefs_.GetString(prefs::kGoogleServicesAccountId));
}
TEST_F(PrimaryAccountManagerTest, GaiaIdMigrationCrashInTheMiddle) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeature(switches::kAccountIdMigration);
#endif
ASSERT_EQ(AccountTrackerService::MIGRATION_DONE,
account_tracker()->GetMigrationState());
std::string email = "user@gmail.com";
std::string gaia_id = "account_gaia_id";
PrefService* client_prefs = signin_client()->GetPrefs();
client_prefs->SetInteger(prefs::kAccountIdMigrationState,
AccountTrackerService::MIGRATION_NOT_STARTED);
ListPrefUpdate update(client_prefs, prefs::kAccountInfo);
update->Clear();
auto dict = std::make_unique<base::DictionaryValue>();
dict->SetString("account_id", email);
dict->SetString("email", email);
dict->SetString("gaia", gaia_id);
update->Append(std::move(dict));
account_tracker()->Shutdown();
account_tracker()->Initialize(prefs(), base::FilePath());
client_prefs->SetString(prefs::kGoogleServicesAccountId, gaia_id);
CreatePrimaryAccountManager();
EXPECT_EQ(CoreAccountId(gaia_id),
manager_->GetPrimaryAccountId(ConsentLevel::kSync));
EXPECT_EQ(gaia_id, user_prefs_.GetString(prefs::kGoogleServicesAccountId));
base::RunLoop().RunUntilIdle();
EXPECT_EQ(AccountTrackerService::MIGRATION_DONE,
account_tracker()->GetMigrationState());
}
TEST_F(PrimaryAccountManagerTest, RestoreFromPrefsConsented) {
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString());
user_prefs_.SetBoolean(prefs::kGoogleServicesConsentedToSync, true);
CreatePrimaryAccountManager();
EXPECT_EQ("user@gmail.com",
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(account_id, manager_->GetPrimaryAccountId(ConsentLevel::kSync));
EXPECT_EQ(manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired),
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
}
TEST_F(PrimaryAccountManagerTest, RestoreFromPrefsUnconsented) {
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString());
user_prefs_.SetBoolean(prefs::kGoogleServicesConsentedToSync, false);
CreatePrimaryAccountManager();
EXPECT_EQ("user@gmail.com",
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).email);
EXPECT_EQ(
account_id,
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).account_id);
EXPECT_TRUE(manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).IsEmpty());
}
// If kGoogleServicesConsentedToSync is missing, the account is fully
// authenticated.
TEST_F(PrimaryAccountManagerTest, RestoreFromPrefsMissingConsentPref) {
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString());
const PrefService::Preference* consented_pref =
user_prefs_.FindPreference(prefs::kGoogleServicesConsentedToSync);
ASSERT_TRUE(consented_pref); // Pref is registered.
ASSERT_TRUE(consented_pref->IsDefaultValue()); // Pref is not set.
CreatePrimaryAccountManager();
EXPECT_TRUE(user_prefs_.GetBoolean(prefs::kGoogleServicesConsentedToSync));
EXPECT_EQ("user@gmail.com",
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
EXPECT_EQ(account_id, manager_->GetPrimaryAccountId(ConsentLevel::kSync));
EXPECT_EQ(manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired),
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
}
TEST_F(PrimaryAccountManagerTest, SetUnconsentedPrimaryAccountInfo) {
CreatePrimaryAccountManager();
EXPECT_EQ(CoreAccountInfo(),
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
EXPECT_EQ(0, num_unconsented_account_changed_);
EXPECT_EQ(0, num_successful_signins_);
// Set the unconsented primary account.
CoreAccountInfo account_info;
account_info.account_id = CoreAccountId("gaia_id");
account_info.gaia = "gaia_id";
account_info.email = "user@gmail.com";
manager_->SetUnconsentedPrimaryAccountInfo(account_info);
EXPECT_EQ(0, num_successful_signins_);
EXPECT_EQ(1, num_unconsented_account_changed_);
EXPECT_EQ(account_info,
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
EXPECT_EQ(CoreAccountInfo(),
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
// Set the same account again.
manager_->SetUnconsentedPrimaryAccountInfo(account_info);
EXPECT_EQ(0, num_successful_signins_);
EXPECT_EQ(1, num_unconsented_account_changed_);
EXPECT_EQ(account_info,
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
EXPECT_EQ(CoreAccountInfo(),
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
// Change the email to another equivalent email. The account is updated but
// observers are not notified.
account_info.email = "us.er@gmail.com";
manager_->SetUnconsentedPrimaryAccountInfo(account_info);
EXPECT_EQ(0, num_successful_signins_);
EXPECT_EQ(1, num_unconsented_account_changed_);
EXPECT_EQ(account_info,
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
EXPECT_EQ(CoreAccountInfo(),
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
// Clear it.
manager_->SetUnconsentedPrimaryAccountInfo(CoreAccountInfo());
EXPECT_EQ(0, num_successful_signins_);
EXPECT_EQ(2, num_unconsented_account_changed_);
EXPECT_EQ(CoreAccountInfo(),
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
EXPECT_EQ(CoreAccountInfo(),
manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
}
TEST_F(PrimaryAccountManagerTest, RevokeSyncConsent) {
CreatePrimaryAccountManager();
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
manager_->SetSyncPrimaryAccountInfo(
account_tracker()->GetAccountInfo(account_id));
EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
manager_->RevokeSyncConsent(signin_metrics::ProfileSignout::SIGNOUT_TEST,
signin_metrics::SignoutDelete::IGNORE_METRIC);
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
EXPECT_EQ(
account_id,
manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).account_id);
}
#if !BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(PrimaryAccountManagerTest, ClearPrimaryAccount) {
CreatePrimaryAccountManager();
CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
manager_->SetSyncPrimaryAccountInfo(
account_tracker()->GetAccountInfo(account_id));
EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
manager_->ClearPrimaryAccount(signin_metrics::ProfileSignout::SIGNOUT_TEST,
signin_metrics::SignoutDelete::IGNORE_METRIC);
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
}
#endif // !BUILDFLAG(IS_CHROMEOS_ASH)