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