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. 4 5#include "base/format_macros.h" 6#include "base/strings/string_util.h" 7#include "base/strings/stringprintf.h" 8#include "base/strings/utf_string_conversions.h" 9#include "components/autofill/core/browser/autofill_field.h" 10#include "components/autofill/core/browser/autofill_type.h" 11#include "components/autofill/core/browser/field_types.h" 12#include "testing/gtest/include/gtest/gtest.h" 13 14namespace autofill { 15namespace { 16 17// Returns a FormFieldData object corresponding to a <select> field populated 18// with the given |options|. 19FormFieldData GenerateSelectFieldWithOptions(const char* const* options, 20 size_t options_size) { 21 std::vector<base::string16> options16(options_size); 22 for (size_t i = 0; i < options_size; ++i) { 23 options16[i] = ASCIIToUTF16(options[i]); 24 } 25 26 FormFieldData form_field; 27 form_field.form_control_type = "select-one"; 28 form_field.option_values = options16; 29 form_field.option_contents = options16; 30 return form_field; 31} 32 33TEST(AutofillFieldTest, Type) { 34 AutofillField field; 35 ASSERT_EQ(NO_SERVER_DATA, field.server_type()); 36 ASSERT_EQ(UNKNOWN_TYPE, field.heuristic_type()); 37 38 // |server_type_| is NO_SERVER_DATA, so |heuristic_type_| is returned. 39 EXPECT_EQ(UNKNOWN_TYPE, field.Type().GetStorableType()); 40 41 // Set the heuristic type and check it. 42 field.set_heuristic_type(NAME_FIRST); 43 EXPECT_EQ(NAME_FIRST, field.Type().GetStorableType()); 44 EXPECT_EQ(NAME, field.Type().group()); 45 46 // Set the server type and check it. 47 field.set_server_type(ADDRESS_BILLING_LINE1); 48 EXPECT_EQ(ADDRESS_HOME_LINE1, field.Type().GetStorableType()); 49 EXPECT_EQ(ADDRESS_BILLING, field.Type().group()); 50 51 // Remove the server type to make sure the heuristic type is preserved. 52 field.set_server_type(NO_SERVER_DATA); 53 EXPECT_EQ(NAME_FIRST, field.Type().GetStorableType()); 54 EXPECT_EQ(NAME, field.Type().group()); 55} 56 57TEST(AutofillFieldTest, IsEmpty) { 58 AutofillField field; 59 ASSERT_EQ(base::string16(), field.value); 60 61 // Field value is empty. 62 EXPECT_TRUE(field.IsEmpty()); 63 64 // Field value is non-empty. 65 field.value = ASCIIToUTF16("Value"); 66 EXPECT_FALSE(field.IsEmpty()); 67} 68 69TEST(AutofillFieldTest, FieldSignature) { 70 AutofillField field; 71 ASSERT_EQ(base::string16(), field.name); 72 ASSERT_EQ(std::string(), field.form_control_type); 73 74 // Signature is empty. 75 EXPECT_EQ("2085434232", field.FieldSignature()); 76 77 // Field name is set. 78 field.name = ASCIIToUTF16("Name"); 79 EXPECT_EQ("1606968241", field.FieldSignature()); 80 81 // Field form control type is set. 82 field.form_control_type = "text"; 83 EXPECT_EQ("502192749", field.FieldSignature()); 84 85 // Heuristic type does not affect FieldSignature. 86 field.set_heuristic_type(NAME_FIRST); 87 EXPECT_EQ("502192749", field.FieldSignature()); 88 89 // Server type does not affect FieldSignature. 90 field.set_server_type(NAME_LAST); 91 EXPECT_EQ("502192749", field.FieldSignature()); 92} 93 94TEST(AutofillFieldTest, IsFieldFillable) { 95 AutofillField field; 96 ASSERT_EQ(UNKNOWN_TYPE, field.Type().GetStorableType()); 97 98 // Type is unknown. 99 EXPECT_FALSE(field.IsFieldFillable()); 100 101 // Only heuristic type is set. 102 field.set_heuristic_type(NAME_FIRST); 103 EXPECT_TRUE(field.IsFieldFillable()); 104 105 // Only server type is set. 106 field.set_heuristic_type(UNKNOWN_TYPE); 107 field.set_server_type(NAME_LAST); 108 EXPECT_TRUE(field.IsFieldFillable()); 109 110 // Both types set. 111 field.set_heuristic_type(NAME_FIRST); 112 field.set_server_type(NAME_LAST); 113 EXPECT_TRUE(field.IsFieldFillable()); 114} 115 116TEST(AutofillFieldTest, FillPhoneNumber) { 117 AutofillField field; 118 field.SetHtmlType(HTML_TYPE_TEL_LOCAL_PREFIX, HtmlFieldMode()); 119 120 // Fill with a non-phone number; should fill normally. 121 AutofillField::FillFormField(field, ASCIIToUTF16("Oh hai"), "en-US", &field); 122 EXPECT_EQ(ASCIIToUTF16("Oh hai"), field.value); 123 124 // Fill with a phone number; should fill just the prefix. 125 AutofillField::FillFormField(field, ASCIIToUTF16("5551234"), "en-US", &field); 126 EXPECT_EQ(ASCIIToUTF16("555"), field.value); 127 128 // Now reset the type, and set a max-length instead. 129 field.SetHtmlType(HTML_TYPE_UNKNOWN, HtmlFieldMode()); 130 field.set_heuristic_type(PHONE_HOME_NUMBER); 131 field.max_length = 4; 132 133 // Fill with a phone-number; should fill just the suffix. 134 AutofillField::FillFormField(field, ASCIIToUTF16("5551234"), "en-US", &field); 135 EXPECT_EQ(ASCIIToUTF16("1234"), field.value); 136} 137 138TEST(AutofillFieldTest, FillSelectControlByValue) { 139 const char* const kOptions[] = { 140 "Eenie", "Meenie", "Miney", "Mo", 141 }; 142 AutofillField field( 143 GenerateSelectFieldWithOptions(kOptions, arraysize(kOptions)), 144 base::string16()); 145 146 // Set semantically empty contents for each option, so that only the values 147 // can be used for matching. 148 for (size_t i = 0; i < field.option_contents.size(); ++i) { 149 field.option_contents[i] = ASCIIToUTF16(base::StringPrintf("%" PRIuS, i)); 150 } 151 152 AutofillField::FillFormField(field, ASCIIToUTF16("Meenie"), "en-US", 153 &field); 154 EXPECT_EQ(ASCIIToUTF16("Meenie"), field.value); 155} 156 157TEST(AutofillFieldTest, FillSelectControlByContents) { 158 const char* const kOptions[] = { 159 "Eenie", "Meenie", "Miney", "Mo", 160 }; 161 AutofillField field( 162 GenerateSelectFieldWithOptions(kOptions, arraysize(kOptions)), 163 base::string16()); 164 165 // Set semantically empty values for each option, so that only the contents 166 // can be used for matching. 167 for (size_t i = 0; i < field.option_values.size(); ++i) { 168 field.option_values[i] = ASCIIToUTF16(base::StringPrintf("%" PRIuS, i)); 169 } 170 171 AutofillField::FillFormField(field, ASCIIToUTF16("Miney"), "en-US", 172 &field); 173 EXPECT_EQ(ASCIIToUTF16("2"), field.value); // Corresponds to "Miney". 174} 175 176TEST(AutofillFieldTest, FillSelectControlWithFullCountryNames) { 177 const char* const kCountries[] = { 178 "Albania", "Canada" 179 }; 180 AutofillField field( 181 GenerateSelectFieldWithOptions(kCountries, arraysize(kCountries)), 182 base::string16()); 183 field.set_heuristic_type(ADDRESS_HOME_COUNTRY); 184 185 AutofillField::FillFormField(field, ASCIIToUTF16("CA"), "en-US", &field); 186 EXPECT_EQ(ASCIIToUTF16("Canada"), field.value); 187} 188 189TEST(AutofillFieldTest, FillSelectControlWithAbbreviatedCountryNames) { 190 const char* const kCountries[] = { 191 "AL", "CA" 192 }; 193 AutofillField field( 194 GenerateSelectFieldWithOptions(kCountries, arraysize(kCountries)), 195 base::string16()); 196 field.set_heuristic_type(ADDRESS_HOME_COUNTRY); 197 198 AutofillField::FillFormField(field, ASCIIToUTF16("Canada"), "en-US", &field); 199 EXPECT_EQ(ASCIIToUTF16("CA"), field.value); 200} 201 202TEST(AutofillFieldTest, FillSelectControlWithFullStateNames) { 203 const char* const kStates[] = { 204 "Alabama", "California" 205 }; 206 AutofillField field( 207 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), 208 base::string16()); 209 field.set_heuristic_type(ADDRESS_HOME_STATE); 210 211 AutofillField::FillFormField(field, ASCIIToUTF16("CA"), "en-US", &field); 212 EXPECT_EQ(ASCIIToUTF16("California"), field.value); 213} 214 215TEST(AutofillFieldTest, FillSelectControlWithWithAbbreviateStateNames) { 216 const char* const kStates[] = { 217 "AL", "CA" 218 }; 219 AutofillField field( 220 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), 221 base::string16()); 222 field.set_heuristic_type(ADDRESS_HOME_STATE); 223 224 AutofillField::FillFormField(field, ASCIIToUTF16("California"), "en-US", 225 &field); 226 EXPECT_EQ(ASCIIToUTF16("CA"), field.value); 227} 228 229TEST(AutofillFieldTest, FillSelectControlWithNumericMonth) { 230 const char* const kMonthsNumeric[] = { 231 "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", 232 }; 233 AutofillField field( 234 GenerateSelectFieldWithOptions(kMonthsNumeric, arraysize(kMonthsNumeric)), 235 base::string16()); 236 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); 237 238 // Try with a leading zero. 239 AutofillField::FillFormField(field, ASCIIToUTF16("03"), "en-US", &field); 240 EXPECT_EQ(ASCIIToUTF16("03"), field.value); 241 242 // Try without a leading zero. 243 AutofillField::FillFormField(field, ASCIIToUTF16("4"), "en-US", &field); 244 EXPECT_EQ(ASCIIToUTF16("04"), field.value); 245 246 // Try a two-digit month. 247 AutofillField::FillFormField(field, ASCIIToUTF16("11"), "en-US", &field); 248 EXPECT_EQ(ASCIIToUTF16("11"), field.value); 249} 250 251TEST(AutofillFieldTest, FillSelectControlWithAbbreviatedMonthName) { 252 const char* const kMonthsAbbreviated[] = { 253 "Jan", "Feb", "Mar", "Apr", "May", "Jun", 254 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", 255 }; 256 AutofillField field( 257 GenerateSelectFieldWithOptions( 258 kMonthsAbbreviated, arraysize(kMonthsAbbreviated)), 259 base::string16()); 260 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); 261 262 AutofillField::FillFormField(field, ASCIIToUTF16("04"), "en-US", &field); 263 EXPECT_EQ(ASCIIToUTF16("Apr"), field.value); 264} 265 266TEST(AutofillFieldTest, FillSelectControlWithFullMonthName) { 267 const char* const kMonthsFull[] = { 268 "January", "February", "March", "April", "May", "June", 269 "July", "August", "September", "October", "November", "December", 270 }; 271 AutofillField field( 272 GenerateSelectFieldWithOptions(kMonthsFull, arraysize(kMonthsFull)), 273 base::string16()); 274 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); 275 276 AutofillField::FillFormField(field, ASCIIToUTF16("04"), "en-US", &field); 277 EXPECT_EQ(ASCIIToUTF16("April"), field.value); 278} 279 280TEST(AutofillFieldTest, FillSelectControlWithNumericMonthSansLeadingZero) { 281 const char* const kMonthsNumeric[] = { 282 "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 283 }; 284 AutofillField field( 285 GenerateSelectFieldWithOptions(kMonthsNumeric, arraysize(kMonthsNumeric)), 286 base::string16()); 287 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); 288 289 AutofillField::FillFormField(field, ASCIIToUTF16("04"), "en-US", &field); 290 EXPECT_EQ(ASCIIToUTF16("4"), field.value); 291} 292 293TEST(AutofillFieldTest, FillSelectControlWithTwoDigitCreditCardYear) { 294 const char* const kYears[] = { 295 "12", "13", "14", "15", "16", "17", "18", "19" 296 }; 297 AutofillField field(GenerateSelectFieldWithOptions(kYears, arraysize(kYears)), 298 base::string16()); 299 field.set_heuristic_type(CREDIT_CARD_EXP_2_DIGIT_YEAR); 300 301 AutofillField::FillFormField(field, ASCIIToUTF16("2017"), "en-US", &field); 302 EXPECT_EQ(ASCIIToUTF16("17"), field.value); 303} 304 305TEST(AutofillFieldTest, FillSelectControlWithCreditCardType) { 306 const char* const kCreditCardTypes[] = { 307 "Visa", "Master Card", "AmEx", "discover" 308 }; 309 AutofillField field( 310 GenerateSelectFieldWithOptions( 311 kCreditCardTypes, arraysize(kCreditCardTypes)), 312 base::string16()); 313 field.set_heuristic_type(CREDIT_CARD_TYPE); 314 315 // Normal case: 316 AutofillField::FillFormField(field, ASCIIToUTF16("Visa"), "en-US", &field); 317 EXPECT_EQ(ASCIIToUTF16("Visa"), field.value); 318 319 // Filling should be able to handle intervening whitespace: 320 AutofillField::FillFormField(field, ASCIIToUTF16("MasterCard"), "en-US", 321 &field); 322 EXPECT_EQ(ASCIIToUTF16("Master Card"), field.value); 323 324 // American Express is sometimes abbreviated as AmEx: 325 AutofillField::FillFormField(field, ASCIIToUTF16("American Express"), "en-US", 326 &field); 327 EXPECT_EQ(ASCIIToUTF16("AmEx"), field.value); 328 329 // Case insensitivity: 330 AutofillField::FillFormField(field, ASCIIToUTF16("Discover"), "en-US", 331 &field); 332 EXPECT_EQ(ASCIIToUTF16("discover"), field.value); 333} 334 335TEST(AutofillFieldTest, FillMonthControl) { 336 AutofillField field; 337 field.form_control_type = "month"; 338 339 // Try a month with two digits. 340 AutofillField::FillFormField(field, ASCIIToUTF16("12/2017"), "en-US", &field); 341 EXPECT_EQ(ASCIIToUTF16("2017-12"), field.value); 342 343 // Try a month with a leading zero. 344 AutofillField::FillFormField(field, ASCIIToUTF16("03/2019"), "en-US", &field); 345 EXPECT_EQ(ASCIIToUTF16("2019-03"), field.value); 346 347 // Try a month without a leading zero. 348 AutofillField::FillFormField(field, ASCIIToUTF16("4/2018"), "en-US", &field); 349 EXPECT_EQ(ASCIIToUTF16("2018-04"), field.value); 350} 351 352TEST(AutofillFieldTest, FillStreetAddressTextArea) { 353 AutofillField field; 354 field.form_control_type = "textarea"; 355 356 base::string16 value = ASCIIToUTF16("123 Fake St.\n" 357 "Apt. 42"); 358 AutofillField::FillFormField(field, value, "en-US", &field); 359 EXPECT_EQ(value, field.value); 360} 361 362TEST(AutofillFieldTest, FillStreetAddressTextField) { 363 AutofillField field; 364 field.form_control_type = "text"; 365 field.set_server_type(ADDRESS_HOME_STREET_ADDRESS); 366 367 base::string16 value = ASCIIToUTF16("123 Fake St.\n" 368 "Apt. 42"); 369 AutofillField::FillFormField(field, value, "en-US", &field); 370 EXPECT_EQ(ASCIIToUTF16("123 Fake St., Apt. 42"), field.value); 371} 372 373} // namespace 374} // namespace autofill 375