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