two_client_passwords_sync_test.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_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 autofill::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 = base::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)->AwaitCommitActivityCompletion());
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)->AwaitCommitActivityCompletion());
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)->AwaitCommitActivityCompletion());
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 = base::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
232IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest,
233                       SetPassphraseAndThenSetupSync) {
234  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
235
236  ASSERT_TRUE(GetClient(0)->SetupSync());
237  SetEncryptionPassphrase(0, kValidPassphrase, ProfileSyncService::EXPLICIT);
238  ASSERT_TRUE(GetClient(0)->AwaitPassphraseAccepted());
239  ASSERT_TRUE(GetClient(0)->AwaitCommitActivityCompletion());
240
241  ASSERT_FALSE(GetClient(1)->SetupSync());
242  ASSERT_TRUE(GetClient(1)->AwaitPassphraseRequired());
243  ASSERT_TRUE(SetDecryptionPassphrase(1, kValidPassphrase));
244  ASSERT_TRUE(GetClient(1)->AwaitPassphraseAccepted());
245  ASSERT_TRUE(GetClient(1)->AwaitCommitActivityCompletion());
246
247  // Following ensures types are enabled and active (see bug 87572).
248  syncer::ModelSafeRoutingInfo routes;
249  GetClient(0)->service()->GetModelSafeRoutingInfo(&routes);
250  ASSERT_EQ(syncer::GROUP_PASSWORD, routes[syncer::PASSWORDS]);
251  routes.clear();
252  GetClient(1)->service()->GetModelSafeRoutingInfo(&routes);
253  ASSERT_EQ(syncer::GROUP_PASSWORD, routes[syncer::PASSWORDS]);
254}
255
256IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest,
257                       SetDifferentPassphraseAndThenSetupSync) {
258  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
259
260  ASSERT_TRUE(GetClient(0)->SetupSync());
261  SetEncryptionPassphrase(0, kValidPassphrase, ProfileSyncService::EXPLICIT);
262  ASSERT_TRUE(GetClient(0)->AwaitPassphraseAccepted());
263  ASSERT_TRUE(GetClient(0)->AwaitCommitActivityCompletion());
264
265  // Setup 1 with a different passphrase, so that it fails to sync.
266  ASSERT_FALSE(GetClient(1)->SetupSync());
267  ASSERT_TRUE(GetClient(1)->AwaitPassphraseRequired());
268  ASSERT_FALSE(SetDecryptionPassphrase(1, kAnotherValidPassphrase));
269  ASSERT_TRUE(GetClient(1)->AwaitPassphraseRequired());
270
271  // Add a password on 0 while clients have different passphrases.
272  PasswordForm form0 = CreateTestPasswordForm(0);
273  AddLogin(GetVerifierPasswordStore(), form0);
274  AddLogin(GetPasswordStore(0), form0);
275
276  ASSERT_TRUE(GetClient(0)->AwaitCommitActivityCompletion());
277
278  // Password hasn't been synced to 1 yet.
279  ASSERT_FALSE(AllProfilesContainSamePasswordFormsAsVerifier());
280
281  // Update 1 with the correct passphrase, the password should now sync over.
282  ASSERT_TRUE(GetClient(1)->AwaitPassphraseRequired());
283  ASSERT_TRUE(SetDecryptionPassphrase(1, kValidPassphrase));
284  ASSERT_TRUE(GetClient(1)->AwaitPassphraseAccepted());
285
286  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
287  ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier());
288}
289