Home | History | Annotate | Download | only in integration
      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:
     49   TwoClientAutofillSyncTest() : SyncTest(TWO_CLIENT) { count = 0; }
     50   virtual ~TwoClientAutofillSyncTest() {}
     51 
     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.
     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 
     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.
    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 
    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 
    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 
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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 (at) TV.com"));
    299   MakeABookmarkChange(0);
    300   ASSERT_TRUE(AwaitProfilesMatch(0, 1));
    301   ASSERT_EQ(1U, GetAllProfiles(0).size());
    302 }
    303 
    304 // TCM ID - 3628299.
    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.
    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 
    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.
    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