Home | History | Annotate | Download | only in browser
      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 <string>
      6 
      7 #include "base/strings/string16.h"
      8 #include "base/strings/utf_string_conversions.h"
      9 #include "components/autofill/core/browser/address.h"
     10 #include "components/autofill/core/browser/autofill_type.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 using base::ASCIIToUTF16;
     14 
     15 namespace autofill {
     16 
     17 // Test that country data can be properly returned as either a country code or a
     18 // localized country name.
     19 TEST(AddressTest, GetCountry) {
     20   Address address;
     21   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
     22 
     23   // Make sure that nothing breaks when the country code is missing.
     24   base::string16 country =
     25       address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
     26   EXPECT_EQ(base::string16(), country);
     27 
     28   address.SetInfo(
     29       AutofillType(ADDRESS_HOME_COUNTRY), ASCIIToUTF16("US"), "en-US");
     30   country = address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
     31   EXPECT_EQ(ASCIIToUTF16("United States"), country);
     32   country = address.GetInfo(
     33       AutofillType(HTML_TYPE_COUNTRY_NAME, HTML_MODE_NONE), "en-US");
     34   EXPECT_EQ(ASCIIToUTF16("United States"), country);
     35   country = address.GetInfo(
     36       AutofillType(HTML_TYPE_COUNTRY_CODE, HTML_MODE_NONE), "en-US");
     37   EXPECT_EQ(ASCIIToUTF16("US"), country);
     38 
     39   address.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("CA"));
     40   country = address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
     41   EXPECT_EQ(ASCIIToUTF16("Canada"), country);
     42   country = address.GetInfo(
     43       AutofillType(HTML_TYPE_COUNTRY_NAME, HTML_MODE_NONE), "en-US");
     44   EXPECT_EQ(ASCIIToUTF16("Canada"), country);
     45   country = address.GetInfo(
     46       AutofillType(HTML_TYPE_COUNTRY_CODE, HTML_MODE_NONE), "en-US");
     47   EXPECT_EQ(ASCIIToUTF16("CA"), country);
     48 }
     49 
     50 // Test that we properly detect country codes appropriate for each country.
     51 TEST(AddressTest, SetCountry) {
     52   Address address;
     53   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
     54 
     55   // Test basic conversion.
     56   address.SetInfo(
     57       AutofillType(ADDRESS_HOME_COUNTRY), ASCIIToUTF16("United States"),
     58       "en-US");
     59   base::string16 country =
     60       address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
     61   EXPECT_EQ(ASCIIToUTF16("US"), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
     62   EXPECT_EQ(ASCIIToUTF16("United States"), country);
     63 
     64   // Test basic synonym detection.
     65   address.SetInfo(
     66       AutofillType(ADDRESS_HOME_COUNTRY), ASCIIToUTF16("USA"), "en-US");
     67   country = address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
     68   EXPECT_EQ(ASCIIToUTF16("US"), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
     69   EXPECT_EQ(ASCIIToUTF16("United States"), country);
     70 
     71   // Test case-insensitivity.
     72   address.SetInfo(
     73       AutofillType(ADDRESS_HOME_COUNTRY), ASCIIToUTF16("canADA"), "en-US");
     74   country = address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
     75   EXPECT_EQ(ASCIIToUTF16("CA"), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
     76   EXPECT_EQ(ASCIIToUTF16("Canada"), country);
     77 
     78   // Test country code detection.
     79   address.SetInfo(
     80       AutofillType(ADDRESS_HOME_COUNTRY), ASCIIToUTF16("JP"), "en-US");
     81   country = address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
     82   EXPECT_EQ(ASCIIToUTF16("JP"), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
     83   EXPECT_EQ(ASCIIToUTF16("Japan"), country);
     84 
     85   // Test that we ignore unknown countries.
     86   address.SetInfo(
     87       AutofillType(ADDRESS_HOME_COUNTRY), ASCIIToUTF16("Unknown"), "en-US");
     88   country = address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
     89   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
     90   EXPECT_EQ(base::string16(), country);
     91 
     92   // Test setting the country based on an HTML field type.
     93   AutofillType html_type_country_code =
     94       AutofillType(HTML_TYPE_COUNTRY_CODE, HTML_MODE_NONE);
     95   address.SetInfo(html_type_country_code, ASCIIToUTF16("US"), "en-US");
     96   country = address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
     97   EXPECT_EQ(ASCIIToUTF16("US"), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
     98   EXPECT_EQ(ASCIIToUTF16("United States"), country);
     99 
    100   // Test case-insensitivity when setting the country based on an HTML field
    101   // type.
    102   address.SetInfo(html_type_country_code, ASCIIToUTF16("cA"), "en-US");
    103   country = address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
    104   EXPECT_EQ(ASCIIToUTF16("CA"), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
    105   EXPECT_EQ(ASCIIToUTF16("Canada"), country);
    106 
    107   // Test setting the country based on invalid data with an HTML field type.
    108   address.SetInfo(html_type_country_code, ASCIIToUTF16("unknown"), "en-US");
    109   country = address.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), "en-US");
    110   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
    111   EXPECT_EQ(base::string16(), country);
    112 }
    113 
    114 // Test that we properly match typed values to stored country data.
    115 TEST(AddressTest, IsCountry) {
    116   Address address;
    117   address.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
    118 
    119   const char* const kValidMatches[] = {
    120     "United States",
    121     "USA",
    122     "US",
    123     "United states",
    124     "us"
    125   };
    126   for (size_t i = 0; i < arraysize(kValidMatches); ++i) {
    127     SCOPED_TRACE(kValidMatches[i]);
    128     ServerFieldTypeSet matching_types;
    129     address.GetMatchingTypes(ASCIIToUTF16(kValidMatches[i]), "US",
    130                              &matching_types);
    131     ASSERT_EQ(1U, matching_types.size());
    132     EXPECT_EQ(ADDRESS_HOME_COUNTRY, *matching_types.begin());
    133   }
    134 
    135   const char* const kInvalidMatches[] = {
    136     "United",
    137     "Garbage"
    138   };
    139   for (size_t i = 0; i < arraysize(kInvalidMatches); ++i) {
    140     ServerFieldTypeSet matching_types;
    141     address.GetMatchingTypes(ASCIIToUTF16(kInvalidMatches[i]), "US",
    142                              &matching_types);
    143     EXPECT_EQ(0U, matching_types.size());
    144   }
    145 
    146   // Make sure that garbage values don't match when the country code is empty.
    147   address.SetRawInfo(ADDRESS_HOME_COUNTRY, base::string16());
    148   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
    149   ServerFieldTypeSet matching_types;
    150   address.GetMatchingTypes(ASCIIToUTF16("Garbage"), "US", &matching_types);
    151   EXPECT_EQ(0U, matching_types.size());
    152 }
    153 
    154 // Verifies that Address::GetInfo() correctly combines address lines.
    155 TEST(AddressTest, GetStreetAddress) {
    156   const AutofillType type = AutofillType(ADDRESS_HOME_STREET_ADDRESS);
    157 
    158   // Address has no address lines.
    159   Address address;
    160   EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    161   EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    162   EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE3).empty());
    163   EXPECT_EQ(base::string16(), address.GetInfo(type, "en-US"));
    164 
    165   // Address has only line 1.
    166   address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave."));
    167   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    168   EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    169   EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE3).empty());
    170   EXPECT_EQ(ASCIIToUTF16("123 Example Ave."), address.GetInfo(type, "en-US"));
    171 
    172   // Address has only line 2.
    173   address.SetRawInfo(ADDRESS_HOME_LINE1, base::string16());
    174   address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt 42."));
    175   EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    176   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    177   EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE3).empty());
    178   EXPECT_EQ(ASCIIToUTF16("\nApt 42."), address.GetInfo(type, "en-US"));
    179 
    180   // Address has lines 1 and 2.
    181   address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave."));
    182   address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42"));
    183   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    184   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    185   EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE3).empty());
    186   EXPECT_EQ(ASCIIToUTF16("123 Example Ave.\n"
    187                          "Apt. 42"),
    188             address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
    189   EXPECT_EQ(ASCIIToUTF16("123 Example Ave.\n"
    190                          "Apt. 42"),
    191             address.GetInfo(type, "en-US"));
    192 
    193   // A wild third line appears.
    194   address.SetRawInfo(ADDRESS_HOME_LINE3, ASCIIToUTF16("Living room couch"));
    195   EXPECT_EQ(ASCIIToUTF16("Living room couch"),
    196             address.GetRawInfo(ADDRESS_HOME_LINE3));
    197   EXPECT_EQ(ASCIIToUTF16("123 Example Ave.\n"
    198                          "Apt. 42\n"
    199                          "Living room couch"),
    200             address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
    201 
    202   // The second line vanishes.
    203   address.SetRawInfo(ADDRESS_HOME_LINE2, base::string16());
    204   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    205   EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    206   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE3).empty());
    207   EXPECT_EQ(ASCIIToUTF16("123 Example Ave.\n"
    208                          "\n"
    209                          "Living room couch"),
    210             address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
    211 }
    212 
    213 // Verifies that overwriting an address with N lines with one that has fewer
    214 // than N lines does not result in an address with blank lines at the end.
    215 TEST(AddressTest, GetStreetAddressAfterOverwritingLongAddressWithShorterOne) {
    216   // Start with an address that has two lines.
    217   Address address;
    218   address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave."));
    219   address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42"));
    220 
    221   // Now clear out the second address line.
    222   address.SetRawInfo(ADDRESS_HOME_LINE2, base::string16());
    223   EXPECT_EQ(ASCIIToUTF16("123 Example Ave."),
    224             address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
    225 
    226   // Now clear out the first address line as well.
    227   address.SetRawInfo(ADDRESS_HOME_LINE1, base::string16());
    228   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
    229 }
    230 
    231 // Verifies that Address::SetRawInfo() is able to split address lines correctly.
    232 TEST(AddressTest, SetRawStreetAddress) {
    233   const base::string16 empty_street_address;
    234   const base::string16 short_street_address = ASCIIToUTF16("456 Nowhere Ln.");
    235   const base::string16 long_street_address =
    236       ASCIIToUTF16("123 Example Ave.\n"
    237                    "Apt. 42\n"
    238                    "(The one with the blue door)");
    239 
    240   Address address;
    241   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1));
    242   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2));
    243 
    244   address.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, long_street_address);
    245   EXPECT_EQ(ASCIIToUTF16("123 Example Ave."),
    246             address.GetRawInfo(ADDRESS_HOME_LINE1));
    247   EXPECT_EQ(ASCIIToUTF16("Apt. 42"), address.GetRawInfo(ADDRESS_HOME_LINE2));
    248   EXPECT_EQ(long_street_address,
    249             address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
    250 
    251   // A short address should clear out unused address lines.
    252   address.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, short_street_address);
    253   EXPECT_EQ(ASCIIToUTF16("456 Nowhere Ln."),
    254             address.GetRawInfo(ADDRESS_HOME_LINE1));
    255   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2));
    256 
    257   // An empty address should clear out all address lines.
    258   address.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, long_street_address);
    259   address.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, empty_street_address);
    260   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1));
    261   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2));
    262 }
    263 
    264 // Street addresses should be set properly.
    265 TEST(AddressTest, SetStreetAddress) {
    266   const base::string16 empty_street_address;
    267   const base::string16 multi_line_street_address =
    268       ASCIIToUTF16("789 Fancy Pkwy.\n"
    269                    "Unit 3.14\n"
    270                    "Box 9");
    271   const base::string16 single_line_street_address =
    272       ASCIIToUTF16("123 Main, Apt 7");
    273   const AutofillType type = AutofillType(ADDRESS_HOME_STREET_ADDRESS);
    274 
    275   // Start with a non-empty address.
    276   Address address;
    277   address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave."));
    278   address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42"));
    279   address.SetRawInfo(ADDRESS_HOME_LINE3, ASCIIToUTF16("and a half"));
    280   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    281   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    282   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE3).empty());
    283 
    284   // Attempting to set a multi-line address should succeed.
    285   EXPECT_TRUE(address.SetInfo(type, multi_line_street_address, "en-US"));
    286   EXPECT_EQ(ASCIIToUTF16("789 Fancy Pkwy."),
    287             address.GetRawInfo(ADDRESS_HOME_LINE1));
    288   EXPECT_EQ(ASCIIToUTF16("Unit 3.14"), address.GetRawInfo(ADDRESS_HOME_LINE2));
    289   EXPECT_EQ(ASCIIToUTF16("Box 9"), address.GetRawInfo(ADDRESS_HOME_LINE3));
    290 
    291   // Setting a single line street address should clear out subsequent lines.
    292   EXPECT_TRUE(address.SetInfo(type, single_line_street_address, "en-US"));
    293   EXPECT_EQ(single_line_street_address, address.GetRawInfo(ADDRESS_HOME_LINE1));
    294   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2));
    295   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE3));
    296 
    297   // Attempting to set an empty address should also succeed, and clear out the
    298   // previously stored data.
    299   EXPECT_TRUE(address.SetInfo(type, multi_line_street_address, "en-US"));
    300   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    301   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    302   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE3).empty());
    303   EXPECT_TRUE(address.SetInfo(type, empty_street_address, "en-US"));
    304   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1));
    305   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2));
    306   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE3));
    307 }
    308 
    309 // Verifies that Address::SetInfio() rejects setting data for
    310 // ADDRESS_HOME_STREET_ADDRESS if the data has any interior blank lines.
    311 TEST(AddressTest, SetStreetAddressRejectsAddressesWithInteriorBlankLines) {
    312   // Start with a non-empty address.
    313   Address address;
    314   address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave."));
    315   address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42"));
    316   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    317   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    318   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS).empty());
    319 
    320   // Attempting to set an address with interior blank lines should fail, and
    321   // clear out the previously stored address.
    322   EXPECT_FALSE(address.SetInfo(AutofillType(ADDRESS_HOME_STREET_ADDRESS),
    323                                ASCIIToUTF16("Address line 1\n"
    324                                             "\n"
    325                                             "Address line 3"),
    326                                "en-US"));
    327   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1));
    328   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2));
    329   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
    330 }
    331 
    332 // Verifies that Address::SetInfio() rejects setting data for
    333 // ADDRESS_HOME_STREET_ADDRESS if the data has any leading blank lines.
    334 TEST(AddressTest, SetStreetAddressRejectsAddressesWithLeadingBlankLines) {
    335   // Start with a non-empty address.
    336   Address address;
    337   address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave."));
    338   address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42"));
    339   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    340   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    341   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS).empty());
    342 
    343   // Attempting to set an address with leading blank lines should fail, and
    344   // clear out the previously stored address.
    345   EXPECT_FALSE(address.SetInfo(AutofillType(ADDRESS_HOME_STREET_ADDRESS),
    346                                ASCIIToUTF16("\n"
    347                                             "Address line 2"
    348                                             "Address line 3"),
    349                                "en-US"));
    350   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1));
    351   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2));
    352   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
    353 }
    354 
    355 // Verifies that Address::SetInfio() rejects setting data for
    356 // ADDRESS_HOME_STREET_ADDRESS if the data has any trailing blank lines.
    357 TEST(AddressTest, SetStreetAddressRejectsAddressesWithTrailingBlankLines) {
    358   // Start with a non-empty address.
    359   Address address;
    360   address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave."));
    361   address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42"));
    362   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty());
    363   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty());
    364   EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS).empty());
    365 
    366   // Attempting to set an address with leading blank lines should fail, and
    367   // clear out the previously stored address.
    368   EXPECT_FALSE(address.SetInfo(AutofillType(ADDRESS_HOME_STREET_ADDRESS),
    369                                ASCIIToUTF16("Address line 1"
    370                                             "Address line 2"
    371                                             "\n"),
    372                                "en-US"));
    373   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1));
    374   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2));
    375   EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
    376 }
    377 
    378 }  // namespace autofill
    379