1 // Copyright 2013 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.
9 #include "base/basictypes.h"
10 #include "base/files/scoped_temp_dir.h"
11 #include "base/guid.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/message_loop/message_loop.h"
14 #include "base/prefs/pref_service.h"
15 #include "base/strings/utf_string_conversions.h"
16 #include "base/synchronization/waitable_event.h"
17 #include "components/autofill/core/browser/autofill_metrics.h"
18 #include "components/autofill/core/browser/autofill_profile.h"
19 #include "components/autofill/core/browser/autofill_test_utils.h"
20 #include "components/autofill/core/browser/form_structure.h"
21 #include "components/autofill/core/browser/personal_data_manager.h"
22 #include "components/autofill/core/browser/personal_data_manager_observer.h"
23 #include "components/autofill/core/browser/webdata/autofill_table.h"
24 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
25 #include "components/autofill/core/common/autofill_pref_names.h"
26 #include "components/autofill/core/common/form_data.h"
27 #include "components/webdata/common/web_data_service_base.h"
28 #include "components/webdata/common/web_database_service.h"
29 #include "testing/gmock/include/gmock/gmock.h"
30 #include "testing/gtest/include/gtest/gtest.h"
32 using base::ASCIIToUTF16;
37 enum UserMode { USER_MODE_NORMAL, USER_MODE_INCOGNITO };
39 bool ReturnTrue(const AutofillProfile&) { return true; }
41 ACTION(QuitMainMessageLoop) { base::MessageLoop::current()->Quit(); }
43 class PersonalDataLoadedObserverMock : public PersonalDataManagerObserver {
45 PersonalDataLoadedObserverMock() {}
46 virtual ~PersonalDataLoadedObserverMock() {}
48 MOCK_METHOD0(OnPersonalDataChanged, void());
51 // Unlike the base AutofillMetrics, exposes copy and assignment constructors,
52 // which are handy for briefer test code. The AutofillMetrics class is
53 // stateless, so this is safe.
54 class TestAutofillMetrics : public AutofillMetrics {
56 TestAutofillMetrics() {}
57 virtual ~TestAutofillMetrics() {}
61 bool CompareElements(T* a, T* b) {
62 return a->Compare(*b) < 0;
66 bool ElementsEqual(T* a, T* b) {
67 return a->Compare(*b) == 0;
70 // Verifies that two vectors have the same elements (according to T::Compare)
71 // while ignoring order. This is useful because multiple profiles or credit
72 // cards that are added to the SQLite DB within the same second will be returned
73 // in GUID (aka random) order.
75 void ExpectSameElements(const std::vector<T*>& expectations,
76 const std::vector<T*>& results) {
77 ASSERT_EQ(expectations.size(), results.size());
79 std::vector<T*> expectations_copy = expectations;
81 expectations_copy.begin(), expectations_copy.end(), CompareElements<T>);
82 std::vector<T*> results_copy = results;
83 std::sort(results_copy.begin(), results_copy.end(), CompareElements<T>);
85 EXPECT_EQ(std::mismatch(results_copy.begin(),
87 expectations_copy.begin(),
88 ElementsEqual<T>).first,
92 } // anonymous namespace
94 class PersonalDataManagerTest : public testing::Test {
96 PersonalDataManagerTest() {}
98 virtual void SetUp() {
99 prefs_ = test::PrefServiceForTesting();
100 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
101 base::FilePath path = temp_dir_.path().AppendASCII("TestWebDB");
102 web_database_ = new WebDatabaseService(path,
103 base::MessageLoopProxy::current(),
104 base::MessageLoopProxy::current());
105 web_database_->AddTable(
106 scoped_ptr<WebDatabaseTable>(new AutofillTable("en-US")));
107 web_database_->LoadDatabase();
108 autofill_database_service_ =
109 new AutofillWebDataService(web_database_,
110 base::MessageLoopProxy::current(),
111 base::MessageLoopProxy::current(),
112 WebDataServiceBase::ProfileErrorCallback());
113 autofill_database_service_->Init();
115 test::DisableSystemServices(prefs_.get());
116 ResetPersonalDataManager(USER_MODE_NORMAL);
119 void ResetPersonalDataManager(UserMode user_mode) {
120 bool is_incognito = (user_mode == USER_MODE_INCOGNITO);
121 personal_data_.reset(new PersonalDataManager("en-US"));
122 personal_data_->Init(
123 scoped_refptr<AutofillWebDataService>(autofill_database_service_),
126 personal_data_->AddObserver(&personal_data_observer_);
128 // Verify that the web database has been updated and the notification sent.
129 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
130 .WillOnce(QuitMainMessageLoop());
131 base::MessageLoop::current()->Run();
134 // The temporary directory should be deleted at the end to ensure that
135 // files are not used anymore and deletion succeeds.
136 base::ScopedTempDir temp_dir_;
137 base::MessageLoopForUI message_loop_;
138 scoped_ptr<PrefService> prefs_;
139 scoped_refptr<AutofillWebDataService> autofill_database_service_;
140 scoped_refptr<WebDatabaseService> web_database_;
141 PersonalDataLoadedObserverMock personal_data_observer_;
142 scoped_ptr<PersonalDataManager> personal_data_;
145 TEST_F(PersonalDataManagerTest, AddProfile) {
146 // Add profile0 to the database.
147 AutofillProfile profile0(autofill::test::GetFullProfile());
148 profile0.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("j@s.com"));
149 personal_data_->AddProfile(profile0);
151 // Reload the database.
152 ResetPersonalDataManager(USER_MODE_NORMAL);
154 // Verify the addition.
155 const std::vector<AutofillProfile*>& results1 = personal_data_->GetProfiles();
156 ASSERT_EQ(1U, results1.size());
157 EXPECT_EQ(0, profile0.Compare(*results1[0]));
159 // Add profile with identical values. Duplicates should not get saved.
160 AutofillProfile profile0a = profile0;
161 profile0a.set_guid(base::GenerateGUID());
162 personal_data_->AddProfile(profile0a);
164 // Reload the database.
165 ResetPersonalDataManager(USER_MODE_NORMAL);
167 // Verify the non-addition.
168 const std::vector<AutofillProfile*>& results2 = personal_data_->GetProfiles();
169 ASSERT_EQ(1U, results2.size());
170 EXPECT_EQ(0, profile0.Compare(*results2[0]));
172 // New profile with different email.
173 AutofillProfile profile1 = profile0;
174 profile1.set_guid(base::GenerateGUID());
175 profile1.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("john@smith.com"));
177 // Add the different profile. This should save as a separate profile.
178 // Note that if this same profile was "merged" it would collapse to one
179 // profile with a multi-valued entry for email.
180 personal_data_->AddProfile(profile1);
182 // Reload the database.
183 ResetPersonalDataManager(USER_MODE_NORMAL);
185 // Verify the addition.
186 std::vector<AutofillProfile*> profiles;
187 profiles.push_back(&profile0);
188 profiles.push_back(&profile1);
189 ExpectSameElements(profiles, personal_data_->GetProfiles());
192 TEST_F(PersonalDataManagerTest, AddUpdateRemoveProfiles) {
193 AutofillProfile profile0(base::GenerateGUID(), "https://www.example.com");
194 test::SetProfileInfo(&profile0,
195 "Marion", "Mitchell", "Morrison",
196 "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
197 "91601", "US", "12345678910");
199 AutofillProfile profile1(base::GenerateGUID(), "https://www.example.com");
200 test::SetProfileInfo(&profile1,
201 "Josephine", "Alicia", "Saenz",
202 "joewayne@me.xyz", "Fox", "903 Apple Ct.", NULL, "Orlando", "FL", "32801",
203 "US", "19482937549");
205 AutofillProfile profile2(base::GenerateGUID(), "https://www.example.com");
206 test::SetProfileInfo(&profile2,
207 "Josephine", "Alicia", "Saenz",
208 "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
209 "32801", "US", "19482937549");
211 // Add two test profiles to the database.
212 personal_data_->AddProfile(profile0);
213 personal_data_->AddProfile(profile1);
215 // Verify that the web database has been updated and the notification sent.
216 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
217 .WillOnce(QuitMainMessageLoop());
218 base::MessageLoop::current()->Run();
220 std::vector<AutofillProfile*> profiles;
221 profiles.push_back(&profile0);
222 profiles.push_back(&profile1);
223 ExpectSameElements(profiles, personal_data_->GetProfiles());
225 // Update, remove, and add.
226 profile0.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
227 personal_data_->UpdateProfile(profile0);
228 personal_data_->RemoveByGUID(profile1.guid());
229 personal_data_->AddProfile(profile2);
231 // Verify that the web database has been updated and the notification sent.
232 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
233 .WillOnce(QuitMainMessageLoop());
234 base::MessageLoop::current()->Run();
237 profiles.push_back(&profile0);
238 profiles.push_back(&profile2);
239 ExpectSameElements(profiles, personal_data_->GetProfiles());
241 // Reset the PersonalDataManager. This tests that the personal data was saved
242 // to the web database, and that we can load the profiles from the web
244 ResetPersonalDataManager(USER_MODE_NORMAL);
246 // Verify that we've loaded the profiles from the web database.
247 ExpectSameElements(profiles, personal_data_->GetProfiles());
250 TEST_F(PersonalDataManagerTest, AddUpdateRemoveCreditCards) {
251 CreditCard credit_card0(base::GenerateGUID(), "https://www.example.com");
252 test::SetCreditCardInfo(&credit_card0,
253 "John Dillinger", "423456789012" /* Visa */, "01", "2010");
255 CreditCard credit_card1(base::GenerateGUID(), "https://www.example.com");
256 test::SetCreditCardInfo(&credit_card1,
257 "Bonnie Parker", "518765432109" /* Mastercard */, "12", "2012");
259 CreditCard credit_card2(base::GenerateGUID(), "https://www.example.com");
260 test::SetCreditCardInfo(&credit_card2,
261 "Clyde Barrow", "347666888555" /* American Express */, "04", "2015");
263 // Add two test credit cards to the database.
264 personal_data_->AddCreditCard(credit_card0);
265 personal_data_->AddCreditCard(credit_card1);
267 // Verify that the web database has been updated and the notification sent.
268 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
269 .WillOnce(QuitMainMessageLoop());
270 base::MessageLoop::current()->Run();
272 std::vector<CreditCard*> cards;
273 cards.push_back(&credit_card0);
274 cards.push_back(&credit_card1);
275 ExpectSameElements(cards, personal_data_->GetCreditCards());
277 // Update, remove, and add.
278 credit_card0.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Joe"));
279 personal_data_->UpdateCreditCard(credit_card0);
280 personal_data_->RemoveByGUID(credit_card1.guid());
281 personal_data_->AddCreditCard(credit_card2);
283 // Verify that the web database has been updated and the notification sent.
284 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
285 .WillOnce(QuitMainMessageLoop());
286 base::MessageLoop::current()->Run();
289 cards.push_back(&credit_card0);
290 cards.push_back(&credit_card2);
291 ExpectSameElements(cards, personal_data_->GetCreditCards());
293 // Reset the PersonalDataManager. This tests that the personal data was saved
294 // to the web database, and that we can load the credit cards from the web
296 ResetPersonalDataManager(USER_MODE_NORMAL);
298 // Verify that we've loaded the credit cards from the web database.
300 cards.push_back(&credit_card0);
301 cards.push_back(&credit_card2);
302 ExpectSameElements(cards, personal_data_->GetCreditCards());
305 TEST_F(PersonalDataManagerTest, UpdateUnverifiedProfilesAndCreditCards) {
306 // Start with unverified data.
307 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com/");
308 test::SetProfileInfo(&profile,
309 "Marion", "Mitchell", "Morrison",
310 "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
311 "91601", "US", "12345678910");
312 EXPECT_FALSE(profile.IsVerified());
314 CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
315 test::SetCreditCardInfo(&credit_card,
316 "John Dillinger", "423456789012" /* Visa */, "01", "2010");
317 EXPECT_FALSE(credit_card.IsVerified());
319 // Add the data to the database.
320 personal_data_->AddProfile(profile);
321 personal_data_->AddCreditCard(credit_card);
323 // Verify that the web database has been updated and the notification sent.
324 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
325 .WillOnce(QuitMainMessageLoop());
326 base::MessageLoop::current()->Run();
328 const std::vector<AutofillProfile*>& profiles1 =
329 personal_data_->GetProfiles();
330 const std::vector<CreditCard*>& cards1 = personal_data_->GetCreditCards();
331 ASSERT_EQ(1U, profiles1.size());
332 ASSERT_EQ(1U, cards1.size());
333 EXPECT_EQ(0, profile.Compare(*profiles1[0]));
334 EXPECT_EQ(0, credit_card.Compare(*cards1[0]));
336 // Try to update with just the origin changed.
337 AutofillProfile original_profile(profile);
338 CreditCard original_credit_card(credit_card);
339 profile.set_origin("Chrome settings");
340 credit_card.set_origin("Chrome settings");
342 EXPECT_TRUE(profile.IsVerified());
343 EXPECT_TRUE(credit_card.IsVerified());
345 personal_data_->UpdateProfile(profile);
346 personal_data_->UpdateCreditCard(credit_card);
348 // Note: No refresh, as no update is expected.
350 const std::vector<AutofillProfile*>& profiles2 =
351 personal_data_->GetProfiles();
352 const std::vector<CreditCard*>& cards2 = personal_data_->GetCreditCards();
353 ASSERT_EQ(1U, profiles2.size());
354 ASSERT_EQ(1U, cards2.size());
355 EXPECT_NE(profile.origin(), profiles2[0]->origin());
356 EXPECT_NE(credit_card.origin(), cards2[0]->origin());
357 EXPECT_EQ(original_profile.origin(), profiles2[0]->origin());
358 EXPECT_EQ(original_credit_card.origin(), cards2[0]->origin());
360 // Try to update with data changed as well.
361 profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
362 credit_card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Joe"));
364 personal_data_->UpdateProfile(profile);
365 personal_data_->UpdateCreditCard(credit_card);
367 // Verify that the web database has been updated and the notification sent.
368 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
369 .WillOnce(QuitMainMessageLoop());
370 base::MessageLoop::current()->Run();
372 const std::vector<AutofillProfile*>& profiles3 =
373 personal_data_->GetProfiles();
374 const std::vector<CreditCard*>& cards3 = personal_data_->GetCreditCards();
375 ASSERT_EQ(1U, profiles3.size());
376 ASSERT_EQ(1U, cards3.size());
377 EXPECT_EQ(0, profile.Compare(*profiles3[0]));
378 EXPECT_EQ(0, credit_card.Compare(*cards3[0]));
379 EXPECT_EQ(profile.origin(), profiles3[0]->origin());
380 EXPECT_EQ(credit_card.origin(), cards3[0]->origin());
383 TEST_F(PersonalDataManagerTest, AddProfilesAndCreditCards) {
384 AutofillProfile profile0(base::GenerateGUID(), "https://www.example.com");
385 test::SetProfileInfo(&profile0,
386 "Marion", "Mitchell", "Morrison",
387 "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
388 "91601", "US", "12345678910");
390 AutofillProfile profile1(base::GenerateGUID(), "https://www.example.com");
391 test::SetProfileInfo(&profile1,
392 "Josephine", "Alicia", "Saenz",
393 "joewayne@me.xyz", "Fox", "903 Apple Ct.", NULL, "Orlando", "FL", "32801",
394 "US", "19482937549");
396 CreditCard credit_card0(base::GenerateGUID(), "https://www.example.com");
397 test::SetCreditCardInfo(&credit_card0,
398 "John Dillinger", "423456789012" /* Visa */, "01", "2010");
400 CreditCard credit_card1(base::GenerateGUID(), "https://www.example.com");
401 test::SetCreditCardInfo(&credit_card1,
402 "Bonnie Parker", "518765432109" /* Mastercard */, "12", "2012");
404 // Add two test profiles to the database.
405 personal_data_->AddProfile(profile0);
406 personal_data_->AddProfile(profile1);
408 // Verify that the web database has been updated and the notification sent.
409 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
410 .WillOnce(QuitMainMessageLoop());
411 base::MessageLoop::current()->Run();
413 std::vector<AutofillProfile*> profiles;
414 profiles.push_back(&profile0);
415 profiles.push_back(&profile1);
416 ExpectSameElements(profiles, personal_data_->GetProfiles());
418 // Add two test credit cards to the database.
419 personal_data_->AddCreditCard(credit_card0);
420 personal_data_->AddCreditCard(credit_card1);
422 // Verify that the web database has been updated and the notification sent.
423 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
424 .WillOnce(QuitMainMessageLoop());
425 base::MessageLoop::current()->Run();
427 std::vector<CreditCard*> cards;
428 cards.push_back(&credit_card0);
429 cards.push_back(&credit_card1);
430 ExpectSameElements(cards, personal_data_->GetCreditCards());
432 // Determine uniqueness by inserting all of the GUIDs into a set and verifying
433 // the size of the set matches the number of GUIDs.
434 std::set<std::string> guids;
435 guids.insert(profile0.guid());
436 guids.insert(profile1.guid());
437 guids.insert(credit_card0.guid());
438 guids.insert(credit_card1.guid());
439 EXPECT_EQ(4U, guids.size());
442 // Test for http://crbug.com/50047. Makes sure that guids are populated
443 // correctly on load.
444 TEST_F(PersonalDataManagerTest, PopulateUniqueIDsOnLoad) {
445 AutofillProfile profile0(base::GenerateGUID(), "https://www.example.com");
446 test::SetProfileInfo(&profile0,
447 "y", "", "", "", "", "", "", "", "", "", "", "");
449 // Add the profile0 to the db.
450 personal_data_->AddProfile(profile0);
452 // Verify that the web database has been updated and the notification sent.
453 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
454 .WillOnce(QuitMainMessageLoop());
455 base::MessageLoop::current()->Run();
457 // Verify that we've loaded the profiles from the web database.
458 const std::vector<AutofillProfile*>& results2 = personal_data_->GetProfiles();
459 ASSERT_EQ(1U, results2.size());
460 EXPECT_EQ(0, profile0.Compare(*results2[0]));
462 // Add a new profile.
463 AutofillProfile profile1(base::GenerateGUID(), "https://www.example.com");
464 test::SetProfileInfo(&profile1,
465 "z", "", "", "", "", "", "", "", "", "", "", "");
466 personal_data_->AddProfile(profile1);
468 // Verify that the web database has been updated and the notification sent.
469 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
470 .WillOnce(QuitMainMessageLoop());
471 base::MessageLoop::current()->Run();
473 // Make sure the two profiles have different GUIDs, both valid.
474 const std::vector<AutofillProfile*>& results3 = personal_data_->GetProfiles();
475 ASSERT_EQ(2U, results3.size());
476 EXPECT_NE(results3[0]->guid(), results3[1]->guid());
477 EXPECT_TRUE(base::IsValidGUID(results3[0]->guid()));
478 EXPECT_TRUE(base::IsValidGUID(results3[1]->guid()));
481 TEST_F(PersonalDataManagerTest, SetEmptyProfile) {
482 AutofillProfile profile0(base::GenerateGUID(), "https://www.example.com");
483 test::SetProfileInfo(&profile0,
484 "", "", "", "", "", "", "", "", "", "", "", "");
486 // Add the empty profile to the database.
487 personal_data_->AddProfile(profile0);
489 // Note: no refresh here.
491 // Reset the PersonalDataManager. This tests that the personal data was saved
492 // to the web database, and that we can load the profiles from the web
494 ResetPersonalDataManager(USER_MODE_NORMAL);
496 // Verify that we've loaded the profiles from the web database.
497 const std::vector<AutofillProfile*>& results2 = personal_data_->GetProfiles();
498 ASSERT_EQ(0U, results2.size());
501 TEST_F(PersonalDataManagerTest, SetEmptyCreditCard) {
502 CreditCard credit_card0(base::GenerateGUID(), "https://www.example.com");
503 test::SetCreditCardInfo(&credit_card0, "", "", "", "");
505 // Add the empty credit card to the database.
506 personal_data_->AddCreditCard(credit_card0);
508 // Note: no refresh here.
510 // Reset the PersonalDataManager. This tests that the personal data was saved
511 // to the web database, and that we can load the credit cards from the web
513 ResetPersonalDataManager(USER_MODE_NORMAL);
515 // Verify that we've loaded the credit cards from the web database.
516 const std::vector<CreditCard*>& results2 = personal_data_->GetCreditCards();
517 ASSERT_EQ(0U, results2.size());
520 TEST_F(PersonalDataManagerTest, Refresh) {
521 AutofillProfile profile0(base::GenerateGUID(), "https://www.example.com");
522 test::SetProfileInfo(&profile0,
523 "Marion", "Mitchell", "Morrison",
524 "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
525 "91601", "US", "12345678910");
527 AutofillProfile profile1(base::GenerateGUID(), "https://www.example.com");
528 test::SetProfileInfo(&profile1,
529 "Josephine", "Alicia", "Saenz",
530 "joewayne@me.xyz", "Fox", "903 Apple Ct.", NULL, "Orlando", "FL", "32801",
531 "US", "19482937549");
533 // Add the test profiles to the database.
534 personal_data_->AddProfile(profile0);
535 personal_data_->AddProfile(profile1);
537 // Verify that the web database has been updated and the notification sent.
538 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
539 .WillOnce(QuitMainMessageLoop());
540 base::MessageLoop::current()->Run();
542 std::vector<AutofillProfile*> profiles;
543 profiles.push_back(&profile0);
544 profiles.push_back(&profile1);
545 ExpectSameElements(profiles, personal_data_->GetProfiles());
547 AutofillProfile profile2(base::GenerateGUID(), "https://www.example.com");
548 test::SetProfileInfo(&profile2,
549 "Josephine", "Alicia", "Saenz",
550 "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
551 "32801", "US", "19482937549");
553 autofill_database_service_->AddAutofillProfile(profile2);
555 personal_data_->Refresh();
557 // Verify that the web database has been updated and the notification sent.
558 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
559 .WillOnce(QuitMainMessageLoop());
560 base::MessageLoop::current()->Run();
563 profiles.push_back(&profile0);
564 profiles.push_back(&profile1);
565 profiles.push_back(&profile2);
566 ExpectSameElements(profiles, personal_data_->GetProfiles());
568 autofill_database_service_->RemoveAutofillProfile(profile1.guid());
569 autofill_database_service_->RemoveAutofillProfile(profile2.guid());
571 // Before telling the PDM to refresh, simulate an edit to one of the deleted
572 // profiles via a SetProfile update (this would happen if the Autofill window
573 // was open with a previous snapshot of the profiles, and something
574 // [e.g. sync] removed a profile from the browser. In this edge case, we will
575 // end up in a consistent state by dropping the write).
576 profile0.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Mar"));
577 profile2.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Jo"));
578 personal_data_->UpdateProfile(profile0);
579 personal_data_->AddProfile(profile1);
580 personal_data_->AddProfile(profile2);
582 // Verify that the web database has been updated and the notification sent.
583 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
584 .WillOnce(QuitMainMessageLoop());
585 base::MessageLoop::current()->Run();
587 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
588 ASSERT_EQ(1U, results.size());
589 EXPECT_EQ(profile0, *results[0]);
592 TEST_F(PersonalDataManagerTest, ImportFormData) {
595 test::CreateTestFormField(
596 "First name:", "first_name", "George", "text", &field);
597 form.fields.push_back(field);
598 test::CreateTestFormField(
599 "Last name:", "last_name", "Washington", "text", &field);
600 form.fields.push_back(field);
601 test::CreateTestFormField(
602 "Email:", "email", "theprez@gmail.com", "text", &field);
603 form.fields.push_back(field);
604 test::CreateTestFormField(
605 "Address:", "address1", "21 Laussat St", "text", &field);
606 form.fields.push_back(field);
607 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
608 form.fields.push_back(field);
609 test::CreateTestFormField("State:", "state", "California", "text", &field);
610 form.fields.push_back(field);
611 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
612 form.fields.push_back(field);
613 FormStructure form_structure(form);
614 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
615 scoped_ptr<CreditCard> imported_credit_card;
616 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
617 &imported_credit_card));
618 ASSERT_FALSE(imported_credit_card);
620 // Verify that the web database has been updated and the notification sent.
621 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
622 .WillOnce(QuitMainMessageLoop());
623 base::MessageLoop::current()->Run();
625 AutofillProfile expected(base::GenerateGUID(), "https://www.example.com");
626 test::SetProfileInfo(&expected, "George", NULL,
627 "Washington", "theprez@gmail.com", NULL, "21 Laussat St", NULL,
628 "San Francisco", "California", "94102", NULL, NULL);
629 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
630 ASSERT_EQ(1U, results.size());
631 EXPECT_EQ(0, expected.Compare(*results[0]));
634 TEST_F(PersonalDataManagerTest, ImportFormDataBadEmail) {
637 test::CreateTestFormField(
638 "First name:", "first_name", "George", "text", &field);
639 form.fields.push_back(field);
640 test::CreateTestFormField(
641 "Last name:", "last_name", "Washington", "text", &field);
642 form.fields.push_back(field);
643 test::CreateTestFormField("Email:", "email", "bogus", "text", &field);
644 form.fields.push_back(field);
645 test::CreateTestFormField(
646 "Address:", "address1", "21 Laussat St", "text", &field);
647 form.fields.push_back(field);
648 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
649 form.fields.push_back(field);
650 test::CreateTestFormField("State:", "state", "California", "text", &field);
651 form.fields.push_back(field);
652 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
653 form.fields.push_back(field);
654 FormStructure form_structure(form);
655 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
656 scoped_ptr<CreditCard> imported_credit_card;
657 EXPECT_FALSE(personal_data_->ImportFormData(form_structure,
658 &imported_credit_card));
659 ASSERT_EQ(static_cast<CreditCard*>(NULL), imported_credit_card.get());
661 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
662 ASSERT_EQ(0U, results.size());
665 // Tests that a 'confirm email' field does not block profile import.
666 TEST_F(PersonalDataManagerTest, ImportFormDataTwoEmails) {
669 test::CreateTestFormField(
670 "Name:", "name", "George Washington", "text", &field);
671 form.fields.push_back(field);
672 test::CreateTestFormField(
673 "Address:", "address1", "21 Laussat St", "text", &field);
674 form.fields.push_back(field);
675 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
676 form.fields.push_back(field);
677 test::CreateTestFormField("State:", "state", "California", "text", &field);
678 form.fields.push_back(field);
679 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
680 form.fields.push_back(field);
681 test::CreateTestFormField(
682 "Email:", "email", "example@example.com", "text", &field);
683 form.fields.push_back(field);
684 test::CreateTestFormField(
685 "Confirm email:", "confirm_email", "example@example.com", "text", &field);
686 form.fields.push_back(field);
687 FormStructure form_structure(form);
688 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
689 scoped_ptr<CreditCard> imported_credit_card;
690 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
691 &imported_credit_card));
692 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
693 ASSERT_EQ(1U, results.size());
696 // Tests two email fields containing different values blocks provile import.
697 TEST_F(PersonalDataManagerTest, ImportFormDataTwoDifferentEmails) {
700 test::CreateTestFormField(
701 "Name:", "name", "George Washington", "text", &field);
702 form.fields.push_back(field);
703 test::CreateTestFormField(
704 "Address:", "address1", "21 Laussat St", "text", &field);
705 form.fields.push_back(field);
706 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
707 form.fields.push_back(field);
708 test::CreateTestFormField("State:", "state", "California", "text", &field);
709 form.fields.push_back(field);
710 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
711 form.fields.push_back(field);
712 test::CreateTestFormField(
713 "Email:", "email", "example@example.com", "text", &field);
714 form.fields.push_back(field);
715 test::CreateTestFormField(
716 "Email:", "email2", "example2@example.com", "text", &field);
717 form.fields.push_back(field);
718 FormStructure form_structure(form);
719 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
720 scoped_ptr<CreditCard> imported_credit_card;
721 EXPECT_FALSE(personal_data_->ImportFormData(form_structure,
722 &imported_credit_card));
723 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
724 ASSERT_EQ(0U, results.size());
727 TEST_F(PersonalDataManagerTest, ImportFormDataNotEnoughFilledFields) {
730 test::CreateTestFormField(
731 "First name:", "first_name", "George", "text", &field);
732 form.fields.push_back(field);
733 test::CreateTestFormField(
734 "Last name:", "last_name", "Washington", "text", &field);
735 form.fields.push_back(field);
736 test::CreateTestFormField(
737 "Card number:", "card_number", "4111 1111 1111 1111", "text", &field);
738 form.fields.push_back(field);
739 FormStructure form_structure(form);
740 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
741 scoped_ptr<CreditCard> imported_credit_card;
742 EXPECT_FALSE(personal_data_->ImportFormData(form_structure,
743 &imported_credit_card));
744 ASSERT_FALSE(imported_credit_card);
746 const std::vector<AutofillProfile*>& profiles = personal_data_->GetProfiles();
747 ASSERT_EQ(0U, profiles.size());
748 const std::vector<CreditCard*>& cards = personal_data_->GetCreditCards();
749 ASSERT_EQ(0U, cards.size());
752 TEST_F(PersonalDataManagerTest, ImportFormMinimumAddressUSA) {
753 // United States addresses must specifiy one address line, a city, state and
757 test::CreateTestFormField("Name:", "name", "Barack Obama", "text", &field);
758 form.fields.push_back(field);
759 test::CreateTestFormField(
760 "Address:", "address", "1600 Pennsylvania Avenue", "text", &field);
761 form.fields.push_back(field);
762 test::CreateTestFormField("City:", "city", "Washington", "text", &field);
763 form.fields.push_back(field);
764 test::CreateTestFormField("State:", "state", "DC", "text", &field);
765 form.fields.push_back(field);
766 test::CreateTestFormField("Zip:", "zip", "20500", "text", &field);
767 form.fields.push_back(field);
768 test::CreateTestFormField("Country:", "country", "USA", "text", &field);
769 form.fields.push_back(field);
770 FormStructure form_structure(form);
771 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
772 scoped_ptr<CreditCard> imported_credit_card;
773 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
774 &imported_credit_card));
775 const std::vector<AutofillProfile*>& profiles = personal_data_->GetProfiles();
776 ASSERT_EQ(1U, profiles.size());
779 TEST_F(PersonalDataManagerTest, ImportFormMinimumAddressGB) {
780 // British addresses do not require a state/province as the county is usually
781 // not requested on forms.
784 test::CreateTestFormField("Name:", "name", "David Cameron", "text", &field);
785 form.fields.push_back(field);
786 test::CreateTestFormField(
787 "Address:", "address", "10 Downing Street", "text", &field);
788 form.fields.push_back(field);
789 test::CreateTestFormField("City:", "city", "London", "text", &field);
790 form.fields.push_back(field);
791 test::CreateTestFormField(
792 "Postcode:", "postcode", "SW1A 2AA", "text", &field);
793 form.fields.push_back(field);
794 test::CreateTestFormField(
795 "Country:", "country", "United Kingdom", "text", &field);
796 form.fields.push_back(field);
797 FormStructure form_structure(form);
798 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
799 scoped_ptr<CreditCard> imported_credit_card;
800 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
801 &imported_credit_card));
802 const std::vector<AutofillProfile*>& profiles = personal_data_->GetProfiles();
803 ASSERT_EQ(1U, profiles.size());
806 TEST_F(PersonalDataManagerTest, ImportFormMinimumAddressGI) {
807 // Gibraltar has the most minimal set of requirements for a valid address.
808 // There are no cities or provinces and no postal/zip code system.
811 test::CreateTestFormField(
812 "Name:", "name", "Sir Adrian Johns", "text", &field);
813 form.fields.push_back(field);
814 test::CreateTestFormField(
815 "Address:", "address", "The Convent, Main Street", "text", &field);
816 form.fields.push_back(field);
817 test::CreateTestFormField("Country:", "country", "Gibraltar", "text", &field);
818 form.fields.push_back(field);
819 FormStructure form_structure(form);
820 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
821 scoped_ptr<CreditCard> imported_credit_card;
822 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
823 &imported_credit_card));
824 const std::vector<AutofillProfile*>& profiles = personal_data_->GetProfiles();
825 ASSERT_EQ(1U, profiles.size());
828 TEST_F(PersonalDataManagerTest, ImportPhoneNumberSplitAcrossMultipleFields) {
831 test::CreateTestFormField(
832 "First name:", "first_name", "George", "text", &field);
833 form.fields.push_back(field);
834 test::CreateTestFormField(
835 "Last name:", "last_name", "Washington", "text", &field);
836 form.fields.push_back(field);
837 test::CreateTestFormField(
838 "Phone #:", "home_phone_area_code", "650", "text", &field);
839 field.max_length = 3;
840 form.fields.push_back(field);
841 test::CreateTestFormField(
842 "Phone #:", "home_phone_prefix", "555", "text", &field);
843 field.max_length = 3;
844 form.fields.push_back(field);
845 test::CreateTestFormField(
846 "Phone #:", "home_phone_suffix", "0000", "text", &field);
847 field.max_length = 4;
848 form.fields.push_back(field);
849 test::CreateTestFormField(
850 "Address:", "address1", "21 Laussat St", "text", &field);
851 form.fields.push_back(field);
852 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
853 form.fields.push_back(field);
854 test::CreateTestFormField("State:", "state", "California", "text", &field);
855 form.fields.push_back(field);
856 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
857 form.fields.push_back(field);
858 FormStructure form_structure(form);
859 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
860 scoped_ptr<CreditCard> imported_credit_card;
861 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
862 &imported_credit_card));
863 ASSERT_FALSE(imported_credit_card);
865 // Verify that the web database has been updated and the notification sent.
866 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
867 .WillOnce(QuitMainMessageLoop());
868 base::MessageLoop::current()->Run();
870 AutofillProfile expected(base::GenerateGUID(), "https://www.example.com");
871 test::SetProfileInfo(&expected, "George", NULL,
872 "Washington", NULL, NULL, "21 Laussat St", NULL,
873 "San Francisco", "California", "94102", NULL, "(650) 555-0000");
874 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
875 ASSERT_EQ(1U, results.size());
876 EXPECT_EQ(0, expected.Compare(*results[0]));
879 TEST_F(PersonalDataManagerTest, ImportFormDataMultilineAddress) {
882 test::CreateTestFormField(
883 "First name:", "first_name", "George", "text", &field);
884 form.fields.push_back(field);
885 test::CreateTestFormField(
886 "Last name:", "last_name", "Washington", "text", &field);
887 form.fields.push_back(field);
888 test::CreateTestFormField(
889 "Email:", "email", "theprez@gmail.com", "text", &field);
890 form.fields.push_back(field);
891 test::CreateTestFormField(
898 form.fields.push_back(field);
899 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
900 form.fields.push_back(field);
901 test::CreateTestFormField("State:", "state", "California", "text", &field);
902 form.fields.push_back(field);
903 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
904 form.fields.push_back(field);
905 FormStructure form_structure(form);
906 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
907 scoped_ptr<CreditCard> imported_credit_card;
908 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
909 &imported_credit_card));
910 ASSERT_FALSE(imported_credit_card);
912 // Verify that the web database has been updated and the notification sent.
913 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
914 .WillOnce(QuitMainMessageLoop());
915 base::MessageLoop::current()->Run();
917 AutofillProfile expected(base::GenerateGUID(), "https://www.example.com");
918 test::SetProfileInfo(&expected, "George", NULL,
919 "Washington", "theprez@gmail.com", NULL, "21 Laussat St", "Apt. #42",
920 "San Francisco", "California", "94102", NULL, NULL);
921 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
922 ASSERT_EQ(1U, results.size());
923 EXPECT_EQ(0, expected.Compare(*results[0]));
926 TEST_F(PersonalDataManagerTest, SetUniqueCreditCardLabels) {
927 CreditCard credit_card0(base::GenerateGUID(), "https://www.example.com");
928 credit_card0.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("John"));
929 CreditCard credit_card1(base::GenerateGUID(), "https://www.example.com");
930 credit_card1.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Paul"));
931 CreditCard credit_card2(base::GenerateGUID(), "https://www.example.com");
932 credit_card2.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Ringo"));
933 CreditCard credit_card3(base::GenerateGUID(), "https://www.example.com");
934 credit_card3.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Other"));
935 CreditCard credit_card4(base::GenerateGUID(), "https://www.example.com");
936 credit_card4.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Ozzy"));
937 CreditCard credit_card5(base::GenerateGUID(), "https://www.example.com");
938 credit_card5.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Dio"));
940 // Add the test credit cards to the database.
941 personal_data_->AddCreditCard(credit_card0);
942 personal_data_->AddCreditCard(credit_card1);
943 personal_data_->AddCreditCard(credit_card2);
944 personal_data_->AddCreditCard(credit_card3);
945 personal_data_->AddCreditCard(credit_card4);
946 personal_data_->AddCreditCard(credit_card5);
948 // Reset the PersonalDataManager. This tests that the personal data was saved
949 // to the web database, and that we can load the credit cards from the web
951 ResetPersonalDataManager(USER_MODE_NORMAL);
953 std::vector<CreditCard*> cards;
954 cards.push_back(&credit_card0);
955 cards.push_back(&credit_card1);
956 cards.push_back(&credit_card2);
957 cards.push_back(&credit_card3);
958 cards.push_back(&credit_card4);
959 cards.push_back(&credit_card5);
960 ExpectSameElements(cards, personal_data_->GetCreditCards());
963 TEST_F(PersonalDataManagerTest, AggregateTwoDifferentProfiles) {
966 test::CreateTestFormField(
967 "First name:", "first_name", "George", "text", &field);
968 form1.fields.push_back(field);
969 test::CreateTestFormField(
970 "Last name:", "last_name", "Washington", "text", &field);
971 form1.fields.push_back(field);
972 test::CreateTestFormField(
973 "Email:", "email", "theprez@gmail.com", "text", &field);
974 form1.fields.push_back(field);
975 test::CreateTestFormField(
976 "Address:", "address1", "21 Laussat St", "text", &field);
977 form1.fields.push_back(field);
978 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
979 form1.fields.push_back(field);
980 test::CreateTestFormField("State:", "state", "California", "text", &field);
981 form1.fields.push_back(field);
982 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
983 form1.fields.push_back(field);
985 FormStructure form_structure1(form1);
986 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
987 scoped_ptr<CreditCard> imported_credit_card;
988 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
989 &imported_credit_card));
990 ASSERT_FALSE(imported_credit_card);
992 // Verify that the web database has been updated and the notification sent.
993 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
994 .WillOnce(QuitMainMessageLoop());
995 base::MessageLoop::current()->Run();
997 AutofillProfile expected(base::GenerateGUID(), "https://www.example.com");
998 test::SetProfileInfo(&expected, "George", NULL,
999 "Washington", "theprez@gmail.com", NULL, "21 Laussat St", NULL,
1000 "San Francisco", "California", "94102", NULL, NULL);
1001 const std::vector<AutofillProfile*>& results1 = personal_data_->GetProfiles();
1002 ASSERT_EQ(1U, results1.size());
1003 EXPECT_EQ(0, expected.Compare(*results1[0]));
1005 // Now create a completely different profile.
1007 test::CreateTestFormField(
1008 "First name:", "first_name", "John", "text", &field);
1009 form2.fields.push_back(field);
1010 test::CreateTestFormField(
1011 "Last name:", "last_name", "Adams", "text", &field);
1012 form2.fields.push_back(field);
1013 test::CreateTestFormField(
1014 "Email:", "email", "second@gmail.com", "text", &field);
1015 form2.fields.push_back(field);
1016 test::CreateTestFormField(
1017 "Address:", "address1", "22 Laussat St", "text", &field);
1018 form2.fields.push_back(field);
1019 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
1020 form2.fields.push_back(field);
1021 test::CreateTestFormField("State:", "state", "California", "text", &field);
1022 form2.fields.push_back(field);
1023 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
1024 form2.fields.push_back(field);
1026 FormStructure form_structure2(form2);
1027 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1028 EXPECT_TRUE(personal_data_->ImportFormData(form_structure2,
1029 &imported_credit_card));
1030 ASSERT_FALSE(imported_credit_card);
1032 // Verify that the web database has been updated and the notification sent.
1033 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1034 .WillOnce(QuitMainMessageLoop());
1035 base::MessageLoop::current()->Run();
1037 AutofillProfile expected2(base::GenerateGUID(), "https://www.example.com");
1038 test::SetProfileInfo(&expected2, "John", NULL,
1039 "Adams", "second@gmail.com", NULL, "22 Laussat St", NULL,
1040 "San Francisco", "California", "94102", NULL, NULL);
1041 std::vector<AutofillProfile*> profiles;
1042 profiles.push_back(&expected);
1043 profiles.push_back(&expected2);
1044 ExpectSameElements(profiles, personal_data_->GetProfiles());
1047 TEST_F(PersonalDataManagerTest, AggregateTwoProfilesWithMultiValue) {
1049 FormFieldData field;
1050 test::CreateTestFormField(
1051 "First name:", "first_name", "George", "text", &field);
1052 form1.fields.push_back(field);
1053 test::CreateTestFormField(
1054 "Last name:", "last_name", "Washington", "text", &field);
1055 form1.fields.push_back(field);
1056 test::CreateTestFormField(
1057 "Email:", "email", "theprez@gmail.com", "text", &field);
1058 form1.fields.push_back(field);
1059 test::CreateTestFormField(
1060 "Address:", "address1", "21 Laussat St", "text", &field);
1061 form1.fields.push_back(field);
1062 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
1063 form1.fields.push_back(field);
1064 test::CreateTestFormField("State:", "state", "California", "text", &field);
1065 form1.fields.push_back(field);
1066 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
1067 form1.fields.push_back(field);
1069 FormStructure form_structure1(form1);
1070 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1071 scoped_ptr<CreditCard> imported_credit_card;
1072 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
1073 &imported_credit_card));
1074 ASSERT_FALSE(imported_credit_card);
1076 // Verify that the web database has been updated and the notification sent.
1077 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1078 .WillOnce(QuitMainMessageLoop());
1079 base::MessageLoop::current()->Run();
1081 AutofillProfile expected(base::GenerateGUID(), "https://www.example.com");
1082 test::SetProfileInfo(&expected, "George", NULL,
1083 "Washington", "theprez@gmail.com", NULL, "21 Laussat St", NULL,
1084 "San Francisco", "California", "94102", NULL, NULL);
1085 const std::vector<AutofillProfile*>& results1 = personal_data_->GetProfiles();
1086 ASSERT_EQ(1U, results1.size());
1087 EXPECT_EQ(0, expected.Compare(*results1[0]));
1089 // Now create a completely different profile.
1091 test::CreateTestFormField(
1092 "First name:", "first_name", "John", "text", &field);
1093 form2.fields.push_back(field);
1094 test::CreateTestFormField("Last name:", "last_name", "Adams", "text", &field);
1095 form2.fields.push_back(field);
1096 test::CreateTestFormField(
1097 "Email:", "email", "second@gmail.com", "text", &field);
1098 form2.fields.push_back(field);
1099 test::CreateTestFormField(
1100 "Address:", "address1", "21 Laussat St", "text", &field);
1101 form2.fields.push_back(field);
1102 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
1103 form2.fields.push_back(field);
1104 test::CreateTestFormField("State:", "state", "California", "text", &field);
1105 form2.fields.push_back(field);
1106 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
1107 form2.fields.push_back(field);
1109 FormStructure form_structure2(form2);
1110 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1111 EXPECT_TRUE(personal_data_->ImportFormData(form_structure2,
1112 &imported_credit_card));
1113 ASSERT_FALSE(imported_credit_card);
1115 // Verify that the web database has been updated and the notification sent.
1116 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1117 .WillOnce(QuitMainMessageLoop());
1118 base::MessageLoop::current()->Run();
1120 const std::vector<AutofillProfile*>& results2 = personal_data_->GetProfiles();
1122 // Modify expected to include multi-valued fields.
1123 std::vector<base::string16> first_names, last_names, emails;
1124 expected.GetRawMultiInfo(NAME_FIRST, &first_names);
1125 first_names.push_back(ASCIIToUTF16("John"));
1126 expected.GetRawMultiInfo(NAME_LAST, &last_names);
1127 last_names.push_back(ASCIIToUTF16("Adams"));
1128 expected.SetRawMultiInfo(NAME_FIRST, first_names);
1129 expected.SetRawMultiInfo(NAME_LAST, last_names);
1131 expected.GetRawMultiInfo(EMAIL_ADDRESS, &emails);
1132 emails.push_back(ASCIIToUTF16("second@gmail.com"));
1133 expected.SetRawMultiInfo(EMAIL_ADDRESS, emails);
1135 ASSERT_EQ(1U, results2.size());
1136 EXPECT_EQ(0, expected.Compare(*results2[0]));
1139 TEST_F(PersonalDataManagerTest, AggregateSameProfileWithConflict) {
1141 FormFieldData field;
1142 test::CreateTestFormField(
1143 "First name:", "first_name", "George", "text", &field);
1144 form1.fields.push_back(field);
1145 test::CreateTestFormField(
1146 "Last name:", "last_name", "Washington", "text", &field);
1147 form1.fields.push_back(field);
1148 test::CreateTestFormField(
1149 "Address:", "address", "1600 Pennsylvania Avenue", "text", &field);
1150 form1.fields.push_back(field);
1151 test::CreateTestFormField(
1152 "Address Line 2:", "address2", "Suite A", "text", &field);
1153 form1.fields.push_back(field);
1154 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
1155 form1.fields.push_back(field);
1156 test::CreateTestFormField("State:", "state", "California", "text", &field);
1157 form1.fields.push_back(field);
1158 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
1159 form1.fields.push_back(field);
1160 test::CreateTestFormField(
1161 "Email:", "email", "theprez@gmail.com", "text", &field);
1162 form1.fields.push_back(field);
1163 test::CreateTestFormField("Phone:", "phone", "6505556666", "text", &field);
1164 form1.fields.push_back(field);
1166 FormStructure form_structure1(form1);
1167 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1168 scoped_ptr<CreditCard> imported_credit_card;
1169 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
1170 &imported_credit_card));
1171 ASSERT_FALSE(imported_credit_card);
1173 // Verify that the web database has been updated and the notification sent.
1174 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1175 .WillOnce(QuitMainMessageLoop());
1176 base::MessageLoop::current()->Run();
1178 AutofillProfile expected(base::GenerateGUID(), "https://www.example.com");
1179 test::SetProfileInfo(
1180 &expected, "George", NULL, "Washington", "theprez@gmail.com", NULL,
1181 "1600 Pennsylvania Avenue", "Suite A", "San Francisco", "California",
1182 "94102", NULL, "(650) 555-6666");
1183 const std::vector<AutofillProfile*>& results1 = personal_data_->GetProfiles();
1184 ASSERT_EQ(1U, results1.size());
1185 EXPECT_EQ(0, expected.Compare(*results1[0]));
1187 // Now create an updated profile.
1189 test::CreateTestFormField(
1190 "First name:", "first_name", "George", "text", &field);
1191 form2.fields.push_back(field);
1192 test::CreateTestFormField(
1193 "Last name:", "last_name", "Washington", "text", &field);
1194 form2.fields.push_back(field);
1195 test::CreateTestFormField(
1196 "Address:", "address", "1600 Pennsylvania Avenue", "text", &field);
1197 form2.fields.push_back(field);
1198 test::CreateTestFormField(
1199 "Address Line 2:", "address2", "Suite A", "text", &field);
1200 form2.fields.push_back(field);
1201 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
1202 form2.fields.push_back(field);
1203 test::CreateTestFormField("State:", "state", "California", "text", &field);
1204 form2.fields.push_back(field);
1205 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
1206 form2.fields.push_back(field);
1207 test::CreateTestFormField(
1208 "Email:", "email", "theprez@gmail.com", "text", &field);
1209 form2.fields.push_back(field);
1210 // Country gets added.
1211 test::CreateTestFormField("Country:", "country", "USA", "text", &field);
1212 form2.fields.push_back(field);
1213 // Phone gets updated.
1214 test::CreateTestFormField("Phone:", "phone", "6502231234", "text", &field);
1215 form2.fields.push_back(field);
1217 FormStructure form_structure2(form2);
1218 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1219 EXPECT_TRUE(personal_data_->ImportFormData(form_structure2,
1220 &imported_credit_card));
1221 ASSERT_FALSE(imported_credit_card);
1223 // Verify that the web database has been updated and the notification sent.
1224 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1225 .WillOnce(QuitMainMessageLoop());
1226 base::MessageLoop::current()->Run();
1228 const std::vector<AutofillProfile*>& results2 = personal_data_->GetProfiles();
1230 // Add multi-valued phone number to expectation. Also, country gets added.
1231 std::vector<base::string16> values;
1232 expected.GetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, &values);
1233 values.push_back(ASCIIToUTF16("(650) 223-1234"));
1234 expected.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, values);
1235 expected.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
1236 ASSERT_EQ(1U, results2.size());
1237 EXPECT_EQ(0, expected.Compare(*results2[0]));
1240 TEST_F(PersonalDataManagerTest, AggregateProfileWithMissingInfoInOld) {
1242 FormFieldData field;
1243 test::CreateTestFormField(
1244 "First name:", "first_name", "George", "text", &field);
1245 form1.fields.push_back(field);
1246 test::CreateTestFormField(
1247 "Last name:", "last_name", "Washington", "text", &field);
1248 form1.fields.push_back(field);
1249 test::CreateTestFormField(
1250 "Address Line 1:", "address", "190 High Street", "text", &field);
1251 form1.fields.push_back(field);
1252 test::CreateTestFormField("City:", "city", "Philadelphia", "text", &field);
1253 form1.fields.push_back(field);
1254 test::CreateTestFormField("State:", "state", "Pennsylvania", "text", &field);
1255 form1.fields.push_back(field);
1256 test::CreateTestFormField("Zip:", "zipcode", "19106", "text", &field);
1257 form1.fields.push_back(field);
1259 FormStructure form_structure1(form1);
1260 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1261 scoped_ptr<CreditCard> imported_credit_card;
1262 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
1263 &imported_credit_card));
1264 EXPECT_FALSE(imported_credit_card);
1266 // Verify that the web database has been updated and the notification sent.
1267 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1268 .WillOnce(QuitMainMessageLoop());
1269 base::MessageLoop::current()->Run();
1271 AutofillProfile expected(base::GenerateGUID(), "https://www.example.com");
1272 test::SetProfileInfo(&expected, "George", NULL,
1273 "Washington", NULL, NULL, "190 High Street", NULL,
1274 "Philadelphia", "Pennsylvania", "19106", NULL, NULL);
1275 const std::vector<AutofillProfile*>& results1 = personal_data_->GetProfiles();
1276 ASSERT_EQ(1U, results1.size());
1277 EXPECT_EQ(0, expected.Compare(*results1[0]));
1279 // Submit a form with new data for the first profile.
1281 test::CreateTestFormField(
1282 "First name:", "first_name", "George", "text", &field);
1283 form2.fields.push_back(field);
1284 test::CreateTestFormField(
1285 "Last name:", "last_name", "Washington", "text", &field);
1286 form2.fields.push_back(field);
1287 test::CreateTestFormField(
1288 "Email:", "email", "theprez@gmail.com", "text", &field);
1289 form2.fields.push_back(field);
1290 test::CreateTestFormField(
1291 "Address Line 1:", "address", "190 High Street", "text", &field);
1292 form2.fields.push_back(field);
1293 test::CreateTestFormField("City:", "city", "Philadelphia", "text", &field);
1294 form2.fields.push_back(field);
1295 test::CreateTestFormField("State:", "state", "Pennsylvania", "text", &field);
1296 form2.fields.push_back(field);
1297 test::CreateTestFormField("Zip:", "zipcode", "19106", "text", &field);
1298 form2.fields.push_back(field);
1300 FormStructure form_structure2(form2);
1301 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1302 EXPECT_TRUE(personal_data_->ImportFormData(form_structure2,
1303 &imported_credit_card));
1304 ASSERT_FALSE(imported_credit_card);
1306 // Verify that the web database has been updated and the notification sent.
1307 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1308 .WillOnce(QuitMainMessageLoop());
1309 base::MessageLoop::current()->Run();
1311 const std::vector<AutofillProfile*>& results2 = personal_data_->GetProfiles();
1313 AutofillProfile expected2(base::GenerateGUID(), "https://www.example.com");
1314 test::SetProfileInfo(&expected2, "George", NULL,
1315 "Washington", "theprez@gmail.com", NULL, "190 High Street", NULL,
1316 "Philadelphia", "Pennsylvania", "19106", NULL, NULL);
1317 ASSERT_EQ(1U, results2.size());
1318 EXPECT_EQ(0, expected2.Compare(*results2[0]));
1321 TEST_F(PersonalDataManagerTest, AggregateProfileWithMissingInfoInNew) {
1323 FormFieldData field;
1324 test::CreateTestFormField(
1325 "First name:", "first_name", "George", "text", &field);
1326 form1.fields.push_back(field);
1327 test::CreateTestFormField(
1328 "Last name:", "last_name", "Washington", "text", &field);
1329 form1.fields.push_back(field);
1330 test::CreateTestFormField(
1331 "Company:", "company", "Government", "text", &field);
1332 form1.fields.push_back(field);
1333 test::CreateTestFormField(
1334 "Email:", "email", "theprez@gmail.com", "text", &field);
1335 form1.fields.push_back(field);
1336 test::CreateTestFormField(
1337 "Address Line 1:", "address", "190 High Street", "text", &field);
1338 form1.fields.push_back(field);
1339 test::CreateTestFormField("City:", "city", "Philadelphia", "text", &field);
1340 form1.fields.push_back(field);
1341 test::CreateTestFormField("State:", "state", "Pennsylvania", "text", &field);
1342 form1.fields.push_back(field);
1343 test::CreateTestFormField("Zip:", "zipcode", "19106", "text", &field);
1344 form1.fields.push_back(field);
1346 FormStructure form_structure1(form1);
1347 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1348 scoped_ptr<CreditCard> imported_credit_card;
1349 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
1350 &imported_credit_card));
1351 ASSERT_FALSE(imported_credit_card);
1353 // Verify that the web database has been updated and the notification sent.
1354 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1355 .WillOnce(QuitMainMessageLoop());
1356 base::MessageLoop::current()->Run();
1358 AutofillProfile expected(base::GenerateGUID(), "https://www.example.com");
1359 test::SetProfileInfo(&expected, "George", NULL,
1360 "Washington", "theprez@gmail.com", "Government", "190 High Street", NULL,
1361 "Philadelphia", "Pennsylvania", "19106", NULL, NULL);
1362 const std::vector<AutofillProfile*>& results1 = personal_data_->GetProfiles();
1363 ASSERT_EQ(1U, results1.size());
1364 EXPECT_EQ(0, expected.Compare(*results1[0]));
1366 // Submit a form with new data for the first profile.
1368 test::CreateTestFormField(
1369 "First name:", "first_name", "George", "text", &field);
1370 form2.fields.push_back(field);
1371 test::CreateTestFormField(
1372 "Last name:", "last_name", "Washington", "text", &field);
1373 form2.fields.push_back(field);
1374 // Note missing Company field.
1375 test::CreateTestFormField(
1376 "Email:", "email", "theprez@gmail.com", "text", &field);
1377 form2.fields.push_back(field);
1378 test::CreateTestFormField(
1379 "Address Line 1:", "address", "190 High Street", "text", &field);
1380 form2.fields.push_back(field);
1381 test::CreateTestFormField("City:", "city", "Philadelphia", "text", &field);
1382 form2.fields.push_back(field);
1383 test::CreateTestFormField("State:", "state", "Pennsylvania", "text", &field);
1384 form2.fields.push_back(field);
1385 test::CreateTestFormField("Zip:", "zipcode", "19106", "text", &field);
1386 form2.fields.push_back(field);
1388 FormStructure form_structure2(form2);
1389 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1390 EXPECT_TRUE(personal_data_->ImportFormData(form_structure2,
1391 &imported_credit_card));
1392 ASSERT_FALSE(imported_credit_card);
1394 // Verify that the web database has been updated and the notification sent.
1395 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1396 .WillOnce(QuitMainMessageLoop());
1397 base::MessageLoop::current()->Run();
1399 const std::vector<AutofillProfile*>& results2 = personal_data_->GetProfiles();
1401 // Expect no change.
1402 ASSERT_EQ(1U, results2.size());
1403 EXPECT_EQ(0, expected.Compare(*results2[0]));
1406 TEST_F(PersonalDataManagerTest, AggregateProfileWithInsufficientAddress) {
1408 FormFieldData field;
1409 test::CreateTestFormField(
1410 "First name:", "first_name", "George", "text", &field);
1411 form1.fields.push_back(field);
1412 test::CreateTestFormField(
1413 "Last name:", "last_name", "Washington", "text", &field);
1414 form1.fields.push_back(field);
1415 test::CreateTestFormField(
1416 "Company:", "company", "Government", "text", &field);
1417 form1.fields.push_back(field);
1418 test::CreateTestFormField(
1419 "Email:", "email", "theprez@gmail.com", "text", &field);
1420 form1.fields.push_back(field);
1421 test::CreateTestFormField(
1422 "Address Line 1:", "address", "190 High Street", "text", &field);
1423 form1.fields.push_back(field);
1424 test::CreateTestFormField("City:", "city", "Philadelphia", "text", &field);
1425 form1.fields.push_back(field);
1427 FormStructure form_structure1(form1);
1428 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1429 scoped_ptr<CreditCard> imported_credit_card;
1430 EXPECT_FALSE(personal_data_->ImportFormData(form_structure1,
1431 &imported_credit_card));
1432 ASSERT_FALSE(imported_credit_card);
1434 // Since no refresh is expected, reload the data from the database to make
1435 // sure no changes were written out.
1436 ResetPersonalDataManager(USER_MODE_NORMAL);
1438 const std::vector<AutofillProfile*>& profiles = personal_data_->GetProfiles();
1439 ASSERT_EQ(0U, profiles.size());
1440 const std::vector<CreditCard*>& cards = personal_data_->GetCreditCards();
1441 ASSERT_EQ(0U, cards.size());
1444 TEST_F(PersonalDataManagerTest, AggregateExistingAuxiliaryProfile) {
1445 // Simulate having access to an auxiliary profile.
1446 // |auxiliary_profile| will be owned by |personal_data_|.
1447 AutofillProfile* auxiliary_profile =
1448 new AutofillProfile(base::GenerateGUID(), "https://www.example.com");
1449 test::SetProfileInfo(auxiliary_profile,
1450 "Tester", "Frederick", "McAddressBookTesterson",
1451 "tester@example.com", "Acme Inc.", "1 Main", "Apt A", "San Francisco",
1452 "CA", "94102", "US", "1.415.888.9999");
1453 ScopedVector<AutofillProfile>& auxiliary_profiles =
1454 personal_data_->auxiliary_profiles_;
1455 auxiliary_profiles.push_back(auxiliary_profile);
1457 // Simulate a form submission with a subset of the info.
1458 // Note that the phone number format is different from the saved format.
1460 FormFieldData field;
1461 test::CreateTestFormField(
1462 "First name:", "first_name", "Tester", "text", &field);
1463 form.fields.push_back(field);
1464 test::CreateTestFormField(
1465 "Last name:", "last_name", "McAddressBookTesterson", "text", &field);
1466 form.fields.push_back(field);
1467 test::CreateTestFormField(
1468 "Email:", "email", "tester@example.com", "text", &field);
1469 form.fields.push_back(field);
1470 test::CreateTestFormField("Address:", "address1", "1 Main", "text", &field);
1471 form.fields.push_back(field);
1472 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
1473 form.fields.push_back(field);
1474 test::CreateTestFormField("State:", "state", "CA", "text", &field);
1475 form.fields.push_back(field);
1476 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
1477 form.fields.push_back(field);
1478 test::CreateTestFormField("Phone:", "phone", "4158889999", "text", &field);
1479 form.fields.push_back(field);
1481 FormStructure form_structure(form);
1482 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
1483 scoped_ptr<CreditCard> imported_credit_card;
1484 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
1485 &imported_credit_card));
1486 EXPECT_FALSE(imported_credit_card);
1488 // Note: No refresh.
1490 // Expect no change.
1491 const std::vector<AutofillProfile*>& web_profiles =
1492 personal_data_->web_profiles();
1493 EXPECT_EQ(0U, web_profiles.size());
1494 ASSERT_EQ(1U, auxiliary_profiles.size());
1495 EXPECT_EQ(0, auxiliary_profile->Compare(*auxiliary_profiles[0]));
1498 TEST_F(PersonalDataManagerTest, AggregateTwoDifferentCreditCards) {
1501 // Start with a single valid credit card form.
1502 FormFieldData field;
1503 test::CreateTestFormField(
1504 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
1505 form1.fields.push_back(field);
1506 test::CreateTestFormField(
1507 "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
1508 form1.fields.push_back(field);
1509 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1510 form1.fields.push_back(field);
1511 test::CreateTestFormField("Exp Year:", "exp_year", "2011", "text", &field);
1512 form1.fields.push_back(field);
1514 FormStructure form_structure1(form1);
1515 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1516 scoped_ptr<CreditCard> imported_credit_card;
1517 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
1518 &imported_credit_card));
1519 ASSERT_TRUE(imported_credit_card);
1520 personal_data_->SaveImportedCreditCard(*imported_credit_card);
1522 // Verify that the web database has been updated and the notification sent.
1523 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1524 .WillOnce(QuitMainMessageLoop());
1525 base::MessageLoop::current()->Run();
1527 CreditCard expected(base::GenerateGUID(), "https://www.example.com");
1528 test::SetCreditCardInfo(&expected,
1529 "Biggie Smalls", "4111111111111111", "01", "2011");
1530 const std::vector<CreditCard*>& results = personal_data_->GetCreditCards();
1531 ASSERT_EQ(1U, results.size());
1532 EXPECT_EQ(0, expected.Compare(*results[0]));
1534 // Add a second different valid credit card.
1536 test::CreateTestFormField(
1537 "Name on card:", "name_on_card", "", "text", &field);
1538 form2.fields.push_back(field);
1539 test::CreateTestFormField(
1540 "Card Number:", "card_number", "5500 0000 0000 0004", "text", &field);
1541 form2.fields.push_back(field);
1542 test::CreateTestFormField("Exp Month:", "exp_month", "02", "text", &field);
1543 form2.fields.push_back(field);
1544 test::CreateTestFormField("Exp Year:", "exp_year", "2012", "text", &field);
1545 form2.fields.push_back(field);
1547 FormStructure form_structure2(form2);
1548 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1549 EXPECT_TRUE(personal_data_->ImportFormData(form_structure2,
1550 &imported_credit_card));
1551 ASSERT_TRUE(imported_credit_card);
1552 personal_data_->SaveImportedCreditCard(*imported_credit_card);
1554 // Verify that the web database has been updated and the notification sent.
1555 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1556 .WillOnce(QuitMainMessageLoop());
1557 base::MessageLoop::current()->Run();
1559 CreditCard expected2(base::GenerateGUID(), "https://www.example.com");
1560 test::SetCreditCardInfo(&expected2,"", "5500000000000004", "02", "2012");
1561 std::vector<CreditCard*> cards;
1562 cards.push_back(&expected);
1563 cards.push_back(&expected2);
1564 ExpectSameElements(cards, personal_data_->GetCreditCards());
1567 TEST_F(PersonalDataManagerTest, AggregateInvalidCreditCard) {
1570 // Start with a single valid credit card form.
1571 FormFieldData field;
1572 test::CreateTestFormField(
1573 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
1574 form1.fields.push_back(field);
1575 test::CreateTestFormField(
1576 "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
1577 form1.fields.push_back(field);
1578 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1579 form1.fields.push_back(field);
1580 test::CreateTestFormField("Exp Year:", "exp_year", "2011", "text", &field);
1581 form1.fields.push_back(field);
1583 FormStructure form_structure1(form1);
1584 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1585 scoped_ptr<CreditCard> imported_credit_card;
1586 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
1587 &imported_credit_card));
1588 ASSERT_TRUE(imported_credit_card);
1589 personal_data_->SaveImportedCreditCard(*imported_credit_card);
1591 // Verify that the web database has been updated and the notification sent.
1592 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1593 .WillOnce(QuitMainMessageLoop());
1594 base::MessageLoop::current()->Run();
1596 CreditCard expected(base::GenerateGUID(), "https://www.example.com");
1597 test::SetCreditCardInfo(&expected,
1598 "Biggie Smalls", "4111111111111111", "01", "2011");
1599 const std::vector<CreditCard*>& results = personal_data_->GetCreditCards();
1600 ASSERT_EQ(1U, results.size());
1601 EXPECT_EQ(0, expected.Compare(*results[0]));
1603 // Add a second different invalid credit card.
1605 test::CreateTestFormField(
1606 "Name on card:", "name_on_card", "Jim Johansen", "text", &field);
1607 form2.fields.push_back(field);
1608 test::CreateTestFormField(
1609 "Card Number:", "card_number", "1000000000000000", "text", &field);
1610 form2.fields.push_back(field);
1611 test::CreateTestFormField("Exp Month:", "exp_month", "02", "text", &field);
1612 form2.fields.push_back(field);
1613 test::CreateTestFormField("Exp Year:", "exp_year", "2012", "text", &field);
1614 form2.fields.push_back(field);
1616 FormStructure form_structure2(form2);
1617 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1618 EXPECT_FALSE(personal_data_->ImportFormData(form_structure2,
1619 &imported_credit_card));
1620 ASSERT_FALSE(imported_credit_card);
1622 // Since no refresh is expected, reload the data from the database to make
1623 // sure no changes were written out.
1624 ResetPersonalDataManager(USER_MODE_NORMAL);
1626 const std::vector<CreditCard*>& results2 = personal_data_->GetCreditCards();
1627 ASSERT_EQ(1U, results2.size());
1628 EXPECT_EQ(0, expected.Compare(*results2[0]));
1631 TEST_F(PersonalDataManagerTest, AggregateSameCreditCardWithConflict) {
1634 // Start with a single valid credit card form.
1635 FormFieldData field;
1636 test::CreateTestFormField(
1637 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
1638 form1.fields.push_back(field);
1639 test::CreateTestFormField(
1640 "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
1641 form1.fields.push_back(field);
1642 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1643 form1.fields.push_back(field);
1644 test::CreateTestFormField("Exp Year:", "exp_year", "2011", "text", &field);
1645 form1.fields.push_back(field);
1647 FormStructure form_structure1(form1);
1648 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1649 scoped_ptr<CreditCard> imported_credit_card;
1650 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
1651 &imported_credit_card));
1652 ASSERT_TRUE(imported_credit_card);
1653 personal_data_->SaveImportedCreditCard(*imported_credit_card);
1655 // Verify that the web database has been updated and the notification sent.
1656 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1657 .WillOnce(QuitMainMessageLoop());
1658 base::MessageLoop::current()->Run();
1660 CreditCard expected(base::GenerateGUID(), "https://www.example.com");
1661 test::SetCreditCardInfo(&expected,
1662 "Biggie Smalls", "4111111111111111", "01", "2011");
1663 const std::vector<CreditCard*>& results = personal_data_->GetCreditCards();
1664 ASSERT_EQ(1U, results.size());
1665 EXPECT_EQ(0, expected.Compare(*results[0]));
1667 // Add a second different valid credit card where the year is different but
1668 // the credit card number matches.
1670 test::CreateTestFormField(
1671 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
1672 form2.fields.push_back(field);
1673 test::CreateTestFormField(
1674 "Card Number:", "card_number", "4111 1111 1111 1111", "text", &field);
1675 form2.fields.push_back(field);
1676 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1677 form2.fields.push_back(field);
1678 test::CreateTestFormField("Exp Year:", "exp_year", "2012", "text", &field);
1679 form2.fields.push_back(field);
1681 FormStructure form_structure2(form2);
1682 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1683 EXPECT_TRUE(personal_data_->ImportFormData(form_structure2,
1684 &imported_credit_card));
1685 EXPECT_FALSE(imported_credit_card);
1687 // Verify that the web database has been updated and the notification sent.
1688 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1689 .WillOnce(QuitMainMessageLoop());
1690 base::MessageLoop::current()->Run();
1692 // Expect that the newer information is saved. In this case the year is
1693 // updated to "2012".
1694 CreditCard expected2(base::GenerateGUID(), "https://www.example.com");
1695 test::SetCreditCardInfo(&expected2,
1696 "Biggie Smalls", "4111111111111111", "01", "2012");
1697 const std::vector<CreditCard*>& results2 = personal_data_->GetCreditCards();
1698 ASSERT_EQ(1U, results2.size());
1699 EXPECT_EQ(0, expected2.Compare(*results2[0]));
1702 TEST_F(PersonalDataManagerTest, AggregateEmptyCreditCardWithConflict) {
1705 // Start with a single valid credit card form.
1706 FormFieldData field;
1707 test::CreateTestFormField(
1708 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
1709 form1.fields.push_back(field);
1710 test::CreateTestFormField(
1711 "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
1712 form1.fields.push_back(field);
1713 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1714 form1.fields.push_back(field);
1715 test::CreateTestFormField("Exp Year:", "exp_year", "2011", "text", &field);
1716 form1.fields.push_back(field);
1718 FormStructure form_structure1(form1);
1719 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1720 scoped_ptr<CreditCard> imported_credit_card;
1721 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
1722 &imported_credit_card));
1723 ASSERT_TRUE(imported_credit_card);
1724 personal_data_->SaveImportedCreditCard(*imported_credit_card);
1726 // Verify that the web database has been updated and the notification sent.
1727 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1728 .WillOnce(QuitMainMessageLoop());
1729 base::MessageLoop::current()->Run();
1731 CreditCard expected(base::GenerateGUID(), "https://www.example.com");
1732 test::SetCreditCardInfo(&expected,
1733 "Biggie Smalls", "4111111111111111", "01", "2011");
1734 const std::vector<CreditCard*>& results = personal_data_->GetCreditCards();
1735 ASSERT_EQ(1U, results.size());
1736 EXPECT_EQ(0, expected.Compare(*results[0]));
1738 // Add a second credit card with no number.
1740 test::CreateTestFormField(
1741 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
1742 form2.fields.push_back(field);
1743 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1744 form2.fields.push_back(field);
1745 test::CreateTestFormField("Exp Year:", "exp_year", "2012", "text", &field);
1746 form2.fields.push_back(field);
1748 FormStructure form_structure2(form2);
1749 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1750 EXPECT_FALSE(personal_data_->ImportFormData(form_structure2,
1751 &imported_credit_card));
1752 EXPECT_FALSE(imported_credit_card);
1754 // Since no refresh is expected, reload the data from the database to make
1755 // sure no changes were written out.
1756 ResetPersonalDataManager(USER_MODE_NORMAL);
1758 // No change is expected.
1759 CreditCard expected2(base::GenerateGUID(), "https://www.example.com");
1760 test::SetCreditCardInfo(&expected2,
1761 "Biggie Smalls", "4111111111111111", "01", "2011");
1762 const std::vector<CreditCard*>& results2 = personal_data_->GetCreditCards();
1763 ASSERT_EQ(1U, results2.size());
1764 EXPECT_EQ(0, expected2.Compare(*results2[0]));
1767 TEST_F(PersonalDataManagerTest, AggregateCreditCardWithMissingInfoInNew) {
1770 // Start with a single valid credit card form.
1771 FormFieldData field;
1772 test::CreateTestFormField(
1773 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
1774 form1.fields.push_back(field);
1775 test::CreateTestFormField(
1776 "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
1777 form1.fields.push_back(field);
1778 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1779 form1.fields.push_back(field);
1780 test::CreateTestFormField("Exp Year:", "exp_year", "2011", "text", &field);
1781 form1.fields.push_back(field);
1783 FormStructure form_structure1(form1);
1784 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
1785 scoped_ptr<CreditCard> imported_credit_card;
1786 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
1787 &imported_credit_card));
1788 ASSERT_TRUE(imported_credit_card);
1789 personal_data_->SaveImportedCreditCard(*imported_credit_card);
1791 // Verify that the web database has been updated and the notification sent.
1792 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1793 .WillOnce(QuitMainMessageLoop());
1794 base::MessageLoop::current()->Run();
1796 CreditCard expected(base::GenerateGUID(), "https://www.example.com");
1797 test::SetCreditCardInfo(&expected,
1798 "Biggie Smalls", "4111111111111111", "01", "2011");
1799 const std::vector<CreditCard*>& results = personal_data_->GetCreditCards();
1800 ASSERT_EQ(1U, results.size());
1801 EXPECT_EQ(0, expected.Compare(*results[0]));
1803 // Add a second different valid credit card where the name is missing but
1804 // the credit card number matches.
1806 // Note missing name.
1807 test::CreateTestFormField(
1808 "Card Number:", "card_number", "4111111111111111", "text", &field);
1809 form2.fields.push_back(field);
1810 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1811 form2.fields.push_back(field);
1812 test::CreateTestFormField("Exp Year:", "exp_year", "2011", "text", &field);
1813 form2.fields.push_back(field);
1815 FormStructure form_structure2(form2);
1816 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
1817 EXPECT_TRUE(personal_data_->ImportFormData(form_structure2,
1818 &imported_credit_card));
1819 EXPECT_FALSE(imported_credit_card);
1821 // Since no refresh is expected, reload the data from the database to make
1822 // sure no changes were written out.
1823 ResetPersonalDataManager(USER_MODE_NORMAL);
1825 // No change is expected.
1826 CreditCard expected2(base::GenerateGUID(), "https://www.example.com");
1827 test::SetCreditCardInfo(&expected2,
1828 "Biggie Smalls", "4111111111111111", "01", "2011");
1829 const std::vector<CreditCard*>& results2 = personal_data_->GetCreditCards();
1830 ASSERT_EQ(1U, results2.size());
1831 EXPECT_EQ(0, expected2.Compare(*results2[0]));
1833 // Add a third credit card where the expiration date is missing.
1835 test::CreateTestFormField(
1836 "Name on card:", "name_on_card", "Johnny McEnroe", "text", &field);
1837 form3.fields.push_back(field);
1838 test::CreateTestFormField(
1839 "Card Number:", "card_number", "5555555555554444", "text", &field);
1840 form3.fields.push_back(field);
1841 // Note missing expiration month and year..
1843 FormStructure form_structure3(form3);
1844 form_structure3.DetermineHeuristicTypes(TestAutofillMetrics());
1845 EXPECT_FALSE(personal_data_->ImportFormData(form_structure3,
1846 &imported_credit_card));
1847 ASSERT_FALSE(imported_credit_card);
1849 // Since no refresh is expected, reload the data from the database to make
1850 // sure no changes were written out.
1851 ResetPersonalDataManager(USER_MODE_NORMAL);
1853 // No change is expected.
1854 CreditCard expected3(base::GenerateGUID(), "https://www.example.com");
1855 test::SetCreditCardInfo(&expected3,
1856 "Biggie Smalls", "4111111111111111", "01", "2011");
1857 const std::vector<CreditCard*>& results3 = personal_data_->GetCreditCards();
1858 ASSERT_EQ(1U, results3.size());
1859 EXPECT_EQ(0, expected3.Compare(*results3[0]));
1862 TEST_F(PersonalDataManagerTest, AggregateCreditCardWithMissingInfoInOld) {
1863 // Start with a single valid credit card stored via the preferences.
1864 // Note the empty name.
1865 CreditCard saved_credit_card(base::GenerateGUID(), "https://www.example.com");
1866 test::SetCreditCardInfo(&saved_credit_card,
1867 "", "4111111111111111" /* Visa */, "01", "2011");
1868 personal_data_->AddCreditCard(saved_credit_card);
1870 // Verify that the web database has been updated and the notification sent.
1871 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1872 .WillOnce(QuitMainMessageLoop());
1873 base::MessageLoop::current()->Run();
1875 const std::vector<CreditCard*>& results1 = personal_data_->GetCreditCards();
1876 ASSERT_EQ(1U, results1.size());
1877 EXPECT_EQ(saved_credit_card, *results1[0]);
1880 // Add a second different valid credit card where the year is different but
1881 // the credit card number matches.
1883 FormFieldData field;
1884 test::CreateTestFormField(
1885 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
1886 form.fields.push_back(field);
1887 test::CreateTestFormField(
1888 "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
1889 form.fields.push_back(field);
1890 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1891 form.fields.push_back(field);
1892 test::CreateTestFormField("Exp Year:", "exp_year", "2012", "text", &field);
1893 form.fields.push_back(field);
1895 FormStructure form_structure(form);
1896 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
1897 scoped_ptr<CreditCard> imported_credit_card;
1898 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
1899 &imported_credit_card));
1900 EXPECT_FALSE(imported_credit_card);
1902 // Verify that the web database has been updated and the notification sent.
1903 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1904 .WillOnce(QuitMainMessageLoop());
1905 base::MessageLoop::current()->Run();
1907 // Expect that the newer information is saved. In this case the year is
1908 // added to the existing credit card.
1909 CreditCard expected2(base::GenerateGUID(), "https://www.example.com");
1910 test::SetCreditCardInfo(&expected2,
1911 "Biggie Smalls", "4111111111111111", "01", "2012");
1912 const std::vector<CreditCard*>& results2 = personal_data_->GetCreditCards();
1913 ASSERT_EQ(1U, results2.size());
1914 EXPECT_EQ(0, expected2.Compare(*results2[0]));
1917 // We allow the user to store a credit card number with separators via the UI.
1918 // We should not try to re-aggregate the same card with the separators stripped.
1919 TEST_F(PersonalDataManagerTest, AggregateSameCreditCardWithSeparators) {
1920 // Start with a single valid credit card stored via the preferences.
1921 // Note the separators in the credit card number.
1922 CreditCard saved_credit_card(base::GenerateGUID(), "https://www.example.com");
1923 test::SetCreditCardInfo(&saved_credit_card,
1924 "Biggie Smalls", "4111 1111 1111 1111" /* Visa */, "01", "2011");
1925 personal_data_->AddCreditCard(saved_credit_card);
1927 // Verify that the web database has been updated and the notification sent.
1928 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1929 .WillOnce(QuitMainMessageLoop());
1930 base::MessageLoop::current()->Run();
1932 const std::vector<CreditCard*>& results1 = personal_data_->GetCreditCards();
1933 ASSERT_EQ(1U, results1.size());
1934 EXPECT_EQ(0, saved_credit_card.Compare(*results1[0]));
1936 // Import the same card info, but with different separators in the number.
1938 FormFieldData field;
1939 test::CreateTestFormField(
1940 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
1941 form.fields.push_back(field);
1942 test::CreateTestFormField(
1943 "Card Number:", "card_number", "4111-1111-1111-1111", "text", &field);
1944 form.fields.push_back(field);
1945 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
1946 form.fields.push_back(field);
1947 test::CreateTestFormField("Exp Year:", "exp_year", "2011", "text", &field);
1948 form.fields.push_back(field);
1950 FormStructure form_structure(form);
1951 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
1952 scoped_ptr<CreditCard> imported_credit_card;
1953 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
1954 &imported_credit_card));
1955 EXPECT_FALSE(imported_credit_card);
1957 // Since no refresh is expected, reload the data from the database to make
1958 // sure no changes were written out.
1959 ResetPersonalDataManager(USER_MODE_NORMAL);
1961 // Expect that no new card is saved.
1962 const std::vector<CreditCard*>& results2 = personal_data_->GetCreditCards();
1963 ASSERT_EQ(1U, results2.size());
1964 EXPECT_EQ(0, saved_credit_card.Compare(*results2[0]));
1967 // Ensure that if a verified profile already exists, aggregated profiles cannot
1968 // modify it in any way.
1969 TEST_F(PersonalDataManagerTest, AggregateExistingVerifiedProfileWithConflict) {
1970 // Start with a verified profile.
1971 AutofillProfile profile(base::GenerateGUID(), "Chrome settings");
1972 test::SetProfileInfo(&profile,
1973 "Marion", "Mitchell", "Morrison",
1974 "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
1975 "91601", "US", "12345678910");
1976 EXPECT_TRUE(profile.IsVerified());
1978 // Add the profile to the database.
1979 personal_data_->AddProfile(profile);
1981 // Verify that the web database has been updated and the notification sent.
1982 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
1983 .WillOnce(QuitMainMessageLoop());
1984 base::MessageLoop::current()->Run();
1986 // Simulate a form submission with conflicting info.
1988 FormFieldData field;
1989 test::CreateTestFormField(
1990 "First name:", "first_name", "Marion", "text", &field);
1991 form.fields.push_back(field);
1992 test::CreateTestFormField(
1993 "Last name:", "last_name", "Morrison", "text", &field);
1994 form.fields.push_back(field);
1995 test::CreateTestFormField(
1996 "Email:", "email", "other.email@example.com", "text", &field);
1997 form.fields.push_back(field);
1998 test::CreateTestFormField(
1999 "Address:", "address1", "123 Zoo St.", "text", &field);
2000 form.fields.push_back(field);
2001 test::CreateTestFormField("City:", "city", "Hollywood", "text", &field);
2002 form.fields.push_back(field);
2003 test::CreateTestFormField("State:", "state", "CA", "text", &field);
2004 form.fields.push_back(field);
2005 test::CreateTestFormField("Zip:", "zip", "91601", "text", &field);
2006 form.fields.push_back(field);
2008 FormStructure form_structure(form);
2009 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
2010 scoped_ptr<CreditCard> imported_credit_card;
2011 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
2012 &imported_credit_card));
2013 EXPECT_FALSE(imported_credit_card);
2015 // Wait for the refresh, which in this case is a no-op.
2016 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2017 .WillOnce(QuitMainMessageLoop());
2018 base::MessageLoop::current()->Run();
2020 // Expect that no new profile is saved.
2021 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
2022 ASSERT_EQ(1U, results.size());
2023 EXPECT_EQ(0, profile.Compare(*results[0]));
2026 // Ensure that if a verified credit card already exists, aggregated credit cards
2027 // cannot modify it in any way.
2028 TEST_F(PersonalDataManagerTest,
2029 AggregateExistingVerifiedCreditCardWithConflict) {
2030 // Start with a verified credit card.
2031 CreditCard credit_card(base::GenerateGUID(), "Chrome settings");
2032 test::SetCreditCardInfo(&credit_card,
2033 "Biggie Smalls", "4111 1111 1111 1111" /* Visa */, "01", "2011");
2034 EXPECT_TRUE(credit_card.IsVerified());
2036 // Add the credit card to the database.
2037 personal_data_->AddCreditCard(credit_card);
2039 // Verify that the web database has been updated and the notification sent.
2040 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2041 .WillOnce(QuitMainMessageLoop());
2042 base::MessageLoop::current()->Run();
2044 // Simulate a form submission with conflicting expiration year.
2046 FormFieldData field;
2047 test::CreateTestFormField(
2048 "Name on card:", "name_on_card", "Biggie Smalls", "text", &field);
2049 form.fields.push_back(field);
2050 test::CreateTestFormField(
2051 "Card Number:", "card_number", "4111 1111 1111 1111", "text", &field);
2052 form.fields.push_back(field);
2053 test::CreateTestFormField("Exp Month:", "exp_month", "01", "text", &field);
2054 form.fields.push_back(field);
2055 test::CreateTestFormField("Exp Year:", "exp_year", "2012", "text", &field);
2056 form.fields.push_back(field);
2058 FormStructure form_structure(form);
2059 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
2060 scoped_ptr<CreditCard> imported_credit_card;
2061 EXPECT_TRUE(personal_data_->ImportFormData(form_structure,
2062 &imported_credit_card));
2063 ASSERT_FALSE(imported_credit_card);
2065 // Since no refresh is expected, reload the data from the database to make
2066 // sure no changes were written out.
2067 ResetPersonalDataManager(USER_MODE_NORMAL);
2069 // Expect that the saved credit card is not modified.
2070 const std::vector<CreditCard*>& results = personal_data_->GetCreditCards();
2071 ASSERT_EQ(1U, results.size());
2072 EXPECT_EQ(0, credit_card.Compare(*results[0]));
2075 // Ensure that verified profiles can be saved via SaveImportedProfile,
2076 // overwriting existing unverified profiles.
2077 TEST_F(PersonalDataManagerTest, SaveImportedProfileWithVerifiedData) {
2078 // Start with an unverified profile.
2079 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com");
2080 test::SetProfileInfo(&profile,
2081 "Marion", "Mitchell", "Morrison",
2082 "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
2083 "91601", "US", "12345678910");
2084 EXPECT_FALSE(profile.IsVerified());
2086 // Add the profile to the database.
2087 personal_data_->AddProfile(profile);
2089 // Verify that the web database has been updated and the notification sent.
2090 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2091 .WillOnce(QuitMainMessageLoop());
2092 base::MessageLoop::current()->Run();
2094 AutofillProfile new_verified_profile = profile;
2095 new_verified_profile.set_guid(base::GenerateGUID());
2096 new_verified_profile.set_origin("Chrome settings");
2097 new_verified_profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Fizzbang, Inc."));
2098 EXPECT_TRUE(new_verified_profile.IsVerified());
2100 personal_data_->SaveImportedProfile(new_verified_profile);
2102 // Verify that the web database has been updated and the notification sent.
2103 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2104 .WillOnce(QuitMainMessageLoop());
2105 base::MessageLoop::current()->Run();
2107 // Expect that the existing profile is not modified, and instead the new
2108 // profile is added.
2109 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
2110 ASSERT_EQ(1U, results.size());
2111 EXPECT_EQ(0, new_verified_profile.Compare(*results[0]));
2114 // Ensure that verified profiles can be saved via SaveImportedProfile,
2115 // overwriting existing verified profiles as well.
2116 TEST_F(PersonalDataManagerTest, SaveImportedProfileWithExistingVerifiedData) {
2117 // Start with a verified profile.
2118 AutofillProfile profile(base::GenerateGUID(), "Chrome settings");
2119 test::SetProfileInfo(&profile,
2120 "Marion", "Mitchell", "Morrison",
2121 "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
2122 "91601", "US", "12345678910");
2123 EXPECT_TRUE(profile.IsVerified());
2125 // Add the profile to the database.
2126 personal_data_->AddProfile(profile);
2128 // Verify that the web database has been updated and the notification sent.
2129 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2130 .WillOnce(QuitMainMessageLoop());
2131 base::MessageLoop::current()->Run();
2133 AutofillProfile new_verified_profile = profile;
2134 new_verified_profile.set_guid(base::GenerateGUID());
2135 new_verified_profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Fizzbang, Inc."));
2136 new_verified_profile.SetRawInfo(NAME_MIDDLE, base::string16());
2137 EXPECT_TRUE(new_verified_profile.IsVerified());
2139 personal_data_->SaveImportedProfile(new_verified_profile);
2141 // Verify that the web database has been updated and the notification sent.
2142 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2143 .WillOnce(QuitMainMessageLoop());
2144 base::MessageLoop::current()->Run();
2146 // The new profile should be merged into the existing one.
2147 AutofillProfile expected_profile = new_verified_profile;
2148 expected_profile.set_guid(profile.guid());
2149 std::vector<base::string16> first_names, middle_names, last_names;
2150 expected_profile.GetRawMultiInfo(NAME_FIRST, &first_names);
2151 expected_profile.GetRawMultiInfo(NAME_MIDDLE, &middle_names);
2152 expected_profile.GetRawMultiInfo(NAME_LAST, &last_names);
2153 first_names.insert(first_names.begin(), ASCIIToUTF16("Marion"));
2154 middle_names.insert(middle_names.begin(), ASCIIToUTF16("Mitchell"));
2155 last_names.insert(last_names.begin(), ASCIIToUTF16("Morrison"));
2156 expected_profile.SetRawMultiInfo(NAME_FIRST, first_names);
2157 expected_profile.SetRawMultiInfo(NAME_MIDDLE, middle_names);
2158 expected_profile.SetRawMultiInfo(NAME_LAST, last_names);
2160 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
2161 ASSERT_EQ(1U, results.size());
2162 EXPECT_EQ(expected_profile, *results[0]);
2165 // Ensure that verified credit cards can be saved via SaveImportedCreditCard.
2166 TEST_F(PersonalDataManagerTest, SaveImportedCreditCardWithVerifiedData) {
2167 // Start with a verified credit card.
2168 CreditCard credit_card(base::GenerateGUID(), "Chrome settings");
2169 test::SetCreditCardInfo(&credit_card,
2170 "Biggie Smalls", "4111 1111 1111 1111" /* Visa */, "01", "2011");
2171 EXPECT_TRUE(credit_card.IsVerified());
2173 // Add the credit card to the database.
2174 personal_data_->AddCreditCard(credit_card);
2176 // Verify that the web database has been updated and the notification sent.
2177 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2178 .WillOnce(QuitMainMessageLoop());
2179 base::MessageLoop::current()->Run();
2181 CreditCard new_verified_card = credit_card;
2182 new_verified_card.set_guid(base::GenerateGUID());
2183 new_verified_card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("B. Small"));
2184 EXPECT_TRUE(new_verified_card.IsVerified());
2186 personal_data_->SaveImportedCreditCard(new_verified_card);
2188 // Verify that the web database has been updated and the notification sent.
2189 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2190 .WillOnce(QuitMainMessageLoop());
2191 base::MessageLoop::current()->Run();
2193 // Expect that the saved credit card is updated.
2194 const std::vector<CreditCard*>& results = personal_data_->GetCreditCards();
2195 ASSERT_EQ(1U, results.size());
2196 EXPECT_EQ(ASCIIToUTF16("B. Small"), results[0]->GetRawInfo(CREDIT_CARD_NAME));
2199 TEST_F(PersonalDataManagerTest, GetNonEmptyTypes) {
2200 // Check that there are no available types with no profiles stored.
2201 ServerFieldTypeSet non_empty_types;
2202 personal_data_->GetNonEmptyTypes(&non_empty_types);
2203 EXPECT_EQ(0U, non_empty_types.size());
2205 // Test with one profile stored.
2206 AutofillProfile profile0(base::GenerateGUID(), "https://www.example.com");
2207 test::SetProfileInfo(&profile0,
2208 "Marion", NULL, "Morrison",
2209 "johnwayne@me.xyz", NULL, "123 Zoo St.", NULL, "Hollywood", "CA",
2210 "91601", "US", "14155678910");
2212 personal_data_->AddProfile(profile0);
2214 // Verify that the web database has been updated and the notification sent.
2215 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2216 .WillOnce(QuitMainMessageLoop());
2217 base::MessageLoop::current()->Run();
2219 personal_data_->GetNonEmptyTypes(&non_empty_types);
2220 EXPECT_EQ(15U, non_empty_types.size());
2221 EXPECT_TRUE(non_empty_types.count(NAME_FIRST));
2222 EXPECT_TRUE(non_empty_types.count(NAME_LAST));
2223 EXPECT_TRUE(non_empty_types.count(NAME_FULL));
2224 EXPECT_TRUE(non_empty_types.count(EMAIL_ADDRESS));
2225 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_LINE1));
2226 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_STREET_ADDRESS));
2227 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_CITY));
2228 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_STATE));
2229 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_ZIP));
2230 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_COUNTRY));
2231 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_NUMBER));
2232 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_COUNTRY_CODE));
2233 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_CITY_CODE));
2234 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_CITY_AND_NUMBER));
2235 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_WHOLE_NUMBER));
2237 // Test with multiple profiles stored.
2238 AutofillProfile profile1(base::GenerateGUID(), "https://www.example.com");
2239 test::SetProfileInfo(&profile1,
2240 "Josephine", "Alicia", "Saenz",
2241 "joewayne@me.xyz", "Fox", "903 Apple Ct.", NULL, "Orlando", "FL", "32801",
2242 "US", "16502937549");
2244 AutofillProfile profile2(base::GenerateGUID(), "https://www.example.com");
2245 test::SetProfileInfo(&profile2,
2246 "Josephine", "Alicia", "Saenz",
2247 "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
2248 "32801", "US", "16502937549");
2250 personal_data_->AddProfile(profile1);
2251 personal_data_->AddProfile(profile2);
2253 // Verify that the web database has been updated and the notification sent.
2254 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2255 .WillOnce(QuitMainMessageLoop());
2256 base::MessageLoop::current()->Run();
2258 personal_data_->GetNonEmptyTypes(&non_empty_types);
2259 EXPECT_EQ(19U, non_empty_types.size());
2260 EXPECT_TRUE(non_empty_types.count(NAME_FIRST));
2261 EXPECT_TRUE(non_empty_types.count(NAME_MIDDLE));
2262 EXPECT_TRUE(non_empty_types.count(NAME_MIDDLE_INITIAL));
2263 EXPECT_TRUE(non_empty_types.count(NAME_LAST));
2264 EXPECT_TRUE(non_empty_types.count(NAME_FULL));
2265 EXPECT_TRUE(non_empty_types.count(EMAIL_ADDRESS));
2266 EXPECT_TRUE(non_empty_types.count(COMPANY_NAME));
2267 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_LINE1));
2268 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_LINE2));
2269 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_STREET_ADDRESS));
2270 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_CITY));
2271 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_STATE));
2272 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_ZIP));
2273 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_COUNTRY));
2274 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_NUMBER));
2275 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_CITY_CODE));
2276 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_COUNTRY_CODE));
2277 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_CITY_AND_NUMBER));
2278 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_WHOLE_NUMBER));
2280 // Test with credit card information also stored.
2281 CreditCard credit_card(base::GenerateGUID(), "https://www.example.com");
2282 test::SetCreditCardInfo(&credit_card,
2283 "John Dillinger", "423456789012" /* Visa */,
2285 personal_data_->AddCreditCard(credit_card);
2287 // Verify that the web database has been updated and the notification sent.
2288 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2289 .WillOnce(QuitMainMessageLoop());
2290 base::MessageLoop::current()->Run();
2292 personal_data_->GetNonEmptyTypes(&non_empty_types);
2293 EXPECT_EQ(27U, non_empty_types.size());
2294 EXPECT_TRUE(non_empty_types.count(NAME_FIRST));
2295 EXPECT_TRUE(non_empty_types.count(NAME_MIDDLE));
2296 EXPECT_TRUE(non_empty_types.count(NAME_MIDDLE_INITIAL));
2297 EXPECT_TRUE(non_empty_types.count(NAME_LAST));
2298 EXPECT_TRUE(non_empty_types.count(NAME_FULL));
2299 EXPECT_TRUE(non_empty_types.count(EMAIL_ADDRESS));
2300 EXPECT_TRUE(non_empty_types.count(COMPANY_NAME));
2301 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_LINE1));
2302 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_LINE2));
2303 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_STREET_ADDRESS));
2304 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_CITY));
2305 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_STATE));
2306 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_ZIP));
2307 EXPECT_TRUE(non_empty_types.count(ADDRESS_HOME_COUNTRY));
2308 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_NUMBER));
2309 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_CITY_CODE));
2310 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_COUNTRY_CODE));
2311 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_CITY_AND_NUMBER));
2312 EXPECT_TRUE(non_empty_types.count(PHONE_HOME_WHOLE_NUMBER));
2313 EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_NAME));
2314 EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_NUMBER));
2315 EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_TYPE));
2316 EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_EXP_MONTH));
2317 EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_EXP_2_DIGIT_YEAR));
2318 EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2319 EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR));
2320 EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR));
2323 TEST_F(PersonalDataManagerTest, CaseInsensitiveMultiValueAggregation) {
2325 FormFieldData field;
2326 test::CreateTestFormField(
2327 "First name:", "first_name", "George", "text", &field);
2328 form1.fields.push_back(field);
2329 test::CreateTestFormField(
2330 "Last name:", "last_name", "Washington", "text", &field);
2331 form1.fields.push_back(field);
2332 test::CreateTestFormField(
2333 "Email:", "email", "theprez@gmail.com", "text", &field);
2334 form1.fields.push_back(field);
2335 test::CreateTestFormField(
2336 "Address:", "address1", "21 Laussat St", "text", &field);
2337 form1.fields.push_back(field);
2338 test::CreateTestFormField(
2339 "City:", "city", "San Francisco", "text", &field);
2340 form1.fields.push_back(field);
2341 test::CreateTestFormField("State:", "state", "California", "text", &field);
2342 form1.fields.push_back(field);
2343 test::CreateTestFormField(
2344 "Zip:", "zip", "94102", "text", &field);
2345 form1.fields.push_back(field);
2346 test::CreateTestFormField(
2347 "Phone number:", "phone_number", "817-555-6789", "text", &field);
2348 form1.fields.push_back(field);
2350 FormStructure form_structure1(form1);
2351 form_structure1.DetermineHeuristicTypes(TestAutofillMetrics());
2352 scoped_ptr<CreditCard> imported_credit_card;
2353 EXPECT_TRUE(personal_data_->ImportFormData(form_structure1,
2354 &imported_credit_card));
2355 ASSERT_FALSE(imported_credit_card);
2357 // Verify that the web database has been updated and the notification sent.
2358 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2359 .WillOnce(QuitMainMessageLoop());
2360 base::MessageLoop::current()->Run();
2362 AutofillProfile expected(base::GenerateGUID(), "https://www.example.com");
2363 test::SetProfileInfo(&expected,
2367 "theprez@gmail.com",
2376 const std::vector<AutofillProfile*>& results1 = personal_data_->GetProfiles();
2377 ASSERT_EQ(1U, results1.size());
2378 EXPECT_EQ(0, expected.Compare(*results1[0]));
2380 // Upper-case the first name and change the phone number.
2382 test::CreateTestFormField(
2383 "First name:", "first_name", "GEORGE", "text", &field);
2384 form2.fields.push_back(field);
2385 test::CreateTestFormField(
2386 "Last name:", "last_name", "Washington", "text", &field);
2387 form2.fields.push_back(field);
2388 test::CreateTestFormField(
2389 "Email:", "email", "theprez@gmail.com", "text", &field);
2390 form2.fields.push_back(field);
2391 test::CreateTestFormField(
2392 "Address:", "address1", "21 Laussat St", "text", &field);
2393 form2.fields.push_back(field);
2394 test::CreateTestFormField("City:", "city", "San Francisco", "text", &field);
2395 form2.fields.push_back(field);
2396 test::CreateTestFormField("State:", "state", "California", "text", &field);
2397 form2.fields.push_back(field);
2398 test::CreateTestFormField("Zip:", "zip", "94102", "text", &field);
2399 form2.fields.push_back(field);
2400 test::CreateTestFormField(
2401 "Phone number:", "phone_number", "214-555-1234", "text", &field);
2402 form2.fields.push_back(field);
2404 FormStructure form_structure2(form2);
2405 form_structure2.DetermineHeuristicTypes(TestAutofillMetrics());
2406 EXPECT_TRUE(personal_data_->ImportFormData(form_structure2,
2407 &imported_credit_card));
2408 ASSERT_FALSE(imported_credit_card);
2410 // Verify that the web database has been updated and the notification sent.
2411 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2412 .WillOnce(QuitMainMessageLoop());
2413 base::MessageLoop::current()->Run();
2415 const std::vector<AutofillProfile*>& results2 = personal_data_->GetProfiles();
2417 // Modify expected to include multi-valued fields.
2418 std::vector<base::string16> values;
2419 expected.GetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, &values);
2420 values.push_back(ASCIIToUTF16("214-555-1234"));
2421 expected.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, values);
2423 ASSERT_EQ(1U, results2.size());
2424 EXPECT_EQ(0, expected.Compare(*results2[0]));
2427 TEST_F(PersonalDataManagerTest, IncognitoReadOnly) {
2428 ASSERT_TRUE(personal_data_->GetProfiles().empty());
2429 ASSERT_TRUE(personal_data_->GetCreditCards().empty());
2431 AutofillProfile steve_jobs(base::GenerateGUID(), "https://www.example.com");
2432 test::SetProfileInfo(&steve_jobs, "Steven", "Paul", "Jobs", "sjobs@apple.com",
2433 "Apple Computer, Inc.", "1 Infinite Loop", "", "Cupertino", "CA", "95014",
2434 "US", "(800) 275-2273");
2435 personal_data_->AddProfile(steve_jobs);
2437 CreditCard bill_gates(base::GenerateGUID(), "https://www.example.com");
2438 test::SetCreditCardInfo(
2439 &bill_gates, "William H. Gates", "5555555555554444", "1", "2020");
2440 personal_data_->AddCreditCard(bill_gates);
2442 // The personal data manager should be able to read existing profiles in an
2443 // off-the-record context.
2444 ResetPersonalDataManager(USER_MODE_INCOGNITO);
2445 ASSERT_EQ(1U, personal_data_->GetProfiles().size());
2446 ASSERT_EQ(1U, personal_data_->GetCreditCards().size());
2448 // No adds, saves, or updates should take effect.
2449 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged()).Times(0);
2451 // Add profiles or credit card shouldn't work.
2452 personal_data_->AddProfile(test::GetFullProfile());
2454 CreditCard larry_page(base::GenerateGUID(), "https://www.example.com");
2455 test::SetCreditCardInfo(
2456 &larry_page, "Lawrence Page", "4111111111111111", "10", "2025");
2457 personal_data_->AddCreditCard(larry_page);
2459 ResetPersonalDataManager(USER_MODE_INCOGNITO);
2460 EXPECT_EQ(1U, personal_data_->GetProfiles().size());
2461 EXPECT_EQ(1U, personal_data_->GetCreditCards().size());
2463 // Saving or creating profiles from imported profiles shouldn't work.
2464 steve_jobs.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Steve"));
2465 personal_data_->SaveImportedProfile(steve_jobs);
2467 bill_gates.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Bill Gates"));
2468 personal_data_->SaveImportedCreditCard(bill_gates);
2470 ResetPersonalDataManager(USER_MODE_INCOGNITO);
2471 EXPECT_EQ(ASCIIToUTF16("Steven"),
2472 personal_data_->GetProfiles()[0]->GetRawInfo(NAME_FIRST));
2473 EXPECT_EQ(ASCIIToUTF16("William H. Gates"),
2474 personal_data_->GetCreditCards()[0]->GetRawInfo(CREDIT_CARD_NAME));
2476 // Updating existing profiles shouldn't work.
2477 steve_jobs.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Steve"));
2478 personal_data_->UpdateProfile(steve_jobs);
2480 bill_gates.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Bill Gates"));
2481 personal_data_->UpdateCreditCard(bill_gates);
2483 ResetPersonalDataManager(USER_MODE_INCOGNITO);
2484 EXPECT_EQ(ASCIIToUTF16("Steven"),
2485 personal_data_->GetProfiles()[0]->GetRawInfo(NAME_FIRST));
2486 EXPECT_EQ(ASCIIToUTF16("William H. Gates"),
2487 personal_data_->GetCreditCards()[0]->GetRawInfo(CREDIT_CARD_NAME));
2489 // Removing shouldn't work.
2490 personal_data_->RemoveByGUID(steve_jobs.guid());
2491 personal_data_->RemoveByGUID(bill_gates.guid());
2493 ResetPersonalDataManager(USER_MODE_INCOGNITO);
2494 EXPECT_EQ(1U, personal_data_->GetProfiles().size());
2495 EXPECT_EQ(1U, personal_data_->GetCreditCards().size());
2498 TEST_F(PersonalDataManagerTest, DefaultCountryCodeIsCached) {
2499 // The return value should always be some country code, no matter what.
2500 std::string default_country =
2501 personal_data_->GetDefaultCountryCodeForNewAddress();
2502 EXPECT_EQ(2U, default_country.size());
2504 AutofillProfile moose(base::GenerateGUID(), "Chrome settings");
2505 test::SetProfileInfo(&moose, "Moose", "P", "McMahon", "mpm@example.com",
2506 "", "1 Taiga TKTR", "", "Calgary", "AB", "T2B 2K2",
2507 "CA", "(800) 555-9000");
2508 personal_data_->AddProfile(moose);
2509 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2510 .WillOnce(QuitMainMessageLoop());
2511 base::MessageLoop::current()->Run();
2512 // The value is cached and doesn't change even after adding an address.
2513 EXPECT_EQ(default_country,
2514 personal_data_->GetDefaultCountryCodeForNewAddress());
2516 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged()).Times(2);
2518 // Disabling Autofill blows away this cache and shouldn't account for Autofill
2520 prefs_->SetBoolean(prefs::kAutofillEnabled, false);
2521 EXPECT_EQ(default_country,
2522 personal_data_->GetDefaultCountryCodeForNewAddress());
2524 // Enabling Autofill blows away the cached value and should reflect the new
2525 // value (accounting for profiles).
2526 prefs_->SetBoolean(prefs::kAutofillEnabled, true);
2527 EXPECT_EQ(base::UTF16ToUTF8(moose.GetRawInfo(ADDRESS_HOME_COUNTRY)),
2528 personal_data_->GetDefaultCountryCodeForNewAddress());
2531 TEST_F(PersonalDataManagerTest, DefaultCountryCodeComesFromProfiles) {
2532 AutofillProfile moose(base::GenerateGUID(), "Chrome settings");
2533 test::SetProfileInfo(&moose, "Moose", "P", "McMahon", "mpm@example.com",
2534 "", "1 Taiga TKTR", "", "Calgary", "AB", "T2B 2K2",
2535 "CA", "(800) 555-9000");
2536 personal_data_->AddProfile(moose);
2537 ResetPersonalDataManager(USER_MODE_NORMAL);
2538 EXPECT_EQ("CA", personal_data_->GetDefaultCountryCodeForNewAddress());
2540 // Multiple profiles cast votes.
2541 AutofillProfile armadillo(base::GenerateGUID(), "Chrome settings");
2542 test::SetProfileInfo(&armadillo, "Armin", "Dill", "Oh", "ado@example.com",
2543 "", "1 Speed Bump", "", "Lubbock", "TX", "77500",
2544 "MX", "(800) 555-9000");
2545 AutofillProfile armadillo2(base::GenerateGUID(), "Chrome settings");
2546 test::SetProfileInfo(&armadillo2, "Armin", "Dill", "Oh", "ado@example.com",
2547 "", "2 Speed Bump", "", "Lubbock", "TX", "77500",
2548 "MX", "(800) 555-9000");
2549 personal_data_->AddProfile(armadillo);
2550 personal_data_->AddProfile(armadillo2);
2551 ResetPersonalDataManager(USER_MODE_NORMAL);
2552 EXPECT_EQ("MX", personal_data_->GetDefaultCountryCodeForNewAddress());
2554 personal_data_->RemoveByGUID(armadillo.guid());
2555 personal_data_->RemoveByGUID(armadillo2.guid());
2556 ResetPersonalDataManager(USER_MODE_NORMAL);
2557 // Verified profiles count more.
2558 armadillo.set_origin("http://randomwebsite.com");
2559 armadillo2.set_origin("http://randomwebsite.com");
2560 personal_data_->AddProfile(armadillo);
2561 personal_data_->AddProfile(armadillo2);
2562 ResetPersonalDataManager(USER_MODE_NORMAL);
2563 EXPECT_EQ("CA", personal_data_->GetDefaultCountryCodeForNewAddress());
2565 personal_data_->RemoveByGUID(armadillo.guid());
2566 ResetPersonalDataManager(USER_MODE_NORMAL);
2567 // But unverified profiles can be a tie breaker.
2568 armadillo.set_origin("Chrome settings");
2569 personal_data_->AddProfile(armadillo);
2570 ResetPersonalDataManager(USER_MODE_NORMAL);
2571 EXPECT_EQ("MX", personal_data_->GetDefaultCountryCodeForNewAddress());
2573 // Invalid country codes are ignored.
2574 personal_data_->RemoveByGUID(armadillo.guid());
2575 personal_data_->RemoveByGUID(moose.guid());
2576 AutofillProfile space_invader(base::GenerateGUID(), "Chrome settings");
2577 test::SetProfileInfo(&space_invader, "Marty", "", "Martian",
2578 "mm@example.com", "", "1 Flying Object", "", "Valles Marineris", "",
2580 personal_data_->AddProfile(moose);
2581 ResetPersonalDataManager(USER_MODE_NORMAL);
2582 EXPECT_EQ("MX", personal_data_->GetDefaultCountryCodeForNewAddress());
2585 TEST_F(PersonalDataManagerTest, UpdateLanguageCodeInProfile) {
2586 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com");
2587 test::SetProfileInfo(&profile,
2588 "Marion", "Mitchell", "Morrison",
2589 "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
2590 "91601", "US", "12345678910");
2591 personal_data_->AddProfile(profile);
2593 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2594 .WillOnce(QuitMainMessageLoop());
2595 base::MessageLoop::current()->Run();
2597 profile.set_language_code("en");
2598 personal_data_->UpdateProfile(profile);
2600 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2601 .WillOnce(QuitMainMessageLoop());
2602 base::MessageLoop::current()->Run();
2604 const std::vector<AutofillProfile*>& results = personal_data_->GetProfiles();
2605 ASSERT_EQ(1U, results.size());
2606 EXPECT_EQ(0, profile.Compare(*results[0]));
2607 EXPECT_EQ("en", results[0]->language_code());
2610 TEST_F(PersonalDataManagerTest, GetProfileSuggestions) {
2611 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com");
2612 test::SetProfileInfo(&profile,
2613 "Marion", "Mitchell", "Morrison",
2614 "johnwayne@me.xyz", "Fox",
2615 "123 Zoo St.\nSecond Line\nThird line", "unit 5", "Hollywood", "CA",
2616 "91601", "US", "12345678910");
2617 personal_data_->AddProfile(profile);
2618 ResetPersonalDataManager(USER_MODE_NORMAL);
2620 std::vector<base::string16> values;
2621 std::vector<base::string16> labels;
2622 std::vector<base::string16> icons;
2623 std::vector<PersonalDataManager::GUIDPair> guid_pairs;
2624 personal_data_->GetProfileSuggestions(
2625 AutofillType(ADDRESS_HOME_STREET_ADDRESS),
2626 base::UTF8ToUTF16("123"),
2628 std::vector<ServerFieldType>(),
2629 base::Bind(ReturnTrue),
2634 ASSERT_FALSE(values.empty());
2635 EXPECT_EQ(values[0],
2636 base::UTF8ToUTF16("123 Zoo St., Second Line, Third line, unit 5"));
2639 TEST_F(PersonalDataManagerTest, GetCreditCardSuggestions) {
2640 // These GUIDs are alphabetical to make validating expectations easier.
2641 CreditCard credit_card0("087151C8-6AB1-487C-9095-28E80BE5DA15",
2642 "https://www.example.com");
2643 test::SetCreditCardInfo(&credit_card0,
2644 "Clyde Barrow", "347666888555" /* American Express */, "04", "2015");
2645 personal_data_->AddCreditCard(credit_card0);
2647 CreditCard credit_card1("6141084B-72D7-4B73-90CF-3D6AC154673B",
2648 "https://www.example.com");
2649 test::SetCreditCardInfo(&credit_card1, "John Dillinger", "", "01", "2010");
2650 personal_data_->AddCreditCard(credit_card1);
2652 CreditCard credit_card2("702149C1-EE28-4213-A3B9-DA243FFF021B",
2653 "https://www.example.com");
2654 test::SetCreditCardInfo(&credit_card2,
2655 "Bonnie Parker", "518765432109" /* Mastercard */, "", "");
2656 personal_data_->AddCreditCard(credit_card2);
2658 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2659 .WillOnce(QuitMainMessageLoop());
2660 base::MessageLoop::current()->Run();
2662 // Sublabel is card number when filling name.
2663 std::vector<base::string16> values;
2664 std::vector<base::string16> labels;
2665 std::vector<base::string16> icons;
2666 std::vector<PersonalDataManager::GUIDPair> guid_pairs;
2667 personal_data_->GetCreditCardSuggestions(
2668 AutofillType(CREDIT_CARD_NAME),
2674 ASSERT_EQ(3U, values.size());
2675 ASSERT_EQ(values.size(), labels.size());
2676 EXPECT_EQ(ASCIIToUTF16("Clyde Barrow"), values[0]);
2677 EXPECT_EQ(ASCIIToUTF16("*8555"), labels[0]);
2678 EXPECT_EQ(ASCIIToUTF16("John Dillinger"), values[1]);
2679 EXPECT_EQ(base::string16(), labels[1]);
2680 EXPECT_EQ(ASCIIToUTF16("Bonnie Parker"), values[2]);
2681 EXPECT_EQ(ASCIIToUTF16("*2109"), labels[2]);
2683 // Sublabel is expiration date when filling card number.
2688 personal_data_->GetCreditCardSuggestions(
2689 AutofillType(CREDIT_CARD_NUMBER),
2695 ASSERT_EQ(2U, values.size());
2696 ASSERT_EQ(values.size(), labels.size());
2697 EXPECT_EQ(ASCIIToUTF16("********8555"), values[0]);
2698 EXPECT_EQ(ASCIIToUTF16("04/15"), labels[0]);
2699 EXPECT_EQ(ASCIIToUTF16("********2109"), values[1]);
2700 EXPECT_EQ(base::string16(), labels[1]);
2703 #if defined(OS_MACOSX) && !defined(OS_IOS)
2704 TEST_F(PersonalDataManagerTest, ShowAddressBookPrompt) {
2705 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged()).Times(2);
2707 AutofillType type(ADDRESS_HOME_STREET_ADDRESS);
2709 prefs_->SetBoolean(prefs::kAutofillEnabled, false);
2710 EXPECT_FALSE(personal_data_->ShouldShowAccessAddressBookSuggestion(type));
2712 prefs_->SetBoolean(prefs::kAutofillEnabled, true);
2713 EXPECT_TRUE(personal_data_->ShouldShowAccessAddressBookSuggestion(type));
2715 // Adding an Autofill Profile should prevent the prompt from appearing.
2716 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com/");
2717 test::SetProfileInfo(&profile,
2718 "Marion", "Mitchell", "Morrison",
2719 "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
2720 "91601", "US", "12345678910");
2721 personal_data_->AddProfile(profile);
2723 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
2724 .WillOnce(QuitMainMessageLoop());
2725 base::MessageLoop::current()->Run();
2727 EXPECT_FALSE(personal_data_->ShouldShowAccessAddressBookSuggestion(type));
2730 // Tests that the logic to show the access Address Book prompt respects the
2731 // preference that indicates the total number of times the prompt has already
2733 TEST_F(PersonalDataManagerTest, MaxTimesToShowAddressBookPrompt) {
2734 EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged()).Times(1);
2736 AutofillType type(ADDRESS_HOME_STREET_ADDRESS);
2738 prefs_->SetBoolean(prefs::kAutofillEnabled, true);
2739 EXPECT_TRUE(personal_data_->ShouldShowAccessAddressBookSuggestion(type));
2741 prefs_->SetInteger(prefs::kAutofillMacAddressBookShowedCount, 4);
2742 EXPECT_TRUE(personal_data_->ShouldShowAccessAddressBookSuggestion(type));
2744 prefs_->SetInteger(prefs::kAutofillMacAddressBookShowedCount, 6);
2745 EXPECT_FALSE(personal_data_->ShouldShowAccessAddressBookSuggestion(type));
2747 #endif // defined(OS_MACOSX) && !defined(OS_IOS)
2749 } // namespace autofill