blob: 06b7fec30f0b4dcbf9508efc38e5b5ace31fcf35 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/password_manager/core/browser/old_google_credentials_cleaner.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "components/password_manager/core/browser/mock_password_store_interface.h"
#include "components/password_manager/core/common/password_manager_pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace password_manager {
namespace {
PasswordForm CreateForm(base::StringPiece signon_realm) {
PasswordForm form;
form.scheme = PasswordForm::Scheme::kHtml;
form.signon_realm = std::string(signon_realm);
form.in_store = PasswordForm::Store::kProfileStore;
return form;
}
class MockCredentialsCleanerObserver : public CredentialsCleaner::Observer {
public:
MockCredentialsCleanerObserver() = default;
~MockCredentialsCleanerObserver() override = default;
MOCK_METHOD(void, CleaningCompleted, (), (override));
};
} // namespace
class OldGoogleCredentialCleanerTest : public testing::Test {
public:
OldGoogleCredentialCleanerTest() = default;
~OldGoogleCredentialCleanerTest() override = default;
void SetUp() override {
prefs_.registry()->RegisterBooleanPref(prefs::kWereOldGoogleLoginsRemoved,
false);
store_ = new testing::NiceMock<MockPasswordStoreInterface>;
}
void ExpectPasswords(std::vector<PasswordForm> password_forms) {
EXPECT_CALL(*store_, GetAutofillableLogins)
.WillOnce(testing::WithArg<0>(
[password_forms, store = store_.get()](
base::WeakPtr<PasswordStoreConsumer> consumer) {
std::vector<std::unique_ptr<PasswordForm>> results;
for (auto& form : password_forms)
results.push_back(
std::make_unique<PasswordForm>(std::move(form)));
consumer->OnGetPasswordStoreResultsOrErrorFrom(
store, std::move(results));
}));
}
void RunUntilIdle() { task_environment_.RunUntilIdle(); }
MockPasswordStoreInterface* store() { return store_.get(); }
TestingPrefServiceSimple& prefs() { return prefs_; }
private:
base::test::SingleThreadTaskEnvironment task_environment_;
TestingPrefServiceSimple prefs_;
scoped_refptr<MockPasswordStoreInterface> store_;
};
// Tests that all old google.com accounts are deleted.
TEST_F(OldGoogleCredentialCleanerTest, TestOldGooglePasswordsAreDeleted) {
ASSERT_FALSE(prefs().GetBoolean(prefs::kWereOldGoogleLoginsRemoved));
std::vector<PasswordForm> forms = {
CreateForm("http://www.google.com"),
CreateForm("http://www.google.com/"),
CreateForm("https://www.google.com"),
CreateForm("https://www.google.com/"),
};
OldGoogleCredentialCleaner cleaner{store(), &prefs()};
ASSERT_TRUE(cleaner.NeedsCleaning());
ExpectPasswords(forms);
for (const auto& form : forms) {
EXPECT_CALL(*store(), RemoveLogin(form));
}
MockCredentialsCleanerObserver observer;
EXPECT_CALL(observer, CleaningCompleted);
cleaner.StartCleaning(&observer);
EXPECT_TRUE(prefs().GetBoolean(prefs::kWereOldGoogleLoginsRemoved));
}
// Tests that only old google.com accounts are deleted.
TEST_F(OldGoogleCredentialCleanerTest, TestNewerGooglePasswordsAreNotDeleted) {
ASSERT_FALSE(prefs().GetBoolean(prefs::kWereOldGoogleLoginsRemoved));
PasswordForm old_form = CreateForm("http://www.google.com");
// Form created after cutoff.
PasswordForm new_form = CreateForm("https://www.google.com");
const base::Time::Exploded time = {2012, 1, 0, 1,
0, 0, 0, 1}; // 00:01 Jan 1 2012
ASSERT_TRUE(base::Time::FromUTCExploded(time, &new_form.date_created));
OldGoogleCredentialCleaner cleaner{store(), &prefs()};
ASSERT_TRUE(cleaner.NeedsCleaning());
MockCredentialsCleanerObserver observer;
ExpectPasswords({old_form, new_form, CreateForm("http://test.com/")});
EXPECT_CALL(*store(), RemoveLogin(old_form));
EXPECT_CALL(observer, CleaningCompleted);
cleaner.StartCleaning(&observer);
EXPECT_TRUE(prefs().GetBoolean(prefs::kWereOldGoogleLoginsRemoved));
}
// Tests that clearing not needed if pref is true.
TEST_F(OldGoogleCredentialCleanerTest, NoClearingNeeded) {
prefs().SetBoolean(prefs::kWereOldGoogleLoginsRemoved, true);
OldGoogleCredentialCleaner cleaner{store(), &prefs()};
EXPECT_FALSE(cleaner.NeedsCleaning());
}
} // namespace password_manager