diff options
Diffstat (limited to 'chromium/components/autofill/core/browser/credit_card_unittest.cc')
-rw-r--r-- | chromium/components/autofill/core/browser/credit_card_unittest.cc | 883 |
1 files changed, 499 insertions, 384 deletions
diff --git a/chromium/components/autofill/core/browser/credit_card_unittest.cc b/chromium/components/autofill/core/browser/credit_card_unittest.cc index 993862f6d6d..4e371ec4656 100644 --- a/chromium/components/autofill/core/browser/credit_card_unittest.cc +++ b/chromium/components/autofill/core/browser/credit_card_unittest.cc @@ -158,77 +158,90 @@ TEST(CreditCardTest, AssignmentOperator) { EXPECT_TRUE(a == b); } -TEST(CreditCardTest, SetExpirationYearFromString) { - static const struct { - std::string expiration_year; - int expected_year; - } kTestCases[] = { - // Valid values. - {"2040", 2040}, - {"45", 2045}, - {"045", 2045}, - {"9", 2009}, - - // Unrecognized year values. - {"052045", 0}, - {"123", 0}, - {"y2045", 0}, - }; +struct SetExpirationYearFromStringTestCase { + std::string expiration_year; + int expected_year; +}; - for (const auto& test_case : kTestCases) { - CreditCard card(base::GenerateGUID(), "some origin"); - card.SetExpirationYearFromString(ASCIIToUTF16(test_case.expiration_year)); +class SetExpirationYearFromStringTest + : public testing::TestWithParam<SetExpirationYearFromStringTestCase> {}; - EXPECT_EQ(test_case.expected_year, card.expiration_year()) - << test_case.expiration_year << " " << test_case.expected_year; - } +TEST_P(SetExpirationYearFromStringTest, SetExpirationYearFromString) { + auto test_case = GetParam(); + CreditCard card(base::GenerateGUID(), "some origin"); + card.SetExpirationYearFromString(ASCIIToUTF16(test_case.expiration_year)); + + EXPECT_EQ(test_case.expected_year, card.expiration_year()) + << test_case.expiration_year << " " << test_case.expected_year; } -TEST(CreditCardTest, SetExpirationDateFromString) { - static const struct { - std::string expiration_date; - int expected_month; - int expected_year; - } kTestCases[] = {{"10", 0, 0}, // Too small. - {"1020451", 0, 0}, // Too long. - - // No separators. - {"105", 0, 0}, // Too ambiguous. - {"0545", 5, 2045}, - {"52045", 0, 0}, // Too ambiguous. - {"052045", 5, 2045}, - - // "/" separator. - {"05/45", 5, 2045}, - {"5/2045", 5, 2045}, - {"05/2045", 5, 2045}, - - // "-" separator. - {"05-45", 5, 2045}, - {"5-2045", 5, 2045}, - {"05-2045", 5, 2045}, - - // "|" separator. - {"05|45", 5, 2045}, - {"5|2045", 5, 2045}, - {"05|2045", 5, 2045}, - - // Invalid values. - {"13/2016", 0, 2016}, - {"16/13", 0, 2013}, - {"May-2015", 0, 0}, - {"05-/2045", 0, 0}, - {"05_2045", 0, 0}}; +INSTANTIATE_TEST_CASE_P(CreditCardTest, + SetExpirationYearFromStringTest, + testing::Values( + // Valid values. + SetExpirationYearFromStringTestCase{"2040", 2040}, + SetExpirationYearFromStringTestCase{"45", 2045}, + SetExpirationYearFromStringTestCase{"045", 2045}, + SetExpirationYearFromStringTestCase{"9", 2009}, + + // Unrecognized year values. + SetExpirationYearFromStringTestCase{"052045", 0}, + SetExpirationYearFromStringTestCase{"123", 0}, + SetExpirationYearFromStringTestCase{"y2045", 0})); + +struct SetExpirationDateFromStringTestCase { + std::string expiration_date; + int expected_month; + int expected_year; +}; - for (const auto& test_case : kTestCases) { - CreditCard card(base::GenerateGUID(), "some origin"); - card.SetExpirationDateFromString(ASCIIToUTF16(test_case.expiration_date)); +class SetExpirationDateFromStringTest + : public testing::TestWithParam<SetExpirationDateFromStringTestCase> {}; - EXPECT_EQ(test_case.expected_month, card.expiration_month()); - EXPECT_EQ(test_case.expected_year, card.expiration_year()); - } +TEST_P(SetExpirationDateFromStringTest, SetExpirationDateFromString) { + auto test_case = GetParam(); + CreditCard card(base::GenerateGUID(), "some origin"); + card.SetExpirationDateFromString(ASCIIToUTF16(test_case.expiration_date)); + + EXPECT_EQ(test_case.expected_month, card.expiration_month()); + EXPECT_EQ(test_case.expected_year, card.expiration_year()); } +INSTANTIATE_TEST_CASE_P( + CreditCardTest, + SetExpirationDateFromStringTest, + testing::Values( + SetExpirationDateFromStringTestCase{"10", 0, 0}, // Too small. + SetExpirationDateFromStringTestCase{"1020451", 0, 0}, // Too long. + + // No separators. + SetExpirationDateFromStringTestCase{"105", 0, 0}, // Too ambiguous. + SetExpirationDateFromStringTestCase{"0545", 5, 2045}, + SetExpirationDateFromStringTestCase{"52045", 0, 0}, // Too ambiguous. + SetExpirationDateFromStringTestCase{"052045", 5, 2045}, + + // "/" separator. + SetExpirationDateFromStringTestCase{"05/45", 5, 2045}, + SetExpirationDateFromStringTestCase{"5/2045", 5, 2045}, + SetExpirationDateFromStringTestCase{"05/2045", 5, 2045}, + + // "-" separator. + SetExpirationDateFromStringTestCase{"05-45", 5, 2045}, + SetExpirationDateFromStringTestCase{"5-2045", 5, 2045}, + SetExpirationDateFromStringTestCase{"05-2045", 5, 2045}, + + // "|" separator. + SetExpirationDateFromStringTestCase{"05|45", 5, 2045}, + SetExpirationDateFromStringTestCase{"5|2045", 5, 2045}, + SetExpirationDateFromStringTestCase{"05|2045", 5, 2045}, + + // Invalid values. + SetExpirationDateFromStringTestCase{"13/2016", 0, 2016}, + SetExpirationDateFromStringTestCase{"16/13", 0, 2013}, + SetExpirationDateFromStringTestCase{"May-2015", 0, 0}, + SetExpirationDateFromStringTestCase{"05-/2045", 0, 0}, + SetExpirationDateFromStringTestCase{"05_2045", 0, 0})); + TEST(CreditCardTest, Copy) { CreditCard a(base::GenerateGUID(), "https://www.example.com"); test::SetCreditCardInfo(&a, "John Dillinger", "123456789012", "01", "2010"); @@ -238,73 +251,85 @@ TEST(CreditCardTest, Copy) { EXPECT_TRUE(a == b); } -TEST(CreditCardTest, IsLocalDuplicateOfServerCard) { - struct { - CreditCard::RecordType first_card_record_type; - const char* first_card_name; - const char* first_card_number; - const char* first_card_exp_mo; - const char* first_card_exp_yr; - - CreditCard::RecordType second_card_record_type; - const char* second_card_name; - const char* second_card_number; - const char* second_card_exp_mo; - const char* second_card_exp_yr; - const char* second_card_type; - - bool is_local_duplicate; - } test_cases[] = { - { LOCAL_CARD, "", "", "", "", - LOCAL_CARD, "", "", "", "", nullptr, false }, - { LOCAL_CARD, "", "", "", "", - FULL_SERVER_CARD, "", "", "", "", nullptr, true}, - { FULL_SERVER_CARD, "", "", "", "", - FULL_SERVER_CARD, "", "", "", "", nullptr, false}, - { LOCAL_CARD, "John Dillinger", "423456789012", "01", "2010", - FULL_SERVER_CARD, "John Dillinger", "423456789012", "01", "2010", nullptr, - true }, - { LOCAL_CARD, "J Dillinger", "423456789012", "01", "2010", - FULL_SERVER_CARD, "John Dillinger", "423456789012", "01", "2010", nullptr, - false }, - { LOCAL_CARD, "", "423456789012", "01", "2010", - FULL_SERVER_CARD, "John Dillinger", "423456789012", "01", "2010", nullptr, - true }, - { LOCAL_CARD, "", "423456789012", "", "", - FULL_SERVER_CARD, "John Dillinger", "423456789012", "01", "2010", nullptr, - true }, - { LOCAL_CARD, "", "423456789012", "", "", - MASKED_SERVER_CARD, "John Dillinger", "9012", "01", "2010", kVisaCard, - true }, - { LOCAL_CARD, "", "423456789012", "", "", - MASKED_SERVER_CARD, "John Dillinger", "9012", "01", "2010", kMasterCard, - false }, - { LOCAL_CARD, "John Dillinger", "4234-5678-9012", "01", "2010", - FULL_SERVER_CARD, "John Dillinger", "423456789012", "01", "2010", nullptr, - true }, - }; +struct IsLocalDuplicateOfServerCardTestCase { + CreditCard::RecordType first_card_record_type; + const char* first_card_name; + const char* first_card_number; + const char* first_card_exp_mo; + const char* first_card_exp_yr; + + CreditCard::RecordType second_card_record_type; + const char* second_card_name; + const char* second_card_number; + const char* second_card_exp_mo; + const char* second_card_exp_yr; + const char* second_card_type; + + bool is_local_duplicate; +}; - for (const auto& test_case : test_cases) { - CreditCard a(base::GenerateGUID(), std::string()); - a.set_record_type(test_case.first_card_record_type); - test::SetCreditCardInfo( - &a, test_case.first_card_name, test_case.first_card_number, - test_case.first_card_exp_mo, test_case.first_card_exp_yr); +class IsLocalDuplicateOfServerCardTest + : public testing::TestWithParam<IsLocalDuplicateOfServerCardTestCase> {}; - CreditCard b(base::GenerateGUID(), std::string()); - b.set_record_type(test_case.second_card_record_type); - test::SetCreditCardInfo( - &b, test_case.second_card_name, test_case.second_card_number, - test_case.second_card_exp_mo, test_case.second_card_exp_yr); +TEST_P(IsLocalDuplicateOfServerCardTest, IsLocalDuplicateOfServerCard) { + auto test_case = GetParam(); + CreditCard a(base::GenerateGUID(), std::string()); + a.set_record_type(test_case.first_card_record_type); + test::SetCreditCardInfo( + &a, test_case.first_card_name, test_case.first_card_number, + test_case.first_card_exp_mo, test_case.first_card_exp_yr); - if (test_case.second_card_record_type == CreditCard::MASKED_SERVER_CARD) - b.SetTypeForMaskedCard(test_case.second_card_type); + CreditCard b(base::GenerateGUID(), std::string()); + b.set_record_type(test_case.second_card_record_type); + test::SetCreditCardInfo( + &b, test_case.second_card_name, test_case.second_card_number, + test_case.second_card_exp_mo, test_case.second_card_exp_yr); - EXPECT_EQ(test_case.is_local_duplicate, a.IsLocalDuplicateOfServerCard(b)) - << " when comparing cards " << a.Label() << " and " << b.Label(); - } + if (test_case.second_card_record_type == CreditCard::MASKED_SERVER_CARD) + b.SetTypeForMaskedCard(test_case.second_card_type); + + EXPECT_EQ(test_case.is_local_duplicate, a.IsLocalDuplicateOfServerCard(b)) + << " when comparing cards " << a.Label() << " and " << b.Label(); } +INSTANTIATE_TEST_CASE_P( + CreditCardTest, + IsLocalDuplicateOfServerCardTest, + testing::Values( + IsLocalDuplicateOfServerCardTestCase{LOCAL_CARD, "", "", "", "", + LOCAL_CARD, "", "", "", "", + nullptr, false}, + IsLocalDuplicateOfServerCardTestCase{LOCAL_CARD, "", "", "", "", + FULL_SERVER_CARD, "", "", "", "", + nullptr, true}, + IsLocalDuplicateOfServerCardTestCase{FULL_SERVER_CARD, "", "", "", "", + FULL_SERVER_CARD, "", "", "", "", + nullptr, false}, + IsLocalDuplicateOfServerCardTestCase{ + LOCAL_CARD, "John Dillinger", "423456789012", "01", "2010", + FULL_SERVER_CARD, "John Dillinger", "423456789012", "01", "2010", + nullptr, true}, + IsLocalDuplicateOfServerCardTestCase{ + LOCAL_CARD, "J Dillinger", "423456789012", "01", "2010", + FULL_SERVER_CARD, "John Dillinger", "423456789012", "01", "2010", + nullptr, false}, + IsLocalDuplicateOfServerCardTestCase{ + LOCAL_CARD, "", "423456789012", "01", "2010", FULL_SERVER_CARD, + "John Dillinger", "423456789012", "01", "2010", nullptr, true}, + IsLocalDuplicateOfServerCardTestCase{ + LOCAL_CARD, "", "423456789012", "", "", FULL_SERVER_CARD, + "John Dillinger", "423456789012", "01", "2010", nullptr, true}, + IsLocalDuplicateOfServerCardTestCase{ + LOCAL_CARD, "", "423456789012", "", "", MASKED_SERVER_CARD, + "John Dillinger", "9012", "01", "2010", kVisaCard, true}, + IsLocalDuplicateOfServerCardTestCase{ + LOCAL_CARD, "", "423456789012", "", "", MASKED_SERVER_CARD, + "John Dillinger", "9012", "01", "2010", kMasterCard, false}, + IsLocalDuplicateOfServerCardTestCase{ + LOCAL_CARD, "John Dillinger", "4234-5678-9012", "01", "2010", + FULL_SERVER_CARD, "John Dillinger", "423456789012", "01", "2010", + nullptr, true})); + TEST(CreditCardTest, HasSameNumberAs) { CreditCard a(base::GenerateGUID(), std::string()); CreditCard b(base::GenerateGUID(), std::string()); @@ -603,178 +628,223 @@ TEST(CreditCardTest, CreditCardVerificationCode) { EXPECT_EQ(base::string16(), card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); } +struct GetCreditCardTypeTestCase { + std::string card_number; + std::string type; + bool is_valid; +}; -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 - // https://www.auricsystems.com/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 }, - { "6247130048162403", kUnionPay, true }, - { "6247130048162403", kUnionPay, true }, - { "622384452162063648", kUnionPay, true }, - { "2204883716636153", kMirCard, true }, - { "2200111234567898", kMirCard, true }, - { "2200481349288130", kMirCard, true }, - - // Empty string - { std::string(), kGenericCard, false }, - - // Non-numeric - { "garbage", kGenericCard, false }, - { "4garbage", kVisaCard, false }, - - // Fails Luhn check. - { "4111111111111112", kVisaCard, false }, - { "6247130048162413", kUnionPay, false }, - { "2204883716636154", kMirCard, false }, - - // Invalid length. - { "3434343434343434", kAmericanExpressCard, false }, - { "411111111111116", kVisaCard, false }, - { "220011123456783", kMirCard, false }, - - // Issuer Identification Numbers (IINs) that Chrome recognizes. - { "4", kVisaCard, false }, - { "22", kMirCard, 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. - { "2", kGenericCard, false }, - { "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 }, - { "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 }, - }; +// We are doing batches here because INSTANTIATE_TEST_CASE_P has a +// 50 upper limit. +class GetCreditCardTypeTestBatch1 + : public testing::TestWithParam<GetCreditCardTypeTestCase> {}; + +TEST_P(GetCreditCardTypeTestBatch1, GetCreditCardType) { + auto test_case = GetParam(); + base::string16 card_number = ASCIIToUTF16(test_case.card_number); + SCOPED_TRACE(card_number); + EXPECT_EQ(test_case.type, CreditCard::GetCreditCardType(card_number)); + EXPECT_EQ(test_case.is_valid, IsValidCreditCardNumber(card_number)); +} - for (const auto& test_case : test_cases) { - base::string16 card_number = ASCIIToUTF16(test_case.card_number); - SCOPED_TRACE(card_number); - EXPECT_EQ(test_case.type, CreditCard::GetCreditCardType(card_number)); - EXPECT_EQ(test_case.is_valid, IsValidCreditCardNumber(card_number)); - } +INSTANTIATE_TEST_CASE_P( + CreditCardTest, + GetCreditCardTypeTestBatch1, + testing::Values( + // The relevant sample numbers from + // http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm + GetCreditCardTypeTestCase{"378282246310005", kAmericanExpressCard, + true}, + GetCreditCardTypeTestCase{"371449635398431", kAmericanExpressCard, + true}, + GetCreditCardTypeTestCase{"378734493671000", kAmericanExpressCard, + true}, + GetCreditCardTypeTestCase{"30569309025904", kDinersCard, true}, + GetCreditCardTypeTestCase{"38520000023237", kDinersCard, true}, + GetCreditCardTypeTestCase{"6011111111111117", kDiscoverCard, true}, + GetCreditCardTypeTestCase{"6011000990139424", kDiscoverCard, true}, + GetCreditCardTypeTestCase{"3530111333300000", kJCBCard, true}, + GetCreditCardTypeTestCase{"3566002020360505", kJCBCard, true}, + GetCreditCardTypeTestCase{"5555555555554444", kMasterCard, true}, + GetCreditCardTypeTestCase{"5105105105105100", kMasterCard, true}, + GetCreditCardTypeTestCase{"4111111111111111", kVisaCard, true}, + GetCreditCardTypeTestCase{"4012888888881881", kVisaCard, true}, + GetCreditCardTypeTestCase{"4222222222222", kVisaCard, true}, + + // The relevant sample numbers from + // https://www.auricsystems.com/sample-credit-card-numbers/ + GetCreditCardTypeTestCase{"343434343434343", kAmericanExpressCard, + true}, + GetCreditCardTypeTestCase{"371144371144376", kAmericanExpressCard, + true}, + GetCreditCardTypeTestCase{"341134113411347", kAmericanExpressCard, + true}, + GetCreditCardTypeTestCase{"36438936438936", kDinersCard, true}, + GetCreditCardTypeTestCase{"36110361103612", kDinersCard, true}, + GetCreditCardTypeTestCase{"36111111111111", kDinersCard, true}, + GetCreditCardTypeTestCase{"6011016011016011", kDiscoverCard, true}, + GetCreditCardTypeTestCase{"6011000990139424", kDiscoverCard, true}, + GetCreditCardTypeTestCase{"6011000000000004", kDiscoverCard, true}, + GetCreditCardTypeTestCase{"6011000995500000", kDiscoverCard, true}, + GetCreditCardTypeTestCase{"6500000000000002", kDiscoverCard, true}, + GetCreditCardTypeTestCase{"3566002020360505", kJCBCard, true}, + GetCreditCardTypeTestCase{"3528000000000007", kJCBCard, true}, + GetCreditCardTypeTestCase{"5500005555555559", kMasterCard, true}, + GetCreditCardTypeTestCase{"5555555555555557", kMasterCard, true}, + GetCreditCardTypeTestCase{"5454545454545454", kMasterCard, true}, + GetCreditCardTypeTestCase{"5555515555555551", kMasterCard, true}, + GetCreditCardTypeTestCase{"5405222222222226", kMasterCard, true}, + GetCreditCardTypeTestCase{"5478050000000007", kMasterCard, true}, + GetCreditCardTypeTestCase{"5111005111051128", kMasterCard, true}, + GetCreditCardTypeTestCase{"5112345112345114", kMasterCard, true}, + GetCreditCardTypeTestCase{"5115915115915118", kMasterCard, true}, + GetCreditCardTypeTestCase{"6247130048162403", kUnionPay, true}, + GetCreditCardTypeTestCase{"6247130048162403", kUnionPay, true}, + GetCreditCardTypeTestCase{"622384452162063648", kUnionPay, true}, + GetCreditCardTypeTestCase{"2204883716636153", kMirCard, true}, + GetCreditCardTypeTestCase{"2200111234567898", kMirCard, true}, + GetCreditCardTypeTestCase{"2200481349288130", kMirCard, true}, + + // Empty string + GetCreditCardTypeTestCase{std::string(), kGenericCard, false}, + + // Non-numeric + GetCreditCardTypeTestCase{"garbage", kGenericCard, false}, + GetCreditCardTypeTestCase{"4garbage", kVisaCard, false}, + + // Fails Luhn check. + GetCreditCardTypeTestCase{"4111111111111112", kVisaCard, false}, + GetCreditCardTypeTestCase{"6247130048162413", kUnionPay, false}, + GetCreditCardTypeTestCase{"2204883716636154", kMirCard, false})); + +class GetCreditCardTypeTestBatch2 + : public testing::TestWithParam<GetCreditCardTypeTestCase> {}; + +TEST_P(GetCreditCardTypeTestBatch2, GetCreditCardType) { + auto test_case = GetParam(); + base::string16 card_number = ASCIIToUTF16(test_case.card_number); + SCOPED_TRACE(card_number); + EXPECT_EQ(test_case.type, CreditCard::GetCreditCardType(card_number)); + EXPECT_EQ(test_case.is_valid, IsValidCreditCardNumber(card_number)); +} + +INSTANTIATE_TEST_CASE_P( + CreditCardTest, + GetCreditCardTypeTestBatch2, + testing::Values( + // Invalid length. + GetCreditCardTypeTestCase{"3434343434343434", kAmericanExpressCard, + false}, + GetCreditCardTypeTestCase{"411111111111116", kVisaCard, false}, + GetCreditCardTypeTestCase{"220011123456783", kMirCard, false}, + + // Issuer Identification Numbers (IINs) that Chrome recognizes. + GetCreditCardTypeTestCase{"4", kVisaCard, false}, + GetCreditCardTypeTestCase{"22", kMirCard, false}, + GetCreditCardTypeTestCase{"34", kAmericanExpressCard, false}, + GetCreditCardTypeTestCase{"37", kAmericanExpressCard, false}, + GetCreditCardTypeTestCase{"300", kDinersCard, false}, + GetCreditCardTypeTestCase{"301", kDinersCard, false}, + GetCreditCardTypeTestCase{"302", kDinersCard, false}, + GetCreditCardTypeTestCase{"303", kDinersCard, false}, + GetCreditCardTypeTestCase{"304", kDinersCard, false}, + GetCreditCardTypeTestCase{"305", kDinersCard, false}, + GetCreditCardTypeTestCase{"3095", kDinersCard, false}, + GetCreditCardTypeTestCase{"36", kDinersCard, false}, + GetCreditCardTypeTestCase{"38", kDinersCard, false}, + GetCreditCardTypeTestCase{"39", kDinersCard, false}, + GetCreditCardTypeTestCase{"6011", kDiscoverCard, false}, + GetCreditCardTypeTestCase{"644", kDiscoverCard, false}, + GetCreditCardTypeTestCase{"645", kDiscoverCard, false}, + GetCreditCardTypeTestCase{"646", kDiscoverCard, false}, + GetCreditCardTypeTestCase{"647", kDiscoverCard, false}, + GetCreditCardTypeTestCase{"648", kDiscoverCard, false}, + GetCreditCardTypeTestCase{"649", kDiscoverCard, false}, + GetCreditCardTypeTestCase{"65", kDiscoverCard, false}, + GetCreditCardTypeTestCase{"3528", kJCBCard, false}, + GetCreditCardTypeTestCase{"3531", kJCBCard, false}, + GetCreditCardTypeTestCase{"3589", kJCBCard, false}, + GetCreditCardTypeTestCase{"51", kMasterCard, false}, + GetCreditCardTypeTestCase{"52", kMasterCard, false}, + GetCreditCardTypeTestCase{"53", kMasterCard, false}, + GetCreditCardTypeTestCase{"54", kMasterCard, false}, + GetCreditCardTypeTestCase{"55", kMasterCard, false}, + GetCreditCardTypeTestCase{"62", kUnionPay, false}, + + // Not enough data to determine an IIN uniquely. + GetCreditCardTypeTestCase{"2", kGenericCard, false}, + GetCreditCardTypeTestCase{"3", kGenericCard, false}, + GetCreditCardTypeTestCase{"30", kGenericCard, false}, + GetCreditCardTypeTestCase{"309", kGenericCard, false}, + GetCreditCardTypeTestCase{"35", kGenericCard, false}, + GetCreditCardTypeTestCase{"5", kGenericCard, false}, + GetCreditCardTypeTestCase{"6", kGenericCard, false}, + GetCreditCardTypeTestCase{"60", kGenericCard, false}, + GetCreditCardTypeTestCase{"601", kGenericCard, false}, + GetCreditCardTypeTestCase{"64", kGenericCard, false})); + +class GetCreditCardTypeTestBatch3 + : public testing::TestWithParam<GetCreditCardTypeTestCase> {}; + +TEST_P(GetCreditCardTypeTestBatch3, GetCreditCardType) { + auto test_case = GetParam(); + base::string16 card_number = ASCIIToUTF16(test_case.card_number); + SCOPED_TRACE(card_number); + EXPECT_EQ(test_case.type, CreditCard::GetCreditCardType(card_number)); + EXPECT_EQ(test_case.is_valid, IsValidCreditCardNumber(card_number)); } +INSTANTIATE_TEST_CASE_P( + CreditCardTest, + GetCreditCardTypeTestBatch3, + testing::Values( + // Unknown IINs. + GetCreditCardTypeTestCase{"0", kGenericCard, false}, + GetCreditCardTypeTestCase{"1", kGenericCard, false}, + GetCreditCardTypeTestCase{"306", kGenericCard, false}, + GetCreditCardTypeTestCase{"307", kGenericCard, false}, + GetCreditCardTypeTestCase{"308", kGenericCard, false}, + GetCreditCardTypeTestCase{"3091", kGenericCard, false}, + GetCreditCardTypeTestCase{"3094", kGenericCard, false}, + GetCreditCardTypeTestCase{"3096", kGenericCard, false}, + GetCreditCardTypeTestCase{"31", kGenericCard, false}, + GetCreditCardTypeTestCase{"32", kGenericCard, false}, + GetCreditCardTypeTestCase{"33", kGenericCard, false}, + GetCreditCardTypeTestCase{"351", kGenericCard, false}, + GetCreditCardTypeTestCase{"3527", kGenericCard, false}, + GetCreditCardTypeTestCase{"359", kGenericCard, false}, + GetCreditCardTypeTestCase{"50", kGenericCard, false}, + GetCreditCardTypeTestCase{"56", kGenericCard, false}, + GetCreditCardTypeTestCase{"57", kGenericCard, false}, + GetCreditCardTypeTestCase{"58", kGenericCard, false}, + GetCreditCardTypeTestCase{"59", kGenericCard, false}, + GetCreditCardTypeTestCase{"600", kGenericCard, false}, + GetCreditCardTypeTestCase{"602", kGenericCard, false}, + GetCreditCardTypeTestCase{"603", kGenericCard, false}, + GetCreditCardTypeTestCase{"604", kGenericCard, false}, + GetCreditCardTypeTestCase{"605", kGenericCard, false}, + GetCreditCardTypeTestCase{"606", kGenericCard, false}, + GetCreditCardTypeTestCase{"607", kGenericCard, false}, + GetCreditCardTypeTestCase{"608", kGenericCard, false}, + GetCreditCardTypeTestCase{"609", kGenericCard, false}, + GetCreditCardTypeTestCase{"61", kGenericCard, false}, + GetCreditCardTypeTestCase{"63", kGenericCard, false}, + GetCreditCardTypeTestCase{"640", kGenericCard, false}, + GetCreditCardTypeTestCase{"641", kGenericCard, false}, + GetCreditCardTypeTestCase{"642", kGenericCard, false}, + GetCreditCardTypeTestCase{"643", kGenericCard, false}, + GetCreditCardTypeTestCase{"66", kGenericCard, false}, + GetCreditCardTypeTestCase{"67", kGenericCard, false}, + GetCreditCardTypeTestCase{"68", kGenericCard, false}, + GetCreditCardTypeTestCase{"69", kGenericCard, false}, + GetCreditCardTypeTestCase{"7", kGenericCard, false}, + GetCreditCardTypeTestCase{"8", kGenericCard, false}, + GetCreditCardTypeTestCase{"9", kGenericCard, false}, + + // Oddball case: Unknown issuer, but valid Luhn check and plausible + // length. + GetCreditCardTypeTestCase{"7000700070007000", kGenericCard, true})); + TEST(CreditCardTest, LastFourDigits) { CreditCard card(base::GenerateGUID(), "https://www.example.com/"); ASSERT_EQ(base::string16(), card.LastFourDigits()); @@ -791,104 +861,149 @@ TEST(CreditCardTest, LastFourDigits) { } // Verifies that a credit card should be updated. -TEST(CreditCardTest, ShouldUpdateExpiration) { - base::Time now = base::Time::Now(); - - base::Time::Exploded last_year; - (now - base::TimeDelta::FromDays(365)).LocalExplode(&last_year); - - base::Time::Exploded last_month; - (now - base::TimeDelta::FromDays(31)).LocalExplode(&last_month); - - base::Time::Exploded current; - now.LocalExplode(¤t); - - base::Time::Exploded next_month; - (now + base::TimeDelta::FromDays(31)).LocalExplode(&next_month); +struct ShouldUpdateExpirationTestCase { + bool should_update_expiration; + int month; + int year; + CreditCard::RecordType record_type; + CreditCard::ServerStatus server_status; +}; - base::Time::Exploded next_year; - (now + base::TimeDelta::FromDays(365)).LocalExplode(&next_year); +class ShouldUpdateExpirationTest + : public testing::TestWithParam<ShouldUpdateExpirationTestCase> {}; + +class TestingTimes { + public: + TestingTimes() { + now_ = base::Time::Now(); + (now_ - base::TimeDelta::FromDays(365)).LocalExplode(&last_year_); + (now_ - base::TimeDelta::FromDays(31)).LocalExplode(&last_month_); + now_.LocalExplode(¤t_); + (now_ + base::TimeDelta::FromDays(31)).LocalExplode(&next_month_); + (now_ + base::TimeDelta::FromDays(365)).LocalExplode(&next_year_); + } - static const struct { - bool should_update_expiration; - int month; - int year; - CreditCard::RecordType record_type; - CreditCard::ServerStatus server_status; - } kTestCases[] = { + base::Time now_; + base::Time::Exploded last_year_; + base::Time::Exploded last_month_; + base::Time::Exploded current_; + base::Time::Exploded next_month_; + base::Time::Exploded next_year_; +}; - // Cards that expired last year should always be updated. - {true, last_year.month, last_year.year, CreditCard::LOCAL_CARD}, - {true, last_year.month, last_year.year, CreditCard::FULL_SERVER_CARD, - CreditCard::OK}, - {true, last_year.month, last_year.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::OK}, - {true, last_year.month, last_year.year, CreditCard::FULL_SERVER_CARD, - CreditCard::EXPIRED}, - {true, last_year.month, last_year.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::EXPIRED}, - - // Cards that expired last month should always be updated. - {true, last_month.month, last_month.year, CreditCard::LOCAL_CARD}, - {true, last_month.month, last_month.year, CreditCard::FULL_SERVER_CARD, - CreditCard::OK}, - {true, last_month.month, last_month.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::OK}, - {true, last_month.month, last_month.year, CreditCard::FULL_SERVER_CARD, - CreditCard::EXPIRED}, - {true, last_month.month, last_month.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::EXPIRED}, - - // Cards that expire this month should be updated only if the server - // status is EXPIRED. - {false, current.month, current.year, CreditCard::LOCAL_CARD}, - {false, current.month, current.year, CreditCard::FULL_SERVER_CARD, - CreditCard::OK}, - {false, current.month, current.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::OK}, - {true, current.month, current.year, CreditCard::FULL_SERVER_CARD, - CreditCard::EXPIRED}, - {true, current.month, current.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::EXPIRED}, - - // Cards that expire next month should be updated only if the server - // status is EXPIRED. - {false, next_month.month, next_month.year, CreditCard::LOCAL_CARD}, - {false, next_month.month, next_month.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::OK}, - {false, next_month.month, next_month.year, CreditCard::FULL_SERVER_CARD, - CreditCard::OK}, - {true, next_month.month, next_month.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::EXPIRED}, - {true, next_month.month, next_month.year, CreditCard::FULL_SERVER_CARD, - CreditCard::EXPIRED}, - - // Cards that expire next year should be updated only if the server status - // is EXPIRED. - {false, next_year.month, next_year.year, CreditCard::LOCAL_CARD}, - {false, next_year.month, next_year.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::OK}, - {false, next_year.month, next_year.year, CreditCard::FULL_SERVER_CARD, - CreditCard::OK}, - {true, next_year.month, next_year.year, CreditCard::MASKED_SERVER_CARD, - CreditCard::EXPIRED}, - {true, next_year.month, next_year.year, CreditCard::FULL_SERVER_CARD, - CreditCard::EXPIRED}, - }; +TestingTimes testingTimes; - for (const auto& test_case : kTestCases) { - CreditCard card; - card.SetExpirationMonth(test_case.month); - card.SetExpirationYear(test_case.year); - card.set_record_type(test_case.record_type); - if (card.record_type() != CreditCard::LOCAL_CARD) - card.SetServerStatus(test_case.server_status); - - EXPECT_EQ(test_case.should_update_expiration, - card.ShouldUpdateExpiration(now)); - } +TEST_P(ShouldUpdateExpirationTest, ShouldUpdateExpiration) { + auto test_case = GetParam(); + CreditCard card; + card.SetExpirationMonth(test_case.month); + card.SetExpirationYear(test_case.year); + card.set_record_type(test_case.record_type); + if (card.record_type() != CreditCard::LOCAL_CARD) + card.SetServerStatus(test_case.server_status); + + EXPECT_EQ(test_case.should_update_expiration, + card.ShouldUpdateExpiration(testingTimes.now_)); } +INSTANTIATE_TEST_CASE_P( + CreditCardTest, + ShouldUpdateExpirationTest, + testing::Values( + // Cards that expired last year should always be updated. + ShouldUpdateExpirationTestCase{true, testingTimes.last_year_.month, + testingTimes.last_year_.year, + CreditCard::LOCAL_CARD}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.last_year_.month, testingTimes.last_year_.year, + CreditCard::FULL_SERVER_CARD, CreditCard::OK}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.last_year_.month, testingTimes.last_year_.year, + CreditCard::MASKED_SERVER_CARD, CreditCard::OK}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.last_year_.month, testingTimes.last_year_.year, + CreditCard::FULL_SERVER_CARD, CreditCard::EXPIRED}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.last_year_.month, testingTimes.last_year_.year, + CreditCard::MASKED_SERVER_CARD, CreditCard::EXPIRED}, + + // Cards that expired last month should always be updated. + ShouldUpdateExpirationTestCase{true, testingTimes.last_month_.month, + testingTimes.last_month_.year, + CreditCard::LOCAL_CARD}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.last_month_.month, testingTimes.last_month_.year, + CreditCard::FULL_SERVER_CARD, CreditCard::OK}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.last_month_.month, testingTimes.last_month_.year, + CreditCard::MASKED_SERVER_CARD, CreditCard::OK}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.last_month_.month, testingTimes.last_month_.year, + CreditCard::FULL_SERVER_CARD, CreditCard::EXPIRED}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.last_month_.month, testingTimes.last_month_.year, + CreditCard::MASKED_SERVER_CARD, CreditCard::EXPIRED}, + + // Cards that expire this month should be updated only if the server + // status is EXPIRED. + ShouldUpdateExpirationTestCase{false, testingTimes.current_.month, + testingTimes.current_.year, + CreditCard::LOCAL_CARD}, + ShouldUpdateExpirationTestCase{ + false, testingTimes.current_.month, testingTimes.current_.year, + CreditCard::FULL_SERVER_CARD, CreditCard::OK}, + ShouldUpdateExpirationTestCase{ + false, testingTimes.current_.month, testingTimes.current_.year, + CreditCard::MASKED_SERVER_CARD, CreditCard::OK}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.current_.month, testingTimes.current_.year, + CreditCard::FULL_SERVER_CARD, CreditCard::EXPIRED}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.current_.month, testingTimes.current_.year, + CreditCard::MASKED_SERVER_CARD, CreditCard::EXPIRED}, + + // Cards that expire next month should be updated only if the server + // status is EXPIRED. + ShouldUpdateExpirationTestCase{false, testingTimes.next_month_.month, + testingTimes.next_month_.year, + CreditCard::LOCAL_CARD}, + ShouldUpdateExpirationTestCase{false, testingTimes.next_month_.month, + testingTimes.next_month_.year, + CreditCard::MASKED_SERVER_CARD, + CreditCard::OK}, + ShouldUpdateExpirationTestCase{false, testingTimes.next_month_.month, + testingTimes.next_month_.year, + CreditCard::FULL_SERVER_CARD, + CreditCard::OK}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.next_month_.month, testingTimes.next_month_.year, + CreditCard::MASKED_SERVER_CARD, CreditCard::EXPIRED}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.next_month_.month, testingTimes.next_month_.year, + CreditCard::FULL_SERVER_CARD, CreditCard::EXPIRED}, + + // Cards that expire next year should be updated only if the server + // status is EXPIRED. + ShouldUpdateExpirationTestCase{false, testingTimes.next_year_.month, + testingTimes.next_year_.year, + CreditCard::LOCAL_CARD}, + ShouldUpdateExpirationTestCase{ + false, testingTimes.next_year_.month, testingTimes.next_year_.year, + CreditCard::MASKED_SERVER_CARD, CreditCard::OK}, + ShouldUpdateExpirationTestCase{ + false, testingTimes.next_year_.month, testingTimes.next_year_.year, + CreditCard::FULL_SERVER_CARD, CreditCard::OK}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.next_year_.month, testingTimes.next_year_.year, + CreditCard::MASKED_SERVER_CARD, CreditCard::EXPIRED}, + ShouldUpdateExpirationTestCase{ + true, testingTimes.next_year_.month, testingTimes.next_year_.year, + CreditCard::FULL_SERVER_CARD, CreditCard::EXPIRED})); + +// TODO(wuandy): rewriting below test with INSTANTIATE_TEST_CASE_P seems to +// trigger a complaint on windows compilers. Removing it and revert to +// original test for now. + // Test that credit card last used date suggestion can be generated correctly // in different variations. TEST(CreditCardTest, GetLastUsedDateForDisplay) { |