Chromium Code Reviews| Index: components/autofill/core/browser/personal_data_manager_unittest.cc |
| diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc |
| index 18bb0aebdd43692e5a59a927b3175659b6b0fd1f..351a838867c712bc716d2a3eafc6cfae01e668d3 100644 |
| --- a/components/autofill/core/browser/personal_data_manager_unittest.cc |
| +++ b/components/autofill/core/browser/personal_data_manager_unittest.cc |
| @@ -17,8 +17,8 @@ |
| #include "base/command_line.h" |
| #include "base/files/scoped_temp_dir.h" |
| #include "base/guid.h" |
| +#include "base/i18n/time_formatting.h" |
| #include "base/memory/ptr_util.h" |
| -#include "base/metrics/field_trial.h" |
| #include "base/run_loop.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/synchronization/waitable_event.h" |
| @@ -44,8 +44,7 @@ |
| #include "components/signin/core/browser/fake_signin_manager.h" |
| #include "components/signin/core/browser/test_signin_client.h" |
| #include "components/signin/core/common/signin_pref_names.h" |
| -#include "components/variations/entropy_provider.h" |
| -#include "components/variations/variations_associated_data.h" |
| +#include "components/variations/variations_params_manager.h" |
| #include "components/webdata/common/web_data_service_base.h" |
| #include "components/webdata/common/web_database_service.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| @@ -146,9 +145,6 @@ class PersonalDataManagerTest : public testing::Test { |
| test::DisableSystemServices(prefs_.get()); |
| ResetPersonalDataManager(USER_MODE_NORMAL); |
| - // There are no field trials enabled by default. |
| - field_trial_list_.reset(); |
| - |
| // Reset the deduping pref to its default value. |
| personal_data_->pref_service_->SetInteger( |
| prefs::kAutofillLastVersionDeduped, 0); |
| @@ -290,6 +286,46 @@ class PersonalDataManagerTest : public testing::Test { |
| ASSERT_EQ(3U, personal_data_->GetCreditCards().size()); |
| } |
| + // Adds three local cards to the |personal_data_|. These cards are different: |
| + // One was just added, one was already used in autofill, and the third was |
| + // last used more than one year ago. |
| + void SetupReferenceCreditCardsForLastUsedVariationTest() { |
| + ASSERT_EQ(0U, personal_data_->GetCreditCards().size()); |
| + base::Time cur_time = base::Time::Now(); |
| + |
| + // Test for added to chrome. |
| + CreditCard credit_card0("1141084B-72D7-4B73-90CF-3D6AC154673B", |
| + "https://www.example.com"); |
| + credit_card0.set_use_count(1); |
| + credit_card0.set_use_date(cur_time - base::TimeDelta::FromDays(1)); |
| + test::SetCreditCardInfo(&credit_card0, "John Dillinger", |
| + "423456789012" /* Visa */, "01", "2021"); |
| + personal_data_->AddCreditCard(credit_card0); |
| + |
| + // Test for last used date. |
| + CreditCard credit_card1("287151C8-6AB1-487C-9095-28E80BE5DA15", |
| + "https://www.example.com"); |
| + test::SetCreditCardInfo(&credit_card1, "Clyde Barrow", |
| + "347666888555" /* American Express */, "04", |
| + "2021"); |
| + credit_card1.set_use_count(10); |
| + credit_card1.set_use_date(cur_time - base::TimeDelta::FromDays(10)); |
| + personal_data_->AddCreditCard(credit_card1); |
| + |
| + // Test for last used more than one year ago. |
| + CreditCard credit_card2("002149C1-EE28-4213-A3B9-DA243FFF021B", |
| + "https://www.example.com"); |
| + credit_card2.set_use_count(5); |
| + credit_card2.set_use_date(cur_time - base::TimeDelta::FromDays(366)); |
| + test::SetCreditCardInfo(&credit_card2, "Bonnie Parker", |
| + "518765432109" /* Mastercard */, "12", "2021"); |
| + personal_data_->AddCreditCard(credit_card2); |
| + |
| + EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged()) |
| + .WillOnce(QuitMainMessageLoop()); |
| + base::RunLoop().Run(); |
| + } |
| + |
| // Helper methods that simply forward the call to the private member (to avoid |
| // having to friend every test that needs to access the private |
| // PersonalDataManager::ImportAddressProfile or ImportCreditCard). |
| @@ -303,28 +339,6 @@ class PersonalDataManagerTest : public testing::Test { |
| imported_credit_card); |
| } |
| - // Sets up the profile order field trial group and parameter. Sets up the |
| - // suggestions limit parameter to |limit_param|. |
| - void EnableAutofillProfileLimitFieldTrial(const std::string& limit_param) { |
| - DCHECK(!limit_param.empty()); |
| - |
| - // Clear the existing |field_trial_list_| and variation parameters. |
| - field_trial_list_.reset(NULL); |
| - field_trial_list_.reset( |
| - new base::FieldTrialList( |
| - base::MakeUnique<metrics::SHA1EntropyProvider>("foo"))); |
| - variations::testing::ClearAllVariationParams(); |
| - |
| - std::map<std::string, std::string> params; |
| - params[kFrecencyFieldTrialLimitParam] = limit_param; |
| - variations::AssociateVariationParams(kFrecencyFieldTrialName, "LimitToN", |
| - params); |
| - |
| - field_trial_ = base::FieldTrialList::CreateFieldTrial( |
| - kFrecencyFieldTrialName, "LimitToN"); |
| - field_trial_->group(); |
| - } |
| - |
| void SubmitFormAndExpectImportedCardWithData(const FormData& form, |
| const char* exp_name, |
| const char* exp_cc_num, |
| @@ -364,8 +378,7 @@ class PersonalDataManagerTest : public testing::Test { |
| PersonalDataLoadedObserverMock personal_data_observer_; |
| std::unique_ptr<PersonalDataManager> personal_data_; |
| - std::unique_ptr<base::FieldTrialList> field_trial_list_; |
| - scoped_refptr<base::FieldTrial> field_trial_; |
| + variations::testing::VariationParamsManager variation_params_; |
| }; |
| TEST_F(PersonalDataManagerTest, AddProfile) { |
| @@ -3482,12 +3495,16 @@ TEST_F(PersonalDataManagerTest, GetProfileSuggestions_NumberOfSuggestions) { |
| EXPECT_EQ(3U, suggestions.size()); |
| // Verify that only two profiles are suggested. |
| - EnableAutofillProfileLimitFieldTrial("2"); |
| + variation_params_.SetVariationParams( |
|
Mathieu
2017/01/27 15:01:44
Thanks for doing this!
jiahuiguo
2017/02/03 07:11:17
Done.
|
| + kFrecencyFieldTrialName, |
| + {{kFrecencyFieldTrialLimitParam, "2"}}); |
| suggestions = personal_data_->GetProfileSuggestions( |
| AutofillType(NAME_FIRST), base::string16(), false, |
| std::vector<ServerFieldType>()); |
| EXPECT_EQ(2U, suggestions.size()); |
| + |
| + variation_params_.ClearAllVariationParams(); |
| } |
| // Tests that GetProfileSuggestions returns the right number of profile |
| @@ -3495,7 +3512,9 @@ TEST_F(PersonalDataManagerTest, GetProfileSuggestions_NumberOfSuggestions) { |
| // than three profiles. |
| TEST_F(PersonalDataManagerTest, |
| GetProfileSuggestions_LimitIsMoreThanProfileSuggestions) { |
| - EnableAutofillProfileLimitFieldTrial("3"); |
| + variation_params_.SetVariationParams( |
| + kFrecencyFieldTrialName, |
| + {{kFrecencyFieldTrialLimitParam, "3"}}); |
| // Set up 2 different profiles. |
| AutofillProfile profile1(base::GenerateGUID(), "https://www.example.com"); |
| @@ -3518,6 +3537,8 @@ TEST_F(PersonalDataManagerTest, |
| AutofillType(NAME_FIRST), base::string16(), false, |
| std::vector<ServerFieldType>()); |
| EXPECT_EQ(2U, suggestions.size()); |
| + |
| + variation_params_.ClearAllVariationParams(); |
| } |
| // Test that a masked server card is not suggested if more that six numbers have |
| @@ -3814,6 +3835,181 @@ TEST_F(PersonalDataManagerTest, |
| ASSERT_EQ(3U, suggestions.size()); |
| } |
| +// Test that credit card last used date suggestion can be generated correctly |
| +// in variation 1: only show last used date. |
| +TEST_F(PersonalDataManagerTest, GetCreditCardSuggestions_LastUsedDateOnly) { |
|
Mathieu
2017/01/27 15:01:44
I think you would need to unit-test the GetLastUse
jiahuiguo
2017/02/03 07:11:17
Done.
|
| + SetupReferenceCreditCardsForLastUsedVariationTest(); |
| + |
| + variation_params_.SetVariationParamsWithFeatureAssociations( |
| + kAutofillCreditCardLastUsedDateDisplay.name, |
| + {{kAutofillCreditCardLastUsedDateShowExpirationDateKey, "false"}, |
| + {kAutofillCreditCardLastUsedDateShowTimeDetailKey, "false"}}, |
| + {kAutofillCreditCardLastUsedDateDisplay.name}); |
| + |
| + const std::vector<CreditCard*> credit_cards = |
| + personal_data_->GetCreditCards(); |
| + ASSERT_EQ(3U, credit_cards.size()); |
| + |
| + std::vector<Suggestion> suggestions = |
| + personal_data_->GetCreditCardSuggestions( |
| + AutofillType(CREDIT_CARD_NUMBER), |
| + /* field_contents= */ base::string16()); |
| + ASSERT_EQ(3U, suggestions.size()); |
| + |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Last used: ") + |
| + base::TimeFormatWithPattern(credit_cards[2]->use_date(), "MMMdd"), |
|
Mathieu
2017/01/27 15:01:44
I don't think we should call TimeFormatWithPattern
jungshik at Google
2017/01/27 21:43:30
Well, TimeFormatWithPattern is already tested in i
jiahuiguo
2017/02/03 07:11:17
Done.
jiahuiguo
2017/02/03 07:11:17
Done.
|
| + suggestions[0].label); |
| + |
| +#if defined(GOOGLE_CHROME_BUILD) |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Added to Chrome: ") + |
| + base::TimeFormatWithPattern(credit_cards[1]->use_date(), "MMMdd"), |
| + suggestions[1].label); |
| +#elif defined(CHROMIUM_BUILD) |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Added to Chromium: ") + |
| + base::TimeFormatWithPattern(credit_cards[1]->use_date(), "MMMdd"), |
| + suggestions[1].label); |
| +#endif |
| + |
| + EXPECT_EQ(ASCIIToUTF16("Last used over a year ago"), suggestions[2].label); |
| + |
| + variation_params_.ClearAllVariationParams(); |
| +} |
| + |
| +// Test that credit card last used date suggestion can be generated correctly |
| +// in variation 2: show expiration date and last used date. |
| +TEST_F(PersonalDataManagerTest, GetCreditCardSuggestions_ExpAndLastUsedDate) { |
| + SetupReferenceCreditCardsForLastUsedVariationTest(); |
| + |
| + variation_params_.SetVariationParamsWithFeatureAssociations( |
| + kAutofillCreditCardLastUsedDateDisplay.name, |
| + {{kAutofillCreditCardLastUsedDateShowExpirationDateKey, "true"}, |
| + {kAutofillCreditCardLastUsedDateShowTimeDetailKey, "false"}}, |
| + {kAutofillCreditCardLastUsedDateDisplay.name}); |
| + |
| + const std::vector<CreditCard*> credit_cards = |
| + personal_data_->GetCreditCards(); |
| + ASSERT_EQ(3U, credit_cards.size()); |
| + |
| + std::vector<Suggestion> suggestions = |
| + personal_data_->GetCreditCardSuggestions( |
| + AutofillType(CREDIT_CARD_NUMBER), |
| + /* field_contents= */ base::string16()); |
| + ASSERT_EQ(3U, suggestions.size()); |
| + |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Exp: 04/21, last used: ") + |
| + base::TimeFormatWithPattern(credit_cards[2]->use_date(), "MMMdd"), |
| + suggestions[0].label); |
| + |
| +#if defined(GOOGLE_CHROME_BUILD) |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Exp: 01/21, added to Chrome: ") + |
| + base::TimeFormatWithPattern(credit_cards[1]->use_date(), "MMMdd"), |
| + suggestions[1].label); |
| +#elif defined(CHROMIUM_BUILD) |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Exp: 01/21, added to Chromium: ") + |
| + base::TimeFormatWithPattern(credit_cards[1]->use_date(), "MMMdd"), |
| + suggestions[1].label); |
| +#endif |
| + |
| + EXPECT_EQ(ASCIIToUTF16("Exp: 12/21, last used over a year ago"), |
| + suggestions[2].label); |
| + |
| + variation_params_.ClearAllVariationParams(); |
| +} |
| + |
| +// Test that credit card last used date suggestion can be generated correctly |
| +// in variation 3: show last used date detail. |
| +TEST_F(PersonalDataManagerTest, GetCreditCardSuggestions_LastUsedDateDetail) { |
| + SetupReferenceCreditCardsForLastUsedVariationTest(); |
| + |
| + variation_params_.SetVariationParamsWithFeatureAssociations( |
| + kAutofillCreditCardLastUsedDateDisplay.name, |
| + {{kAutofillCreditCardLastUsedDateShowExpirationDateKey, "false"}, |
| + {kAutofillCreditCardLastUsedDateShowTimeDetailKey, "true"}}, |
| + {kAutofillCreditCardLastUsedDateDisplay.name}); |
| + |
| + const std::vector<CreditCard*> credit_cards = |
| + personal_data_->GetCreditCards(); |
| + ASSERT_EQ(3U, credit_cards.size()); |
| + |
| + std::vector<Suggestion> suggestions = |
| + personal_data_->GetCreditCardSuggestions( |
| + AutofillType(CREDIT_CARD_NUMBER), |
| + /* field_contents= */ base::string16()); |
| + ASSERT_EQ(3U, suggestions.size()); |
| + |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Last used: ") + |
| + base::TimeFormatWithPattern(credit_cards[2]->use_date(), "MMMddjmm"), |
| + suggestions[0].label); |
| + |
| +#if defined(GOOGLE_CHROME_BUILD) |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Added to Chrome: ") + |
| + base::TimeFormatWithPattern(credit_cards[1]->use_date(), "MMMdd"), |
| + suggestions[1].label); |
| +#elif defined(CHROMIUM_BUILD) |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Added to Chromium: ") + |
| + base::TimeFormatWithPattern(credit_cards[1]->use_date(), "MMMdd"), |
| + suggestions[1].label); |
| +#endif |
| + |
| + EXPECT_EQ(ASCIIToUTF16("Last used over a year ago"), suggestions[2].label); |
| + |
| + variation_params_.ClearAllVariationParams(); |
| +} |
| + |
| +// Test that credit card last used date suggestion can be generated correctly |
| +// in variation 4: show expiration date and last used date detail. |
| +TEST_F(PersonalDataManagerTest, |
| + GetCreditCardSuggestions_ExpAndLastUsedDateDetail) { |
| + SetupReferenceCreditCardsForLastUsedVariationTest(); |
| + |
| + variation_params_.SetVariationParamsWithFeatureAssociations( |
| + kAutofillCreditCardLastUsedDateDisplay.name, |
| + {{kAutofillCreditCardLastUsedDateShowExpirationDateKey, "true"}, |
| + {kAutofillCreditCardLastUsedDateShowTimeDetailKey, "true"}}, |
| + {kAutofillCreditCardLastUsedDateDisplay.name}); |
| + |
| + const std::vector<CreditCard*> credit_cards = |
| + personal_data_->GetCreditCards(); |
| + ASSERT_EQ(3U, credit_cards.size()); |
| + |
| + std::vector<Suggestion> suggestions = |
| + personal_data_->GetCreditCardSuggestions( |
| + AutofillType(CREDIT_CARD_NUMBER), |
| + /* field_contents= */ base::string16()); |
| + ASSERT_EQ(3U, suggestions.size()); |
| + |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Exp: 04/21, last used: ") + |
| + base::TimeFormatWithPattern(credit_cards[2]->use_date(), "MMMddjmm"), |
| + suggestions[0].label); |
| + |
| +#if defined(GOOGLE_CHROME_BUILD) |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Exp: 01/21, added to Chrome: ") + |
| + base::TimeFormatWithPattern(credit_cards[1]->use_date(), "MMMdd"), |
| + suggestions[1].label); |
| +#elif defined(CHROMIUM_BUILD) |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Exp: 01/21, added to Chromium: ") + |
| + base::TimeFormatWithPattern(credit_cards[1]->use_date(), "MMMdd"), |
| + suggestions[1].label); |
| +#endif |
| + |
| + EXPECT_EQ(ASCIIToUTF16("Exp: 12/21, last used over a year ago"), |
| + suggestions[2].label); |
| + |
| + variation_params_.ClearAllVariationParams(); |
| +} |
| + |
| // Tests that only the full server card is kept when deduping with a local |
| // duplicate of it. |
| TEST_F(PersonalDataManagerTest, |