Index: chrome/browser/browsing_data/passwords_counter_browsertest.cc |
diff --git a/chrome/browser/browsing_data/passwords_counter_browsertest.cc b/chrome/browser/browsing_data/passwords_counter_browsertest.cc |
index 8f5b994da687be2fdc53987fe361d39cde258687..38d647ff2ac1f1fb04a9720c9cf012e6e887beef 100644 |
--- a/chrome/browser/browsing_data/passwords_counter_browsertest.cc |
+++ b/chrome/browser/browsing_data/passwords_counter_browsertest.cc |
@@ -8,10 +8,14 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "base/synchronization/waitable_event.h" |
#include "chrome/browser/password_manager/password_store_factory.h" |
+#include "chrome/browser/sync/profile_sync_service_factory.h" |
#include "chrome/browser/sync/test/integration/passwords_helper.h" |
+#include "chrome/browser/sync/test/integration/sync_test.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/test/base/in_process_browser_test.h" |
#include "components/autofill/core/common/password_form.h" |
+#include "components/browser_sync/profile_sync_service.h" |
+#include "components/browser_sync/profile_sync_service_mock.h" |
#include "components/browsing_data/core/browsing_data_utils.h" |
#include "components/browsing_data/core/pref_names.h" |
#include "components/prefs/pref_service.h" |
@@ -21,9 +25,14 @@ namespace { |
using autofill::PasswordForm; |
-class PasswordsCounterTest : public InProcessBrowserTest { |
+// TODO(crbug.com/553421): Only RestartOnSyncChange is a SyncTest. |
+// Extract it together with HistoryCounterTest.RestartOnSyncChange. |
+class PasswordsCounterTest : public SyncTest { |
public: |
+ PasswordsCounterTest() : SyncTest(SINGLE_CLIENT) {} |
+ |
void SetUpOnMainThread() override { |
+ finished_ = false; |
time_ = base::Time::Now(); |
store_ = PasswordStoreFactory::GetForProfile( |
browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS); |
@@ -79,23 +88,41 @@ class PasswordsCounterTest : public InProcessBrowserTest { |
run_loop_->Run(); |
} |
+ bool CountingFinishedSinceLastAsked() { |
+ bool result = finished_; |
+ finished_ = false; |
+ return result; |
+ } |
+ |
+ void WaitForCountingOrConfirmFinished() { |
+ if (CountingFinishedSinceLastAsked()) |
+ return; |
+ |
+ WaitForCounting(); |
+ CountingFinishedSinceLastAsked(); |
+ } |
+ |
browsing_data::BrowsingDataCounter::ResultInt GetResult() { |
DCHECK(finished_); |
return result_; |
} |
+ bool PasswordSyncEnabled() { return password_sync_enabled_; } |
+ |
void Callback( |
std::unique_ptr<browsing_data::BrowsingDataCounter::Result> result) { |
+ DCHECK(result); |
finished_ = result->Finished(); |
if (finished_) { |
- result_ = |
- static_cast<browsing_data::BrowsingDataCounter::FinishedResult*>( |
- result.get()) |
- ->Value(); |
- } |
+ auto* password_result = |
+ static_cast<browsing_data::PasswordsCounter::PasswordResult*>( |
+ result.get()); |
+ result_ = password_result->Value(); |
- if (finished_) |
+ password_sync_enabled_ = password_result->password_sync_enabled(); |
+ } |
+ if (run_loop_ && finished_) |
run_loop_->Quit(); |
} |
@@ -125,6 +152,7 @@ class PasswordsCounterTest : public InProcessBrowserTest { |
bool finished_; |
browsing_data::BrowsingDataCounter::ResultInt result_; |
+ bool password_sync_enabled_; |
}; |
// Tests that the counter correctly counts each individual credential on |
@@ -138,8 +166,10 @@ IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, SameDomain) { |
WaitForUICallbacksFromAddingLogins(); |
Profile* profile = browser()->profile(); |
- browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile( |
- profile, ServiceAccessType::EXPLICIT_ACCESS)); |
+ browsing_data::PasswordsCounter counter( |
+ PasswordStoreFactory::GetForProfile(profile, |
+ ServiceAccessType::EXPLICIT_ACCESS), |
+ ProfileSyncServiceFactory::GetForProfile(profile)); |
counter.Init( |
profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED, |
base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this))); |
@@ -147,6 +177,7 @@ IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, SameDomain) { |
WaitForCounting(); |
EXPECT_EQ(5u, GetResult()); |
+ EXPECT_FALSE(PasswordSyncEnabled()); |
} |
// Tests that the counter doesn't count blacklisted entries. |
@@ -157,8 +188,10 @@ IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, Blacklisted) { |
WaitForUICallbacksFromAddingLogins(); |
Profile* profile = browser()->profile(); |
- browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile( |
- profile, ServiceAccessType::EXPLICIT_ACCESS)); |
+ browsing_data::PasswordsCounter counter( |
+ PasswordStoreFactory::GetForProfile(profile, |
+ ServiceAccessType::EXPLICIT_ACCESS), |
+ ProfileSyncServiceFactory::GetForProfile(profile)); |
counter.Init( |
profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED, |
@@ -167,6 +200,7 @@ IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, Blacklisted) { |
WaitForCounting(); |
EXPECT_EQ(1u, GetResult()); |
+ EXPECT_FALSE(PasswordSyncEnabled()); |
} |
// Tests that the counter starts counting automatically when the deletion |
@@ -178,8 +212,10 @@ IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, PrefChanged) { |
WaitForUICallbacksFromAddingLogins(); |
Profile* profile = browser()->profile(); |
- browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile( |
- profile, ServiceAccessType::EXPLICIT_ACCESS)); |
+ browsing_data::PasswordsCounter counter( |
+ PasswordStoreFactory::GetForProfile(profile, |
+ ServiceAccessType::EXPLICIT_ACCESS), |
+ ProfileSyncServiceFactory::GetForProfile(profile)); |
counter.Init( |
profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED, |
base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this))); |
@@ -187,6 +223,7 @@ IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, PrefChanged) { |
WaitForCounting(); |
EXPECT_EQ(2u, GetResult()); |
+ EXPECT_FALSE(PasswordSyncEnabled()); |
} |
// Tests that the counter starts counting automatically when |
@@ -196,8 +233,10 @@ IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, StoreChanged) { |
WaitForUICallbacksFromAddingLogins(); |
Profile* profile = browser()->profile(); |
- browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile( |
- profile, ServiceAccessType::EXPLICIT_ACCESS)); |
+ browsing_data::PasswordsCounter counter( |
+ PasswordStoreFactory::GetForProfile(profile, |
+ ServiceAccessType::EXPLICIT_ACCESS), |
+ ProfileSyncServiceFactory::GetForProfile(profile)); |
counter.Init( |
profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED, |
base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this))); |
@@ -228,8 +267,10 @@ IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, PeriodChanged) { |
WaitForUICallbacksFromAddingLogins(); |
Profile* profile = browser()->profile(); |
- browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile( |
- profile, ServiceAccessType::EXPLICIT_ACCESS)); |
+ browsing_data::PasswordsCounter counter( |
+ PasswordStoreFactory::GetForProfile(profile, |
+ ServiceAccessType::EXPLICIT_ACCESS), |
+ ProfileSyncServiceFactory::GetForProfile(profile)); |
counter.Init( |
profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED, |
base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this))); |
@@ -255,4 +296,69 @@ IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, PeriodChanged) { |
EXPECT_EQ(4u, GetResult()); |
} |
+// Test that the counting restarts when password sync state changes. |
+// TODO(crbug.com/553421): Move this to the sync/test/integration directory? |
+IN_PROC_BROWSER_TEST_F(PasswordsCounterTest, RestartOnSyncChange) { |
+ // Set up the Sync client. |
+ ASSERT_TRUE(SetupClients()); |
+ static const int kFirstProfileIndex = 0; |
+ browser_sync::ProfileSyncService* sync_service = |
+ GetSyncService(kFirstProfileIndex); |
+ Profile* profile = GetProfile(kFirstProfileIndex); |
+ // Set up the counter. |
+ browsing_data::PasswordsCounter counter( |
+ PasswordStoreFactory::GetForProfile(profile, |
+ ServiceAccessType::EXPLICIT_ACCESS), |
+ sync_service); |
+ |
+ counter.Init( |
+ profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED, |
+ base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this))); |
+ |
+ // Note that some Sync operations notify observers immediately (and thus there |
+ // is no need to call |WaitForCounting()|; in fact, it would block the test), |
+ // while other operations only post the task on UI thread's message loop |
+ // (which requires calling |WaitForCounting()| for them to run). Therefore, |
+ // this test always checks if the callback has already run and only waits |
+ // if it has not. |
+ |
+ // We sync all datatypes by default, so starting Sync means that we start |
+ // syncing passwords, and this should restart the counter. |
+ ASSERT_TRUE(SetupSync()); |
+ ASSERT_TRUE(sync_service->IsSyncActive()); |
+ ASSERT_TRUE(sync_service->GetPreferredDataTypes().Has(syncer::PASSWORDS)); |
+ WaitForCountingOrConfirmFinished(); |
+ EXPECT_TRUE(PasswordSyncEnabled()); |
+ |
+ // We stop syncing passwords in particular. This restarts the counter. |
+ syncer::ModelTypeSet everything_except_passwords = |
+ syncer::ModelTypeSet::All(); |
+ everything_except_passwords.Remove(syncer::PASSWORDS); |
+ auto sync_blocker = sync_service->GetSetupInProgressHandle(); |
+ sync_service->ChangePreferredDataTypes(everything_except_passwords); |
+ sync_blocker.reset(); |
+ WaitForCountingOrConfirmFinished(); |
+ EXPECT_FALSE(PasswordSyncEnabled()); |
+ |
+ // If password sync is not affected, the counter is not restarted. |
+ syncer::ModelTypeSet only_history(syncer::HISTORY_DELETE_DIRECTIVES); |
+ sync_service->ChangePreferredDataTypes(only_history); |
+ sync_blocker = sync_service->GetSetupInProgressHandle(); |
+ sync_service->ChangePreferredDataTypes(only_history); |
+ sync_blocker.reset(); |
+ EXPECT_FALSE(CountingFinishedSinceLastAsked()); |
+ |
+ // We start syncing passwords again. This restarts the counter. |
+ sync_blocker = sync_service->GetSetupInProgressHandle(); |
+ sync_service->ChangePreferredDataTypes(syncer::ModelTypeSet::All()); |
+ sync_blocker.reset(); |
+ WaitForCountingOrConfirmFinished(); |
+ EXPECT_TRUE(PasswordSyncEnabled()); |
+ |
+ // Stopping the Sync service triggers a restart. |
+ sync_service->RequestStop(syncer::SyncService::CLEAR_DATA); |
+ WaitForCountingOrConfirmFinished(); |
+ EXPECT_FALSE(PasswordSyncEnabled()); |
+} |
+ |
} // namespace |