blob: 837d729f9790dc64a87a198c8629fd1d933d19e9 [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 "base/basictypes.h"
#include "base/guid.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/autofill_common_test.h"
#include "components/autofill/core/browser/autofill_type.h"
#include "components/autofill/core/browser/credit_card.h"
#include "components/autofill/core/browser/validation.h"
#include "components/autofill/core/common/form_field_data.h"
#include "grit/webkit_resources.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace autofill {
namespace {
// From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
const char* const kValidNumbers[] = {
"378282246310005",
"3714 4963 5398 431",
"3787-3449-3671-000",
"5610591081018250",
"3056 9309 0259 04",
"3852-0000-0232-37",
"6011111111111117",
"6011 0009 9013 9424",
"3530-1113-3330-0000",
"3566002020360505",
"5555 5555 5555 4444",
"5105-1051-0510-5100",
"4111111111111111",
"4012 8888 8888 1881",
"4222-2222-2222-2",
"5019717010103742",
"6331101999990016",
// A UnionPay card that doesn't pass the Luhn checksum
"6200000000000000",
};
const char* const kInvalidNumbers[] = {
"4111 1111 112", /* too short */
"41111111111111111115", /* too long */
"4111-1111-1111-1110", /* wrong Luhn checksum */
"3056 9309 0259 04aa", /* non-digit characters */
};
} // namespace
// Tests credit card summary string generation. This test simulates a variety
// of different possible summary strings. Variations occur based on the
// existence of credit card number, month, and year fields.
TEST(CreditCardTest, PreviewSummaryAndObfuscatedNumberStrings) {
// Case 0: empty credit card.
CreditCard credit_card0(base::GenerateGUID(), "https://www.example.com/");
base::string16 summary0 = credit_card0.Label();
EXPECT_EQ(base::string16(), summary0);
base::string16 obfuscated0 = credit_card0.ObfuscatedNumber();
EXPECT_EQ(base::string16(), obfuscated0);
// Case 00: Empty credit card with empty strings.
CreditCard credit_card00(base::GenerateGUID(), "https://www.example.com/");
test::SetCreditCardInfo(&credit_card00,"John Dillinger", "", "", "");
base::string16 summary00 = credit_card00.Label();
EXPECT_EQ(base::string16(ASCIIToUTF16("John Dillinger")), summary00);
base::string16 obfuscated00 = credit_card00.ObfuscatedNumber();
EXPECT_EQ(base::string16(), obfuscated00);
// Case 1: No credit card number.
CreditCard credit_card1(base::GenerateGUID(), "https://www.example.com/");
test::SetCreditCardInfo(&credit_card1,"John Dillinger", "", "01", "2010");
base::string16 summary1 = credit_card1.Label();
EXPECT_EQ(base::string16(ASCIIToUTF16("John Dillinger")), summary1);
base::string16 obfuscated1 = credit_card1.ObfuscatedNumber();
EXPECT_EQ(base::string16(), obfuscated1);
// Case 2: No month.
CreditCard credit_card2(base::GenerateGUID(), "https://www.example.com/");
test::SetCreditCardInfo(
&credit_card2, "John Dillinger", "5105 1051 0510 5100", "", "2010");
base::string16 summary2 = credit_card2.Label();
EXPECT_EQ(ASCIIToUTF16("************5100"), summary2);
base::string16 obfuscated2 = credit_card2.ObfuscatedNumber();
EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated2);
// Case 3: No year.
CreditCard credit_card3(base::GenerateGUID(), "https://www.example.com/");
test::SetCreditCardInfo(
&credit_card3, "John Dillinger", "5105 1051 0510 5100", "01", "");
base::string16 summary3 = credit_card3.Label();
EXPECT_EQ(ASCIIToUTF16("************5100"), summary3);
base::string16 obfuscated3 = credit_card3.ObfuscatedNumber();
EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated3);
// Case 4: Have everything.
CreditCard credit_card4(base::GenerateGUID(), "https://www.example.com/");
test::SetCreditCardInfo(
&credit_card4, "John Dillinger", "5105 1051 0510 5100", "01", "2010");
base::string16 summary4 = credit_card4.Label();
EXPECT_EQ(ASCIIToUTF16("************5100, Exp: 01/2010"), summary4);
base::string16 obfuscated4 = credit_card4.ObfuscatedNumber();
EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated4);
// Case 5: Very long credit card
CreditCard credit_card5(base::GenerateGUID(), "https://www.example.com/");
test::SetCreditCardInfo(
&credit_card5,
"John Dillinger",
"0123456789 0123456789 0123456789 5105 1051 0510 5100", "01", "2010");
base::string16 summary5 = credit_card5.Label();
EXPECT_EQ(ASCIIToUTF16("********************5100, Exp: 01/2010"), summary5);
base::string16 obfuscated5 = credit_card5.ObfuscatedNumber();
EXPECT_EQ(ASCIIToUTF16("********************5100"), obfuscated5);
}
TEST(CreditCardTest, AssignmentOperator) {
CreditCard a(base::GenerateGUID(), "some origin");
test::SetCreditCardInfo(&a, "John Dillinger", "123456789012", "01", "2010");
// Result of assignment should be logically equal to the original profile.
CreditCard b(base::GenerateGUID(), "some other origin");
b = a;
EXPECT_TRUE(a == b);
// Assignment to self should not change the profile value.
a = a;
EXPECT_TRUE(a == b);
}
TEST(CreditCardTest, Copy) {
CreditCard a(base::GenerateGUID(), "https://www.example.com");
test::SetCreditCardInfo(&a, "John Dillinger", "123456789012", "01", "2010");
// Clone should be logically equal to the original.
CreditCard b(a);
EXPECT_TRUE(a == b);
}
TEST(CreditCardTest, Compare) {
CreditCard a(base::GenerateGUID(), std::string());
CreditCard b(base::GenerateGUID(), std::string());
// Empty cards 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::SetCreditCardInfo(&a, "Jimmy", NULL, NULL, NULL);
test::SetCreditCardInfo(&b, "Ringo", NULL, NULL, NULL);
EXPECT_GT(0, a.Compare(b));
EXPECT_LT(0, b.Compare(a));
}
// Test we get the correct icon for each card type.
TEST(CreditCardTest, IconResourceId) {
EXPECT_EQ(IDR_AUTOFILL_CC_AMEX,
CreditCard::IconResourceId(kAmericanExpressCard));
EXPECT_EQ(IDR_AUTOFILL_CC_DINERS,
CreditCard::IconResourceId(kDinersCard));
EXPECT_EQ(IDR_AUTOFILL_CC_DISCOVER,
CreditCard::IconResourceId(kDiscoverCard));
EXPECT_EQ(IDR_AUTOFILL_CC_JCB,
CreditCard::IconResourceId(kJCBCard));
EXPECT_EQ(IDR_AUTOFILL_CC_MASTERCARD,
CreditCard::IconResourceId(kMasterCard));
EXPECT_EQ(IDR_AUTOFILL_CC_VISA,
CreditCard::IconResourceId(kVisaCard));
}
TEST(CreditCardTest, UpdateFromImportedCard) {
CreditCard original_card(base::GenerateGUID(), "https://www.example.com");
test::SetCreditCardInfo(
&original_card, "John Dillinger", "123456789012", "09", "2017");
CreditCard a = original_card;
// The new card has a different name, expiration date, and origin.
CreditCard b = a;
b.set_guid(base::GenerateGUID());
b.set_origin("https://www.example.org");
b.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("J. Dillinger"));
b.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("08"));
b.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2019"));
EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
EXPECT_EQ("https://www.example.org", a.origin());
EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
// Try again, but with no name set for |b|.
a = original_card;
b.SetRawInfo(CREDIT_CARD_NAME, base::string16());
EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
EXPECT_EQ("https://www.example.org", a.origin());
EXPECT_EQ(ASCIIToUTF16("John Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
// Try again, but with only the original card having a verified origin.
// |a| should be unchanged.
a = original_card;
a.set_origin("Chrome settings");
b.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("J. Dillinger"));
EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
EXPECT_EQ("Chrome settings", a.origin());
EXPECT_EQ(ASCIIToUTF16("John Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
EXPECT_EQ(ASCIIToUTF16("09"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(ASCIIToUTF16("2017"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
// Try again, but with only the new card having a verified origin.
a = original_card;
b.set_origin("Chrome settings");
EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
EXPECT_EQ("Chrome settings", a.origin());
EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
// Try again, with both cards having a verified origin.
a = original_card;
a.set_origin("Chrome Autofill dialog");
b.set_origin("Chrome settings");
EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
EXPECT_EQ("Chrome settings", a.origin());
EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
// Try again, but with |b| having a different card number.
// |a| should be unchanged.
a = original_card;
b.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
EXPECT_FALSE(a.UpdateFromImportedCard(b, "en-US"));
EXPECT_EQ(original_card, a);
}
TEST(CreditCardTest, IsComplete) {
CreditCard card(base::GenerateGUID(), "https://www.example.com/");
EXPECT_FALSE(card.IsComplete());
card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Wally T. Walrus"));
EXPECT_FALSE(card.IsComplete());
card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
EXPECT_FALSE(card.IsComplete());
card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2014"));
for (size_t i = 0; i < arraysize(kValidNumbers); ++i) {
SCOPED_TRACE(kValidNumbers[i]);
card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kValidNumbers[i]));
EXPECT_TRUE(card.IsComplete());
}
for (size_t i = 0; i < arraysize(kInvalidNumbers); ++i) {
SCOPED_TRACE(kInvalidNumbers[i]);
card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kInvalidNumbers[i]));
EXPECT_FALSE(card.IsComplete());
}
}
TEST(CreditCardTest, IsValid) {
CreditCard card;
// Invalid because expired
card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("1"));
card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2010"));
card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
EXPECT_FALSE(card.IsValid());
// Invalid because card number is not complete
card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("12"));
card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("9999"));
card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("41111"));
EXPECT_FALSE(card.IsValid());
// Valid
card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("12"));
card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("9999"));
card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
EXPECT_TRUE(card.IsValid());
}
TEST(CreditCardTest, InvalidMastercardNumber) {
CreditCard card(base::GenerateGUID(), "https://www.example.com/");
test::SetCreditCardInfo(&card, "Baby Face Nelson",
"5200000000000004", "01", "2010");
EXPECT_EQ(kMasterCard, card.type());
EXPECT_FALSE(card.IsComplete());
}
// Verify that we preserve exactly what the user typed for credit card numbers.
TEST(CreditCardTest, SetRawInfoCreditCardNumber) {
CreditCard card(base::GenerateGUID(), "https://www.example.com/");
test::SetCreditCardInfo(&card, "Bob Dylan",
"4321-5432-6543-xxxx", "07", "2013");
EXPECT_EQ(ASCIIToUTF16("4321-5432-6543-xxxx"),
card.GetRawInfo(CREDIT_CARD_NUMBER));
}
// Verify that we can handle both numeric and named months.
TEST(CreditCardTest, SetExpirationMonth) {
CreditCard card(base::GenerateGUID(), "https://www.example.com/");
card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("05"));
EXPECT_EQ(ASCIIToUTF16("05"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(5, card.expiration_month());
card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("7"));
EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(7, card.expiration_month());
// This should fail, and preserve the previous value.
card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("January"));
EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(7, card.expiration_month());
card.SetInfo(
AutofillType(CREDIT_CARD_EXP_MONTH), ASCIIToUTF16("January"), "en-US");
EXPECT_EQ(ASCIIToUTF16("01"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(1, card.expiration_month());
card.SetInfo(
AutofillType(CREDIT_CARD_EXP_MONTH), ASCIIToUTF16("Apr"), "en-US");
EXPECT_EQ(ASCIIToUTF16("04"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
EXPECT_EQ(4, card.expiration_month());
}
TEST(CreditCardTest, CreditCardType) {
CreditCard card(base::GenerateGUID(), "https://www.example.com/");
// The card type cannot be set directly.
card.SetRawInfo(CREDIT_CARD_TYPE, ASCIIToUTF16("Visa"));
EXPECT_EQ(base::string16(), card.GetRawInfo(CREDIT_CARD_TYPE));
// Setting the number should implicitly set the type.
card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111 1111 1111 1111"));
EXPECT_EQ(ASCIIToUTF16("Visa"), card.GetRawInfo(CREDIT_CARD_TYPE));
}
TEST(CreditCardTest, CreditCardVerificationCode) {
CreditCard card(base::GenerateGUID(), "https://www.example.com/");
// The verification code cannot be set, as Chrome does not store this data.
card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, ASCIIToUTF16("999"));
EXPECT_EQ(base::string16(), card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
}
TEST(CreditCardTest, CreditCardMonthExact) {
const char* const kMonthsNumeric[] = {
"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12",
};
std::vector<base::string16> options(arraysize(kMonthsNumeric));
for (size_t i = 0; i < arraysize(kMonthsNumeric); ++i) {
options[i] = ASCIIToUTF16(kMonthsNumeric[i]);
}
FormFieldData field;
field.form_control_type = "select-one";
field.option_values = options;
field.option_contents = options;
CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
credit_card.FillSelectControl(
AutofillType(CREDIT_CARD_EXP_MONTH), "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("01"), field.value);
}
TEST(CreditCardTest, CreditCardMonthAbbreviated) {
const char* const kMonthsAbbreviated[] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
};
std::vector<base::string16> options(arraysize(kMonthsAbbreviated));
for (size_t i = 0; i < arraysize(kMonthsAbbreviated); ++i) {
options[i] = ASCIIToUTF16(kMonthsAbbreviated[i]);
}
FormFieldData field;
field.form_control_type = "select-one";
field.option_values = options;
field.option_contents = options;
CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
credit_card.FillSelectControl(
AutofillType(CREDIT_CARD_EXP_MONTH), "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Jan"), field.value);
}
TEST(CreditCardTest, CreditCardMonthFull) {
const char* const kMonthsFull[] = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December",
};
std::vector<base::string16> options(arraysize(kMonthsFull));
for (size_t i = 0; i < arraysize(kMonthsFull); ++i) {
options[i] = ASCIIToUTF16(kMonthsFull[i]);
}
FormFieldData field;
field.form_control_type = "select-one";
field.option_values = options;
field.option_contents = options;
CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
credit_card.FillSelectControl(
AutofillType(CREDIT_CARD_EXP_MONTH), "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("January"), field.value);
}
TEST(CreditCardTest, CreditCardMonthNumeric) {
const char* const kMonthsNumeric[] = {
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
};
std::vector<base::string16> options(arraysize(kMonthsNumeric));
for (size_t i = 0; i < arraysize(kMonthsNumeric); ++i) {
options[i] = ASCIIToUTF16(kMonthsNumeric[i]);
}
FormFieldData field;
field.form_control_type = "select-one";
field.option_values = options;
field.option_contents = options;
CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
credit_card.FillSelectControl(
AutofillType(CREDIT_CARD_EXP_MONTH), "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("1"), field.value);
}
TEST(CreditCardTest, CreditCardTwoDigitYear) {
const char* const kYears[] = {
"12", "13", "14", "15", "16", "17", "18", "19"
};
std::vector<base::string16> options(arraysize(kYears));
for (size_t i = 0; i < arraysize(kYears); ++i) {
options[i] = ASCIIToUTF16(kYears[i]);
}
FormFieldData field;
field.form_control_type = "select-one";
field.option_values = options;
field.option_contents = options;
CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
credit_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2017"));
credit_card.FillSelectControl(
AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("17"), field.value);
EXPECT_EQ(2017, credit_card.expiration_year());
}
TEST(CreditCardTest, CreditCardTypeSelectControl) {
const char* const kCreditCardTypes[] = {
"Visa", "Master Card", "AmEx", "discover"
};
std::vector<base::string16> options(arraysize(kCreditCardTypes));
for (size_t i = 0; i < arraysize(kCreditCardTypes); ++i) {
options[i] = ASCIIToUTF16(kCreditCardTypes[i]);
}
FormFieldData field;
field.form_control_type = "select-one";
field.option_values = options;
field.option_contents = options;
// Credit card types are inferred from the numbers, so we use test numbers for
// each card type. Test card numbers are drawn from
// http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
{
// Normal case:
CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
ASCIIToUTF16("4111111111111111"));
credit_card.FillSelectControl(
AutofillType(CREDIT_CARD_TYPE), "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Visa"), field.value);
}
{
// Filling should be able to handle intervening whitespace:
CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
ASCIIToUTF16("5105105105105100"));
credit_card.FillSelectControl(
AutofillType(CREDIT_CARD_TYPE), "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Master Card"), field.value);
}
{
// American Express is sometimes abbreviated as AmEx:
CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
credit_card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("371449635398431"));
credit_card.FillSelectControl(
AutofillType(CREDIT_CARD_TYPE), "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("AmEx"), field.value);
}
{
// Case insensitivity:
CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
ASCIIToUTF16("6011111111111117"));
credit_card.FillSelectControl(
AutofillType(CREDIT_CARD_TYPE), "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("discover"), field.value);
}
}
TEST(CreditCardTest, GetCreditCardType) {
struct {
std::string card_number;
std::string type;
bool is_valid;
} test_cases[] = {
// The relevant sample numbers from
// http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
{ "378282246310005", kAmericanExpressCard, true },
{ "371449635398431", kAmericanExpressCard, true },
{ "378734493671000", kAmericanExpressCard, true },
{ "30569309025904", kDinersCard, true },
{ "38520000023237", kDinersCard, true },
{ "6011111111111117", kDiscoverCard, true },
{ "6011000990139424", kDiscoverCard, true },
{ "3530111333300000", kJCBCard, true },
{ "3566002020360505", kJCBCard, true },
{ "5555555555554444", kMasterCard, true },
{ "5105105105105100", kMasterCard, true },
{ "4111111111111111", kVisaCard, true },
{ "4012888888881881", kVisaCard, true },
{ "4222222222222", kVisaCard, true },
// The relevant sample numbers from
// http://auricsystems.com/support-center/sample-credit-card-numbers/
{ "343434343434343", kAmericanExpressCard, true },
{ "371144371144376", kAmericanExpressCard, true },
{ "341134113411347", kAmericanExpressCard, true },
{ "36438936438936", kDinersCard, true },
{ "36110361103612", kDinersCard, true },
{ "36111111111111", kDinersCard, true },
{ "6011016011016011", kDiscoverCard, true },
{ "6011000990139424", kDiscoverCard, true },
{ "6011000000000004", kDiscoverCard, true },
{ "6011000995500000", kDiscoverCard, true },
{ "6500000000000002", kDiscoverCard, true },
{ "3566002020360505", kJCBCard, true },
{ "3528000000000007", kJCBCard, true },
{ "5500005555555559", kMasterCard, true },
{ "5555555555555557", kMasterCard, true },
{ "5454545454545454", kMasterCard, true },
{ "5555515555555551", kMasterCard, true },
{ "5405222222222226", kMasterCard, true },
{ "5478050000000007", kMasterCard, true },
{ "5111005111051128", kMasterCard, true },
{ "5112345112345114", kMasterCard, true },
{ "5115915115915118", kMasterCard, true },
// A UnionPay card that doesn't pass the Luhn checksum
{ "6200000000000000", kUnionPay, true },
// Empty string
{ std::string(), kGenericCard, false },
// Non-numeric
{ "garbage", kGenericCard, false },
{ "4garbage", kVisaCard, false },
// Fails Luhn check.
{ "4111111111111112", kVisaCard, false },
// Invalid length.
{ "3434343434343434", kAmericanExpressCard, false },
{ "411111111111116", kVisaCard, false },
// Issuer Identification Numbers (IINs) that Chrome recognizes.
{ "4", kVisaCard, false },
{ "34", kAmericanExpressCard, false },
{ "37", kAmericanExpressCard, false },
{ "300", kDinersCard, false },
{ "301", kDinersCard, false },
{ "302", kDinersCard, false },
{ "303", kDinersCard, false },
{ "304", kDinersCard, false },
{ "305", kDinersCard, false },
{ "3095", kDinersCard, false },
{ "36", kDinersCard, false },
{ "38", kDinersCard, false },
{ "39", kDinersCard, false },
{ "6011", kDiscoverCard, false },
{ "644", kDiscoverCard, false },
{ "645", kDiscoverCard, false },
{ "646", kDiscoverCard, false },
{ "647", kDiscoverCard, false },
{ "648", kDiscoverCard, false },
{ "649", kDiscoverCard, false },
{ "65", kDiscoverCard, false },
{ "3528", kJCBCard, false },
{ "3531", kJCBCard, false },
{ "3589", kJCBCard, false },
{ "51", kMasterCard, false },
{ "52", kMasterCard, false },
{ "53", kMasterCard, false },
{ "54", kMasterCard, false },
{ "55", kMasterCard, false },
{ "62", kUnionPay, false },
// Not enough data to determine an IIN uniquely.
{ "3", kGenericCard, false },
{ "30", kGenericCard, false },
{ "309", kGenericCard, false },
{ "35", kGenericCard, false },
{ "5", kGenericCard, false },
{ "6", kGenericCard, false },
{ "60", kGenericCard, false },
{ "601", kGenericCard, false },
{ "64", kGenericCard, false },
// Unknown IINs.
{ "0", kGenericCard, false },
{ "1", kGenericCard, false },
{ "2", kGenericCard, false },
{ "306", kGenericCard, false },
{ "307", kGenericCard, false },
{ "308", kGenericCard, false },
{ "3091", kGenericCard, false },
{ "3094", kGenericCard, false },
{ "3096", kGenericCard, false },
{ "31", kGenericCard, false },
{ "32", kGenericCard, false },
{ "33", kGenericCard, false },
{ "351", kGenericCard, false },
{ "3527", kGenericCard, false },
{ "359", kGenericCard, false },
{ "50", kGenericCard, false },
{ "56", kGenericCard, false },
{ "57", kGenericCard, false },
{ "58", kGenericCard, false },
{ "59", kGenericCard, false },
{ "600", kGenericCard, false },
{ "602", kGenericCard, false },
{ "603", kGenericCard, false },
{ "604", kGenericCard, false },
{ "605", kGenericCard, false },
{ "606", kGenericCard, false },
{ "607", kGenericCard, false },
{ "608", kGenericCard, false },
{ "609", kGenericCard, false },
{ "61", kGenericCard, false },
{ "63", kGenericCard, false },
{ "640", kGenericCard, false },
{ "641", kGenericCard, false },
{ "642", kGenericCard, false },
{ "643", kGenericCard, false },
{ "66", kGenericCard, false },
{ "67", kGenericCard, false },
{ "68", kGenericCard, false },
{ "69", kGenericCard, false },
{ "7", kGenericCard, false },
{ "8", kGenericCard, false },
{ "9", kGenericCard, false },
// Oddball case: Unknown issuer, but valid Luhn check and plausible length.
{ "7000700070007000", kGenericCard, true },
};
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
base::string16 card_number = ASCIIToUTF16(test_cases[i].card_number);
SCOPED_TRACE(card_number);
EXPECT_EQ(test_cases[i].type, CreditCard::GetCreditCardType(card_number));
EXPECT_EQ(test_cases[i].is_valid, IsValidCreditCardNumber(card_number));
}
}
} // namespace autofill