blob: b70b6f2077a87cdcab29b41a440704010baa3429 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/autofill/core/browser/autofill_profile.h"
#include <stddef.h>
#include <memory>
#include <vector>
#include "base/format_macros.h"
#include "base/guid.h"
#include "base/stl_util.h"
#include "base/strings/string16.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/autofill_metadata.h"
#include "components/autofill/core/browser/autofill_test_utils.h"
#include "components/autofill/core/browser/autofill_type.h"
#include "components/autofill/core/browser/field_types.h"
#include "components/autofill/core/browser/test_autofill_clock.h"
#include "components/autofill/core/common/autofill_constants.h"
#include "components/autofill/core/common/form_field_data.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::ASCIIToUTF16;
using base::UTF8ToUTF16;
namespace autofill {
namespace {
base::string16 GetLabel(AutofillProfile* profile) {
std::vector<AutofillProfile*> profiles;
profiles.push_back(profile);
std::vector<base::string16> labels;
AutofillProfile::CreateDifferentiatingLabels(profiles, "en-US", &labels);
return labels[0];
}
void SetupValidatedTestProfile(AutofillProfile& profile) {
profile.set_guid(base::GenerateGUID());
profile.set_origin(kSettingsOrigin);
test::SetProfileInfo(&profile, "Marion", "Mitchell", "Morrison",
"marion@me.xyz", "Fox", "123 Zoo St.", "unit 5",
"Hollywood", "CA", "91601", "US", "12345678910");
profile.SetClientValidityFromBitfieldValue(1984);
profile.set_is_client_validity_states_updated(true);
}
std::vector<AutofillProfile*> ToRawPointerVector(
const std::vector<std::unique_ptr<AutofillProfile>>& list) {
std::vector<AutofillProfile*> result;
for (const auto& item : list)
result.push_back(item.get());
return result;
}
} // namespace
// Tests different possibilities for summary string generation.
// Based on existence of first name, last name, and address line 1.
TEST(AutofillProfileTest, PreviewSummaryString) {
// Case 0/null: ""
AutofillProfile profile0(base::GenerateGUID(), test::kEmptyOrigin);
// Empty profile - nothing to update.
base::string16 summary0 = GetLabel(&profile0);
EXPECT_EQ(base::string16(), summary0);
// Case 0a/empty name and address, so the first two fields of the rest of the
// data is used: "Hollywood, CA"
AutofillProfile profile00(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile00, "", "", "",
"johnwayne@me.xyz", "Fox", "", "", "Hollywood", "CA", "91601", "US",
"16505678910");
base::string16 summary00 = GetLabel(&profile00);
EXPECT_EQ(ASCIIToUTF16("Hollywood, CA"), summary00);
// Case 1: "<address>" without line 2.
AutofillProfile profile1(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile1, "", "", "",
"johnwayne@me.xyz", "Fox", "123 Zoo St.", "", "Hollywood", "CA",
"91601", "US", "16505678910");
base::string16 summary1 = GetLabel(&profile1);
EXPECT_EQ(ASCIIToUTF16("123 Zoo St., Hollywood"), summary1);
// Case 1a: "<address>" with line 2.
AutofillProfile profile1a(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile1a, "", "", "",
"johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
"91601", "US", "16505678910");
base::string16 summary1a = GetLabel(&profile1a);
EXPECT_EQ(ASCIIToUTF16("123 Zoo St., unit 5"), summary1a);
// Case 2: "<lastname>"
AutofillProfile profile2(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile2, "", "Mitchell",
"Morrison", "johnwayne@me.xyz", "Fox", "", "", "Hollywood", "CA",
"91601", "US", "16505678910");
base::string16 summary2 = GetLabel(&profile2);
// Summary includes full name, to the maximal extent available.
EXPECT_EQ(ASCIIToUTF16("Mitchell Morrison, Hollywood"), summary2);
// Case 3: "<lastname>, <address>"
AutofillProfile profile3(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile3, "", "Mitchell",
"Morrison", "johnwayne@me.xyz", "Fox", "123 Zoo St.", "",
"Hollywood", "CA", "91601", "US", "16505678910");
base::string16 summary3 = GetLabel(&profile3);
EXPECT_EQ(ASCIIToUTF16("Mitchell Morrison, 123 Zoo St."), summary3);
// Case 4: "<firstname>"
AutofillProfile profile4(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile4, "Marion", "Mitchell", "",
"johnwayne@me.xyz", "Fox", "", "", "Hollywood", "CA", "91601", "US",
"16505678910");
base::string16 summary4 = GetLabel(&profile4);
EXPECT_EQ(ASCIIToUTF16("Marion Mitchell, Hollywood"), summary4);
// Case 5: "<firstname>, <address>"
AutofillProfile profile5(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile5, "Marion", "Mitchell", "",
"johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
"91601", "US", "16505678910");
base::string16 summary5 = GetLabel(&profile5);
EXPECT_EQ(ASCIIToUTF16("Marion Mitchell, 123 Zoo St."), summary5);
// Case 6: "<firstname> <lastname>"
AutofillProfile profile6(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile6, "Marion", "Mitchell",
"Morrison", "johnwayne@me.xyz", "Fox", "", "", "Hollywood", "CA",
"91601", "US", "16505678910");
base::string16 summary6 = GetLabel(&profile6);
EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison, Hollywood"),
summary6);
// Case 7: "<firstname> <lastname>, <address>"
AutofillProfile profile7(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile7, "Marion", "Mitchell",
"Morrison", "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5",
"Hollywood", "CA", "91601", "US", "16505678910");
base::string16 summary7 = GetLabel(&profile7);
EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison, 123 Zoo St."), summary7);
// Case 7a: "<firstname> <lastname>, <address>" - same as #7, except for
// e-mail.
AutofillProfile profile7a(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile7a, "Marion", "Mitchell",
"Morrison", "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5",
"Hollywood", "CA", "91601", "US", "16505678910");
std::vector<AutofillProfile*> profiles;
profiles.push_back(&profile7);
profiles.push_back(&profile7a);
std::vector<base::string16> labels;
AutofillProfile::CreateDifferentiatingLabels(profiles, "en-US", &labels);
ASSERT_EQ(profiles.size(), labels.size());
summary7 = labels[0];
base::string16 summary7a = labels[1];
EXPECT_EQ(ASCIIToUTF16(
"Marion Mitchell Morrison, 123 Zoo St., johnwayne@me.xyz"), summary7);
EXPECT_EQ(ASCIIToUTF16(
"Marion Mitchell Morrison, 123 Zoo St., marion@me.xyz"), summary7a);
}
TEST(AutofillProfileTest, AdjustInferredLabels) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[0].get(), "John", "", "Doe",
"johndoe@hades.com", "Underworld", "666 Erebus St.", "",
"Elysium", "CA", "91111", "US", "16502111111");
profiles.push_back(std::make_unique<AutofillProfile>(
base::GenerateGUID(), "http://www.example.com/"));
test::SetProfileInfo(profiles[1].get(), "Jane", "", "Doe",
"janedoe@tertium.com", "Pluto Inc.", "123 Letha Shore.",
"", "Dis", "CA", "91222", "US", "12345678910");
std::vector<base::string16> labels;
AutofillProfile::CreateDifferentiatingLabels(ToRawPointerVector(profiles),
"en-US", &labels);
ASSERT_EQ(2U, labels.size());
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St."), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]);
profiles.push_back(
std::make_unique<AutofillProfile>(base::GenerateGUID(), kSettingsOrigin));
test::SetProfileInfo(profiles[2].get(), "John", "", "Doe",
"johndoe@tertium.com", "Underworld", "666 Erebus St.",
"", "Elysium", "CA", "91111", "US", "16502111111");
labels.clear();
AutofillProfile::CreateDifferentiatingLabels(ToRawPointerVector(profiles),
"en-US", &labels);
// Profile 0 and 2 inferred label now includes an e-mail.
ASSERT_EQ(3U, labels.size());
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@hades.com"),
labels[0]);
EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]);
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@tertium.com"),
labels[2]);
profiles.resize(2);
profiles.push_back(
std::make_unique<AutofillProfile>(base::GenerateGUID(), std::string()));
test::SetProfileInfo(profiles[2].get(), "John", "", "Doe",
"johndoe@hades.com", "Underworld", "666 Erebus St.", "",
"Elysium", "CO", // State is different
"91111", "US", "16502111111");
labels.clear();
AutofillProfile::CreateDifferentiatingLabels(ToRawPointerVector(profiles),
"en-US", &labels);
// Profile 0 and 2 inferred label now includes a state.
ASSERT_EQ(3U, labels.size());
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CA"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]);
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO"), labels[2]);
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[3].get(), "John", "", "Doe",
"johndoe@hades.com", "Underworld", "666 Erebus St.", "",
"Elysium", "CO", // State is different for some.
"91111", "US",
"16504444444"); // Phone is different for some.
labels.clear();
AutofillProfile::CreateDifferentiatingLabels(ToRawPointerVector(profiles),
"en-US", &labels);
ASSERT_EQ(4U, labels.size());
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CA"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]);
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, 16502111111"),
labels[2]);
// This one differs from other ones by unique phone, so no need for extra
// information.
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, 16504444444"),
labels[3]);
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[4].get(), "John", "", "Doe",
"johndoe@styx.com", // E-Mail is different for some.
"Underworld", "666 Erebus St.", "", "Elysium",
"CO", // State is different for some.
"91111", "US",
"16504444444"); // Phone is different for some.
labels.clear();
AutofillProfile::CreateDifferentiatingLabels(ToRawPointerVector(profiles),
"en-US", &labels);
ASSERT_EQ(5U, labels.size());
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CA"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]);
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, johndoe@hades.com,"
" 16502111111"), labels[2]);
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, johndoe@hades.com,"
" 16504444444"), labels[3]);
// This one differs from other ones by unique e-mail, so no need for extra
// information.
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, johndoe@styx.com"),
labels[4]);
}
TEST(AutofillProfileTest, CreateInferredLabelsI18n_CH) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles.back().get(), "H.", "R.", "Giger",
"hrgiger@beispiel.com", "Beispiel Inc",
"Brandschenkestrasse 110", "", "Zurich", "", "8002",
"CH", "+41 44-668-1800");
profiles.back()->set_language_code("de_CH");
static const char* kExpectedLabels[] = {
"",
"H. R. Giger",
"H. R. Giger, Brandschenkestrasse 110",
"H. R. Giger, Brandschenkestrasse 110, Zurich",
"H. R. Giger, Brandschenkestrasse 110, CH-8002 Zurich",
"Beispiel Inc, H. R. Giger, Brandschenkestrasse 110, CH-8002 Zurich",
"Beispiel Inc, H. R. Giger, Brandschenkestrasse 110, CH-8002 Zurich, "
"Switzerland",
"Beispiel Inc, H. R. Giger, Brandschenkestrasse 110, CH-8002 Zurich, "
"Switzerland, hrgiger@beispiel.com",
"Beispiel Inc, H. R. Giger, Brandschenkestrasse 110, CH-8002 Zurich, "
"Switzerland, hrgiger@beispiel.com, +41 44-668-1800",
};
std::vector<base::string16> labels;
for (size_t i = 0; i < base::size(kExpectedLabels); ++i) {
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
UNKNOWN_TYPE, i, "en-US", &labels);
ASSERT_FALSE(labels.empty());
EXPECT_EQ(UTF8ToUTF16(kExpectedLabels[i]), labels.back());
}
}
TEST(AutofillProfileTest, CreateInferredLabelsI18n_FR) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles.back().get(), "Antoine", "", "de Saint-Exupéry",
"antoine@exemple.com", "Exemple Inc", "8 Rue de Londres",
"", "Paris", "", "75009", "FR", "+33 (0) 1 42 68 53 00");
profiles.back()->set_language_code("fr_FR");
profiles.back()->SetInfo(
AutofillType(ADDRESS_HOME_SORTING_CODE), UTF8ToUTF16("CEDEX"), "en-US");
static const char* kExpectedLabels[] = {
"",
"Antoine de Saint-Exupéry",
"Antoine de Saint-Exupéry, 8 Rue de Londres",
"Antoine de Saint-Exupéry, 8 Rue de Londres, Paris",
"Antoine de Saint-Exupéry, 8 Rue de Londres, 75009 Paris",
"Antoine de Saint-Exupéry, 8 Rue de Londres, 75009 Paris CEDEX",
"Exemple Inc, Antoine de Saint-Exupéry, 8 Rue de Londres, 75009 Paris "
"CEDEX",
"Exemple Inc, Antoine de Saint-Exupéry, 8 Rue de Londres, 75009 Paris "
"CEDEX, France",
"Exemple Inc, Antoine de Saint-Exupéry, 8 Rue de Londres, 75009 Paris "
"CEDEX, France, antoine@exemple.com",
"Exemple Inc, Antoine de Saint-Exupéry, 8 Rue de Londres, 75009 Paris "
"CEDEX, France, antoine@exemple.com, +33 (0) 1 42 68 53 00",
"Exemple Inc, Antoine de Saint-Exupéry, 8 Rue de Londres, 75009 Paris "
"CEDEX, France, antoine@exemple.com, +33 (0) 1 42 68 53 00",
};
std::vector<base::string16> labels;
for (size_t i = 0; i < base::size(kExpectedLabels); ++i) {
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
UNKNOWN_TYPE, i, "en-US", &labels);
ASSERT_FALSE(labels.empty());
EXPECT_EQ(UTF8ToUTF16(kExpectedLabels[i]), labels.back());
}
}
TEST(AutofillProfileTest, CreateInferredLabelsI18n_KR) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles.back().get(), "Park", "", "Jae-sang",
"park@yeleul.com", "Yeleul Inc",
"Gangnam Finance Center", "152 Teheran-ro", "Gangnam-Gu",
"Seoul", "135-984", "KR", "+82-2-531-9000");
profiles.back()->set_language_code("ko_Latn");
profiles.back()->SetInfo(ADDRESS_HOME_DEPENDENT_LOCALITY,
UTF8ToUTF16("Yeoksam-Dong"), "en-US");
static const char* kExpectedLabels[] = {
"",
"Park Jae-sang",
"Park Jae-sang, Gangnam Finance Center",
"Park Jae-sang, Gangnam Finance Center, 152 Teheran-ro",
"Park Jae-sang, Gangnam Finance Center, 152 Teheran-ro, Yeoksam-Dong",
"Park Jae-sang, Gangnam Finance Center, 152 Teheran-ro, Yeoksam-Dong, "
"Gangnam-Gu",
"Park Jae-sang, Gangnam Finance Center, 152 Teheran-ro, Yeoksam-Dong, "
"Gangnam-Gu, Seoul",
"Park Jae-sang, Gangnam Finance Center, 152 Teheran-ro, Yeoksam-Dong, "
"Gangnam-Gu, Seoul, 135-984",
"Park Jae-sang, Yeleul Inc, Gangnam Finance Center, 152 Teheran-ro, "
"Yeoksam-Dong, Gangnam-Gu, Seoul, 135-984",
"Park Jae-sang, Yeleul Inc, Gangnam Finance Center, 152 Teheran-ro, "
"Yeoksam-Dong, Gangnam-Gu, Seoul, 135-984, South Korea",
"Park Jae-sang, Yeleul Inc, Gangnam Finance Center, 152 Teheran-ro, "
"Yeoksam-Dong, Gangnam-Gu, Seoul, 135-984, South Korea, "
"park@yeleul.com",
"Park Jae-sang, Yeleul Inc, Gangnam Finance Center, 152 Teheran-ro, "
"Yeoksam-Dong, Gangnam-Gu, Seoul, 135-984, South Korea, "
"park@yeleul.com, +82-2-531-9000",
};
std::vector<base::string16> labels;
for (size_t i = 0; i < base::size(kExpectedLabels); ++i) {
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
UNKNOWN_TYPE, i, "en-US", &labels);
ASSERT_FALSE(labels.empty());
EXPECT_EQ(UTF8ToUTF16(kExpectedLabels[i]), labels.back());
}
}
TEST(AutofillProfileTest, CreateInferredLabelsI18n_JP_Latn) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles.back().get(), "Miku", "", "Hatsune",
"miku@rei.com", "Rei Inc", "Roppongi Hills Mori Tower",
"6-10-1 Roppongi, Minato-ku", "", "Tokyo", "106-6126",
"JP", "+81-3-6384-9000");
profiles.back()->set_language_code("ja_Latn");
static const char* kExpectedLabels[] = {
"",
"Miku Hatsune",
"Miku Hatsune, Roppongi Hills Mori Tower",
"Miku Hatsune, Roppongi Hills Mori Tower, 6-10-1 Roppongi, Minato-ku",
"Miku Hatsune, Roppongi Hills Mori Tower, 6-10-1 Roppongi, Minato-ku, "
"Tokyo",
"Miku Hatsune, Roppongi Hills Mori Tower, 6-10-1 Roppongi, Minato-ku, "
"Tokyo, 106-6126",
"Miku Hatsune, Rei Inc, Roppongi Hills Mori Tower, 6-10-1 Roppongi, "
"Minato-ku, Tokyo, 106-6126",
"Miku Hatsune, Rei Inc, Roppongi Hills Mori Tower, 6-10-1 Roppongi, "
"Minato-ku, Tokyo, 106-6126, Japan",
"Miku Hatsune, Rei Inc, Roppongi Hills Mori Tower, 6-10-1 Roppongi, "
"Minato-ku, Tokyo, 106-6126, Japan, miku@rei.com",
"Miku Hatsune, Rei Inc, Roppongi Hills Mori Tower, 6-10-1 Roppongi, "
"Minato-ku, Tokyo, 106-6126, Japan, miku@rei.com, +81-3-6384-9000",
};
std::vector<base::string16> labels;
for (size_t i = 0; i < base::size(kExpectedLabels); ++i) {
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
UNKNOWN_TYPE, i, "en-US", &labels);
ASSERT_FALSE(labels.empty());
EXPECT_EQ(UTF8ToUTF16(kExpectedLabels[i]), labels.back());
}
}
TEST(AutofillProfileTest, CreateInferredLabelsI18n_JP_ja) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles.back().get(), "ミク", "", "初音",
"miku@rei.com", "例", "港区六本木ヒルズ森タワー",
"六本木 6-10-1", "", "東京都", "106-6126", "JP",
"03-6384-9000");
profiles.back()->set_language_code("ja_JP");
static const char* kExpectedLabels[] = {
"",
"初音ミク",
"港区六本木ヒルズ森タワー初音ミク",
"港区六本木ヒルズ森タワー六本木 6-10-1初音ミク",
"東京都港区六本木ヒルズ森タワー六本木 6-10-1初音ミク",
"〒106-6126東京都港区六本木ヒルズ森タワー六本木 6-10-1初音ミク",
"〒106-6126東京都港区六本木ヒルズ森タワー六本木 6-10-1例初音ミク",
"〒106-6126東京都港区六本木ヒルズ森タワー六本木 6-10-1例初音ミク, Japan",
"〒106-6126東京都港区六本木ヒルズ森タワー六本木 6-10-1例初音ミク, Japan, "
"miku@rei.com",
"〒106-6126東京都港区六本木ヒルズ森タワー六本木 6-10-1例初音ミク, Japan, "
"miku@rei.com, 03-6384-9000",
};
std::vector<base::string16> labels;
for (size_t i = 0; i < base::size(kExpectedLabels); ++i) {
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
UNKNOWN_TYPE, i, "en-US", &labels);
ASSERT_FALSE(labels.empty());
EXPECT_EQ(UTF8ToUTF16(kExpectedLabels[i]), labels.back());
}
}
TEST(AutofillProfileTest, CreateInferredLabels) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[0].get(), "John", "", "Doe",
"johndoe@hades.com", "Underworld", "666 Erebus St.", "",
"Elysium", "CA", "91111", "US", "16502111111");
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[1].get(), "Jane", "", "Doe",
"janedoe@tertium.com", "Pluto Inc.", "123 Letha Shore.",
"", "Dis", "CA", "91222", "US", "12345678910");
std::vector<base::string16> labels;
// Two fields at least - no filter.
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
UNKNOWN_TYPE, 2, "en-US", &labels);
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St."), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]);
// Three fields at least - no filter.
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
UNKNOWN_TYPE, 3, "en-US", &labels);
EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., Elysium"),
labels[0]);
EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore., Dis"),
labels[1]);
std::vector<ServerFieldType> suggested_fields;
suggested_fields.push_back(ADDRESS_HOME_CITY);
suggested_fields.push_back(ADDRESS_HOME_STATE);
suggested_fields.push_back(ADDRESS_HOME_ZIP);
// Two fields at least, from suggested fields - no filter.
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, UNKNOWN_TYPE, 2,
"en-US", &labels);
EXPECT_EQ(ASCIIToUTF16("Elysium 91111"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Dis 91222"), labels[1]);
// Three fields at least, from suggested fields - no filter.
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, UNKNOWN_TYPE, 3,
"en-US", &labels);
EXPECT_EQ(ASCIIToUTF16("Elysium, CA 91111"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Dis, CA 91222"), labels[1]);
// Three fields at least, from suggested fields - but filter reduces available
// fields to two.
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, ADDRESS_HOME_ZIP, 3,
"en-US", &labels);
EXPECT_EQ(ASCIIToUTF16("Elysium, CA"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Dis, CA"), labels[1]);
suggested_fields.clear();
// In our implementation we always display NAME_FULL for all NAME* fields...
suggested_fields.push_back(NAME_MIDDLE);
// One field at least, from suggested fields - no filter.
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, UNKNOWN_TYPE, 1,
"en-US", &labels);
EXPECT_EQ(ASCIIToUTF16("John Doe"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Jane Doe"), labels[1]);
// One field at least, from suggested fields - filter the same as suggested
// field.
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, NAME_MIDDLE, 1,
"en-US", &labels);
EXPECT_EQ(base::string16(), labels[0]);
EXPECT_EQ(base::string16(), labels[1]);
suggested_fields.clear();
// In our implementation we always display NAME_FULL for NAME_MIDDLE_INITIAL
suggested_fields.push_back(NAME_MIDDLE_INITIAL);
// One field at least, from suggested fields - no filter.
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, UNKNOWN_TYPE, 1,
"en-US", &labels);
EXPECT_EQ(ASCIIToUTF16("John Doe"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("Jane Doe"), labels[1]);
// One field at least, from suggested fields - filter same as the first non-
// unknown suggested field.
suggested_fields.clear();
suggested_fields.push_back(UNKNOWN_TYPE);
suggested_fields.push_back(NAME_FULL);
suggested_fields.push_back(ADDRESS_HOME_LINE1);
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, NAME_FULL, 1,
"en-US", &labels);
EXPECT_EQ(base::string16(ASCIIToUTF16("666 Erebus St.")), labels[0]);
EXPECT_EQ(base::string16(ASCIIToUTF16("123 Letha Shore.")), labels[1]);
// No suggested fields, but non-unknown excluded field.
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
NAME_FULL, 1, "en-US", &labels);
EXPECT_EQ(base::string16(ASCIIToUTF16("666 Erebus St.")), labels[0]);
EXPECT_EQ(base::string16(ASCIIToUTF16("123 Letha Shore.")), labels[1]);
}
// Test that we fall back to using the full name if there are no other
// distinguishing fields, but only if it makes sense given the suggested fields.
TEST(AutofillProfileTest, CreateInferredLabelsFallsBackToFullName) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[0].get(), "John", "", "Doe", "doe@example.com",
"", "88 Nowhere Ave.", "", "", "", "", "", "");
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[1].get(), "Johnny", "K", "Doe",
"doe@example.com", "", "88 Nowhere Ave.", "", "", "", "",
"", "");
// If the only name field in the suggested fields is the excluded field, we
// should not fall back to the full name as a distinguishing field.
std::vector<ServerFieldType> suggested_fields;
suggested_fields.push_back(NAME_LAST);
suggested_fields.push_back(ADDRESS_HOME_LINE1);
suggested_fields.push_back(EMAIL_ADDRESS);
std::vector<base::string16> labels;
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, NAME_LAST, 1,
"en-US", &labels);
ASSERT_EQ(2U, labels.size());
EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave."), labels[0]);
EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave."), labels[1]);
// Otherwise, we should.
suggested_fields.push_back(NAME_FIRST);
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, NAME_LAST, 1,
"en-US", &labels);
ASSERT_EQ(2U, labels.size());
EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., John Doe"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., Johnny K Doe"), labels[1]);
}
// Test that we do not show duplicate fields in the labels.
TEST(AutofillProfileTest, CreateInferredLabelsNoDuplicatedFields) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[0].get(), "John", "", "Doe", "doe@example.com",
"", "88 Nowhere Ave.", "", "", "", "", "", "");
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[1].get(), "John", "", "Doe", "dojo@example.com",
"", "88 Nowhere Ave.", "", "", "", "", "", "");
// If the only name field in the suggested fields is the excluded field, we
// should not fall back to the full name as a distinguishing field.
std::vector<ServerFieldType> suggested_fields;
suggested_fields.push_back(ADDRESS_HOME_LINE1);
suggested_fields.push_back(ADDRESS_BILLING_LINE1);
suggested_fields.push_back(EMAIL_ADDRESS);
std::vector<base::string16> labels;
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, UNKNOWN_TYPE, 2,
"en-US", &labels);
ASSERT_EQ(2U, labels.size());
EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., doe@example.com"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., dojo@example.com"), labels[1]);
}
// Make sure that empty fields are not treated as distinguishing fields.
TEST(AutofillProfileTest, CreateInferredLabelsSkipsEmptyFields) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[0].get(), "John", "", "Doe", "doe@example.com",
"Gogole", "", "", "", "", "", "", "");
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[1].get(), "John", "", "Doe", "doe@example.com",
"Ggoole", "", "", "", "", "", "", "");
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[2].get(), "John", "", "Doe",
"john.doe@example.com", "Goolge", "", "", "", "", "", "",
"");
std::vector<base::string16> labels;
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
UNKNOWN_TYPE, 3, "en-US", &labels);
ASSERT_EQ(3U, labels.size());
EXPECT_EQ(ASCIIToUTF16("John Doe, doe@example.com, Gogole"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("John Doe, doe@example.com, Ggoole"), labels[1]);
EXPECT_EQ(ASCIIToUTF16("John Doe, john.doe@example.com, Goolge"), labels[2]);
// A field must have a non-empty value for each profile to be considered a
// distinguishing field.
profiles[1]->SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("88 Nowhere Ave."));
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles), nullptr,
UNKNOWN_TYPE, 1, "en-US", &labels);
ASSERT_EQ(3U, labels.size());
EXPECT_EQ(ASCIIToUTF16("John Doe, doe@example.com, Gogole"), labels[0]);
EXPECT_EQ(ASCIIToUTF16("John Doe, 88 Nowhere Ave., doe@example.com, Ggoole"),
labels[1]) << labels[1];
EXPECT_EQ(ASCIIToUTF16("John Doe, john.doe@example.com"), labels[2]);
}
// Test that labels that would otherwise have multiline values are flattened.
TEST(AutofillProfileTest, CreateInferredLabelsFlattensMultiLineValues) {
std::vector<std::unique_ptr<AutofillProfile>> profiles;
profiles.push_back(std::make_unique<AutofillProfile>(base::GenerateGUID(),
test::kEmptyOrigin));
test::SetProfileInfo(profiles[0].get(), "John", "", "Doe", "doe@example.com",
"", "88 Nowhere Ave.", "Apt. 42", "", "", "", "", "");
// If the only name field in the suggested fields is the excluded field, we
// should not fall back to the full name as a distinguishing field.
std::vector<ServerFieldType> suggested_fields;
suggested_fields.push_back(NAME_FULL);
suggested_fields.push_back(ADDRESS_HOME_STREET_ADDRESS);
std::vector<base::string16> labels;
AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
&suggested_fields, NAME_FULL, 1,
"en-US", &labels);
ASSERT_EQ(1U, labels.size());
EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., Apt. 42"), labels[0]);
}
TEST(AutofillProfileTest, IsSubsetOf) {
std::unique_ptr<AutofillProfile> a, b;
// |a| is a subset of |b|.
a.reset(new AutofillProfile(base::GenerateGUID(), test::kEmptyOrigin));
b.reset(new AutofillProfile(base::GenerateGUID(), test::kEmptyOrigin));
test::SetProfileInfo(a.get(), "Thomas", nullptr, "Jefferson",
"declaration_guy@gmail.com", nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr);
test::SetProfileInfo(b.get(), "Thomas", nullptr, "Jefferson",
"declaration_guy@gmail.com", "United States Government",
"Monticello", nullptr, "Charlottesville", "Virginia",
"22902", nullptr, nullptr);
EXPECT_TRUE(a->IsSubsetOf(*b, "en-US"));
// |b| is not a subset of |a|.
EXPECT_FALSE(b->IsSubsetOf(*a, "en-US"));
// |a| is a subset of |a|.
EXPECT_TRUE(a->IsSubsetOf(*a, "en-US"));
// One field in |b| is different.
a.reset(new AutofillProfile(base::GenerateGUID(), test::kEmptyOrigin));
b.reset(new AutofillProfile(base::GenerateGUID(), test::kEmptyOrigin));
test::SetProfileInfo(a.get(), "Thomas", nullptr, "Jefferson",
"declaration_guy@gmail.com", nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr);
test::SetProfileInfo(a.get(), "Thomas", nullptr, "Adams",
"declaration_guy@gmail.com", nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr);
EXPECT_FALSE(a->IsSubsetOf(*b, "en-US"));
}
TEST(AutofillProfileTest, SetRawInfo_UpdateValidityFlag) {
AutofillProfile a;
SetupValidatedTestProfile(a);
EXPECT_TRUE(a.is_client_validity_states_updated());
a.SetRawInfo(NAME_FULL, ASCIIToUTF16("Alice Munro"));
// NAME_FULL is NOT validated through the client API (not supported),
// therefore it should not change the validity flag.
EXPECT_TRUE(a.is_client_validity_states_updated());
a.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Ooz"));
// ADDRESS_HOME_CITY IS validated through the client API, therefore it should
// change the flag to false.
EXPECT_FALSE(a.is_client_validity_states_updated());
}
TEST(AutofillProfileTest, MergeDataFrom_DifferentProfile) {
AutofillProfile a;
SetupValidatedTestProfile(a);
// Create an identical profile except that the new profile:
// (1) Has a different origin,
// (2) Has a different address line 2,
// (3) Lacks a company name,
// (4) Has a different full name, and
// (5) Has a language code.
AutofillProfile b = a;
b.set_guid(base::GenerateGUID());
b.set_origin(kSettingsOrigin);
b.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Unit 5, area 51"));
b.SetRawInfo(COMPANY_NAME, base::string16());
b.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("M."));
b.SetRawInfo(NAME_FULL, ASCIIToUTF16("Marion M. Morrison"));
b.set_language_code("en");
EXPECT_TRUE(a.MergeDataFrom(b, "en-US"));
// Merge has modified profile a, the validation is not updated.
EXPECT_FALSE(a.is_client_validity_states_updated());
EXPECT_EQ(kSettingsOrigin, a.origin());
EXPECT_EQ(ASCIIToUTF16("Unit 5, area 51"), a.GetRawInfo(ADDRESS_HOME_LINE2));
EXPECT_EQ(ASCIIToUTF16("Fox"), a.GetRawInfo(COMPANY_NAME));
base::string16 name = a.GetInfo(NAME_FULL, "en-US");
EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison"), name);
EXPECT_EQ("en", a.language_code());
}
TEST(AutofillProfileTest, MergeDataFrom_SameProfile) {
AutofillProfile a;
SetupValidatedTestProfile(a);
// The profile has no full name yet. Merge will add it.
AutofillProfile b = a;
b.set_guid(base::GenerateGUID());
EXPECT_TRUE(a.MergeDataFrom(b, "en-US"));
// Merge has modified profile a, the validation is not updated.
EXPECT_FALSE(a.is_client_validity_states_updated());
EXPECT_EQ(1u, a.use_count());
// pretend that the profile is re-validated.
a.set_is_client_validity_states_updated(true);
// Now the profile is fully populated. Merging it again has no effect (except
// for usage statistics).
AutofillProfile c = a;
c.set_guid(base::GenerateGUID());
c.set_use_count(3);
EXPECT_FALSE(a.MergeDataFrom(c, "en-US"));
// Merge has not modified anything, the validation should not changed.
EXPECT_TRUE(a.is_client_validity_states_updated());
EXPECT_EQ(3u, a.use_count());
}
TEST(AutofillProfileTest, OverwriteName_AddNameFull) {
AutofillProfile a;
a.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("Marion"));
a.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16("Mitchell"));
a.SetRawInfo(NAME_LAST, base::ASCIIToUTF16("Morrison"));
AutofillProfile b = a;
b.SetRawInfo(NAME_FULL, base::ASCIIToUTF16("Marion Mitchell Morrison"));
EXPECT_TRUE(a.MergeDataFrom(b, "en-US"));
EXPECT_EQ(base::ASCIIToUTF16("Marion"), a.GetRawInfo(NAME_FIRST));
EXPECT_EQ(base::ASCIIToUTF16("Mitchell"), a.GetRawInfo(NAME_MIDDLE));
EXPECT_EQ(base::ASCIIToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
EXPECT_EQ(base::ASCIIToUTF16("Marion Mitchell Morrison"),
a.GetRawInfo(NAME_FULL));
}
// Tests that OverwriteName overwrites the name parts if they have different
// case.
TEST(AutofillProfileTest, OverwriteName_DifferentCase) {
AutofillProfile a;
a.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("marion"));
a.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16("mitchell"));
a.SetRawInfo(NAME_LAST, base::ASCIIToUTF16("morrison"));
AutofillProfile b = a;
b.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("Marion"));
b.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16("Mitchell"));
b.SetRawInfo(NAME_LAST, base::ASCIIToUTF16("Morrison"));
EXPECT_TRUE(a.MergeDataFrom(b, "en-US"));
EXPECT_EQ(base::ASCIIToUTF16("Marion"), a.GetRawInfo(NAME_FIRST));
EXPECT_EQ(base::ASCIIToUTF16("Mitchell"), a.GetRawInfo(NAME_MIDDLE));
EXPECT_EQ(base::ASCIIToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
}
TEST(AutofillProfileTest, AssignmentOperator) {
AutofillProfile a(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&a, "Marion", "Mitchell", "Morrison",
"marion@me.xyz", "Fox", "123 Zoo St.", "unit 5",
"Hollywood", "CA", "91601", "US",
"12345678910");
// Result of assignment should be logically equal to the original profile.
AutofillProfile b(base::GenerateGUID(), test::kEmptyOrigin);
b = a;
EXPECT_TRUE(a == b);
// Assignment to self should not change the profile value.
a = *&a; // The *& defeats Clang's -Wself-assign warning.
EXPECT_TRUE(a == b);
}
TEST(AutofillProfileTest, Copy) {
AutofillProfile a(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&a, "Marion", "Mitchell", "Morrison",
"marion@me.xyz", "Fox", "123 Zoo St.", "unit 5",
"Hollywood", "CA", "91601", "US",
"12345678910");
// Clone should be logically equal to the original.
AutofillProfile b(a);
EXPECT_TRUE(a == b);
}
TEST(AutofillProfileTest, Compare) {
AutofillProfile a(base::GenerateGUID(), std::string());
AutofillProfile b(base::GenerateGUID(), std::string());
// Empty profiles are the same.
EXPECT_EQ(0, a.Compare(b));
// GUIDs don't count.
a.set_guid(base::GenerateGUID());
b.set_guid(base::GenerateGUID());
EXPECT_EQ(0, a.Compare(b));
// Origins don't count.
a.set_origin("apple");
b.set_origin("banana");
EXPECT_EQ(0, a.Compare(b));
// Different values produce non-zero results.
test::SetProfileInfo(&a, "Jimmy", nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
test::SetProfileInfo(&b, "Ringo", nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
EXPECT_GT(0, a.Compare(b));
EXPECT_LT(0, b.Compare(a));
// Phone numbers are compared by the full number, including the area code.
// This is a regression test for http://crbug.com/163024
test::SetProfileInfo(&a, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr,
"650.555.4321");
test::SetProfileInfo(&b, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr,
"408.555.4321");
EXPECT_GT(0, a.Compare(b));
EXPECT_LT(0, b.Compare(a));
// Addresses are compared in full. Regression test for http://crbug.com/375545
test::SetProfileInfo(&a, "John", nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
a.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS,
ASCIIToUTF16("line one\nline two"));
test::SetProfileInfo(&b, "John", nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
b.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS,
ASCIIToUTF16("line one\nline two\nline three"));
EXPECT_GT(0, a.Compare(b));
EXPECT_LT(0, b.Compare(a));
}
TEST(AutofillProfileTest, IsPresentButInvalid) {
AutofillProfile profile(base::GenerateGUID(), test::kEmptyOrigin);
EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE));
EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP));
EXPECT_FALSE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER));
profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE));
EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP));
EXPECT_FALSE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER));
profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("C"));
EXPECT_TRUE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE));
profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE));
profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90"));
EXPECT_TRUE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP));
profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90210"));
EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP));
profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("310"));
EXPECT_TRUE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER));
profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("(310) 310-6000"));
EXPECT_FALSE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER));
}
TEST(AutofillProfileTest, SetRawInfoPreservesLineBreaks) {
AutofillProfile profile(base::GenerateGUID(), test::kEmptyOrigin);
profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS,
ASCIIToUTF16("123 Super St.\n"
"Apt. #42"));
EXPECT_EQ(ASCIIToUTF16("123 Super St.\n"
"Apt. #42"),
profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
}
TEST(AutofillProfileTest, SetInfoPreservesLineBreaks) {
AutofillProfile profile(base::GenerateGUID(), test::kEmptyOrigin);
profile.SetInfo(ADDRESS_HOME_STREET_ADDRESS,
ASCIIToUTF16("123 Super St.\n"
"Apt. #42"),
"en-US");
EXPECT_EQ(ASCIIToUTF16("123 Super St.\n"
"Apt. #42"),
profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
}
TEST(AutofillProfileTest, SetRawInfoDoesntTrimWhitespace) {
AutofillProfile profile(base::GenerateGUID(), test::kEmptyOrigin);
profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("\tuser@example.com "));
EXPECT_EQ(ASCIIToUTF16("\tuser@example.com "),
profile.GetRawInfo(EMAIL_ADDRESS));
}
TEST(AutofillProfileTest, SetInfoTrimsWhitespace) {
AutofillProfile profile(base::GenerateGUID(), test::kEmptyOrigin);
profile.SetInfo(EMAIL_ADDRESS, ASCIIToUTF16("\tuser@example.com "),
"en-US");
EXPECT_EQ(ASCIIToUTF16("user@example.com"),
profile.GetRawInfo(EMAIL_ADDRESS));
}
TEST(AutofillProfileTest, FullAddress) {
AutofillProfile profile(base::GenerateGUID(), test::kEmptyOrigin);
test::SetProfileInfo(&profile, "Marion", "Mitchell", "Morrison",
"marion@me.xyz", "Fox", "123 Zoo St.", "unit 5",
"Hollywood", "CA", "91601", "US",
"12345678910");
AutofillType full_address(HTML_TYPE_FULL_ADDRESS, HTML_MODE_NONE);
base::string16 formatted_address(ASCIIToUTF16(
"Marion Mitchell Morrison\n"
"Fox\n"
"123 Zoo St.\n"
"unit 5\n"
"Hollywood, CA 91601"));
EXPECT_EQ(formatted_address, profile.GetInfo(full_address, "en-US"));
// This should fail and leave the profile unchanged.
EXPECT_FALSE(profile.SetInfo(full_address, ASCIIToUTF16("foobar"), "en-US"));
EXPECT_EQ(formatted_address, profile.GetInfo(full_address, "en-US"));
// Some things can be missing...
profile.SetInfo(ADDRESS_HOME_LINE2, base::string16(), "en-US");
profile.SetInfo(EMAIL_ADDRESS, base::string16(), "en-US");
EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison\n"
"Fox\n"
"123 Zoo St.\n"
"Hollywood, CA 91601"),
profile.GetInfo(full_address, "en-US"));
// ...but nothing comes out if a required field is missing.
profile.SetInfo(ADDRESS_HOME_STATE, base::string16(), "en-US");
EXPECT_TRUE(profile.GetInfo(full_address, "en-US").empty());
// Restore the state but remove country. This should also fail.
profile.SetInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"), "en-US");
EXPECT_FALSE(profile.GetInfo(full_address, "en-US").empty());
profile.SetInfo(ADDRESS_HOME_COUNTRY, base::string16(), "en-US");
EXPECT_TRUE(profile.GetInfo(full_address, "en-US").empty());
}
TEST(AutofillProfileTest, SaveAdditionalInfo_Name_AddingNameFull) {
AutofillProfile a;
a.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("Marion"));
a.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16("Mitchell"));
a.SetRawInfo(NAME_LAST, base::ASCIIToUTF16("Morrison"));
AutofillProfile b = a;
b.SetRawInfo(NAME_FULL, base::ASCIIToUTF16("Marion Mitchell Morrison"));
EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US"));
EXPECT_EQ(base::ASCIIToUTF16("Marion"), a.GetRawInfo(NAME_FIRST));
EXPECT_EQ(base::ASCIIToUTF16("Mitchell"), a.GetRawInfo(NAME_MIDDLE));
EXPECT_EQ(base::ASCIIToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
EXPECT_EQ(base::ASCIIToUTF16("Marion Mitchell Morrison"),
a.GetRawInfo(NAME_FULL));
}
TEST(AutofillProfileTest, SaveAdditionalInfo_Name_KeepNameFull) {
AutofillProfile a;
a.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("Marion"));
a.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16("Mitchell"));
a.SetRawInfo(NAME_LAST, base::ASCIIToUTF16("Morrison"));
a.SetRawInfo(NAME_FULL, base::ASCIIToUTF16("Marion Mitchell Morrison"));
AutofillProfile b = a;
b.SetRawInfo(NAME_FULL, base::ASCIIToUTF16(""));
EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US"));
EXPECT_EQ(base::ASCIIToUTF16("Marion"), a.GetRawInfo(NAME_FIRST));
EXPECT_EQ(base::ASCIIToUTF16("Mitchell"), a.GetRawInfo(NAME_MIDDLE));
EXPECT_EQ(base::ASCIIToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
EXPECT_EQ(base::ASCIIToUTF16("Marion Mitchell Morrison"),
a.GetRawInfo(NAME_FULL));
}
// Tests the merging of two similar profiles results in the second profile's
// non-empty fields overwriting the initial profiles values.
TEST(AutofillProfileTest,
SaveAdditionalInfo_Name_DifferentCaseAndDiacriticsNoNameFull) {
AutofillProfile a;
a.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("marion"));
a.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16("mitchell"));
a.SetRawInfo(NAME_LAST, base::ASCIIToUTF16("morrison"));
a.SetRawInfo(NAME_FULL, base::ASCIIToUTF16("marion mitchell morrison"));
AutofillProfile b = a;
b.SetRawInfo(NAME_FIRST, UTF8ToUTF16("Märion"));
b.SetRawInfo(NAME_MIDDLE, UTF8ToUTF16("Mitchéll"));
b.SetRawInfo(NAME_LAST,UTF8ToUTF16("Morrison"));
b.SetRawInfo(NAME_FULL, UTF8ToUTF16(""));
EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US"));
// The first, middle and last names should have their first letter in
// uppercase and have acquired diacritics.
EXPECT_EQ(UTF8ToUTF16("Märion"), a.GetRawInfo(NAME_FIRST));
EXPECT_EQ(UTF8ToUTF16("Mitchéll"), a.GetRawInfo(NAME_MIDDLE));
EXPECT_EQ(UTF8ToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
EXPECT_EQ(UTF8ToUTF16("Märion Mitchéll Morrison"),
a.GetRawInfo(NAME_FULL));
}
// Tests that no loss of information happens when SavingAdditionalInfo with a
// profile with an empty name part.
TEST(AutofillProfileTest, SaveAdditionalInfo_Name_LossOfInformation) {
AutofillProfile a;
a.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("Marion"));
a.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16("Mitchell"));
a.SetRawInfo(NAME_LAST, base::ASCIIToUTF16("Morrison"));
AutofillProfile b = a;
b.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16(""));
EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US"));
EXPECT_EQ(base::ASCIIToUTF16("Marion"), a.GetRawInfo(NAME_FIRST));
EXPECT_EQ(base::ASCIIToUTF16("Mitchell"), a.GetRawInfo(NAME_MIDDLE));
EXPECT_EQ(base::ASCIIToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
}
// Tests that merging two complementary profiles for names results in a profile
// with a complete name.
TEST(AutofillProfileTest, SaveAdditionalInfo_Name_ComplementaryInformation) {
AutofillProfile a;
a.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("Marion"));
a.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16("Mitchell"));
a.SetRawInfo(NAME_LAST, base::ASCIIToUTF16("Morrison"));
AutofillProfile b;
b.SetRawInfo(NAME_FULL, base::ASCIIToUTF16("Marion Mitchell Morrison"));
EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US"));
// The first, middle and last names should be kept and name full should be
// added.
EXPECT_EQ(base::ASCIIToUTF16("Marion"), a.GetRawInfo(NAME_FIRST));
EXPECT_EQ(base::ASCIIToUTF16("Mitchell"), a.GetRawInfo(NAME_MIDDLE));
EXPECT_EQ(base::ASCIIToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
EXPECT_EQ(base::ASCIIToUTF16("Marion Mitchell Morrison"),
a.GetRawInfo(NAME_FULL));
}
TEST(AutofillProfileTest, IsAnInvalidPhoneNumber) {
{
AutofillProfile profile;
// When all fields are unvalidated, none of them is an invalid phone type.
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(NAME_FULL));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_WHOLE_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_BILLING_NUMBER));
EXPECT_EQ(false,
profile.IsAnInvalidPhoneNumber(PHONE_BILLING_WHOLE_NUMBER));
}
{
AutofillProfile profile;
profile.SetValidityState(PHONE_HOME_CITY_AND_NUMBER,
AutofillProfile::INVALID, AutofillProfile::CLIENT);
// It's based on the server side validation.
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(ADDRESS_HOME_LINE1));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_WHOLE_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_BILLING_NUMBER));
EXPECT_EQ(false,
profile.IsAnInvalidPhoneNumber(PHONE_BILLING_WHOLE_NUMBER));
}
{
AutofillProfile profile;
profile.SetValidityState(PHONE_HOME_CITY_CODE, AutofillProfile::INVALID,
AutofillProfile::SERVER);
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(ADDRESS_HOME_LINE2));
EXPECT_EQ(true, profile.IsAnInvalidPhoneNumber(PHONE_HOME_NUMBER));
EXPECT_EQ(true, profile.IsAnInvalidPhoneNumber(PHONE_HOME_WHOLE_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_BILLING_NUMBER));
EXPECT_EQ(false,
profile.IsAnInvalidPhoneNumber(PHONE_BILLING_WHOLE_NUMBER));
}
{
AutofillProfile profile;
profile.SetValidityState(PHONE_BILLING_COUNTRY_CODE,
AutofillProfile::INVALID, AutofillProfile::SERVER);
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(ADDRESS_HOME_LINE2));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_WHOLE_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_BILLING_NUMBER));
EXPECT_EQ(true, profile.IsAnInvalidPhoneNumber(PHONE_BILLING_WHOLE_NUMBER));
}
{
AutofillProfile profile;
profile.SetValidityState(PHONE_BILLING_NUMBER, AutofillProfile::EMPTY,
AutofillProfile::SERVER);
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_CITY_CODE));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_WHOLE_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_BILLING_NUMBER));
EXPECT_EQ(false,
profile.IsAnInvalidPhoneNumber(PHONE_BILLING_WHOLE_NUMBER));
}
{
AutofillProfile profile;
profile.SetValidityState(PHONE_BILLING_WHOLE_NUMBER, AutofillProfile::VALID,
AutofillProfile::SERVER);
EXPECT_EQ(false,
profile.IsAnInvalidPhoneNumber(PHONE_BILLING_COUNTRY_CODE));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_HOME_WHOLE_NUMBER));
EXPECT_EQ(false, profile.IsAnInvalidPhoneNumber(PHONE_BILLING_NUMBER));
EXPECT_EQ(false,
profile.IsAnInvalidPhoneNumber(PHONE_BILLING_WHOLE_NUMBER));
}
}
TEST(AutofillProfileTest, ValidityStatesClients) {
AutofillProfile profile;
// The default validity state should be UNVALIDATED.
EXPECT_EQ(
AutofillProfile::UNVALIDATED,
profile.GetValidityState(ADDRESS_HOME_COUNTRY, AutofillProfile::CLIENT));
// Make sure setting the validity state works.
profile.SetValidityState(ADDRESS_HOME_COUNTRY, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_CITY, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_STATE, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_COUNTRY,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_CITY,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(ADDRESS_HOME_STATE,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest, ValidityStatesServer) {
AutofillProfile profile;
// The default validity state should be UNVALIDATED.
EXPECT_EQ(
AutofillProfile::UNVALIDATED,
profile.GetValidityState(ADDRESS_HOME_COUNTRY, AutofillProfile::SERVER));
// Make sure setting the validity state works.
profile.SetValidityState(ADDRESS_HOME_COUNTRY, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::SERVER);
profile.SetValidityState(ADDRESS_HOME_CITY, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::SERVER);
profile.SetValidityState(ADDRESS_HOME_STATE, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::SERVER);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_COUNTRY,
AutofillProfile::AutofillProfile::SERVER));
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_CITY,
AutofillProfile::AutofillProfile::SERVER));
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(ADDRESS_HOME_STATE,
AutofillProfile::AutofillProfile::SERVER));
}
TEST(AutofillProfileTest, ValidityStates_ClientUnsupportedTypes) {
AutofillProfile profile;
// The validity state of unsupported types should be UNSUPPORTED.
EXPECT_EQ(
AutofillProfile::UNSUPPORTED,
profile.GetValidityState(ADDRESS_HOME_LINE1, AutofillProfile::CLIENT));
// Make sure setting the validity state of an unsupported type does nothing.
profile.SetValidityState(ADDRESS_HOME_LINE1, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_LINE2, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(PHONE_HOME_CITY_AND_NUMBER,
AutofillProfile::UNVALIDATED,
AutofillProfile::AutofillProfile::CLIENT);
EXPECT_EQ(AutofillProfile::UNSUPPORTED,
profile.GetValidityState(ADDRESS_HOME_LINE1,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::UNSUPPORTED,
profile.GetValidityState(ADDRESS_HOME_LINE2,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::UNVALIDATED,
profile.GetValidityState(PHONE_HOME_CITY_AND_NUMBER,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest, GetClientValidityBitfieldValue_Country) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_COUNTRY, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
// 0b01
EXPECT_EQ(1, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_COUNTRY, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b10
EXPECT_EQ(2, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_COUNTRY, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b11
EXPECT_EQ(3, profile.GetClientValidityBitfieldValue());
}
TEST(AutofillProfileTest, GetClientValidityBitfieldValue_State) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_STATE, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
// 0b0100
EXPECT_EQ(4, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_STATE, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b1000
EXPECT_EQ(8, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_STATE, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b1100
EXPECT_EQ(12, profile.GetClientValidityBitfieldValue());
}
TEST(AutofillProfileTest, GetClientValidityBitfieldValue_Zip) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_ZIP, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
// 0b010000
EXPECT_EQ(16, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_ZIP, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b100000
EXPECT_EQ(32, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_ZIP, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b110000
EXPECT_EQ(48, profile.GetClientValidityBitfieldValue());
}
TEST(AutofillProfileTest, GetClientValidityBitfieldValue_City) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_CITY, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
// 0b01000000
EXPECT_EQ(64, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_CITY, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b10000000
EXPECT_EQ(128, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_CITY, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b11000000
EXPECT_EQ(192, profile.GetClientValidityBitfieldValue());
}
TEST(AutofillProfileTest, GetClientValidityBitfieldValue_DependentLocality) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
// 0b0100000000
EXPECT_EQ(256, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b1000000000
EXPECT_EQ(512, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b1100000000
EXPECT_EQ(768, profile.GetClientValidityBitfieldValue());
}
TEST(AutofillProfileTest, GetClientValidityBitfieldValue_Email) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(EMAIL_ADDRESS, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
// 0b010000000000
EXPECT_EQ(1024, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(EMAIL_ADDRESS, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b100000000000
EXPECT_EQ(2048, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(EMAIL_ADDRESS, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b110000000000
EXPECT_EQ(3072, profile.GetClientValidityBitfieldValue());
}
TEST(AutofillProfileTest, GetClientValidityBitfieldValue_Phone) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(PHONE_HOME_WHOLE_NUMBER, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
// 0b01000000000000
EXPECT_EQ(4096, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(PHONE_HOME_WHOLE_NUMBER, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b10000000000000
EXPECT_EQ(8192, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(PHONE_HOME_WHOLE_NUMBER, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b11000000000000
EXPECT_EQ(12288, profile.GetClientValidityBitfieldValue());
}
TEST(AutofillProfileTest, GetClientValidityBitfieldValue_Mixed) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_COUNTRY, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_STATE, AutofillProfile::UNVALIDATED,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_ZIP, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_CITY, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::UNVALIDATED,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(EMAIL_ADDRESS, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(PHONE_HOME_WHOLE_NUMBER, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
// 0b01110011010010
EXPECT_EQ(7378, profile.GetClientValidityBitfieldValue());
profile.SetValidityState(ADDRESS_HOME_COUNTRY, AutofillProfile::EMPTY,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_STATE, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_ZIP, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_CITY, AutofillProfile::VALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(EMAIL_ADDRESS, AutofillProfile::UNVALIDATED,
AutofillProfile::AutofillProfile::CLIENT);
profile.SetValidityState(PHONE_HOME_WHOLE_NUMBER, AutofillProfile::INVALID,
AutofillProfile::AutofillProfile::CLIENT);
// 0b11001110101101
EXPECT_EQ(13229, profile.GetClientValidityBitfieldValue());
}
TEST(AutofillProfileTest, SetClientValidityFromBitfieldValue_Country) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
// 0b01
profile.SetClientValidityFromBitfieldValue(1);
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(ADDRESS_HOME_COUNTRY,
AutofillProfile::AutofillProfile::CLIENT));
// 0b10
profile.SetClientValidityFromBitfieldValue(2);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_COUNTRY,
AutofillProfile::AutofillProfile::CLIENT));
// 0b11
profile.SetClientValidityFromBitfieldValue(3);
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_COUNTRY,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest, SetClientValidityFromBitfieldValue_State) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
// 0b0100
profile.SetClientValidityFromBitfieldValue(4);
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(ADDRESS_HOME_STATE,
AutofillProfile::AutofillProfile::CLIENT));
// 0b1000
profile.SetClientValidityFromBitfieldValue(8);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_STATE,
AutofillProfile::AutofillProfile::CLIENT));
// 0b1100
profile.SetClientValidityFromBitfieldValue(12);
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_STATE,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest, SetClientValidityFromBitfieldValue_Zip) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
// 0b010000
profile.SetClientValidityFromBitfieldValue(16);
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(ADDRESS_HOME_ZIP,
AutofillProfile::AutofillProfile::CLIENT));
// 0b100000
profile.SetClientValidityFromBitfieldValue(32);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_ZIP,
AutofillProfile::AutofillProfile::CLIENT));
// 0b110000
profile.SetClientValidityFromBitfieldValue(48);
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_ZIP,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest, SetClientValidityFromBitfieldValue_City) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
// 0b01000000
profile.SetClientValidityFromBitfieldValue(64);
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(ADDRESS_HOME_CITY,
AutofillProfile::AutofillProfile::CLIENT));
// 0b10000000
profile.SetClientValidityFromBitfieldValue(128);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_CITY,
AutofillProfile::AutofillProfile::CLIENT));
// 0b11000000
profile.SetClientValidityFromBitfieldValue(192);
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_CITY,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest,
SetClientValidityFromBitfieldValue_DependentLocality) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
// 0b0100000000
profile.SetClientValidityFromBitfieldValue(256);
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::AutofillProfile::CLIENT));
// 0b1000000000
profile.SetClientValidityFromBitfieldValue(512);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::AutofillProfile::CLIENT));
// 0b1100000000
profile.SetClientValidityFromBitfieldValue(768);
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest, SetClientValidityFromBitfieldValue_Email) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
// 0b010000000000
profile.SetClientValidityFromBitfieldValue(1024);
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(EMAIL_ADDRESS,
AutofillProfile::AutofillProfile::CLIENT));
// 0b100000000000
profile.SetClientValidityFromBitfieldValue(2048);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(EMAIL_ADDRESS,
AutofillProfile::AutofillProfile::CLIENT));
// 0b110000000000
profile.SetClientValidityFromBitfieldValue(3072);
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(EMAIL_ADDRESS,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest, SetClientValidityFromBitfieldValue_Phone) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
// 0b01000000000000
profile.SetClientValidityFromBitfieldValue(4096);
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(PHONE_HOME_WHOLE_NUMBER,
AutofillProfile::AutofillProfile::CLIENT));
// 0b10000000000000
profile.SetClientValidityFromBitfieldValue(8192);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(PHONE_HOME_WHOLE_NUMBER,
AutofillProfile::AutofillProfile::CLIENT));
// 0b11000000000000
profile.SetClientValidityFromBitfieldValue(12288);
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(PHONE_HOME_WHOLE_NUMBER,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest, SetClientValidityFromBitfieldValue_Mixed) {
AutofillProfile profile;
// By default all validity statuses should be set to UNVALIDATED, thus the
// bitfield value should be empty.
EXPECT_EQ(0, profile.GetClientValidityBitfieldValue());
// 0b01110011010010
profile.SetClientValidityFromBitfieldValue(7378);
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_COUNTRY,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::UNVALIDATED,
profile.GetValidityState(ADDRESS_HOME_STATE,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(ADDRESS_HOME_ZIP,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_CITY,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::UNVALIDATED,
profile.GetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(EMAIL_ADDRESS,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(PHONE_HOME_WHOLE_NUMBER,
AutofillProfile::AutofillProfile::CLIENT));
// 0b11001110101101
profile.SetClientValidityFromBitfieldValue(13229);
EXPECT_EQ(AutofillProfile::EMPTY,
profile.GetValidityState(ADDRESS_HOME_COUNTRY,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_STATE,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_ZIP,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::VALID,
profile.GetValidityState(ADDRESS_HOME_CITY,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(ADDRESS_HOME_DEPENDENT_LOCALITY,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::UNVALIDATED,
profile.GetValidityState(EMAIL_ADDRESS,
AutofillProfile::AutofillProfile::CLIENT));
EXPECT_EQ(AutofillProfile::INVALID,
profile.GetValidityState(PHONE_HOME_WHOLE_NUMBER,
AutofillProfile::AutofillProfile::CLIENT));
}
TEST(AutofillProfileTest, GetMetadata) {
AutofillProfile local_profile = test::GetFullProfile();
local_profile.set_use_count(2);
local_profile.set_use_date(base::Time::FromDoubleT(25));
local_profile.set_has_converted(false);
AutofillMetadata local_metadata = local_profile.GetMetadata();
EXPECT_EQ(local_profile.guid(), local_metadata.id);
EXPECT_EQ(local_profile.has_converted(), local_metadata.has_converted);
EXPECT_EQ(local_profile.use_count(), local_metadata.use_count);
EXPECT_EQ(local_profile.use_date(), local_metadata.use_date);
AutofillProfile server_profile = test::GetServerProfile();
server_profile.set_use_count(10);
server_profile.set_use_date(base::Time::FromDoubleT(100));
server_profile.set_has_converted(true);
AutofillMetadata server_metadata = server_profile.GetMetadata();
EXPECT_EQ(server_profile.server_id(), server_metadata.id);
EXPECT_EQ(server_profile.has_converted(), server_metadata.has_converted);
EXPECT_EQ(server_profile.use_count(), server_metadata.use_count);
EXPECT_EQ(server_profile.use_date(), server_metadata.use_date);
}
TEST(AutofillProfileTest, SetMetadata_MatchingId) {
AutofillProfile local_profile = test::GetFullProfile();
AutofillMetadata local_metadata;
local_metadata.id = local_profile.guid();
local_metadata.use_count = 100;
local_metadata.use_date = base::Time::FromDoubleT(50);
local_metadata.has_converted = true;
EXPECT_TRUE(local_profile.SetMetadata(local_metadata));
EXPECT_EQ(local_metadata.id, local_profile.guid());
EXPECT_EQ(local_metadata.has_converted, local_profile.has_converted());
EXPECT_EQ(local_metadata.use_count, local_profile.use_count());
EXPECT_EQ(local_metadata.use_date, local_profile.use_date());
AutofillProfile server_profile = test::GetServerProfile();
AutofillMetadata server_metadata;
server_metadata.id = server_profile.server_id();
server_metadata.use_count = 100;
server_metadata.use_date = base::Time::FromDoubleT(50);
server_metadata.has_converted = true;
EXPECT_TRUE(server_profile.SetMetadata(server_metadata));
EXPECT_EQ(server_metadata.id, server_profile.server_id());
EXPECT_EQ(server_metadata.has_converted, server_profile.has_converted());
EXPECT_EQ(server_metadata.use_count, server_profile.use_count());
EXPECT_EQ(server_metadata.use_date, server_profile.use_date());
}
TEST(AutofillProfileTest, SetMetadata_NotMatchingId) {
AutofillProfile local_profile = test::GetFullProfile();
AutofillMetadata local_metadata;
local_metadata.id = "WrongId";
local_metadata.use_count = 100;
local_metadata.use_date = base::Time::FromDoubleT(50);
local_metadata.has_converted = true;
EXPECT_FALSE(local_profile.SetMetadata(local_metadata));
EXPECT_NE(local_metadata.id, local_profile.guid());
EXPECT_NE(local_metadata.has_converted, local_profile.has_converted());
EXPECT_NE(local_metadata.use_count, local_profile.use_count());
EXPECT_NE(local_metadata.use_date, local_profile.use_date());
AutofillProfile server_profile = test::GetServerProfile();
AutofillMetadata server_metadata;
server_metadata.id = "WrongId";
server_metadata.use_count = 100;
server_metadata.use_date = base::Time::FromDoubleT(50);
server_metadata.has_converted = true;
EXPECT_FALSE(server_profile.SetMetadata(server_metadata));
EXPECT_NE(server_metadata.id, server_profile.guid());
EXPECT_NE(server_metadata.has_converted, server_profile.has_converted());
EXPECT_NE(server_metadata.use_count, server_profile.use_count());
EXPECT_NE(server_metadata.use_date, server_profile.use_date());
}
// Tests that the profile is only deletable if it is not verified.
TEST(AutofillProfileTest, IsDeletable) {
// Set up an arbitrary time, as setup the current time to just above the
// threshold later than that time.
const base::Time kArbitraryTime = base::Time::FromDoubleT(25000000000);
TestAutofillClock test_clock;
test_clock.SetNow(kArbitraryTime + kDisusedDataModelDeletionTimeDelta +
base::TimeDelta::FromDays(1));
// Created a profile that has not been used since over the deletion threshold.
AutofillProfile profile = test::GetFullProfile();
profile.set_use_date(kArbitraryTime);
// Make sure it's deletable.
EXPECT_TRUE(profile.IsDeletable());
// Set the profile as being verified.
profile.set_origin("Not empty");
ASSERT_TRUE(profile.IsVerified());
// Make sure it's not deletable.
EXPECT_FALSE(profile.IsDeletable());
}
} // namespace autofill