1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/strings/utf_string_conversions.h"
6 #include "base/time/time.h"
7 #include "components/autofill/core/browser/validation.h"
8 #include "testing/gtest/include/gtest/gtest.h"
13 struct ExpirationDate {
18 struct IntExpirationDate {
23 // From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
24 const char* const kValidNumbers[] = {
32 "6011 0009 9013 9424",
33 "3530-1113-3330-0000",
35 "5555 5555 5555 4444",
36 "5105-1051-0510-5100",
38 "4012 8888 8888 1881",
43 // A UnionPay card that doesn't pass the Luhn checksum
46 const char* const kInvalidNumbers[] = {
47 "4111 1111 112", /* too short */
48 "41111111111111111115", /* too long */
49 "4111-1111-1111-1110", /* wrong Luhn checksum */
50 "3056 9309 0259 04aa", /* non-digit characters */
52 const char kCurrentDate[]="1 May 2013";
53 const ExpirationDate kValidCreditCardExpirationDate[] = {
54 { "2013", "5" }, // Valid month in current year.
55 { "2014", "1" }, // Any month in next year.
56 { "2014", " 1" }, // Whitespace in month.
57 { " 2014", "1" }, // Whitespace in year.
59 const IntExpirationDate kValidCreditCardIntExpirationDate[] = {
60 { 2013, 5 }, // Valid month in current year.
61 { 2014, 1 }, // Any month in next year.
63 const ExpirationDate kInvalidCreditCardExpirationDate[] = {
64 { "2013", "04" }, // Previous month in current year.
65 { "2012", "12" }, // Any month in previous year.
67 const IntExpirationDate kInvalidCreditCardIntExpirationDate[] = {
68 { 2013, 4 }, // Previous month in current year.
69 { 2012, 12 }, // Any month in previous year.
71 const char* const kValidCreditCardSecurityCode[] = {
72 "323", // 3-digit CSC.
73 "3234", // 4-digit CSC.
75 const char* const kInvalidCreditCardSecurityCode[] = {
76 "32", // CSC too short.
77 "12345", // CSC too long.
78 "asd", // non-numeric CSC.
80 const char* const kValidEmailAddress[] = {
83 "user@subdomain.example.com",
84 "user+postfix@example.com",
86 const char* const kInvalidEmailAddress[] = {
92 const char kAmericanExpressCard[] = "341111111111111";
93 const char kVisaCard[] = "4111111111111111";
94 const char kAmericanExpressCVC[] = "1234";
95 const char kVisaCVC[] = "123";
98 TEST(AutofillValidation, IsValidCreditCardNumber) {
99 for (size_t i = 0; i < arraysize(kValidNumbers); ++i) {
100 SCOPED_TRACE(kValidNumbers[i]);
102 autofill::IsValidCreditCardNumber(ASCIIToUTF16(kValidNumbers[i])));
104 for (size_t i = 0; i < arraysize(kInvalidNumbers); ++i) {
105 SCOPED_TRACE(kInvalidNumbers[i]);
107 autofill::IsValidCreditCardNumber(ASCIIToUTF16(kInvalidNumbers[i])));
111 TEST(AutofillValidation, IsValidCreditCardExpirationDate)
114 ASSERT_TRUE(base::Time::FromString(kCurrentDate, &now));
116 for (size_t i = 0; i < arraysize(kValidCreditCardExpirationDate); ++i) {
117 const ExpirationDate& data = kValidCreditCardExpirationDate[i];
118 SCOPED_TRACE(data.year);
119 SCOPED_TRACE(data.month);
121 autofill::IsValidCreditCardExpirationDate(ASCIIToUTF16(data.year),
122 ASCIIToUTF16(data.month),
125 for (size_t i = 0; i < arraysize(kInvalidCreditCardExpirationDate); ++i) {
126 const ExpirationDate& data = kInvalidCreditCardExpirationDate[i];
127 SCOPED_TRACE(data.year);
128 SCOPED_TRACE(data.month);
130 !autofill::IsValidCreditCardExpirationDate(ASCIIToUTF16(data.year),
131 ASCIIToUTF16(data.month),
136 TEST(AutofillValidation, IsValidCreditCardIntExpirationDate)
139 ASSERT_TRUE(base::Time::FromString(kCurrentDate, &now));
141 for (size_t i = 0; i < arraysize(kValidCreditCardIntExpirationDate); ++i) {
142 const IntExpirationDate& data = kValidCreditCardIntExpirationDate[i];
143 SCOPED_TRACE(data.year);
144 SCOPED_TRACE(data.month);
146 autofill::IsValidCreditCardExpirationDate(data.year, data.month, now));
148 for (size_t i = 0; i < arraysize(kInvalidCreditCardIntExpirationDate); ++i) {
149 const IntExpirationDate& data = kInvalidCreditCardIntExpirationDate[i];
150 SCOPED_TRACE(data.year);
151 SCOPED_TRACE(data.month);
153 !autofill::IsValidCreditCardExpirationDate(data.year, data.month, now));
156 TEST(AutofillValidation, IsValidCreditCardSecurityCode) {
157 for (size_t i = 0; i < arraysize(kValidCreditCardSecurityCode); ++i) {
158 SCOPED_TRACE(kValidCreditCardSecurityCode[i]);
160 autofill::IsValidCreditCardSecurityCode(
161 ASCIIToUTF16(kValidCreditCardSecurityCode[i])));
163 for (size_t i = 0; i < arraysize(kInvalidCreditCardSecurityCode); ++i) {
164 SCOPED_TRACE(kInvalidCreditCardSecurityCode[i]);
166 autofill::IsValidCreditCardSecurityCode(
167 ASCIIToUTF16(kInvalidCreditCardSecurityCode[i])));
171 TEST(AutofillValidation, IsValidEmailAddress) {
172 for (size_t i = 0; i < arraysize(kValidEmailAddress); ++i) {
173 SCOPED_TRACE(kValidEmailAddress[i]);
175 autofill::IsValidEmailAddress(ASCIIToUTF16(kValidEmailAddress[i])));
177 for (size_t i = 0; i < arraysize(kInvalidEmailAddress); ++i) {
178 SCOPED_TRACE(kInvalidEmailAddress[i]);
180 autofill::IsValidEmailAddress(ASCIIToUTF16(kInvalidEmailAddress[i])));
184 TEST(AutofillValidation, IsValidCreditCardSecurityCodeWithNumber) {
185 EXPECT_TRUE(autofill::IsValidCreditCardSecurityCode(
186 ASCIIToUTF16(kAmericanExpressCVC), ASCIIToUTF16(kAmericanExpressCard)));
187 EXPECT_TRUE(autofill::IsValidCreditCardSecurityCode(
188 ASCIIToUTF16(kVisaCVC), ASCIIToUTF16(kVisaCard)));
189 EXPECT_FALSE(autofill::IsValidCreditCardSecurityCode(
190 ASCIIToUTF16(kVisaCVC), ASCIIToUTF16(kAmericanExpressCard)));
191 EXPECT_FALSE(autofill::IsValidCreditCardSecurityCode(
192 ASCIIToUTF16(kAmericanExpressCVC), ASCIIToUTF16(kVisaCard)));
193 EXPECT_TRUE(autofill::IsValidCreditCardSecurityCode(
194 ASCIIToUTF16(kVisaCVC), ASCIIToUTF16(kInvalidNumbers[0])));
195 EXPECT_FALSE(autofill::IsValidCreditCardSecurityCode(
196 ASCIIToUTF16(kAmericanExpressCVC), ASCIIToUTF16(kInvalidNumbers[0])));
199 } // namespace autofill