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