address_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 13using base::ASCIIToUTF16; 14 15namespace autofill { 16 17// Test that country data can be properly returned as either a country code or a 18// localized country name. 19TEST(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. 51TEST(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. 115TEST(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. 155TEST(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_EQ(base::string16(), address.GetInfo(type, "en-US")); 163 164 // Address has only line 1. 165 address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave.")); 166 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty()); 167 EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty()); 168 EXPECT_EQ(ASCIIToUTF16("123 Example Ave."), address.GetInfo(type, "en-US")); 169 170 // Address has only line 2. 171 address.SetRawInfo(ADDRESS_HOME_LINE1, base::string16()); 172 address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt 42.")); 173 EXPECT_TRUE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty()); 174 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty()); 175 EXPECT_EQ(ASCIIToUTF16("\nApt 42."), address.GetInfo(type, "en-US")); 176 177 // Address has lines 1 and 2. 178 address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave.")); 179 address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42")); 180 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty()); 181 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty()); 182 EXPECT_EQ(ASCIIToUTF16("123 Example Ave.\n" 183 "Apt. 42"), 184 address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); 185 EXPECT_EQ(ASCIIToUTF16("123 Example Ave.\n" 186 "Apt. 42"), 187 address.GetInfo(type, "en-US")); 188} 189 190// Verifies that overwriting an address with N lines with one that has fewer 191// than N lines does not result in an address with blank lines at the end. 192TEST(AddressTest, GetStreetAddressAfterOverwritingLongAddressWithShorterOne) { 193 // Start with an address that has two lines. 194 Address address; 195 address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave.")); 196 address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42")); 197 198 // Now clear out the second address line. 199 address.SetRawInfo(ADDRESS_HOME_LINE2, base::string16()); 200 EXPECT_EQ(ASCIIToUTF16("123 Example Ave."), 201 address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); 202 203 // Now clear out the first address line as well. 204 address.SetRawInfo(ADDRESS_HOME_LINE1, base::string16()); 205 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); 206} 207 208// Verifies that Address::SetRawInfo() is able to split address lines correctly. 209TEST(AddressTest, SetRawStreetAddress) { 210 const base::string16 empty_street_address; 211 const base::string16 short_street_address = ASCIIToUTF16("456 Nowhere Ln."); 212 const base::string16 long_street_address = 213 ASCIIToUTF16("123 Example Ave.\n" 214 "Apt. 42\n" 215 "(The one with the blue door)"); 216 217 Address address; 218 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1)); 219 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2)); 220 221 address.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, long_street_address); 222 EXPECT_EQ(ASCIIToUTF16("123 Example Ave."), 223 address.GetRawInfo(ADDRESS_HOME_LINE1)); 224 EXPECT_EQ(ASCIIToUTF16("Apt. 42"), address.GetRawInfo(ADDRESS_HOME_LINE2)); 225 EXPECT_EQ(long_street_address, 226 address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); 227 228 // A short address should clear out unused address lines. 229 address.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, short_street_address); 230 EXPECT_EQ(ASCIIToUTF16("456 Nowhere Ln."), 231 address.GetRawInfo(ADDRESS_HOME_LINE1)); 232 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2)); 233 234 // An empty address should clear out all address lines. 235 address.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, long_street_address); 236 address.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, empty_street_address); 237 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1)); 238 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2)); 239} 240 241// Verifies that Address::SetInfo() rejects setting data for 242// ADDRESS_HOME_STREET_ADDRESS without newlines, as there is no good general way 243// to parse that data into the consituent address lines. Addresses without 244// newlines should be set properly. 245TEST(AddressTest, SetStreetAddress) { 246 const base::string16 empty_street_address; 247 const base::string16 one_line_street_address = 248 ASCIIToUTF16("456 New St., Apt. 17"); 249 const base::string16 multi_line_street_address = 250 ASCIIToUTF16("789 Fancy Pkwy.\n" 251 "Unit 3.14"); 252 const AutofillType type = AutofillType(ADDRESS_HOME_STREET_ADDRESS); 253 254 // Start with a non-empty address. 255 Address address; 256 address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave.")); 257 address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42")); 258 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty()); 259 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty()); 260 261 // Attempting to set a one-line address should fail, as the single line might 262 // actually represent multiple logical lines, combined into one due to the 263 // user having to work around constraints imposed by the website. 264 EXPECT_FALSE(address.SetInfo(type, one_line_street_address, "en-US")); 265 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1)); 266 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2)); 267 268 // Attempting to set a multi-line address should succeed. 269 EXPECT_TRUE(address.SetInfo(type, multi_line_street_address, "en-US")); 270 EXPECT_EQ(ASCIIToUTF16("789 Fancy Pkwy."), 271 address.GetRawInfo(ADDRESS_HOME_LINE1)); 272 EXPECT_EQ(ASCIIToUTF16("Unit 3.14"), address.GetRawInfo(ADDRESS_HOME_LINE2)); 273 274 // Attempting to set an empty address should also succeed, and clear out the 275 // previously stored data. 276 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty()); 277 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty()); 278 EXPECT_TRUE(address.SetInfo(type, empty_street_address, "en-US")); 279 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1)); 280 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2)); 281} 282 283// Verifies that Address::SetInfio() rejects setting data for 284// ADDRESS_HOME_STREET_ADDRESS if the data has any interior blank lines. 285TEST(AddressTest, SetStreetAddressRejectsAddressesWithInteriorBlankLines) { 286 // Start with a non-empty address. 287 Address address; 288 address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave.")); 289 address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42")); 290 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty()); 291 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty()); 292 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS).empty()); 293 294 // Attempting to set an address with interior blank lines should fail, and 295 // clear out the previously stored address. 296 EXPECT_FALSE(address.SetInfo(AutofillType(ADDRESS_HOME_STREET_ADDRESS), 297 ASCIIToUTF16("Address line 1\n" 298 "\n" 299 "Address line 3"), 300 "en-US")); 301 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1)); 302 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2)); 303 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); 304} 305 306// Verifies that Address::SetInfio() rejects setting data for 307// ADDRESS_HOME_STREET_ADDRESS if the data has any leading blank lines. 308TEST(AddressTest, SetStreetAddressRejectsAddressesWithLeadingBlankLines) { 309 // Start with a non-empty address. 310 Address address; 311 address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave.")); 312 address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42")); 313 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty()); 314 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty()); 315 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS).empty()); 316 317 // Attempting to set an address with leading blank lines should fail, and 318 // clear out the previously stored address. 319 EXPECT_FALSE(address.SetInfo(AutofillType(ADDRESS_HOME_STREET_ADDRESS), 320 ASCIIToUTF16("\n" 321 "Address line 2" 322 "Address line 3"), 323 "en-US")); 324 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1)); 325 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2)); 326 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); 327} 328 329// Verifies that Address::SetInfio() rejects setting data for 330// ADDRESS_HOME_STREET_ADDRESS if the data has any trailing blank lines. 331TEST(AddressTest, SetStreetAddressRejectsAddressesWithTrailingBlankLines) { 332 // Start with a non-empty address. 333 Address address; 334 address.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("123 Example Ave.")); 335 address.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Apt. 42")); 336 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE1).empty()); 337 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_LINE2).empty()); 338 EXPECT_FALSE(address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS).empty()); 339 340 // Attempting to set an address with leading blank lines should fail, and 341 // clear out the previously stored address. 342 EXPECT_FALSE(address.SetInfo(AutofillType(ADDRESS_HOME_STREET_ADDRESS), 343 ASCIIToUTF16("Address line 1" 344 "Address line 2" 345 "\n"), 346 "en-US")); 347 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE1)); 348 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_LINE2)); 349 EXPECT_EQ(base::string16(), address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); 350} 351 352} // namespace autofill 353