two_client_passwords_sync_test.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
1// Copyright (c) 2012 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 "base/strings/utf_string_conversions.h" 6#include "chrome/browser/sync/test/integration/passwords_helper.h" 7#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" 8#include "chrome/browser/sync/test/integration/sync_integration_test_util.h" 9#include "chrome/browser/sync/test/integration/sync_test.h" 10#include "sync/internal_api/public/engine/model_safe_worker.h" 11#include "sync/internal_api/public/sessions/sync_session_snapshot.h" 12 13using passwords_helper::AddLogin; 14using passwords_helper::AllProfilesContainSamePasswordForms; 15using passwords_helper::AllProfilesContainSamePasswordFormsAsVerifier; 16using passwords_helper::CreateTestPasswordForm; 17using passwords_helper::GetPasswordCount; 18using passwords_helper::GetPasswordStore; 19using passwords_helper::GetVerifierPasswordCount; 20using passwords_helper::GetVerifierPasswordStore; 21using passwords_helper::ProfileContainsSamePasswordFormsAsVerifier; 22using passwords_helper::RemoveLogin; 23using passwords_helper::RemoveLogins; 24using passwords_helper::SetDecryptionPassphrase; 25using passwords_helper::SetEncryptionPassphrase; 26using passwords_helper::UpdateLogin; 27using sync_integration_test_util::AwaitCommitActivityCompletion; 28using sync_integration_test_util::AwaitPassphraseAccepted; 29using sync_integration_test_util::AwaitPassphraseRequired; 30 31using autofill::PasswordForm; 32 33static const char* kValidPassphrase = "passphrase!"; 34static const char* kAnotherValidPassphrase = "another passphrase!"; 35 36class TwoClientPasswordsSyncTest : public SyncTest { 37 public: 38 TwoClientPasswordsSyncTest() : SyncTest(TWO_CLIENT) {} 39 virtual ~TwoClientPasswordsSyncTest() {} 40 41 private: 42 DISALLOW_COPY_AND_ASSIGN(TwoClientPasswordsSyncTest); 43}; 44 45// TCM ID - 3732277 46IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, Add) { 47 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 48 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 49 50 PasswordForm form = CreateTestPasswordForm(0); 51 AddLogin(GetVerifierPasswordStore(), form); 52 ASSERT_EQ(1, GetVerifierPasswordCount()); 53 AddLogin(GetPasswordStore(0), form); 54 ASSERT_EQ(1, GetPasswordCount(0)); 55 56 ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1))); 57 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 58} 59 60IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, Race) { 61 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 62 ASSERT_TRUE(AllProfilesContainSamePasswordForms()); 63 64 PasswordForm form0 = CreateTestPasswordForm(0); 65 AddLogin(GetPasswordStore(0), form0); 66 67 PasswordForm form1 = form0; 68 form1.password_value = base::ASCIIToUTF16("new_password"); 69 AddLogin(GetPasswordStore(1), form1); 70 71 ASSERT_TRUE(AwaitQuiescence()); 72 ASSERT_TRUE(AllProfilesContainSamePasswordForms()); 73} 74 75// TCM ID - 4577932. 76IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, DisablePasswords) { 77 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 78 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 79 80 ASSERT_TRUE(GetClient(1)->DisableSyncForDatatype(syncer::PASSWORDS)); 81 PasswordForm form = CreateTestPasswordForm(0); 82 AddLogin(GetVerifierPasswordStore(), form); 83 ASSERT_EQ(1, GetVerifierPasswordCount()); 84 AddLogin(GetPasswordStore(0), form); 85 ASSERT_EQ(1, GetPasswordCount(0)); 86 87 ASSERT_TRUE(AwaitCommitActivityCompletion(GetClient(0)->service())); 88 ASSERT_TRUE(ProfileContainsSamePasswordFormsAsVerifier(0)); 89 ASSERT_FALSE(ProfileContainsSamePasswordFormsAsVerifier(1)); 90 91 ASSERT_TRUE(GetClient(1)->EnableSyncForDatatype(syncer::PASSWORDS)); 92 ASSERT_TRUE(AwaitQuiescence()); 93 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 94 ASSERT_EQ(1, GetPasswordCount(1)); 95} 96 97// TCM ID - 4649281. 98IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, DisableSync) { 99 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 100 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 101 102 ASSERT_TRUE(GetClient(1)->DisableSyncForAllDatatypes()); 103 PasswordForm form = CreateTestPasswordForm(0); 104 AddLogin(GetVerifierPasswordStore(), form); 105 ASSERT_EQ(1, GetVerifierPasswordCount()); 106 AddLogin(GetPasswordStore(0), form); 107 ASSERT_EQ(1, GetPasswordCount(0)); 108 109 ASSERT_TRUE(AwaitCommitActivityCompletion(GetClient(0)->service())); 110 ASSERT_TRUE(ProfileContainsSamePasswordFormsAsVerifier(0)); 111 ASSERT_FALSE(ProfileContainsSamePasswordFormsAsVerifier(1)); 112 113 ASSERT_TRUE(GetClient(1)->EnableSyncForAllDatatypes()); 114 ASSERT_TRUE(AwaitQuiescence()); 115 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 116 ASSERT_EQ(1, GetPasswordCount(1)); 117} 118 119IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, SetPassphrase) { 120 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 121 122 SetEncryptionPassphrase(0, kValidPassphrase, ProfileSyncService::EXPLICIT); 123 ASSERT_TRUE(AwaitPassphraseAccepted(GetClient(0)->service())); 124 ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1))); 125 126 ASSERT_TRUE(AwaitPassphraseRequired(GetClient(1)->service())); 127 ASSERT_TRUE(SetDecryptionPassphrase(1, kValidPassphrase)); 128 ASSERT_TRUE(AwaitPassphraseAccepted(GetClient(1)->service())); 129 ASSERT_TRUE(AwaitCommitActivityCompletion(GetClient(1)->service())); 130} 131 132IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, 133 SetPassphraseAndAddPassword) { 134 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 135 136 SetEncryptionPassphrase(0, kValidPassphrase, ProfileSyncService::EXPLICIT); 137 ASSERT_TRUE(AwaitPassphraseAccepted(GetClient(0)->service())); 138 ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1))); 139 140 ASSERT_TRUE(AwaitPassphraseRequired(GetClient(1)->service())); 141 ASSERT_TRUE(SetDecryptionPassphrase(1, kValidPassphrase)); 142 ASSERT_TRUE(AwaitPassphraseAccepted(GetClient(1)->service())); 143 144 PasswordForm form = CreateTestPasswordForm(0); 145 AddLogin(GetPasswordStore(0), form); 146 ASSERT_EQ(1, GetPasswordCount(0)); 147 148 ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1))); 149 ASSERT_EQ(1, GetPasswordCount(1)); 150} 151 152// TCM ID - 4603879 153IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, Update) { 154 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 155 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 156 157 PasswordForm form = CreateTestPasswordForm(0); 158 AddLogin(GetVerifierPasswordStore(), form); 159 AddLogin(GetPasswordStore(0), form); 160 ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1))); 161 162 form.password_value = base::ASCIIToUTF16("new_password"); 163 UpdateLogin(GetVerifierPasswordStore(), form); 164 UpdateLogin(GetPasswordStore(1), form); 165 ASSERT_TRUE(AwaitQuiescence()); 166 167 ASSERT_EQ(1, GetVerifierPasswordCount()); 168 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 169} 170 171// TCM ID - 3719309 172IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, Delete) { 173 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 174 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 175 176 PasswordForm form0 = CreateTestPasswordForm(0); 177 AddLogin(GetVerifierPasswordStore(), form0); 178 AddLogin(GetPasswordStore(0), form0); 179 PasswordForm form1 = CreateTestPasswordForm(1); 180 AddLogin(GetVerifierPasswordStore(), form1); 181 AddLogin(GetPasswordStore(0), form1); 182 ASSERT_TRUE(AwaitQuiescence()); 183 184 RemoveLogin(GetPasswordStore(1), form0); 185 RemoveLogin(GetVerifierPasswordStore(), form0); 186 ASSERT_TRUE(AwaitQuiescence()); 187 188 ASSERT_EQ(1, GetVerifierPasswordCount()); 189 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 190} 191 192// TCM ID - 7573511 193// Flaky on Mac and Windows: http://crbug.com/111399 194#if defined(OS_WIN) || defined(OS_MACOSX) 195#define MAYBE_DeleteAll DISABLED_DeleteAll 196#else 197#define MAYBE_DeleteAll DeleteAll 198#endif 199IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, MAYBE_DeleteAll) { 200 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 201 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 202 203 PasswordForm form0 = CreateTestPasswordForm(0); 204 AddLogin(GetVerifierPasswordStore(), form0); 205 AddLogin(GetPasswordStore(0), form0); 206 PasswordForm form1 = CreateTestPasswordForm(1); 207 AddLogin(GetVerifierPasswordStore(), form1); 208 AddLogin(GetPasswordStore(0), form1); 209 ASSERT_TRUE(AwaitQuiescence()); 210 211 RemoveLogins(GetPasswordStore(1)); 212 RemoveLogins(GetVerifierPasswordStore()); 213 ASSERT_TRUE(AwaitQuiescence()); 214 215 ASSERT_EQ(0, GetVerifierPasswordCount()); 216 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 217} 218 219// TCM ID - 3694311 220IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, Merge) { 221 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 222 ASSERT_TRUE(AllProfilesContainSamePasswordForms()); 223 224 PasswordForm form0 = CreateTestPasswordForm(0); 225 AddLogin(GetPasswordStore(0), form0); 226 PasswordForm form1 = CreateTestPasswordForm(1); 227 AddLogin(GetPasswordStore(1), form1); 228 PasswordForm form2 = CreateTestPasswordForm(2); 229 AddLogin(GetPasswordStore(1), form2); 230 ASSERT_TRUE(AwaitQuiescence()); 231 232 ASSERT_EQ(3, GetPasswordCount(0)); 233 ASSERT_TRUE(AllProfilesContainSamePasswordForms()); 234} 235 236IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, 237 SetPassphraseAndThenSetupSync) { 238 ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; 239 240 ASSERT_TRUE(GetClient(0)->SetupSync()); 241 SetEncryptionPassphrase(0, kValidPassphrase, ProfileSyncService::EXPLICIT); 242 ASSERT_TRUE(AwaitPassphraseAccepted(GetClient(0)->service())); 243 ASSERT_TRUE(AwaitCommitActivityCompletion(GetClient(0)->service())); 244 245 ASSERT_FALSE(GetClient(1)->SetupSync()); 246 ASSERT_TRUE(AwaitPassphraseRequired(GetClient(1)->service())); 247 ASSERT_TRUE(SetDecryptionPassphrase(1, kValidPassphrase)); 248 ASSERT_TRUE(AwaitPassphraseAccepted(GetClient(1)->service())); 249 250 // For some reason, the tests won't pass unless these flags are set. 251 GetClient(1)->service()->SetSetupInProgress(false); 252 GetClient(1)->service()->SetSyncSetupCompleted(); 253 254 ASSERT_TRUE(AwaitCommitActivityCompletion(GetClient(1)->service())); 255 256 // Following ensures types are enabled and active (see bug 87572). 257 syncer::ModelSafeRoutingInfo routes; 258 GetClient(0)->service()->GetModelSafeRoutingInfo(&routes); 259 ASSERT_EQ(syncer::GROUP_PASSWORD, routes[syncer::PASSWORDS]); 260 routes.clear(); 261 GetClient(1)->service()->GetModelSafeRoutingInfo(&routes); 262 ASSERT_EQ(syncer::GROUP_PASSWORD, routes[syncer::PASSWORDS]); 263} 264 265IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, 266 SetDifferentPassphraseAndThenSetupSync) { 267 ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; 268 269 ASSERT_TRUE(GetClient(0)->SetupSync()); 270 SetEncryptionPassphrase(0, kValidPassphrase, ProfileSyncService::EXPLICIT); 271 ASSERT_TRUE(AwaitPassphraseAccepted(GetClient(0)->service())); 272 ASSERT_TRUE(AwaitCommitActivityCompletion(GetClient(0)->service())); 273 274 // Setup 1 with a different passphrase, so that it fails to sync. 275 ASSERT_FALSE(GetClient(1)->SetupSync()); 276 ASSERT_TRUE(AwaitPassphraseRequired(GetClient(1)->service())); 277 ASSERT_FALSE(SetDecryptionPassphrase(1, kAnotherValidPassphrase)); 278 ASSERT_TRUE(AwaitPassphraseRequired(GetClient(1)->service())); 279 280 // Add a password on 0 while clients have different passphrases. 281 PasswordForm form0 = CreateTestPasswordForm(0); 282 AddLogin(GetVerifierPasswordStore(), form0); 283 AddLogin(GetPasswordStore(0), form0); 284 285 ASSERT_TRUE(AwaitCommitActivityCompletion(GetClient(0)->service())); 286 287 // Password hasn't been synced to 1 yet. 288 ASSERT_FALSE(AllProfilesContainSamePasswordFormsAsVerifier()); 289 290 // Update 1 with the correct passphrase, the password should now sync over. 291 ASSERT_TRUE(AwaitPassphraseRequired(GetClient(1)->service())); 292 ASSERT_TRUE(SetDecryptionPassphrase(1, kValidPassphrase)); 293 ASSERT_TRUE(AwaitPassphraseAccepted(GetClient(1)->service())); 294 295 // For some reason, the tests won't pass unless these flags are set. 296 GetClient(1)->service()->SetSetupInProgress(false); 297 GetClient(1)->service()->SetSyncSetupCompleted(); 298 299 ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1))); 300 ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); 301} 302