Home | History | Annotate | Download | only in autofill
      1 // Copyright (c) 2011 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 <string>
      6 
      7 #include "base/basictypes.h"
      8 #include "base/memory/ref_counted.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/message_loop.h"
     11 #include "base/utf_string_conversions.h"
     12 #include "chrome/browser/autofill/autofill_common_test.h"
     13 #include "chrome/browser/autofill/autofill_profile.h"
     14 #include "chrome/browser/autofill/form_structure.h"
     15 #include "chrome/browser/autofill/personal_data_manager.h"
     16 #include "chrome/browser/password_manager/encryptor.h"
     17 #include "chrome/common/guid.h"
     18 #include "chrome/test/testing_browser_process.h"
     19 #include "chrome/test/testing_profile.h"
     20 #include "content/browser/browser_thread.h"
     21 #include "content/common/notification_details.h"
     22 #include "content/common/notification_observer_mock.h"
     23 #include "content/common/notification_registrar.h"
     24 #include "content/common/notification_source.h"
     25 #include "content/common/notification_type.h"
     26 #include "testing/gmock/include/gmock/gmock.h"
     27 #include "testing/gtest/include/gtest/gtest.h"
     28 #include "webkit/glue/form_data.h"
     29 #include "webkit/glue/form_data.h"
     30 
     31 using webkit_glue::FormData;
     32 
     33 ACTION(QuitUIMessageLoop) {
     34   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     35   MessageLoop::current()->Quit();
     36 }
     37 
     38 class PersonalDataLoadedObserverMock : public PersonalDataManager::Observer {
     39  public:
     40   PersonalDataLoadedObserverMock() {}
     41   virtual ~PersonalDataLoadedObserverMock() {}
     42 
     43   MOCK_METHOD0(OnPersonalDataLoaded, void());
     44 };
     45 
     46 class PersonalDataManagerTest : public testing::Test {
     47  protected:
     48   PersonalDataManagerTest()
     49       : ui_thread_(BrowserThread::UI, &message_loop_),
     50         db_thread_(BrowserThread::DB) {
     51   }
     52 
     53   virtual void SetUp() {
     54     db_thread_.Start();
     55 
     56     profile_.reset(new TestingProfile);
     57     profile_->CreateWebDataService(false);
     58 
     59     autofill_test::DisableSystemServices(profile_.get());
     60     ResetPersonalDataManager();
     61   }
     62 
     63   virtual void TearDown() {
     64     personal_data_ = NULL;
     65     if (profile_.get())
     66       profile_.reset(NULL);
     67 
     68     db_thread_.Stop();
     69     MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask);
     70     MessageLoop::current()->Run();
     71   }
     72 
     73   void ResetPersonalDataManager() {
     74     personal_data_ = new PersonalDataManager();
     75     personal_data_->Init(profile_.get());
     76     personal_data_->SetObserver(&personal_data_observer_);
     77   }
     78 
     79   ScopedTestingBrowserProcess browser_process_;
     80   MessageLoopForUI message_loop_;
     81   BrowserThread ui_thread_;
     82   BrowserThread db_thread_;
     83   scoped_ptr<TestingProfile> profile_;
     84   scoped_refptr<PersonalDataManager> personal_data_;
     85   NotificationRegistrar registrar_;
     86   NotificationObserverMock observer_;
     87   PersonalDataLoadedObserverMock personal_data_observer_;
     88 };
     89 
     90 // TODO(jhawkins): Test SetProfiles w/out a WebDataService in the profile.
     91 TEST_F(PersonalDataManagerTest, SetProfiles) {
     92   AutofillProfile profile0;
     93   autofill_test::SetProfileInfo(&profile0,
     94       "Marion", "Mitchell", "Morrison",
     95       "johnwayne (at) me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
     96       "91601", "US", "12345678910", "01987654321");
     97 
     98   AutofillProfile profile1;
     99   autofill_test::SetProfileInfo(&profile1,
    100       "Josephine", "Alicia", "Saenz",
    101       "joewayne (at) me.xyz", "Fox", "903 Apple Ct.", NULL, "Orlando", "FL", "32801",
    102       "US", "19482937549", "13502849239");
    103 
    104   AutofillProfile profile2;
    105   autofill_test::SetProfileInfo(&profile2,
    106       "Josephine", "Alicia", "Saenz",
    107       "joewayne (at) me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
    108       "32801", "US", "19482937549", "13502849239");
    109 
    110   // This will verify that the web database has been loaded and the notification
    111   // sent out.
    112   EXPECT_CALL(personal_data_observer_,
    113               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    114 
    115   // The message loop will exit when the mock observer is notified.
    116   MessageLoop::current()->Run();
    117 
    118   // Add two test profiles to the database.
    119   std::vector<AutofillProfile> update;
    120   update.push_back(profile0);
    121   update.push_back(profile1);
    122   personal_data_->SetProfiles(&update);
    123 
    124   const std::vector<AutofillProfile*>& results1 = personal_data_->profiles();
    125   ASSERT_EQ(2U, results1.size());
    126   EXPECT_EQ(0, profile0.Compare(*results1.at(0)));
    127   EXPECT_EQ(0, profile1.Compare(*results1.at(1)));
    128 
    129   // Three operations in one:
    130   //  - Update profile0
    131   //  - Remove profile1
    132   //  - Add profile2
    133   profile0.SetInfo(NAME_FIRST, ASCIIToUTF16("John"));
    134   update.clear();
    135   update.push_back(profile0);
    136   update.push_back(profile2);
    137   personal_data_->SetProfiles(&update);
    138 
    139   const std::vector<AutofillProfile*>& results2 = personal_data_->profiles();
    140   ASSERT_EQ(2U, results2.size());
    141   EXPECT_EQ(0, profile0.Compare(*results2.at(0)));
    142   EXPECT_EQ(0, profile2.Compare(*results2.at(1)));
    143 
    144   // Reset the PersonalDataManager.  This tests that the personal data was saved
    145   // to the web database, and that we can load the profiles from the web
    146   // database.
    147   ResetPersonalDataManager();
    148 
    149   // This will verify that the web database has been loaded and the notification
    150   // sent out.
    151   EXPECT_CALL(personal_data_observer_,
    152               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    153 
    154   // The message loop will exit when the PersonalDataLoadedObserver is notified.
    155   MessageLoop::current()->Run();
    156 
    157   // Verify that we've loaded the profiles from the web database.
    158   const std::vector<AutofillProfile*>& results3 = personal_data_->profiles();
    159   ASSERT_EQ(2U, results3.size());
    160   EXPECT_EQ(0, profile0.Compare(*results3.at(0)));
    161   EXPECT_EQ(0, profile2.Compare(*results3.at(1)));
    162 }
    163 
    164 // TODO(jhawkins): Test SetCreditCards w/out a WebDataService in the profile.
    165 TEST_F(PersonalDataManagerTest, SetCreditCards) {
    166   CreditCard creditcard0;
    167   autofill_test::SetCreditCardInfo(&creditcard0,
    168       "John Dillinger", "423456789012" /* Visa */, "01", "2010");
    169 
    170   CreditCard creditcard1;
    171   autofill_test::SetCreditCardInfo(&creditcard1,
    172       "Bonnie Parker", "518765432109" /* Mastercard */, "12", "2012");
    173 
    174   CreditCard creditcard2;
    175   autofill_test::SetCreditCardInfo(&creditcard2,
    176       "Clyde Barrow", "347666888555" /* American Express */, "04", "2015");
    177 
    178   // This will verify that the web database has been loaded and the notification
    179   // sent out.
    180   EXPECT_CALL(personal_data_observer_,
    181               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    182 
    183   // The message loop will exit when the mock observer is notified.
    184   MessageLoop::current()->Run();
    185 
    186   // Add two test credit cards to the database.
    187   std::vector<CreditCard> update;
    188   update.push_back(creditcard0);
    189   update.push_back(creditcard1);
    190   personal_data_->SetCreditCards(&update);
    191 
    192   const std::vector<CreditCard*>& results1 = personal_data_->credit_cards();
    193   ASSERT_EQ(2U, results1.size());
    194   EXPECT_EQ(0, creditcard0.Compare(*results1.at(0)));
    195   EXPECT_EQ(0, creditcard1.Compare(*results1.at(1)));
    196 
    197   // Three operations in one:
    198   //  - Update creditcard0
    199   //  - Remove creditcard1
    200   //  - Add creditcard2
    201   creditcard0.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Joe"));
    202   update.clear();
    203   update.push_back(creditcard0);
    204   update.push_back(creditcard2);
    205   personal_data_->SetCreditCards(&update);
    206 
    207   const std::vector<CreditCard*>& results2 = personal_data_->credit_cards();
    208   ASSERT_EQ(2U, results2.size());
    209   EXPECT_EQ(creditcard0, *results2.at(0));
    210   EXPECT_EQ(creditcard2, *results2.at(1));
    211 
    212   // Reset the PersonalDataManager.  This tests that the personal data was saved
    213   // to the web database, and that we can load the credit cards from the web
    214   // database.
    215   ResetPersonalDataManager();
    216 
    217   // This will verify that the web database has been loaded and the notification
    218   // sent out.
    219   EXPECT_CALL(personal_data_observer_,
    220               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    221 
    222   // The message loop will exit when the PersonalDataLoadedObserver is notified.
    223   MessageLoop::current()->Run();
    224 
    225   // Verify that we've loaded the credit cards from the web database.
    226   const std::vector<CreditCard*>& results3 = personal_data_->credit_cards();
    227   ASSERT_EQ(2U, results3.size());
    228   EXPECT_EQ(creditcard0, *results3.at(0));
    229   EXPECT_EQ(creditcard2, *results3.at(1));
    230 }
    231 
    232 TEST_F(PersonalDataManagerTest, SetProfilesAndCreditCards) {
    233   AutofillProfile profile0;
    234   autofill_test::SetProfileInfo(&profile0,
    235       "Marion", "Mitchell", "Morrison",
    236       "johnwayne (at) me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
    237       "91601", "US", "12345678910", "01987654321");
    238 
    239   AutofillProfile profile1;
    240   autofill_test::SetProfileInfo(&profile1,
    241       "Josephine", "Alicia", "Saenz",
    242       "joewayne (at) me.xyz", "Fox", "903 Apple Ct.", NULL, "Orlando", "FL", "32801",
    243       "US", "19482937549", "13502849239");
    244 
    245   CreditCard creditcard0;
    246   autofill_test::SetCreditCardInfo(&creditcard0,
    247       "John Dillinger", "423456789012" /* Visa */, "01", "2010");
    248 
    249   CreditCard creditcard1;
    250   autofill_test::SetCreditCardInfo(&creditcard1,
    251       "Bonnie Parker", "518765432109" /* Mastercard */, "12", "2012");
    252 
    253   // This will verify that the web database has been loaded and the notification
    254   // sent out.
    255   EXPECT_CALL(
    256       personal_data_observer_,
    257       OnPersonalDataLoaded()).Times(2).WillRepeatedly(QuitUIMessageLoop());
    258 
    259   // The message loop will exit when the mock observer is notified.
    260   MessageLoop::current()->Run();
    261 
    262   // Add two test profiles to the database.
    263   std::vector<AutofillProfile> update;
    264   update.push_back(profile0);
    265   update.push_back(profile1);
    266   personal_data_->SetProfiles(&update);
    267 
    268   const std::vector<AutofillProfile*>& results1 = personal_data_->profiles();
    269   ASSERT_EQ(2U, results1.size());
    270   EXPECT_EQ(0, profile0.Compare(*results1.at(0)));
    271   EXPECT_EQ(0, profile1.Compare(*results1.at(1)));
    272 
    273   MessageLoop::current()->Run();
    274 
    275   // Add two test credit cards to the database.
    276   std::vector<CreditCard> update_cc;
    277   update_cc.push_back(creditcard0);
    278   update_cc.push_back(creditcard1);
    279   personal_data_->SetCreditCards(&update_cc);
    280 
    281 
    282   const std::vector<CreditCard*>& results2 = personal_data_->credit_cards();
    283   ASSERT_EQ(2U, results2.size());
    284   EXPECT_EQ(creditcard0, *results2.at(0));
    285   EXPECT_EQ(creditcard1, *results2.at(1));
    286 
    287   // Determine uniqueness by inserting all of the GUIDs into a set and verifying
    288   // the size of the set matches the number of GUIDs.
    289   std::set<std::string> guids;
    290   guids.insert(profile0.guid());
    291   guids.insert(profile1.guid());
    292   guids.insert(creditcard0.guid());
    293   guids.insert(creditcard1.guid());
    294   EXPECT_EQ(4U, guids.size());
    295 }
    296 
    297 // Test care for 50047. Makes sure that unique_ids_ is populated correctly on
    298 // load.
    299 TEST_F(PersonalDataManagerTest, PopulateUniqueIDsOnLoad) {
    300   AutofillProfile profile0;
    301   autofill_test::SetProfileInfo(&profile0,
    302       "y", "", "", "", "", "", "", "", "", "", "", "", "");
    303 
    304   // This will verify that the web database has been loaded and the notification
    305   // sent out.
    306   EXPECT_CALL(personal_data_observer_,
    307               OnPersonalDataLoaded()).WillRepeatedly(QuitUIMessageLoop());
    308 
    309   // The message loop will exit when the mock observer is notified.
    310   MessageLoop::current()->Run();
    311 
    312   // Add the profile0 to the db.
    313   std::vector<AutofillProfile> update;
    314   update.push_back(profile0);
    315   personal_data_->SetProfiles(&update);
    316 
    317   // Reset the PersonalDataManager. This recreates PersonalDataManager, which
    318   // should populate unique_ids_.
    319   ResetPersonalDataManager();
    320 
    321   // The message loop will exit when the PersonalDataLoadedObserver is notified.
    322   MessageLoop::current()->Run();
    323 
    324   // Verify that we've loaded the profiles from the web database.
    325   const std::vector<AutofillProfile*>& results2 = personal_data_->profiles();
    326   ASSERT_EQ(1U, results2.size());
    327 
    328   // Add a new profile.
    329   AutofillProfile profile1;
    330   autofill_test::SetProfileInfo(&profile1,
    331       "y", "", "", "", "", "", "", "", "", "", "", "", "");
    332   update.clear();
    333   update.push_back(*results2[0]);
    334   update.push_back(profile1);
    335   personal_data_->SetProfiles(&update);
    336 
    337   // Make sure the two profiles have different ids (and neither equal to 0,
    338   // which is an invalid id).
    339   const std::vector<AutofillProfile*>& results3 = personal_data_->profiles();
    340   ASSERT_EQ(2U, results3.size());
    341   EXPECT_NE(results3[0]->guid(), results3[1]->guid());
    342   EXPECT_TRUE(guid::IsValidGUID(results3[0]->guid()));
    343   EXPECT_TRUE(guid::IsValidGUID(results3[1]->guid()));
    344 }
    345 
    346 TEST_F(PersonalDataManagerTest, SetEmptyProfile) {
    347   AutofillProfile profile0;
    348   autofill_test::SetProfileInfo(&profile0,
    349       "", "", "", "", "", "", "", "", "", "", "", "", "");
    350 
    351   // This will verify that the web database has been loaded and the notification
    352   // sent out.
    353   EXPECT_CALL(personal_data_observer_,
    354               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    355 
    356   // The message loop will exit when the mock observer is notified.
    357   MessageLoop::current()->Run();
    358 
    359   // Add the empty profile to the database.
    360   std::vector<AutofillProfile> update;
    361   update.push_back(profile0);
    362   personal_data_->SetProfiles(&update);
    363 
    364   // Check the local store of profiles, not yet saved to the web database.
    365   const std::vector<AutofillProfile*>& results1 = personal_data_->profiles();
    366   ASSERT_EQ(0U, results1.size());
    367 
    368   // Reset the PersonalDataManager.  This tests that the personal data was saved
    369   // to the web database, and that we can load the profiles from the web
    370   // database.
    371   ResetPersonalDataManager();
    372 
    373   // This will verify that the web database has been loaded and the notification
    374   // sent out.
    375   EXPECT_CALL(personal_data_observer_,
    376               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    377 
    378   // The message loop will exit when the PersonalDataLoadedObserver is notified.
    379   MessageLoop::current()->Run();
    380 
    381   // Verify that we've loaded the profiles from the web database.
    382   const std::vector<AutofillProfile*>& results2 = personal_data_->profiles();
    383   ASSERT_EQ(0U, results2.size());
    384 }
    385 
    386 TEST_F(PersonalDataManagerTest, SetEmptyCreditCard) {
    387   CreditCard creditcard0;
    388   autofill_test::SetCreditCardInfo(&creditcard0, "", "", "", "");
    389 
    390   // This will verify that the web database has been loaded and the notification
    391   // sent out.
    392   EXPECT_CALL(personal_data_observer_,
    393               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    394 
    395   // The message loop will exit when the mock observer is notified.
    396   MessageLoop::current()->Run();
    397 
    398   // Add the empty credit card to the database.
    399   std::vector<CreditCard> update;
    400   update.push_back(creditcard0);
    401   personal_data_->SetCreditCards(&update);
    402 
    403   // Check the local store of credit cards, not yet saved to the web database.
    404   const std::vector<CreditCard*>& results1 = personal_data_->credit_cards();
    405   ASSERT_EQ(0U, results1.size());
    406 
    407   // Reset the PersonalDataManager.  This tests that the personal data was saved
    408   // to the web database, and that we can load the credit cards from the web
    409   // database.
    410   ResetPersonalDataManager();
    411 
    412   // This will verify that the web database has been loaded and the notification
    413   // sent out.
    414   EXPECT_CALL(personal_data_observer_,
    415               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    416 
    417   // The message loop will exit when the PersonalDataLoadedObserver is notified.
    418   MessageLoop::current()->Run();
    419 
    420   // Verify that we've loaded the credit cards from the web database.
    421   const std::vector<CreditCard*>& results2 = personal_data_->credit_cards();
    422   ASSERT_EQ(0U, results2.size());
    423 }
    424 
    425 TEST_F(PersonalDataManagerTest, Refresh) {
    426   AutofillProfile profile0;
    427   autofill_test::SetProfileInfo(&profile0,
    428       "Marion", "Mitchell", "Morrison",
    429       "johnwayne (at) me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
    430       "91601", "US", "12345678910", "01987654321");
    431 
    432   AutofillProfile profile1;
    433   autofill_test::SetProfileInfo(&profile1,
    434       "Josephine", "Alicia", "Saenz",
    435       "joewayne (at) me.xyz", "Fox", "903 Apple Ct.", NULL, "Orlando", "FL", "32801",
    436       "US", "19482937549", "13502849239");
    437 
    438   EXPECT_CALL(personal_data_observer_,
    439       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    440 
    441   MessageLoop::current()->Run();
    442 
    443   // Add the test profiles to the database.
    444   std::vector<AutofillProfile> update;
    445   update.push_back(profile0);
    446   update.push_back(profile1);
    447   personal_data_->SetProfiles(&update);
    448 
    449   // Labels depend on other profiles in the list - update labels manually.
    450   std::vector<AutofillProfile *> profile_pointers;
    451   profile_pointers.push_back(&profile0);
    452   profile_pointers.push_back(&profile1);
    453   AutofillProfile::AdjustInferredLabels(&profile_pointers);
    454 
    455   // Wait for the refresh.
    456   EXPECT_CALL(personal_data_observer_,
    457       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    458 
    459   MessageLoop::current()->Run();
    460 
    461   const std::vector<AutofillProfile*>& results1 = personal_data_->profiles();
    462   ASSERT_EQ(2U, results1.size());
    463   EXPECT_EQ(profile0, *results1.at(0));
    464   EXPECT_EQ(profile1, *results1.at(1));
    465 
    466   AutofillProfile profile2;
    467   autofill_test::SetProfileInfo(&profile2,
    468       "Josephine", "Alicia", "Saenz",
    469       "joewayne (at) me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
    470       "32801", "US", "19482937549", "13502849239");
    471 
    472   // Adjust all labels.
    473   profile_pointers.push_back(&profile2);
    474   AutofillProfile::AdjustInferredLabels(&profile_pointers);
    475 
    476   WebDataService* wds = profile_->GetWebDataService(Profile::EXPLICIT_ACCESS);
    477   ASSERT_TRUE(wds);
    478   wds->AddAutofillProfile(profile2);
    479 
    480   personal_data_->Refresh();
    481 
    482   // Wait for the refresh.
    483   EXPECT_CALL(personal_data_observer_,
    484     OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    485 
    486   MessageLoop::current()->Run();
    487 
    488   const std::vector<AutofillProfile*>& results2 = personal_data_->profiles();
    489   ASSERT_EQ(3U, results2.size());
    490   EXPECT_EQ(profile0, *results2.at(0));
    491   EXPECT_EQ(profile1, *results2.at(1));
    492   EXPECT_EQ(profile2, *results2.at(2));
    493 
    494   wds->RemoveAutofillProfile(profile1.guid());
    495   wds->RemoveAutofillProfile(profile2.guid());
    496 
    497   // Before telling the PDM to refresh, simulate an edit to one of the profiles
    498   // via a SetProfile update (this would happen if the Autofill window was
    499   // open with a previous snapshot of the profiles, and something [e.g. sync]
    500   // removed a profile from the browser.  In this edge case, we will end up
    501   // in a consistent state by dropping the write).
    502   profile2.SetInfo(NAME_FIRST, ASCIIToUTF16("Jo"));
    503   update.clear();
    504   update.push_back(profile0);
    505   update.push_back(profile1);
    506   update.push_back(profile2);
    507   personal_data_->SetProfiles(&update);
    508 
    509   // Wait for the refresh.
    510   EXPECT_CALL(personal_data_observer_,
    511       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    512 
    513   MessageLoop::current()->Run();
    514 
    515   const std::vector<AutofillProfile*>& results3 = personal_data_->profiles();
    516   ASSERT_EQ(1U, results3.size());
    517   EXPECT_EQ(profile0, *results2.at(0));
    518 }
    519 
    520 TEST_F(PersonalDataManagerTest, ImportFormData) {
    521   FormData form;
    522   webkit_glue::FormField field;
    523   autofill_test::CreateTestFormField(
    524       "First name:", "first_name", "George", "text", &field);
    525   form.fields.push_back(field);
    526   autofill_test::CreateTestFormField(
    527       "Last name:", "last_name", "Washington", "text", &field);
    528   form.fields.push_back(field);
    529   autofill_test::CreateTestFormField(
    530       "Email:", "email", "theprez (at) gmail.com", "text", &field);
    531   form.fields.push_back(field);
    532   autofill_test::CreateTestFormField(
    533       "Address:", "address1", "21 Laussat St", "text", &field);
    534   form.fields.push_back(field);
    535   autofill_test::CreateTestFormField(
    536       "City:", "city", "San Francisco", "text", &field);
    537   form.fields.push_back(field);
    538   autofill_test::CreateTestFormField(
    539       "State:", "state", "California", "text", &field);
    540   form.fields.push_back(field);
    541   autofill_test::CreateTestFormField(
    542       "Zip:", "zip", "94102", "text", &field);
    543   form.fields.push_back(field);
    544   FormStructure form_structure(form);
    545   form_structure.DetermineHeuristicTypes();
    546   std::vector<const FormStructure*> forms;
    547   forms.push_back(&form_structure);
    548   const CreditCard* imported_credit_card;
    549   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
    550   ASSERT_FALSE(imported_credit_card);
    551 
    552   // Wait for the refresh.
    553   EXPECT_CALL(personal_data_observer_,
    554       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    555 
    556   MessageLoop::current()->Run();
    557 
    558   AutofillProfile expected;
    559   autofill_test::SetProfileInfo(&expected, "George", NULL,
    560       "Washington", "theprez (at) gmail.com", NULL, "21 Laussat St", NULL,
    561       "San Francisco", "California", "94102", NULL, NULL, NULL);
    562   const std::vector<AutofillProfile*>& results = personal_data_->profiles();
    563   ASSERT_EQ(1U, results.size());
    564   EXPECT_EQ(0, expected.Compare(*results[0]));
    565 }
    566 
    567 TEST_F(PersonalDataManagerTest, ImportFormDataBadEmail) {
    568   FormData form;
    569   webkit_glue::FormField field;
    570   autofill_test::CreateTestFormField(
    571       "First name:", "first_name", "George", "text", &field);
    572   form.fields.push_back(field);
    573   autofill_test::CreateTestFormField(
    574       "Last name:", "last_name", "Washington", "text", &field);
    575   form.fields.push_back(field);
    576   autofill_test::CreateTestFormField(
    577       "Email:", "email", "bogus", "text", &field);
    578   form.fields.push_back(field);
    579   autofill_test::CreateTestFormField(
    580       "Address:", "address1", "21 Laussat St", "text", &field);
    581   form.fields.push_back(field);
    582   autofill_test::CreateTestFormField(
    583       "City:", "city", "San Francisco", "text", &field);
    584   form.fields.push_back(field);
    585   autofill_test::CreateTestFormField(
    586       "State:", "state", "California", "text", &field);
    587   form.fields.push_back(field);
    588   autofill_test::CreateTestFormField(
    589       "Zip:", "zip", "94102", "text", &field);
    590   form.fields.push_back(field);
    591   FormStructure form_structure(form);
    592   form_structure.DetermineHeuristicTypes();
    593   std::vector<const FormStructure*> forms;
    594   forms.push_back(&form_structure);
    595   const CreditCard* imported_credit_card;
    596   EXPECT_FALSE(personal_data_->ImportFormData(forms, &imported_credit_card));
    597   ASSERT_EQ(static_cast<CreditCard*>(NULL), imported_credit_card);
    598 
    599   // Wait for the refresh.
    600   EXPECT_CALL(personal_data_observer_,
    601       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    602 
    603   MessageLoop::current()->Run();
    604 
    605   const std::vector<AutofillProfile*>& results = personal_data_->profiles();
    606   ASSERT_EQ(0U, results.size());
    607 }
    608 
    609 TEST_F(PersonalDataManagerTest, ImportFormDataNotEnoughFilledFields) {
    610   FormData form;
    611   webkit_glue::FormField field;
    612   autofill_test::CreateTestFormField(
    613       "First name:", "first_name", "George", "text", &field);
    614   form.fields.push_back(field);
    615   autofill_test::CreateTestFormField(
    616       "Last name:", "last_name", "Washington", "text", &field);
    617   form.fields.push_back(field);
    618   autofill_test::CreateTestFormField(
    619       "Card number:", "card_number", "4111 1111 1111 1111", "text", &field);
    620   form.fields.push_back(field);
    621   FormStructure form_structure(form);
    622   form_structure.DetermineHeuristicTypes();
    623   std::vector<const FormStructure*> forms;
    624   forms.push_back(&form_structure);
    625   const CreditCard* imported_credit_card;
    626   EXPECT_FALSE(personal_data_->ImportFormData(forms, &imported_credit_card));
    627   ASSERT_FALSE(imported_credit_card);
    628 
    629   // Wait for the refresh.
    630   EXPECT_CALL(personal_data_observer_,
    631       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    632 
    633   MessageLoop::current()->Run();
    634 
    635   const std::vector<AutofillProfile*>& profiles = personal_data_->profiles();
    636   ASSERT_EQ(0U, profiles.size());
    637   const std::vector<CreditCard*>& credit_cards = personal_data_->credit_cards();
    638   ASSERT_EQ(0U, credit_cards.size());
    639 }
    640 
    641 TEST_F(PersonalDataManagerTest, ImportPhoneNumberSplitAcrossMultipleFields) {
    642   FormData form;
    643   webkit_glue::FormField field;
    644   autofill_test::CreateTestFormField(
    645       "First name:", "first_name", "George", "text", &field);
    646   form.fields.push_back(field);
    647   autofill_test::CreateTestFormField(
    648       "Last name:", "last_name", "Washington", "text", &field);
    649   form.fields.push_back(field);
    650   autofill_test::CreateTestFormField(
    651       "Phone #:", "home_phone_area_code", "650", "text", &field);
    652   field.max_length = 3;
    653   form.fields.push_back(field);
    654   autofill_test::CreateTestFormField(
    655       "Phone #:", "home_phone_prefix", "555", "text", &field);
    656   field.max_length = 3;
    657   form.fields.push_back(field);
    658   autofill_test::CreateTestFormField(
    659       "Phone #:", "home_phone_suffix", "0000", "text", &field);
    660   field.max_length = 4;
    661   form.fields.push_back(field);
    662   autofill_test::CreateTestFormField(
    663       "Address:", "address1", "21 Laussat St", "text", &field);
    664   form.fields.push_back(field);
    665   autofill_test::CreateTestFormField(
    666       "City:", "city", "San Francisco", "text", &field);
    667   form.fields.push_back(field);
    668   autofill_test::CreateTestFormField(
    669       "State:", "state", "California", "text", &field);
    670   form.fields.push_back(field);
    671   autofill_test::CreateTestFormField(
    672       "Zip:", "zip", "94102", "text", &field);
    673   form.fields.push_back(field);
    674   FormStructure form_structure(form);
    675   form_structure.DetermineHeuristicTypes();
    676   std::vector<const FormStructure*> forms;
    677   forms.push_back(&form_structure);
    678   const CreditCard* imported_credit_card;
    679   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
    680   ASSERT_FALSE(imported_credit_card);
    681 
    682   // Wait for the refresh.
    683   EXPECT_CALL(personal_data_observer_,
    684       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    685 
    686   MessageLoop::current()->Run();
    687 
    688   AutofillProfile expected;
    689   autofill_test::SetProfileInfo(&expected, "George", NULL,
    690       "Washington", NULL, NULL, "21 Laussat St", NULL,
    691       "San Francisco", "California", "94102", NULL, "6505550000", NULL);
    692   const std::vector<AutofillProfile*>& results = personal_data_->profiles();
    693   ASSERT_EQ(1U, results.size());
    694   EXPECT_EQ(0, expected.Compare(*results[0]));
    695 }
    696 
    697 TEST_F(PersonalDataManagerTest, SetUniqueCreditCardLabels) {
    698   CreditCard credit_card0;
    699   credit_card0.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("John"));
    700   CreditCard credit_card1;
    701   credit_card1.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Paul"));
    702   CreditCard credit_card2;
    703   credit_card2.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Ringo"));
    704   CreditCard credit_card3;
    705   credit_card3.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Other"));
    706   CreditCard credit_card4;
    707   credit_card4.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Ozzy"));
    708   CreditCard credit_card5;
    709   credit_card5.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Dio"));
    710 
    711   // This will verify that the web database has been loaded and the notification
    712   // sent out.
    713   EXPECT_CALL(personal_data_observer_,
    714               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    715 
    716   // The message loop will exit when the mock observer is notified.
    717   MessageLoop::current()->Run();
    718 
    719   // Add the test credit cards to the database.
    720   std::vector<CreditCard> update;
    721   update.push_back(credit_card0);
    722   update.push_back(credit_card1);
    723   update.push_back(credit_card2);
    724   update.push_back(credit_card3);
    725   update.push_back(credit_card4);
    726   update.push_back(credit_card5);
    727   personal_data_->SetCreditCards(&update);
    728 
    729   // Reset the PersonalDataManager.  This tests that the personal data was saved
    730   // to the web database, and that we can load the credit cards from the web
    731   // database.
    732   ResetPersonalDataManager();
    733 
    734   // This will verify that the web database has been loaded and the notification
    735   // sent out.
    736   EXPECT_CALL(personal_data_observer_,
    737               OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    738 
    739   // The message loop will exit when the mock observer is notified.
    740   MessageLoop::current()->Run();
    741 
    742   const std::vector<CreditCard*>& results = personal_data_->credit_cards();
    743   ASSERT_EQ(6U, results.size());
    744   EXPECT_EQ(credit_card0.guid(), results[0]->guid());
    745   EXPECT_EQ(credit_card1.guid(), results[1]->guid());
    746   EXPECT_EQ(credit_card2.guid(), results[2]->guid());
    747   EXPECT_EQ(credit_card3.guid(), results[3]->guid());
    748   EXPECT_EQ(credit_card4.guid(), results[4]->guid());
    749   EXPECT_EQ(credit_card5.guid(), results[5]->guid());
    750 }
    751 
    752 TEST_F(PersonalDataManagerTest, AggregateTwoDifferentProfiles) {
    753   FormData form1;
    754   webkit_glue::FormField field;
    755   autofill_test::CreateTestFormField(
    756       "First name:", "first_name", "George", "text", &field);
    757   form1.fields.push_back(field);
    758   autofill_test::CreateTestFormField(
    759       "Last name:", "last_name", "Washington", "text", &field);
    760   form1.fields.push_back(field);
    761   autofill_test::CreateTestFormField(
    762       "Email:", "email", "theprez (at) gmail.com", "text", &field);
    763   form1.fields.push_back(field);
    764   autofill_test::CreateTestFormField(
    765       "Address:", "address1", "21 Laussat St", "text", &field);
    766   form1.fields.push_back(field);
    767   autofill_test::CreateTestFormField(
    768       "City:", "city", "San Francisco", "text", &field);
    769   form1.fields.push_back(field);
    770   autofill_test::CreateTestFormField(
    771       "State:", "state", "California", "text", &field);
    772   form1.fields.push_back(field);
    773   autofill_test::CreateTestFormField(
    774       "Zip:", "zip", "94102", "text", &field);
    775   form1.fields.push_back(field);
    776 
    777   FormStructure form_structure1(form1);
    778   form_structure1.DetermineHeuristicTypes();
    779   std::vector<const FormStructure*> forms;
    780   forms.push_back(&form_structure1);
    781   const CreditCard* imported_credit_card;
    782   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
    783   ASSERT_FALSE(imported_credit_card);
    784 
    785   // Wait for the refresh.
    786   EXPECT_CALL(personal_data_observer_,
    787       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    788 
    789   MessageLoop::current()->Run();
    790 
    791   AutofillProfile expected;
    792   autofill_test::SetProfileInfo(&expected, "George", NULL,
    793       "Washington", "theprez (at) gmail.com", NULL, "21 Laussat St", NULL,
    794       "San Francisco", "California", "94102", NULL, NULL, NULL);
    795   const std::vector<AutofillProfile*>& results1 = personal_data_->profiles();
    796   ASSERT_EQ(1U, results1.size());
    797   EXPECT_EQ(0, expected.Compare(*results1[0]));
    798 
    799   // Now create a completely different profile.
    800   FormData form2;
    801   autofill_test::CreateTestFormField(
    802       "First name:", "first_name", "John", "text", &field);
    803   form2.fields.push_back(field);
    804   autofill_test::CreateTestFormField(
    805       "Last name:", "last_name", "Adams", "text", &field);
    806   form2.fields.push_back(field);
    807   autofill_test::CreateTestFormField(
    808       "Email:", "email", "second (at) gmail.com", "text", &field);
    809   form2.fields.push_back(field);
    810   autofill_test::CreateTestFormField(
    811       "Address:", "address1", "22 Laussat St", "text", &field);
    812   form2.fields.push_back(field);
    813   autofill_test::CreateTestFormField(
    814       "City:", "city", "San Francisco", "text", &field);
    815   form2.fields.push_back(field);
    816   autofill_test::CreateTestFormField(
    817       "State:", "state", "California", "text", &field);
    818   form2.fields.push_back(field);
    819   autofill_test::CreateTestFormField(
    820       "Zip:", "zip", "94102", "text", &field);
    821   form2.fields.push_back(field);
    822 
    823   FormStructure form_structure2(form2);
    824   form_structure2.DetermineHeuristicTypes();
    825   forms.clear();
    826   forms.push_back(&form_structure2);
    827   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
    828   ASSERT_FALSE(imported_credit_card);
    829 
    830   // Wait for the refresh.
    831   EXPECT_CALL(personal_data_observer_,
    832       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    833 
    834   MessageLoop::current()->Run();
    835 
    836   const std::vector<AutofillProfile*>& results2 = personal_data_->profiles();
    837 
    838   AutofillProfile expected2;
    839   autofill_test::SetProfileInfo(&expected2, "John", NULL,
    840       "Adams", "second (at) gmail.com", NULL, "22 Laussat St", NULL,
    841       "San Francisco", "California", "94102", NULL, NULL, NULL);
    842   ASSERT_EQ(2U, results2.size());
    843   EXPECT_EQ(0, expected.Compare(*results2[0]));
    844   EXPECT_EQ(0, expected2.Compare(*results2[1]));
    845 }
    846 
    847 TEST_F(PersonalDataManagerTest, AggregateTwoProfilesWithMultiValue) {
    848   FormData form1;
    849   webkit_glue::FormField field;
    850   autofill_test::CreateTestFormField(
    851       "First name:", "first_name", "George", "text", &field);
    852   form1.fields.push_back(field);
    853   autofill_test::CreateTestFormField(
    854       "Last name:", "last_name", "Washington", "text", &field);
    855   form1.fields.push_back(field);
    856   autofill_test::CreateTestFormField(
    857       "Email:", "email", "theprez (at) gmail.com", "text", &field);
    858   form1.fields.push_back(field);
    859   autofill_test::CreateTestFormField(
    860       "Address:", "address1", "21 Laussat St", "text", &field);
    861   form1.fields.push_back(field);
    862   autofill_test::CreateTestFormField(
    863       "City:", "city", "San Francisco", "text", &field);
    864   form1.fields.push_back(field);
    865   autofill_test::CreateTestFormField(
    866       "State:", "state", "California", "text", &field);
    867   form1.fields.push_back(field);
    868   autofill_test::CreateTestFormField(
    869       "Zip:", "zip", "94102", "text", &field);
    870   form1.fields.push_back(field);
    871 
    872   FormStructure form_structure1(form1);
    873   form_structure1.DetermineHeuristicTypes();
    874   std::vector<const FormStructure*> forms;
    875   forms.push_back(&form_structure1);
    876   const CreditCard* imported_credit_card;
    877   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
    878   ASSERT_FALSE(imported_credit_card);
    879 
    880   // Wait for the refresh.
    881   EXPECT_CALL(personal_data_observer_,
    882       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    883 
    884   MessageLoop::current()->Run();
    885 
    886   AutofillProfile expected;
    887   autofill_test::SetProfileInfo(&expected, "George", NULL,
    888       "Washington", "theprez (at) gmail.com", NULL, "21 Laussat St", NULL,
    889       "San Francisco", "California", "94102", NULL, NULL, NULL);
    890   const std::vector<AutofillProfile*>& results1 = personal_data_->profiles();
    891   ASSERT_EQ(1U, results1.size());
    892   EXPECT_EQ(0, expected.Compare(*results1[0]));
    893 
    894   // Now create a completely different profile.
    895   FormData form2;
    896   autofill_test::CreateTestFormField(
    897       "First name:", "first_name", "John", "text", &field);
    898   form2.fields.push_back(field);
    899   autofill_test::CreateTestFormField(
    900       "Last name:", "last_name", "Adams", "text", &field);
    901   form2.fields.push_back(field);
    902   autofill_test::CreateTestFormField(
    903       "Email:", "email", "second (at) gmail.com", "text", &field);
    904   form2.fields.push_back(field);
    905   autofill_test::CreateTestFormField(
    906       "Address:", "address1", "21 Laussat St", "text", &field);
    907   form2.fields.push_back(field);
    908   autofill_test::CreateTestFormField(
    909       "City:", "city", "San Francisco", "text", &field);
    910   form2.fields.push_back(field);
    911   autofill_test::CreateTestFormField(
    912       "State:", "state", "California", "text", &field);
    913   form2.fields.push_back(field);
    914   autofill_test::CreateTestFormField(
    915       "Zip:", "zip", "94102", "text", &field);
    916   form2.fields.push_back(field);
    917 
    918   FormStructure form_structure2(form2);
    919   form_structure2.DetermineHeuristicTypes();
    920   forms.clear();
    921   forms.push_back(&form_structure2);
    922   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
    923   ASSERT_FALSE(imported_credit_card);
    924 
    925   // Wait for the refresh.
    926   EXPECT_CALL(personal_data_observer_,
    927       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    928 
    929   MessageLoop::current()->Run();
    930 
    931   const std::vector<AutofillProfile*>& results2 = personal_data_->profiles();
    932 
    933   // Modify expected to include multi-valued fields.
    934   std::vector<string16> values;
    935   expected.GetMultiInfo(NAME_FULL, &values);
    936   values.push_back(ASCIIToUTF16("John Adams"));
    937   expected.SetMultiInfo(NAME_FULL, values);
    938   expected.GetMultiInfo(EMAIL_ADDRESS, &values);
    939   values.push_back(ASCIIToUTF16("second (at) gmail.com"));
    940   expected.SetMultiInfo(EMAIL_ADDRESS, values);
    941 
    942   ASSERT_EQ(1U, results2.size());
    943   EXPECT_EQ(0, expected.CompareMulti(*results2[0]));
    944 }
    945 
    946 TEST_F(PersonalDataManagerTest, AggregateSameProfileWithConflict) {
    947   FormData form1;
    948   webkit_glue::FormField field;
    949   autofill_test::CreateTestFormField(
    950       "First name:", "first_name", "George", "text", &field);
    951   form1.fields.push_back(field);
    952   autofill_test::CreateTestFormField(
    953       "Last name:", "last_name", "Washington", "text", &field);
    954   form1.fields.push_back(field);
    955   autofill_test::CreateTestFormField(
    956       "Address:", "address", "1600 Pennsylvania Avenue", "text", &field);
    957   form1.fields.push_back(field);
    958   autofill_test::CreateTestFormField(
    959       "Address Line 2:", "address2", "Suite A", "text", &field);
    960   form1.fields.push_back(field);
    961   autofill_test::CreateTestFormField(
    962       "City:", "city", "San Francisco", "text", &field);
    963   form1.fields.push_back(field);
    964   autofill_test::CreateTestFormField(
    965       "State:", "state", "California", "text", &field);
    966   form1.fields.push_back(field);
    967   autofill_test::CreateTestFormField(
    968       "Zip:", "zip", "94102", "text", &field);
    969   form1.fields.push_back(field);
    970   autofill_test::CreateTestFormField(
    971       "Email:", "email", "theprez (at) gmail.com", "text", &field);
    972   form1.fields.push_back(field);
    973   // Phone gets updated.
    974   autofill_test::CreateTestFormField(
    975       "Phone:", "phone", "4445556666", "text", &field);
    976   form1.fields.push_back(field);
    977 
    978   FormStructure form_structure1(form1);
    979   form_structure1.DetermineHeuristicTypes();
    980   std::vector<const FormStructure*> forms;
    981   forms.push_back(&form_structure1);
    982   const CreditCard* imported_credit_card;
    983   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
    984   ASSERT_FALSE(imported_credit_card);
    985 
    986   // Wait for the refresh.
    987   EXPECT_CALL(personal_data_observer_,
    988       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
    989 
    990   MessageLoop::current()->Run();
    991 
    992   AutofillProfile expected;
    993   autofill_test::SetProfileInfo(&expected, "George", NULL,
    994       "Washington", "theprez (at) gmail.com", NULL, "1600 Pennsylvania Avenue",
    995       "Suite A", "San Francisco", "California", "94102", NULL, "4445556666",
    996       NULL);
    997   const std::vector<AutofillProfile*>& results1 = personal_data_->profiles();
    998   ASSERT_EQ(1U, results1.size());
    999   EXPECT_EQ(0, expected.Compare(*results1[0]));
   1000 
   1001   // Now create an updated profile.
   1002   FormData form2;
   1003   autofill_test::CreateTestFormField(
   1004       "First name:", "first_name", "George", "text", &field);
   1005   form2.fields.push_back(field);
   1006   autofill_test::CreateTestFormField(
   1007       "Last name:", "last_name", "Washington", "text", &field);
   1008   form2.fields.push_back(field);
   1009   autofill_test::CreateTestFormField(
   1010       "Address:", "address", "1600 Pennsylvania Avenue", "text", &field);
   1011   form2.fields.push_back(field);
   1012   autofill_test::CreateTestFormField(
   1013       "Address Line 2:", "address2", "Suite A", "text", &field);
   1014   form2.fields.push_back(field);
   1015   autofill_test::CreateTestFormField(
   1016       "City:", "city", "San Francisco", "text", &field);
   1017   form2.fields.push_back(field);
   1018   autofill_test::CreateTestFormField(
   1019       "State:", "state", "California", "text", &field);
   1020   form2.fields.push_back(field);
   1021   autofill_test::CreateTestFormField(
   1022       "Zip:", "zip", "94102", "text", &field);
   1023   form2.fields.push_back(field);
   1024   autofill_test::CreateTestFormField(
   1025       "Email:", "email", "theprez (at) gmail.com", "text", &field);
   1026   form2.fields.push_back(field);
   1027   // Country gets added.
   1028   autofill_test::CreateTestFormField(
   1029       "Country:", "country", "USA", "text", &field);
   1030   form2.fields.push_back(field);
   1031   // Phone gets updated.
   1032   autofill_test::CreateTestFormField(
   1033       "Phone:", "phone", "1231231234", "text", &field);
   1034   form2.fields.push_back(field);
   1035 
   1036   FormStructure form_structure2(form2);
   1037   form_structure2.DetermineHeuristicTypes();
   1038   forms.clear();
   1039   forms.push_back(&form_structure2);
   1040   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1041   ASSERT_FALSE(imported_credit_card);
   1042 
   1043   // Wait for the refresh.
   1044   EXPECT_CALL(personal_data_observer_,
   1045       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1046 
   1047   MessageLoop::current()->Run();
   1048 
   1049   const std::vector<AutofillProfile*>& results2 = personal_data_->profiles();
   1050 
   1051   // Add multi-valued phone number to expectation.  Also, country gets added.
   1052   std::vector<string16> values;
   1053   expected.GetMultiInfo(PHONE_HOME_WHOLE_NUMBER, &values);
   1054   values.push_back(ASCIIToUTF16("1231231234"));
   1055   expected.SetMultiInfo(PHONE_HOME_WHOLE_NUMBER, values);
   1056   expected.SetInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("United States"));
   1057   ASSERT_EQ(1U, results2.size());
   1058   EXPECT_EQ(0, expected.CompareMulti(*results2[0]));
   1059 }
   1060 
   1061 TEST_F(PersonalDataManagerTest, AggregateProfileWithMissingInfoInOld) {
   1062   FormData form1;
   1063   webkit_glue::FormField field;
   1064   autofill_test::CreateTestFormField(
   1065       "First name:", "first_name", "George", "text", &field);
   1066   form1.fields.push_back(field);
   1067   autofill_test::CreateTestFormField(
   1068       "Last name:", "last_name", "Washington", "text", &field);
   1069   form1.fields.push_back(field);
   1070   autofill_test::CreateTestFormField(
   1071       "Address Line 1:", "address", "190 High Street", "text", &field);
   1072   form1.fields.push_back(field);
   1073   autofill_test::CreateTestFormField(
   1074       "City:", "city", "Philadelphia", "text", &field);
   1075   form1.fields.push_back(field);
   1076   autofill_test::CreateTestFormField(
   1077       "State:", "state", "Pennsylvania", "text", &field);
   1078   form1.fields.push_back(field);
   1079   autofill_test::CreateTestFormField(
   1080       "Zip:", "zipcode", "19106", "text", &field);
   1081   form1.fields.push_back(field);
   1082 
   1083   FormStructure form_structure1(form1);
   1084   form_structure1.DetermineHeuristicTypes();
   1085   std::vector<const FormStructure*> forms;
   1086   forms.push_back(&form_structure1);
   1087   const CreditCard* imported_credit_card;
   1088   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1089   ASSERT_FALSE(imported_credit_card);
   1090 
   1091   // Wait for the refresh.
   1092   EXPECT_CALL(personal_data_observer_,
   1093       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1094 
   1095   MessageLoop::current()->Run();
   1096 
   1097   AutofillProfile expected;
   1098   autofill_test::SetProfileInfo(&expected, "George", NULL,
   1099       "Washington", NULL, NULL, "190 High Street", NULL,
   1100       "Philadelphia", "Pennsylvania", "19106", NULL, NULL, NULL);
   1101   const std::vector<AutofillProfile*>& results1 = personal_data_->profiles();
   1102   ASSERT_EQ(1U, results1.size());
   1103   EXPECT_EQ(0, expected.Compare(*results1[0]));
   1104 
   1105   // Submit a form with new data for the first profile.
   1106   FormData form2;
   1107   autofill_test::CreateTestFormField(
   1108       "First name:", "first_name", "George", "text", &field);
   1109   form2.fields.push_back(field);
   1110   autofill_test::CreateTestFormField(
   1111       "Last name:", "last_name", "Washington", "text", &field);
   1112   form2.fields.push_back(field);
   1113   autofill_test::CreateTestFormField(
   1114       "Email:", "email", "theprez (at) gmail.com", "text", &field);
   1115   form2.fields.push_back(field);
   1116   autofill_test::CreateTestFormField(
   1117       "Address Line 1:", "address", "190 High Street", "text", &field);
   1118   form2.fields.push_back(field);
   1119   autofill_test::CreateTestFormField(
   1120       "City:", "city", "Philadelphia", "text", &field);
   1121   form2.fields.push_back(field);
   1122   autofill_test::CreateTestFormField(
   1123       "State:", "state", "Pennsylvania", "text", &field);
   1124   form2.fields.push_back(field);
   1125   autofill_test::CreateTestFormField(
   1126       "Zip:", "zipcode", "19106", "text", &field);
   1127   form2.fields.push_back(field);
   1128 
   1129   FormStructure form_structure2(form2);
   1130   form_structure2.DetermineHeuristicTypes();
   1131   forms.clear();
   1132   forms.push_back(&form_structure2);
   1133   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1134   ASSERT_FALSE(imported_credit_card);
   1135 
   1136   // Wait for the refresh.
   1137   EXPECT_CALL(personal_data_observer_,
   1138       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1139 
   1140   MessageLoop::current()->Run();
   1141 
   1142   const std::vector<AutofillProfile*>& results2 = personal_data_->profiles();
   1143 
   1144   AutofillProfile expected2;
   1145   autofill_test::SetProfileInfo(&expected2, "George", NULL,
   1146       "Washington", "theprez (at) gmail.com", NULL, "190 High Street", NULL,
   1147       "Philadelphia", "Pennsylvania", "19106", NULL, NULL, NULL);
   1148   ASSERT_EQ(1U, results2.size());
   1149   EXPECT_EQ(0, expected2.Compare(*results2[0]));
   1150 }
   1151 
   1152 TEST_F(PersonalDataManagerTest, AggregateProfileWithMissingInfoInNew) {
   1153   FormData form1;
   1154   webkit_glue::FormField field;
   1155   autofill_test::CreateTestFormField(
   1156       "First name:", "first_name", "George", "text", &field);
   1157   form1.fields.push_back(field);
   1158   autofill_test::CreateTestFormField(
   1159       "Last name:", "last_name", "Washington", "text", &field);
   1160   form1.fields.push_back(field);
   1161   autofill_test::CreateTestFormField(
   1162       "Company:", "company", "Government", "text", &field);
   1163   form1.fields.push_back(field);
   1164   autofill_test::CreateTestFormField(
   1165       "Email:", "email", "theprez (at) gmail.com", "text", &field);
   1166   form1.fields.push_back(field);
   1167   autofill_test::CreateTestFormField(
   1168       "Address Line 1:", "address", "190 High Street", "text", &field);
   1169   form1.fields.push_back(field);
   1170   autofill_test::CreateTestFormField(
   1171       "City:", "city", "Philadelphia", "text", &field);
   1172   form1.fields.push_back(field);
   1173   autofill_test::CreateTestFormField(
   1174       "State:", "state", "Pennsylvania", "text", &field);
   1175   form1.fields.push_back(field);
   1176   autofill_test::CreateTestFormField(
   1177       "Zip:", "zipcode", "19106", "text", &field);
   1178   form1.fields.push_back(field);
   1179 
   1180   FormStructure form_structure1(form1);
   1181   form_structure1.DetermineHeuristicTypes();
   1182   std::vector<const FormStructure*> forms;
   1183   forms.push_back(&form_structure1);
   1184   const CreditCard* imported_credit_card;
   1185   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1186   ASSERT_FALSE(imported_credit_card);
   1187 
   1188   // Wait for the refresh.
   1189   EXPECT_CALL(personal_data_observer_,
   1190       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1191 
   1192   MessageLoop::current()->Run();
   1193 
   1194   AutofillProfile expected;
   1195   autofill_test::SetProfileInfo(&expected, "George", NULL,
   1196       "Washington", "theprez (at) gmail.com", "Government", "190 High Street", NULL,
   1197       "Philadelphia", "Pennsylvania", "19106", NULL, NULL, NULL);
   1198   const std::vector<AutofillProfile*>& results1 = personal_data_->profiles();
   1199   ASSERT_EQ(1U, results1.size());
   1200   EXPECT_EQ(0, expected.Compare(*results1[0]));
   1201 
   1202   // Submit a form with new data for the first profile.
   1203   FormData form2;
   1204   autofill_test::CreateTestFormField(
   1205       "First name:", "first_name", "George", "text", &field);
   1206   form2.fields.push_back(field);
   1207   autofill_test::CreateTestFormField(
   1208       "Last name:", "last_name", "Washington", "text", &field);
   1209   form2.fields.push_back(field);
   1210   // Note missing Company field.
   1211   autofill_test::CreateTestFormField(
   1212       "Email:", "email", "theprez (at) gmail.com", "text", &field);
   1213   form2.fields.push_back(field);
   1214   autofill_test::CreateTestFormField(
   1215       "Address Line 1:", "address", "190 High Street", "text", &field);
   1216   form2.fields.push_back(field);
   1217   autofill_test::CreateTestFormField(
   1218       "City:", "city", "Philadelphia", "text", &field);
   1219   form2.fields.push_back(field);
   1220   autofill_test::CreateTestFormField(
   1221       "State:", "state", "Pennsylvania", "text", &field);
   1222   form2.fields.push_back(field);
   1223   autofill_test::CreateTestFormField(
   1224       "Zip:", "zipcode", "19106", "text", &field);
   1225   form2.fields.push_back(field);
   1226 
   1227   FormStructure form_structure2(form2);
   1228   form_structure2.DetermineHeuristicTypes();
   1229   forms.clear();
   1230   forms.push_back(&form_structure2);
   1231   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1232   ASSERT_FALSE(imported_credit_card);
   1233 
   1234   // Wait for the refresh.
   1235   EXPECT_CALL(personal_data_observer_,
   1236       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1237 
   1238   MessageLoop::current()->Run();
   1239 
   1240   const std::vector<AutofillProfile*>& results2 = personal_data_->profiles();
   1241 
   1242   // Expect no change.
   1243   ASSERT_EQ(1U, results2.size());
   1244   EXPECT_EQ(0, expected.Compare(*results2[0]));
   1245 }
   1246 
   1247 TEST_F(PersonalDataManagerTest, AggregateProfileWithInsufficientAddress) {
   1248   FormData form1;
   1249   webkit_glue::FormField field;
   1250   autofill_test::CreateTestFormField(
   1251       "First name:", "first_name", "George", "text", &field);
   1252   form1.fields.push_back(field);
   1253   autofill_test::CreateTestFormField(
   1254       "Last name:", "last_name", "Washington", "text", &field);
   1255   form1.fields.push_back(field);
   1256   autofill_test::CreateTestFormField(
   1257       "Company:", "company", "Government", "text", &field);
   1258   form1.fields.push_back(field);
   1259   autofill_test::CreateTestFormField(
   1260       "Email:", "email", "theprez (at) gmail.com", "text", &field);
   1261   form1.fields.push_back(field);
   1262   autofill_test::CreateTestFormField(
   1263       "Address Line 1:", "address", "190 High Street", "text", &field);
   1264   form1.fields.push_back(field);
   1265   autofill_test::CreateTestFormField(
   1266       "City:", "city", "Philadelphia", "text", &field);
   1267   form1.fields.push_back(field);
   1268 
   1269   FormStructure form_structure1(form1);
   1270   form_structure1.DetermineHeuristicTypes();
   1271   std::vector<const FormStructure*> forms;
   1272   forms.push_back(&form_structure1);
   1273   const CreditCard* imported_credit_card;
   1274   EXPECT_FALSE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1275   ASSERT_FALSE(imported_credit_card);
   1276 
   1277   // Wait for the refresh.
   1278   EXPECT_CALL(personal_data_observer_,
   1279       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1280 
   1281   MessageLoop::current()->Run();
   1282 
   1283   const std::vector<AutofillProfile*>& profiles = personal_data_->profiles();
   1284   ASSERT_EQ(0U, profiles.size());
   1285   const std::vector<CreditCard*>& credit_cards = personal_data_->credit_cards();
   1286   ASSERT_EQ(0U, credit_cards.size());
   1287 }
   1288 
   1289 
   1290 TEST_F(PersonalDataManagerTest, AggregateTwoDifferentCreditCards) {
   1291   FormData form1;
   1292 
   1293   // Start with a single valid credit card form.
   1294   webkit_glue::FormField field;
   1295   autofill_test::CreateTestFormField(
   1296       "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
   1297   form1.fields.push_back(field);
   1298   autofill_test::CreateTestFormField(
   1299       "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
   1300   form1.fields.push_back(field);
   1301   autofill_test::CreateTestFormField(
   1302       "Exp Month:", "exp_month", "01", "text", &field);
   1303   form1.fields.push_back(field);
   1304   autofill_test::CreateTestFormField(
   1305       "Exp Year:", "exp_year", "2011", "text", &field);
   1306   form1.fields.push_back(field);
   1307 
   1308   FormStructure form_structure1(form1);
   1309   form_structure1.DetermineHeuristicTypes();
   1310   std::vector<const FormStructure*> forms;
   1311   forms.push_back(&form_structure1);
   1312   const CreditCard* imported_credit_card;
   1313   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1314   ASSERT_TRUE(imported_credit_card);
   1315   personal_data_->SaveImportedCreditCard(*imported_credit_card);
   1316   delete imported_credit_card;
   1317 
   1318   // Wait for the refresh.
   1319   EXPECT_CALL(personal_data_observer_,
   1320       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1321 
   1322   MessageLoop::current()->Run();
   1323 
   1324   CreditCard expected;
   1325   autofill_test::SetCreditCardInfo(&expected,
   1326       "Biggie Smalls", "4111111111111111", "01", "2011");
   1327   const std::vector<CreditCard*>& results = personal_data_->credit_cards();
   1328   ASSERT_EQ(1U, results.size());
   1329   EXPECT_EQ(0, expected.Compare(*results[0]));
   1330 
   1331   // Add a second different valid credit card.
   1332   FormData form2;
   1333   autofill_test::CreateTestFormField(
   1334       "Name on card:", "name_on_card", "Jim Johansen", "text", &field);
   1335   form2.fields.push_back(field);
   1336   autofill_test::CreateTestFormField(
   1337       "Card Number:", "card_number", "5500 0000 0000 0004", "text", &field);
   1338   form2.fields.push_back(field);
   1339   autofill_test::CreateTestFormField(
   1340       "Exp Month:", "exp_month", "02", "text", &field);
   1341   form2.fields.push_back(field);
   1342   autofill_test::CreateTestFormField(
   1343       "Exp Year:", "exp_year", "2012", "text", &field);
   1344   form2.fields.push_back(field);
   1345 
   1346   FormStructure form_structure2(form2);
   1347   form_structure2.DetermineHeuristicTypes();
   1348   forms.clear();
   1349   forms.push_back(&form_structure2);
   1350   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1351   ASSERT_TRUE(imported_credit_card);
   1352   personal_data_->SaveImportedCreditCard(*imported_credit_card);
   1353   delete imported_credit_card;
   1354 
   1355   // Wait for the refresh.
   1356   EXPECT_CALL(personal_data_observer_,
   1357       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1358 
   1359   MessageLoop::current()->Run();
   1360 
   1361   CreditCard expected2;
   1362   autofill_test::SetCreditCardInfo(&expected2,
   1363       "Jim Johansen", "5500000000000004", "02", "2012");
   1364   const std::vector<CreditCard*>& results2 = personal_data_->credit_cards();
   1365   ASSERT_EQ(2U, results2.size());
   1366   EXPECT_EQ(0, expected.Compare(*results2[0]));
   1367   EXPECT_EQ(0, expected2.Compare(*results2[1]));
   1368 }
   1369 
   1370 TEST_F(PersonalDataManagerTest, AggregateInvalidCreditCard) {
   1371   FormData form1;
   1372 
   1373   // Start with a single valid credit card form.
   1374   webkit_glue::FormField field;
   1375   autofill_test::CreateTestFormField(
   1376       "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
   1377   form1.fields.push_back(field);
   1378   autofill_test::CreateTestFormField(
   1379       "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
   1380   form1.fields.push_back(field);
   1381   autofill_test::CreateTestFormField(
   1382       "Exp Month:", "exp_month", "01", "text", &field);
   1383   form1.fields.push_back(field);
   1384   autofill_test::CreateTestFormField(
   1385       "Exp Year:", "exp_year", "2011", "text", &field);
   1386   form1.fields.push_back(field);
   1387 
   1388   FormStructure form_structure1(form1);
   1389   form_structure1.DetermineHeuristicTypes();
   1390   std::vector<const FormStructure*> forms;
   1391   forms.push_back(&form_structure1);
   1392   const CreditCard* imported_credit_card;
   1393   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1394   ASSERT_TRUE(imported_credit_card);
   1395   personal_data_->SaveImportedCreditCard(*imported_credit_card);
   1396   delete imported_credit_card;
   1397 
   1398   // Wait for the refresh.
   1399   EXPECT_CALL(personal_data_observer_,
   1400       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1401 
   1402   MessageLoop::current()->Run();
   1403 
   1404   CreditCard expected;
   1405   autofill_test::SetCreditCardInfo(&expected,
   1406       "Biggie Smalls", "4111111111111111", "01", "2011");
   1407   const std::vector<CreditCard*>& results = personal_data_->credit_cards();
   1408   ASSERT_EQ(1U, results.size());
   1409   EXPECT_EQ(0, expected.Compare(*results[0]));
   1410 
   1411   // Add a second different invalid credit card.
   1412   FormData form2;
   1413   autofill_test::CreateTestFormField(
   1414       "Name on card:", "name_on_card", "Jim Johansen", "text", &field);
   1415   form2.fields.push_back(field);
   1416   autofill_test::CreateTestFormField(
   1417       "Card Number:", "card_number", "1000000000000000", "text", &field);
   1418   form2.fields.push_back(field);
   1419   autofill_test::CreateTestFormField(
   1420       "Exp Month:", "exp_month", "02", "text", &field);
   1421   form2.fields.push_back(field);
   1422   autofill_test::CreateTestFormField(
   1423       "Exp Year:", "exp_year", "2012", "text", &field);
   1424   form2.fields.push_back(field);
   1425 
   1426   FormStructure form_structure2(form2);
   1427   form_structure2.DetermineHeuristicTypes();
   1428   forms.clear();
   1429   forms.push_back(&form_structure2);
   1430   EXPECT_FALSE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1431   ASSERT_FALSE(imported_credit_card);
   1432 
   1433   // Note: no refresh here.
   1434 
   1435   const std::vector<CreditCard*>& results2 = personal_data_->credit_cards();
   1436   ASSERT_EQ(1U, results2.size());
   1437   EXPECT_EQ(0, expected.Compare(*results2[0]));
   1438 }
   1439 
   1440 TEST_F(PersonalDataManagerTest, AggregateSameCreditCardWithConflict) {
   1441   FormData form1;
   1442 
   1443   // Start with a single valid credit card form.
   1444   webkit_glue::FormField field;
   1445   autofill_test::CreateTestFormField(
   1446       "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
   1447   form1.fields.push_back(field);
   1448   autofill_test::CreateTestFormField(
   1449       "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
   1450   form1.fields.push_back(field);
   1451   autofill_test::CreateTestFormField(
   1452       "Exp Month:", "exp_month", "01", "text", &field);
   1453   form1.fields.push_back(field);
   1454   autofill_test::CreateTestFormField(
   1455       "Exp Year:", "exp_year", "2011", "text", &field);
   1456   form1.fields.push_back(field);
   1457 
   1458   FormStructure form_structure1(form1);
   1459   form_structure1.DetermineHeuristicTypes();
   1460   std::vector<const FormStructure*> forms;
   1461   forms.push_back(&form_structure1);
   1462   const CreditCard* imported_credit_card;
   1463   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1464   ASSERT_TRUE(imported_credit_card);
   1465   personal_data_->SaveImportedCreditCard(*imported_credit_card);
   1466   delete imported_credit_card;
   1467 
   1468   // Wait for the refresh.
   1469   EXPECT_CALL(personal_data_observer_,
   1470       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1471 
   1472   MessageLoop::current()->Run();
   1473 
   1474   CreditCard expected;
   1475   autofill_test::SetCreditCardInfo(&expected,
   1476       "Biggie Smalls", "4111111111111111", "01", "2011");
   1477   const std::vector<CreditCard*>& results = personal_data_->credit_cards();
   1478   ASSERT_EQ(1U, results.size());
   1479   EXPECT_EQ(0, expected.Compare(*results[0]));
   1480 
   1481   // Add a second different valid credit card where the year is different but
   1482   // the credit card number matches.
   1483   FormData form2;
   1484   autofill_test::CreateTestFormField(
   1485       "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
   1486   form2.fields.push_back(field);
   1487   autofill_test::CreateTestFormField(
   1488       "Card Number:", "card_number", "4111 1111 1111 1111", "text", &field);
   1489   form2.fields.push_back(field);
   1490   autofill_test::CreateTestFormField(
   1491       "Exp Month:", "exp_month", "01", "text", &field);
   1492   form2.fields.push_back(field);
   1493   autofill_test::CreateTestFormField(
   1494       "Exp Year:", "exp_year", "2012", "text", &field);
   1495   form2.fields.push_back(field);
   1496 
   1497   FormStructure form_structure2(form2);
   1498   form_structure2.DetermineHeuristicTypes();
   1499   forms.clear();
   1500   forms.push_back(&form_structure2);
   1501   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1502   ASSERT_TRUE(imported_credit_card);
   1503   personal_data_->SaveImportedCreditCard(*imported_credit_card);
   1504   delete imported_credit_card;
   1505 
   1506   // Wait for the refresh.
   1507   EXPECT_CALL(personal_data_observer_,
   1508       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1509 
   1510   MessageLoop::current()->Run();
   1511 
   1512   // Expect that the newer information is saved.  In this case the year is
   1513   // updated to "2012".
   1514   CreditCard expected2;
   1515   autofill_test::SetCreditCardInfo(&expected2,
   1516       "Biggie Smalls", "4111111111111111", "01", "2012");
   1517   const std::vector<CreditCard*>& results2 = personal_data_->credit_cards();
   1518   ASSERT_EQ(1U, results2.size());
   1519   EXPECT_EQ(0, expected2.Compare(*results2[0]));
   1520 }
   1521 
   1522 TEST_F(PersonalDataManagerTest, AggregateEmptyCreditCardWithConflict) {
   1523   FormData form1;
   1524 
   1525   // Start with a single valid credit card form.
   1526   webkit_glue::FormField field;
   1527   autofill_test::CreateTestFormField(
   1528       "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
   1529   form1.fields.push_back(field);
   1530   autofill_test::CreateTestFormField(
   1531       "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
   1532   form1.fields.push_back(field);
   1533   autofill_test::CreateTestFormField(
   1534       "Exp Month:", "exp_month", "01", "text", &field);
   1535   form1.fields.push_back(field);
   1536   autofill_test::CreateTestFormField(
   1537       "Exp Year:", "exp_year", "2011", "text", &field);
   1538   form1.fields.push_back(field);
   1539 
   1540   FormStructure form_structure1(form1);
   1541   form_structure1.DetermineHeuristicTypes();
   1542   std::vector<const FormStructure*> forms;
   1543   forms.push_back(&form_structure1);
   1544   const CreditCard* imported_credit_card;
   1545   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1546   ASSERT_TRUE(imported_credit_card);
   1547   personal_data_->SaveImportedCreditCard(*imported_credit_card);
   1548   delete imported_credit_card;
   1549 
   1550   // Wait for the refresh.
   1551   EXPECT_CALL(personal_data_observer_,
   1552       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1553 
   1554   MessageLoop::current()->Run();
   1555 
   1556   CreditCard expected;
   1557   autofill_test::SetCreditCardInfo(&expected,
   1558       "Biggie Smalls", "4111111111111111", "01", "2011");
   1559   const std::vector<CreditCard*>& results = personal_data_->credit_cards();
   1560   ASSERT_EQ(1U, results.size());
   1561   EXPECT_EQ(0, expected.Compare(*results[0]));
   1562 
   1563   // Add a second credit card with no number.
   1564   FormData form2;
   1565   autofill_test::CreateTestFormField(
   1566       "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
   1567   form2.fields.push_back(field);
   1568   autofill_test::CreateTestFormField(
   1569       "Exp Month:", "exp_month", "01", "text", &field);
   1570   form2.fields.push_back(field);
   1571   autofill_test::CreateTestFormField(
   1572       "Exp Year:", "exp_year", "2012", "text", &field);
   1573   form2.fields.push_back(field);
   1574 
   1575   FormStructure form_structure2(form2);
   1576   form_structure2.DetermineHeuristicTypes();
   1577   forms.clear();
   1578   forms.push_back(&form_structure2);
   1579   EXPECT_FALSE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1580   EXPECT_FALSE(imported_credit_card);
   1581 
   1582   // Note: no refresh here.
   1583 
   1584   // No change is expected.
   1585   CreditCard expected2;
   1586   autofill_test::SetCreditCardInfo(&expected2,
   1587       "Biggie Smalls", "4111111111111111", "01", "2011");
   1588   const std::vector<CreditCard*>& results2 = personal_data_->credit_cards();
   1589   ASSERT_EQ(1U, results2.size());
   1590   EXPECT_EQ(0, expected2.Compare(*results2[0]));
   1591 }
   1592 
   1593 TEST_F(PersonalDataManagerTest, AggregateCreditCardWithMissingInfoInNew) {
   1594   FormData form1;
   1595 
   1596   // Start with a single valid credit card form.
   1597   webkit_glue::FormField field;
   1598   autofill_test::CreateTestFormField(
   1599       "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
   1600   form1.fields.push_back(field);
   1601   autofill_test::CreateTestFormField(
   1602       "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
   1603   form1.fields.push_back(field);
   1604   autofill_test::CreateTestFormField(
   1605       "Exp Month:", "exp_month", "01", "text", &field);
   1606   form1.fields.push_back(field);
   1607   autofill_test::CreateTestFormField(
   1608       "Exp Year:", "exp_year", "2011", "text", &field);
   1609   form1.fields.push_back(field);
   1610 
   1611   FormStructure form_structure1(form1);
   1612   form_structure1.DetermineHeuristicTypes();
   1613   std::vector<const FormStructure*> forms;
   1614   forms.push_back(&form_structure1);
   1615   const CreditCard* imported_credit_card;
   1616   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1617   ASSERT_TRUE(imported_credit_card);
   1618   personal_data_->SaveImportedCreditCard(*imported_credit_card);
   1619   delete imported_credit_card;
   1620 
   1621   // Wait for the refresh.
   1622   EXPECT_CALL(personal_data_observer_,
   1623       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1624 
   1625   MessageLoop::current()->Run();
   1626 
   1627   CreditCard expected;
   1628   autofill_test::SetCreditCardInfo(&expected,
   1629       "Biggie Smalls", "4111111111111111", "01", "2011");
   1630   const std::vector<CreditCard*>& results = personal_data_->credit_cards();
   1631   ASSERT_EQ(1U, results.size());
   1632   EXPECT_EQ(0, expected.Compare(*results[0]));
   1633 
   1634   // Add a second different valid credit card where the name is missing but
   1635   // the credit card number matches.
   1636   FormData form2;
   1637   // Note missing name.
   1638   autofill_test::CreateTestFormField(
   1639       "Card Number:", "card_number", "4111111111111111", "text", &field);
   1640   form2.fields.push_back(field);
   1641   autofill_test::CreateTestFormField(
   1642       "Exp Month:", "exp_month", "01", "text", &field);
   1643   form2.fields.push_back(field);
   1644   autofill_test::CreateTestFormField(
   1645       "Exp Year:", "exp_year", "2011", "text", &field);
   1646   form2.fields.push_back(field);
   1647 
   1648   FormStructure form_structure2(form2);
   1649   form_structure2.DetermineHeuristicTypes();
   1650   forms.clear();
   1651   forms.push_back(&form_structure2);
   1652   EXPECT_FALSE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1653   ASSERT_FALSE(imported_credit_card);
   1654 
   1655   // Note: no refresh here.
   1656 
   1657   // No change is expected.
   1658   CreditCard expected2;
   1659   autofill_test::SetCreditCardInfo(&expected2,
   1660       "Biggie Smalls", "4111111111111111", "01", "2011");
   1661   const std::vector<CreditCard*>& results2 = personal_data_->credit_cards();
   1662   ASSERT_EQ(1U, results2.size());
   1663   EXPECT_EQ(0, expected2.Compare(*results2[0]));
   1664 }
   1665 
   1666 TEST_F(PersonalDataManagerTest, AggregateCreditCardWithMissingInfoInOld) {
   1667   FormData form1;
   1668 
   1669   // Start with a single valid credit card form.
   1670   webkit_glue::FormField field;
   1671   // Note missing name.
   1672   autofill_test::CreateTestFormField(
   1673       "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
   1674   form1.fields.push_back(field);
   1675   autofill_test::CreateTestFormField(
   1676       "Exp Month:", "exp_month", "01", "text", &field);
   1677   form1.fields.push_back(field);
   1678   autofill_test::CreateTestFormField(
   1679       "Exp Year:", "exp_year", "2011", "text", &field);
   1680   form1.fields.push_back(field);
   1681 
   1682   FormStructure form_structure1(form1);
   1683   form_structure1.DetermineHeuristicTypes();
   1684   std::vector<const FormStructure*> forms;
   1685   forms.push_back(&form_structure1);
   1686   const CreditCard* imported_credit_card;
   1687   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1688   ASSERT_TRUE(imported_credit_card);
   1689   personal_data_->SaveImportedCreditCard(*imported_credit_card);
   1690   delete imported_credit_card;
   1691 
   1692   // Wait for the refresh.
   1693   EXPECT_CALL(personal_data_observer_,
   1694       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1695 
   1696   MessageLoop::current()->Run();
   1697 
   1698   CreditCard expected;
   1699   autofill_test::SetCreditCardInfo(&expected,
   1700       NULL, "4111111111111111", "01", "2011");
   1701   const std::vector<CreditCard*>& results = personal_data_->credit_cards();
   1702   ASSERT_EQ(1U, results.size());
   1703   EXPECT_EQ(0, expected.Compare(*results[0]));
   1704 
   1705   // Add a second different valid credit card where the year is different but
   1706   // the credit card number matches.
   1707   FormData form2;
   1708   autofill_test::CreateTestFormField(
   1709       "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
   1710   form2.fields.push_back(field);
   1711   autofill_test::CreateTestFormField(
   1712       "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
   1713   form2.fields.push_back(field);
   1714   autofill_test::CreateTestFormField(
   1715       "Exp Month:", "exp_month", "01", "text", &field);
   1716   form2.fields.push_back(field);
   1717   autofill_test::CreateTestFormField(
   1718       "Exp Year:", "exp_year", "2011", "text", &field);
   1719   form2.fields.push_back(field);
   1720 
   1721   FormStructure form_structure2(form2);
   1722   form_structure2.DetermineHeuristicTypes();
   1723   forms.clear();
   1724   forms.push_back(&form_structure2);
   1725   EXPECT_TRUE(personal_data_->ImportFormData(forms, &imported_credit_card));
   1726   ASSERT_TRUE(imported_credit_card);
   1727   personal_data_->SaveImportedCreditCard(*imported_credit_card);
   1728   delete imported_credit_card;
   1729 
   1730   // Wait for the refresh.
   1731   EXPECT_CALL(personal_data_observer_,
   1732       OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
   1733 
   1734   MessageLoop::current()->Run();
   1735 
   1736   // Expect that the newer information is saved.  In this case the year is
   1737   // added to the existing credit card.
   1738   CreditCard expected2;
   1739   autofill_test::SetCreditCardInfo(&expected2,
   1740       "Biggie Smalls", "4111111111111111", "01", "2011");
   1741   const std::vector<CreditCard*>& results2 = personal_data_->credit_cards();
   1742   ASSERT_EQ(1U, results2.size());
   1743   EXPECT_EQ(0, expected2.Compare(*results2[0]));
   1744 }
   1745