• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/autofill_helper.h"
7 #include "chrome/browser/sync/test/integration/bookmarks_helper.h"
8 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
9 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
10 #include "chrome/browser/sync/test/integration/sync_test.h"
11 #include "components/autofill/core/browser/autofill_profile.h"
12 #include "components/autofill/core/browser/credit_card.h"
13 #include "components/autofill/core/browser/personal_data_manager.h"
14 #include "components/autofill/core/browser/webdata/autofill_entry.h"
15 #include "components/autofill/core/browser/webdata/autofill_table.h"
16 
17 using autofill::AutofillKey;
18 using autofill::AutofillTable;
19 using autofill::AutofillProfile;
20 using autofill::AutofillType;
21 using autofill::CreditCard;
22 using autofill::PersonalDataManager;
23 using autofill_helper::AddKeys;
24 using autofill_helper::AddProfile;
25 using autofill_helper::AwaitKeysMatch;
26 using autofill_helper::AwaitProfilesMatch;
27 using autofill_helper::CreateAutofillProfile;
28 using autofill_helper::GetAllKeys;
29 using autofill_helper::GetAllProfiles;
30 using autofill_helper::GetPersonalDataManager;
31 using autofill_helper::KeysMatch;
32 using autofill_helper::ProfilesMatch;
33 using autofill_helper::PROFILE_FRASIER;
34 using autofill_helper::PROFILE_HOMER;
35 using autofill_helper::PROFILE_MARION;
36 using autofill_helper::PROFILE_NULL;
37 using autofill_helper::RemoveKey;
38 using autofill_helper::RemoveProfile;
39 using autofill_helper::SetCreditCards;
40 using autofill_helper::UpdateProfile;
41 using bookmarks_helper::AddFolder;
42 using bookmarks_helper::AddURL;
43 using bookmarks_helper::IndexedURL;
44 using bookmarks_helper::IndexedURLTitle;
45 using sync_integration_test_util::AwaitCommitActivityCompletion;
46 
47 class TwoClientAutofillSyncTest : public SyncTest {
48  public:
TwoClientAutofillSyncTest()49   TwoClientAutofillSyncTest() : SyncTest(TWO_CLIENT) { count = 0; }
~TwoClientAutofillSyncTest()50   virtual ~TwoClientAutofillSyncTest() {}
51 
TestUsesSelfNotifications()52   virtual bool TestUsesSelfNotifications() OVERRIDE { return false; }
53 
54   // We do this so as to make a change that will trigger the autofill to sync.
55   // By default autofill does not sync unless there is some other change.
MakeABookmarkChange(int profile)56   void MakeABookmarkChange(int profile) {
57     ASSERT_TRUE(
58         AddURL(profile, IndexedURLTitle(count), GURL(IndexedURL(count))));
59     ++count;
60   }
61  private:
62   int count;
63   DISALLOW_COPY_AND_ASSIGN(TwoClientAutofillSyncTest);
64 };
65 
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,WebDataServiceSanity)66 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, WebDataServiceSanity) {
67   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
68 
69   // Client0 adds a key.
70   std::set<AutofillKey> keys;
71   keys.insert(AutofillKey("name0", "value0"));
72   AddKeys(0, keys);
73   MakeABookmarkChange(0);
74   ASSERT_TRUE(AwaitKeysMatch(0, 1));
75   ASSERT_EQ(1U, GetAllKeys(0).size());
76 
77   // Client1 adds a key.
78   keys.clear();
79   keys.insert(AutofillKey("name1", "value1-0"));
80   AddKeys(1, keys);
81   MakeABookmarkChange(1);
82   ASSERT_TRUE(AwaitKeysMatch(0, 1));
83   ASSERT_EQ(2U, GetAllKeys(0).size());
84 
85   // Client0 adds a key with the same name.
86   keys.clear();
87   keys.insert(AutofillKey("name1", "value1-1"));
88   AddKeys(0, keys);
89   MakeABookmarkChange(0);
90   ASSERT_TRUE(AwaitKeysMatch(0, 1));
91   ASSERT_EQ(3U, GetAllKeys(0).size());
92 
93   // Client1 removes a key.
94   RemoveKey(1, AutofillKey("name1", "value1-0"));
95   MakeABookmarkChange(1);
96   ASSERT_TRUE(AwaitKeysMatch(0, 1));
97   ASSERT_EQ(2U, GetAllKeys(0).size());
98 
99   // Client0 removes the rest.
100   RemoveKey(0, AutofillKey("name0", "value0"));
101   RemoveKey(0, AutofillKey("name1", "value1-1"));
102   MakeABookmarkChange(0);
103   ASSERT_TRUE(AwaitKeysMatch(0, 1));
104   ASSERT_EQ(0U, GetAllKeys(0).size());
105 }
106 
107 // TCM ID - 3678296.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,AddUnicodeProfile)108 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, AddUnicodeProfile) {
109   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
110 
111   std::set<AutofillKey> keys;
112   keys.insert(AutofillKey(base::WideToUTF16(L"Sigur R\u00F3s"),
113                           base::WideToUTF16(L"\u00C1g\u00E6tis byrjun")));
114   AddKeys(0, keys);
115   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
116   ASSERT_TRUE(AwaitKeysMatch(0, 1));
117 }
118 
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,AddDuplicateNamesToSameProfile)119 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,
120                        AddDuplicateNamesToSameProfile) {
121   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
122 
123   std::set<AutofillKey> keys;
124   keys.insert(AutofillKey("name0", "value0-0"));
125   keys.insert(AutofillKey("name0", "value0-1"));
126   keys.insert(AutofillKey("name1", "value1"));
127   AddKeys(0, keys);
128   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
129   ASSERT_TRUE(AwaitKeysMatch(0, 1));
130   ASSERT_EQ(2U, GetAllKeys(0).size());
131 }
132 
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,AddDuplicateNamesToDifferentProfiles)133 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,
134                        AddDuplicateNamesToDifferentProfiles) {
135   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
136 
137   std::set<AutofillKey> keys0;
138   keys0.insert(AutofillKey("name0", "value0-0"));
139   keys0.insert(AutofillKey("name1", "value1"));
140   AddKeys(0, keys0);
141 
142   std::set<AutofillKey> keys1;
143   keys1.insert(AutofillKey("name0", "value0-1"));
144   keys1.insert(AutofillKey("name2", "value2"));
145   keys1.insert(AutofillKey("name3", "value3"));
146   AddKeys(1, keys1);
147 
148   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
149   ASSERT_TRUE(AwaitKeysMatch(0, 1));
150   ASSERT_EQ(5U, GetAllKeys(0).size());
151 }
152 
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,PersonalDataManagerSanity)153 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,
154                        PersonalDataManagerSanity) {
155   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
156 
157   // Client0 adds a profile.
158   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
159   MakeABookmarkChange(0);
160   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
161   ASSERT_EQ(1U, GetAllProfiles(0).size());
162 
163   // Client1 adds a profile.
164   AddProfile(1, CreateAutofillProfile(PROFILE_MARION));
165   MakeABookmarkChange(1);
166   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
167   ASSERT_EQ(2U, GetAllProfiles(0).size());
168 
169   // Client0 adds the same profile.
170   AddProfile(0, CreateAutofillProfile(PROFILE_MARION));
171   MakeABookmarkChange(0);
172   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
173   ASSERT_EQ(2U, GetAllProfiles(0).size());
174 
175   // Client1 removes a profile.
176   RemoveProfile(1, GetAllProfiles(1)[0]->guid());
177   MakeABookmarkChange(1);
178   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
179   ASSERT_EQ(1U, GetAllProfiles(0).size());
180 
181   // Client0 updates a profile.
182   UpdateProfile(0,
183                 GetAllProfiles(0)[0]->guid(),
184                 AutofillType(autofill::NAME_FIRST),
185                 base::ASCIIToUTF16("Bart"));
186   MakeABookmarkChange(0);
187   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
188   ASSERT_EQ(1U, GetAllProfiles(0).size());
189 
190   // Client1 removes remaining profile.
191   RemoveProfile(1, GetAllProfiles(1)[0]->guid());
192   MakeABookmarkChange(1);
193   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
194   ASSERT_EQ(0U, GetAllProfiles(0).size());
195 }
196 
197 // TCM ID - 7261786.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,AddDuplicateProfiles)198 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, AddDuplicateProfiles) {
199   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
200 
201   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
202   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
203   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
204   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
205   ASSERT_EQ(1U, GetAllProfiles(0).size());
206 }
207 
208 // TCM ID - 3636294.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,SameProfileWithConflict)209 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, SameProfileWithConflict) {
210   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
211 
212   AutofillProfile profile0 = CreateAutofillProfile(PROFILE_HOMER);
213   AutofillProfile profile1 = CreateAutofillProfile(PROFILE_HOMER);
214   profile1.SetRawInfo(autofill::PHONE_HOME_WHOLE_NUMBER,
215                       base::ASCIIToUTF16("1234567890"));
216 
217   AddProfile(0, profile0);
218   AddProfile(1, profile1);
219   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
220   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
221   ASSERT_EQ(1U, GetAllProfiles(0).size());
222 }
223 
224 // TCM ID - 3626291.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,AddEmptyProfile)225 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, AddEmptyProfile) {
226   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
227 
228   AddProfile(0, CreateAutofillProfile(PROFILE_NULL));
229   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
230   ASSERT_EQ(0U, GetAllProfiles(0).size());
231 }
232 
233 // TCM ID - 3616283.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,AddProfile)234 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, AddProfile) {
235   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
236 
237   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
238   MakeABookmarkChange(0);
239   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
240   ASSERT_EQ(1U, GetAllProfiles(0).size());
241 }
242 
243 // TCM ID - 3632260.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,AddMultipleProfiles)244 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, AddMultipleProfiles) {
245   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
246 
247   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
248   AddProfile(0, CreateAutofillProfile(PROFILE_MARION));
249   AddProfile(0, CreateAutofillProfile(PROFILE_FRASIER));
250   MakeABookmarkChange(0);
251   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
252   ASSERT_EQ(3U, GetAllProfiles(0).size());
253 }
254 
255 // TCM ID - 3602257.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,DeleteProfile)256 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, DeleteProfile) {
257   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
258 
259   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
260   MakeABookmarkChange(0);
261   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
262   ASSERT_EQ(1U, GetAllProfiles(0).size());
263 
264   RemoveProfile(1, GetAllProfiles(1)[0]->guid());
265   MakeABookmarkChange(1);
266   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
267   ASSERT_EQ(0U, GetAllProfiles(0).size());
268 }
269 
270 // TCM ID - 3627300.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,MergeProfiles)271 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, MergeProfiles) {
272   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
273 
274   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
275   AddProfile(1, CreateAutofillProfile(PROFILE_MARION));
276   AddProfile(1, CreateAutofillProfile(PROFILE_FRASIER));
277   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
278   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
279   ASSERT_EQ(3U, GetAllProfiles(0).size());
280 }
281 
282 // TCM ID - 3665264.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,UpdateFields)283 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, UpdateFields) {
284   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
285 
286   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
287   MakeABookmarkChange(0);
288   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
289   ASSERT_EQ(1U, GetAllProfiles(0).size());
290 
291   UpdateProfile(0,
292                 GetAllProfiles(0)[0]->guid(),
293                 AutofillType(autofill::NAME_FIRST),
294                 base::ASCIIToUTF16("Lisa"));
295   UpdateProfile(0,
296                 GetAllProfiles(0)[0]->guid(),
297                 AutofillType(autofill::EMAIL_ADDRESS),
298                 base::ASCIIToUTF16("grrrl@TV.com"));
299   MakeABookmarkChange(0);
300   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
301   ASSERT_EQ(1U, GetAllProfiles(0).size());
302 }
303 
304 // TCM ID - 3628299.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,ConflictingFields)305 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, ConflictingFields) {
306   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
307 
308   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
309   MakeABookmarkChange(0);
310   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
311   ASSERT_EQ(1U, GetAllProfiles(0).size());
312   UpdateProfile(0,
313                 GetAllProfiles(0)[0]->guid(),
314                 AutofillType(autofill::NAME_FIRST),
315                 base::ASCIIToUTF16("Lisa"));
316   MakeABookmarkChange(0);
317   UpdateProfile(1,
318                 GetAllProfiles(1)[0]->guid(),
319                 AutofillType(autofill::NAME_FIRST),
320                 base::ASCIIToUTF16("Bart"));
321   MakeABookmarkChange(1);
322   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
323   ASSERT_EQ(1U, GetAllProfiles(0).size());
324 }
325 
326 // TCM ID - 3608295.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,MaxLength)327 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, MaxLength) {
328   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
329 
330   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
331   MakeABookmarkChange(0);
332   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
333   ASSERT_EQ(1U, GetAllProfiles(0).size());
334 
335   base::string16 max_length_string(AutofillTable::kMaxDataLength, '.');
336   UpdateProfile(0,
337                 GetAllProfiles(0)[0]->guid(),
338                 AutofillType(autofill::NAME_FULL),
339                 max_length_string);
340   UpdateProfile(0,
341                 GetAllProfiles(0)[0]->guid(),
342                 AutofillType(autofill::EMAIL_ADDRESS),
343                 max_length_string);
344   UpdateProfile(0,
345                 GetAllProfiles(0)[0]->guid(),
346                 AutofillType(autofill::ADDRESS_HOME_LINE1),
347                 max_length_string);
348 
349   MakeABookmarkChange(0);
350   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
351 }
352 
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,ExceedsMaxLength)353 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, ExceedsMaxLength) {
354   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
355 
356   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
357   MakeABookmarkChange(0);
358   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
359   ASSERT_EQ(1U, GetAllProfiles(0).size());
360 
361   base::string16 exceeds_max_length_string(
362       AutofillTable::kMaxDataLength + 1, '.');
363   UpdateProfile(0,
364                 GetAllProfiles(0)[0]->guid(),
365                 AutofillType(autofill::NAME_FIRST),
366                 exceeds_max_length_string);
367   UpdateProfile(0,
368                 GetAllProfiles(0)[0]->guid(),
369                 AutofillType(autofill::NAME_LAST),
370                 exceeds_max_length_string);
371   UpdateProfile(0,
372                 GetAllProfiles(0)[0]->guid(),
373                 AutofillType(autofill::EMAIL_ADDRESS),
374                 exceeds_max_length_string);
375   UpdateProfile(0,
376                 GetAllProfiles(0)[0]->guid(),
377                 AutofillType(autofill::ADDRESS_HOME_LINE1),
378                 exceeds_max_length_string);
379 
380   MakeABookmarkChange(0);
381   ASSERT_TRUE(bookmarks_helper::AwaitAllModelsMatch());
382   EXPECT_FALSE(ProfilesMatch(0, 1));
383 }
384 
385 // Test credit cards don't sync.
IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest,NoCreditCardSync)386 IN_PROC_BROWSER_TEST_F(TwoClientAutofillSyncTest, NoCreditCardSync) {
387   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
388 
389   AddProfile(0, CreateAutofillProfile(PROFILE_HOMER));
390 
391   CreditCard card;
392   card.SetRawInfo(autofill::CREDIT_CARD_NUMBER,
393                   base::ASCIIToUTF16("6011111111111117"));
394   std::vector<CreditCard> credit_cards;
395   credit_cards.push_back(card);
396   SetCreditCards(0, &credit_cards);
397 
398   MakeABookmarkChange(0);
399   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
400   ASSERT_EQ(1U, GetAllProfiles(0).size());
401 
402   PersonalDataManager* pdm = GetPersonalDataManager(1);
403   ASSERT_EQ(0U, pdm->GetCreditCards().size());
404 }
405