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.
5 #include "components/autofill/core/browser/autofill_test_utils.h"
8 #include "base/prefs/pref_service.h"
9 #include "base/prefs/pref_service_factory.h"
10 #include "base/prefs/testing_pref_store.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "components/autofill/core/browser/autofill_manager.h"
13 #include "components/autofill/core/browser/autofill_profile.h"
14 #include "components/autofill/core/browser/credit_card.h"
15 #include "components/autofill/core/browser/field_types.h"
16 #include "components/autofill/core/browser/webdata/autofill_table.h"
17 #include "components/autofill/core/common/autofill_pref_names.h"
18 #include "components/autofill/core/common/form_data.h"
19 #include "components/autofill/core/common/form_field_data.h"
20 #include "components/os_crypt/os_crypt.h"
21 #include "components/pref_registry/pref_registry_syncable.h"
22 #include "components/signin/core/browser/account_fetcher_service.h"
23 #include "components/signin/core/browser/account_tracker_service.h"
24 #include "components/signin/core/common/signin_pref_names.h"
26 using base::ASCIIToUTF16
;
33 const char kSettingsOrigin
[] = "Chrome settings";
37 scoped_ptr
<PrefService
> PrefServiceForTesting() {
38 scoped_refptr
<user_prefs::PrefRegistrySyncable
> registry(
39 new user_prefs::PrefRegistrySyncable());
40 AutofillManager::RegisterProfilePrefs(registry
.get());
42 // PDM depends on this pref, which is normally registered in
43 // SigninManagerFactory.
44 registry
->RegisterStringPref(::prefs::kGoogleServicesAccountId
,
47 // PDM depends on these prefs, which are normally registered in
48 // AccountTrackerServiceFactory.
49 registry
->RegisterListPref(AccountTrackerService::kAccountInfoPref
);
50 registry
->RegisterIntegerPref(::prefs::kAccountIdMigrationState
,
51 AccountTrackerService::MIGRATION_NOT_STARTED
);
52 registry
->RegisterInt64Pref(AccountFetcherService::kLastUpdatePref
, 0);
54 base::PrefServiceFactory factory
;
55 factory
.set_user_prefs(make_scoped_refptr(new TestingPrefStore()));
56 return factory
.Create(registry
.get());
59 void CreateTestFormField(const char* label
,
63 FormFieldData
* field
) {
64 field
->label
= ASCIIToUTF16(label
);
65 field
->name
= ASCIIToUTF16(name
);
66 field
->value
= ASCIIToUTF16(value
);
67 field
->form_control_type
= type
;
68 field
->is_focusable
= true;
71 void CreateTestAddressFormData(FormData
* form
) {
72 std::vector
<ServerFieldTypeSet
> types
;
73 CreateTestAddressFormData(form
, &types
);
76 void CreateTestAddressFormData(FormData
* form
,
77 std::vector
<ServerFieldTypeSet
>* types
) {
78 form
->name
= ASCIIToUTF16("MyForm");
79 form
->origin
= GURL("http://myform.com/form.html");
80 form
->action
= GURL("http://myform.com/submit.html");
84 ServerFieldTypeSet type_set
;
85 test::CreateTestFormField("First Name", "firstname", "", "text", &field
);
86 form
->fields
.push_back(field
);
88 type_set
.insert(NAME_FIRST
);
89 types
->push_back(type_set
);
90 test::CreateTestFormField("Middle Name", "middlename", "", "text", &field
);
91 form
->fields
.push_back(field
);
93 type_set
.insert(NAME_MIDDLE
);
94 types
->push_back(type_set
);
95 test::CreateTestFormField("Last Name", "lastname", "", "text", &field
);
96 form
->fields
.push_back(field
);
98 type_set
.insert(NAME_LAST
);
99 types
->push_back(type_set
);
100 test::CreateTestFormField("Address Line 1", "addr1", "", "text", &field
);
101 form
->fields
.push_back(field
);
103 type_set
.insert(ADDRESS_HOME_LINE1
);
104 types
->push_back(type_set
);
105 test::CreateTestFormField("Address Line 2", "addr2", "", "text", &field
);
106 form
->fields
.push_back(field
);
108 type_set
.insert(ADDRESS_HOME_LINE2
);
109 types
->push_back(type_set
);
110 test::CreateTestFormField("City", "city", "", "text", &field
);
111 form
->fields
.push_back(field
);
113 type_set
.insert(ADDRESS_HOME_CITY
);
114 types
->push_back(type_set
);
115 test::CreateTestFormField("State", "state", "", "text", &field
);
116 form
->fields
.push_back(field
);
118 type_set
.insert(ADDRESS_HOME_STATE
);
119 types
->push_back(type_set
);
120 test::CreateTestFormField("Postal Code", "zipcode", "", "text", &field
);
121 form
->fields
.push_back(field
);
123 type_set
.insert(ADDRESS_HOME_ZIP
);
124 types
->push_back(type_set
);
125 test::CreateTestFormField("Country", "country", "", "text", &field
);
126 form
->fields
.push_back(field
);
128 type_set
.insert(ADDRESS_HOME_COUNTRY
);
129 types
->push_back(type_set
);
130 test::CreateTestFormField("Phone Number", "phonenumber", "", "tel", &field
);
131 form
->fields
.push_back(field
);
133 type_set
.insert(PHONE_HOME_WHOLE_NUMBER
);
134 types
->push_back(type_set
);
135 test::CreateTestFormField("Email", "email", "", "email", &field
);
136 form
->fields
.push_back(field
);
138 type_set
.insert(EMAIL_ADDRESS
);
139 types
->push_back(type_set
);
142 inline void check_and_set(
143 FormGroup
* profile
, ServerFieldType type
, const char* value
) {
145 profile
->SetRawInfo(type
, base::UTF8ToUTF16(value
));
148 AutofillProfile
GetFullProfile() {
149 AutofillProfile
profile(base::GenerateGUID(), "http://www.example.com/");
150 SetProfileInfo(&profile
,
165 AutofillProfile
GetFullProfile2() {
166 AutofillProfile
profile(base::GenerateGUID(), "https://www.example.com/");
167 SetProfileInfo(&profile
,
171 "jsmith@example.com",
182 AutofillProfile
GetVerifiedProfile() {
183 AutofillProfile
profile(GetFullProfile());
184 profile
.set_origin(kSettingsOrigin
);
188 AutofillProfile
GetVerifiedProfile2() {
189 AutofillProfile
profile(GetFullProfile2());
190 profile
.set_origin(kSettingsOrigin
);
194 CreditCard
GetCreditCard() {
195 CreditCard
credit_card(base::GenerateGUID(), "http://www.example.com");
197 &credit_card
, "Test User", "4111111111111111" /* Visa */, "11", "2017");
201 CreditCard
GetCreditCard2() {
202 CreditCard
credit_card(base::GenerateGUID(), "https://www.example.com");
204 &credit_card
, "Someone Else", "378282246310005" /* AmEx */, "07", "2019");
208 CreditCard
GetVerifiedCreditCard() {
209 CreditCard
credit_card(GetCreditCard());
210 credit_card
.set_origin(kSettingsOrigin
);
214 CreditCard
GetVerifiedCreditCard2() {
215 CreditCard
credit_card(GetCreditCard2());
216 credit_card
.set_origin(kSettingsOrigin
);
220 CreditCard
GetMaskedServerCard() {
221 CreditCard
credit_card(CreditCard::MASKED_SERVER_CARD
, "a123");
222 test::SetCreditCardInfo(&credit_card
, "Bonnie Parker",
223 "2109" /* Mastercard */, "12", "2012");
224 credit_card
.SetTypeForMaskedCard(kMasterCard
);
228 CreditCard
GetMaskedServerCardAmex() {
229 CreditCard
credit_card(CreditCard::MASKED_SERVER_CARD
, "b456");
230 test::SetCreditCardInfo(&credit_card
, "Justin Thyme",
231 "8431" /* Amex */, "9", "2020");
232 credit_card
.SetTypeForMaskedCard(kAmericanExpressCard
);
236 void SetProfileInfo(AutofillProfile
* profile
,
237 const char* first_name
, const char* middle_name
,
238 const char* last_name
, const char* email
, const char* company
,
239 const char* address1
, const char* address2
, const char* city
,
240 const char* state
, const char* zipcode
, const char* country
,
242 check_and_set(profile
, NAME_FIRST
, first_name
);
243 check_and_set(profile
, NAME_MIDDLE
, middle_name
);
244 check_and_set(profile
, NAME_LAST
, last_name
);
245 check_and_set(profile
, EMAIL_ADDRESS
, email
);
246 check_and_set(profile
, COMPANY_NAME
, company
);
247 check_and_set(profile
, ADDRESS_HOME_LINE1
, address1
);
248 check_and_set(profile
, ADDRESS_HOME_LINE2
, address2
);
249 check_and_set(profile
, ADDRESS_HOME_CITY
, city
);
250 check_and_set(profile
, ADDRESS_HOME_STATE
, state
);
251 check_and_set(profile
, ADDRESS_HOME_ZIP
, zipcode
);
252 check_and_set(profile
, ADDRESS_HOME_COUNTRY
, country
);
253 check_and_set(profile
, PHONE_HOME_WHOLE_NUMBER
, phone
);
256 void SetProfileInfoWithGuid(AutofillProfile
* profile
,
257 const char* guid
, const char* first_name
, const char* middle_name
,
258 const char* last_name
, const char* email
, const char* company
,
259 const char* address1
, const char* address2
, const char* city
,
260 const char* state
, const char* zipcode
, const char* country
,
263 profile
->set_guid(guid
);
264 SetProfileInfo(profile
, first_name
, middle_name
, last_name
, email
,
265 company
, address1
, address2
, city
, state
, zipcode
, country
,
269 void SetCreditCardInfo(CreditCard
* credit_card
,
270 const char* name_on_card
, const char* card_number
,
271 const char* expiration_month
, const char* expiration_year
) {
272 check_and_set(credit_card
, CREDIT_CARD_NAME
, name_on_card
);
273 check_and_set(credit_card
, CREDIT_CARD_NUMBER
, card_number
);
274 check_and_set(credit_card
, CREDIT_CARD_EXP_MONTH
, expiration_month
);
275 check_and_set(credit_card
, CREDIT_CARD_EXP_4_DIGIT_YEAR
, expiration_year
);
278 void DisableSystemServices(PrefService
* prefs
) {
279 // Use a mock Keychain rather than the OS one to store credit card data.
280 #if defined(OS_MACOSX)
281 OSCrypt::UseMockKeychain(true);
282 #endif // defined(OS_MACOSX)
285 void SetServerCreditCards(AutofillTable
* table
,
286 const std::vector
<CreditCard
>& cards
) {
287 std::vector
<CreditCard
> as_masked_cards
= cards
;
288 for (CreditCard
& card
: as_masked_cards
) {
289 card
.set_record_type(CreditCard::MASKED_SERVER_CARD
);
290 std::string type
= card
.type();
291 card
.SetNumber(card
.LastFourDigits());
292 card
.SetTypeForMaskedCard(type
.c_str());
294 table
->SetServerCreditCards(as_masked_cards
);
296 for (const CreditCard
& card
: cards
) {
297 if (card
.record_type() != CreditCard::FULL_SERVER_CARD
)
300 table
->UnmaskServerCreditCard(card
, card
.number());
305 } // namespace autofill