1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "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"
9
10using base::ASCIIToUTF16;
11
12namespace autofill {
13namespace {
14
15struct ExpirationDate {
16  const char* year;
17  const char* month;
18};
19
20struct IntExpirationDate {
21  const int year;
22  const int month;
23};
24
25// From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
26const char* const kValidNumbers[] = {
27  "378282246310005",
28  "3714 4963 5398 431",
29  "3787-3449-3671-000",
30  "5610591081018250",
31  "3056 9309 0259 04",
32  "3852-0000-0232-37",
33  "6011111111111117",
34  "6011 0009 9013 9424",
35  "3530-1113-3330-0000",
36  "3566002020360505",
37  "5555 5555 5555 4444",
38  "5105-1051-0510-5100",
39  "4111111111111111",
40  "4012 8888 8888 1881",
41  "4222-2222-2222-2",
42  "5019717010103742",
43  "6331101999990016",
44
45  // A UnionPay card that doesn't pass the Luhn checksum
46  "6200000000000000",
47};
48const char* const kInvalidNumbers[] = {
49  "4111 1111 112", /* too short */
50  "41111111111111111115", /* too long */
51  "4111-1111-1111-1110", /* wrong Luhn checksum */
52  "3056 9309 0259 04aa", /* non-digit characters */
53};
54const char kCurrentDate[]="1 May 2013";
55const ExpirationDate kValidCreditCardExpirationDate[] = {
56  { "2013", "5" },  // Valid month in current year.
57  { "2014", "1" },  // Any month in next year.
58  { "2014", " 1" },  // Whitespace in month.
59  { " 2014", "1" },  // Whitespace in year.
60};
61const IntExpirationDate kValidCreditCardIntExpirationDate[] = {
62  { 2013, 5 },  // Valid month in current year.
63  { 2014, 1 },  // Any month in next year.
64};
65const ExpirationDate kInvalidCreditCardExpirationDate[] = {
66  { "2013", "04" },  // Previous month in current year.
67  { "2012", "12" },  // Any month in previous year.
68};
69const IntExpirationDate kInvalidCreditCardIntExpirationDate[] = {
70  { 2013, 4 },  // Previous month in current year.
71  { 2012, 12 },  // Any month in previous year.
72};
73const char* const kValidCreditCardSecurityCode[] = {
74  "323",  // 3-digit CSC.
75  "3234",  // 4-digit CSC.
76};
77const char* const kInvalidCreditCardSecurityCode[] = {
78  "32",  // CSC too short.
79  "12345",  // CSC too long.
80  "asd",  // non-numeric CSC.
81};
82const char* const kValidEmailAddress[] = {
83  "user@example",
84  "user@example.com",
85  "user@subdomain.example.com",
86  "user+postfix@example.com",
87};
88const char* const kInvalidEmailAddress[] = {
89  "user",
90  "foo.com",
91  "user@",
92  "user@=example.com"
93};
94const char kAmericanExpressCard[] = "341111111111111";
95const char kVisaCard[] = "4111111111111111";
96const char kAmericanExpressCVC[] = "1234";
97const char kVisaCVC[] = "123";
98}  // namespace
99
100TEST(AutofillValidation, IsValidCreditCardNumber) {
101  for (size_t i = 0; i < arraysize(kValidNumbers); ++i) {
102    SCOPED_TRACE(kValidNumbers[i]);
103    EXPECT_TRUE(
104        autofill::IsValidCreditCardNumber(ASCIIToUTF16(kValidNumbers[i])));
105  }
106  for (size_t i = 0; i < arraysize(kInvalidNumbers); ++i) {
107    SCOPED_TRACE(kInvalidNumbers[i]);
108    EXPECT_FALSE(
109        autofill::IsValidCreditCardNumber(ASCIIToUTF16(kInvalidNumbers[i])));
110  }
111}
112
113TEST(AutofillValidation, IsValidCreditCardExpirationDate)
114{
115  base::Time now;
116  ASSERT_TRUE(base::Time::FromString(kCurrentDate, &now));
117
118  for (size_t i = 0; i < arraysize(kValidCreditCardExpirationDate); ++i) {
119    const ExpirationDate& data = kValidCreditCardExpirationDate[i];
120    SCOPED_TRACE(data.year);
121    SCOPED_TRACE(data.month);
122    EXPECT_TRUE(
123        autofill::IsValidCreditCardExpirationDate(ASCIIToUTF16(data.year),
124                                                  ASCIIToUTF16(data.month),
125                                                  now));
126  }
127  for (size_t i = 0; i < arraysize(kInvalidCreditCardExpirationDate); ++i) {
128    const ExpirationDate& data = kInvalidCreditCardExpirationDate[i];
129    SCOPED_TRACE(data.year);
130    SCOPED_TRACE(data.month);
131    EXPECT_TRUE(
132        !autofill::IsValidCreditCardExpirationDate(ASCIIToUTF16(data.year),
133                                                   ASCIIToUTF16(data.month),
134                                                   now));
135  }
136}
137
138TEST(AutofillValidation, IsValidCreditCardIntExpirationDate)
139{
140  base::Time now;
141  ASSERT_TRUE(base::Time::FromString(kCurrentDate, &now));
142
143  for (size_t i = 0; i < arraysize(kValidCreditCardIntExpirationDate); ++i) {
144    const IntExpirationDate& data = kValidCreditCardIntExpirationDate[i];
145    SCOPED_TRACE(data.year);
146    SCOPED_TRACE(data.month);
147    EXPECT_TRUE(
148        autofill::IsValidCreditCardExpirationDate(data.year, data.month, now));
149  }
150  for (size_t i = 0; i < arraysize(kInvalidCreditCardIntExpirationDate); ++i) {
151    const IntExpirationDate& data = kInvalidCreditCardIntExpirationDate[i];
152    SCOPED_TRACE(data.year);
153    SCOPED_TRACE(data.month);
154    EXPECT_TRUE(
155        !autofill::IsValidCreditCardExpirationDate(data.year, data.month, now));
156  }
157}
158TEST(AutofillValidation, IsValidCreditCardSecurityCode) {
159  for (size_t i = 0; i < arraysize(kValidCreditCardSecurityCode); ++i) {
160    SCOPED_TRACE(kValidCreditCardSecurityCode[i]);
161    EXPECT_TRUE(
162        autofill::IsValidCreditCardSecurityCode(
163            ASCIIToUTF16(kValidCreditCardSecurityCode[i])));
164  }
165  for (size_t i = 0; i < arraysize(kInvalidCreditCardSecurityCode); ++i) {
166    SCOPED_TRACE(kInvalidCreditCardSecurityCode[i]);
167    EXPECT_FALSE(
168        autofill::IsValidCreditCardSecurityCode(
169            ASCIIToUTF16(kInvalidCreditCardSecurityCode[i])));
170  }
171}
172
173TEST(AutofillValidation, IsValidEmailAddress) {
174  for (size_t i = 0; i < arraysize(kValidEmailAddress); ++i) {
175    SCOPED_TRACE(kValidEmailAddress[i]);
176    EXPECT_TRUE(
177        autofill::IsValidEmailAddress(ASCIIToUTF16(kValidEmailAddress[i])));
178  }
179  for (size_t i = 0; i < arraysize(kInvalidEmailAddress); ++i) {
180    SCOPED_TRACE(kInvalidEmailAddress[i]);
181    EXPECT_FALSE(
182        autofill::IsValidEmailAddress(ASCIIToUTF16(kInvalidEmailAddress[i])));
183  }
184}
185
186TEST(AutofillValidation, IsValidCreditCardSecurityCodeWithNumber) {
187  EXPECT_TRUE(autofill::IsValidCreditCardSecurityCode(
188      ASCIIToUTF16(kAmericanExpressCVC), ASCIIToUTF16(kAmericanExpressCard)));
189  EXPECT_TRUE(autofill::IsValidCreditCardSecurityCode(
190      ASCIIToUTF16(kVisaCVC), ASCIIToUTF16(kVisaCard)));
191  EXPECT_FALSE(autofill::IsValidCreditCardSecurityCode(
192      ASCIIToUTF16(kVisaCVC), ASCIIToUTF16(kAmericanExpressCard)));
193  EXPECT_FALSE(autofill::IsValidCreditCardSecurityCode(
194      ASCIIToUTF16(kAmericanExpressCVC), ASCIIToUTF16(kVisaCard)));
195  EXPECT_TRUE(autofill::IsValidCreditCardSecurityCode(
196      ASCIIToUTF16(kVisaCVC), ASCIIToUTF16(kInvalidNumbers[0])));
197  EXPECT_FALSE(autofill::IsValidCreditCardSecurityCode(
198      ASCIIToUTF16(kAmericanExpressCVC), ASCIIToUTF16(kInvalidNumbers[0])));
199}
200
201}  // namespace autofill
202