OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/autofill/core/browser/validation.h" | 5 #include "components/autofill/core/browser/validation.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/strings/string16.h" | 10 #include "base/strings/string16.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 const int month; | 31 const int month; |
32 }; | 32 }; |
33 | 33 |
34 struct SecurityCodeCardTypePair { | 34 struct SecurityCodeCardTypePair { |
35 const char* security_code; | 35 const char* security_code; |
36 const char* card_type; | 36 const char* card_type; |
37 }; | 37 }; |
38 | 38 |
39 // From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card
_numbers.htm | 39 // From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card
_numbers.htm |
40 const char* const kValidNumbers[] = { | 40 const char* const kValidNumbers[] = { |
41 "378282246310005", | 41 "378282246310005", |
42 "3714 4963 5398 431", | 42 "3714 4963 5398 431", |
43 "3787-3449-3671-000", | 43 "3787-3449-3671-000", |
44 "5610591081018250", | 44 "5610591081018250", |
45 "3056 9309 0259 04", | 45 "3056 9309 0259 04", |
46 "3852-0000-0232-37", | 46 "3852-0000-0232-37", |
47 "6011111111111117", | 47 "6011111111111117", |
48 "6011 0009 9013 9424", | 48 "6011 0009 9013 9424", |
49 "3530-1113-3330-0000", | 49 "3530-1113-3330-0000", |
50 "3566002020360505", | 50 "3566002020360505", |
51 "5555 5555 5555 4444", | 51 "5555 5555 5555 4444", // Mastercard. |
52 "5105-1051-0510-5100", | 52 "5105-1051-0510-5100", |
53 "4111111111111111", | 53 "4111111111111111", // Visa. |
54 "4012 8888 8888 1881", | 54 "4012 8888 8888 1881", |
55 "4222-2222-2222-2", | 55 "4222-2222-2222-2", |
56 "5019717010103742", | 56 "5019717010103742", |
57 "6331101999990016", | 57 "6331101999990016", |
58 "6247130048162403", | 58 "6247130048162403", |
59 }; | 59 }; |
60 const char* const kInvalidNumbers[] = { | 60 const char* const kInvalidNumbers[] = { |
61 "4111 1111 112", /* too short */ | 61 "4111 1111 112", /* too short */ |
62 "41111111111111111115", /* too long */ | 62 "41111111111111111115", /* too long */ |
63 "4111-1111-1111-1110", /* wrong Luhn checksum */ | 63 "4111-1111-1111-1110", /* wrong Luhn checksum */ |
64 "3056 9309 0259 04aa", /* non-digit characters */ | 64 "3056 9309 0259 04aa", /* non-digit characters */ |
65 }; | 65 }; |
66 const char kCurrentDate[]="1 May 2013"; | 66 const char kCurrentDate[]="1 May 2013"; |
67 const IntExpirationDate kValidCreditCardIntExpirationDate[] = { | 67 const IntExpirationDate kValidCreditCardIntExpirationDate[] = { |
68 { 2013, 5 }, // Valid month in current year. | 68 { 2013, 5 }, // Valid month in current year. |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 ValidationCase("05/1987", | 223 ValidationCase("05/1987", |
224 CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, | 224 CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, |
225 false, | 225 false, |
226 IDS_PAYMENTS_CARD_EXPIRATION_INVALID_VALIDATION_MESSAGE), | 226 IDS_PAYMENTS_CARD_EXPIRATION_INVALID_VALIDATION_MESSAGE), |
227 ValidationCase("05/12", | 227 ValidationCase("05/12", |
228 CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, | 228 CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, |
229 false, | 229 false, |
230 IDS_PAYMENTS_VALIDATION_INVALID_CREDIT_CARD_EXPIRED))); | 230 IDS_PAYMENTS_VALIDATION_INVALID_CREDIT_CARD_EXPIRED))); |
231 | 231 |
232 INSTANTIATE_TEST_CASE_P( | 232 INSTANTIATE_TEST_CASE_P( |
233 CreditCardNumber, | |
234 AutofillTypeValidationTest, | |
235 testing::Values( | |
236 ValidationCase(kValidNumbers[0], CREDIT_CARD_NUMBER, true, 0), | |
237 ValidationCase(kValidNumbers[1], CREDIT_CARD_NUMBER, true, 0), | |
238 ValidationCase(kValidNumbers[2], CREDIT_CARD_NUMBER, true, 0), | |
239 ValidationCase(kValidNumbers[3], CREDIT_CARD_NUMBER, true, 0), | |
240 ValidationCase(kValidNumbers[4], CREDIT_CARD_NUMBER, true, 0), | |
241 ValidationCase(kValidNumbers[5], CREDIT_CARD_NUMBER, true, 0), | |
242 ValidationCase(kValidNumbers[6], CREDIT_CARD_NUMBER, true, 0), | |
243 ValidationCase(kValidNumbers[7], CREDIT_CARD_NUMBER, true, 0), | |
244 ValidationCase(kValidNumbers[8], CREDIT_CARD_NUMBER, true, 0), | |
245 ValidationCase(kValidNumbers[9], CREDIT_CARD_NUMBER, true, 0), | |
246 ValidationCase(kValidNumbers[10], CREDIT_CARD_NUMBER, true, 0), | |
247 ValidationCase(kValidNumbers[11], CREDIT_CARD_NUMBER, true, 0), | |
248 ValidationCase(kValidNumbers[12], CREDIT_CARD_NUMBER, true, 0), | |
249 ValidationCase(kValidNumbers[13], CREDIT_CARD_NUMBER, true, 0), | |
250 ValidationCase(kValidNumbers[14], CREDIT_CARD_NUMBER, true, 0), | |
251 ValidationCase(kValidNumbers[15], CREDIT_CARD_NUMBER, true, 0), | |
252 ValidationCase(kValidNumbers[16], CREDIT_CARD_NUMBER, true, 0), | |
253 ValidationCase(kValidNumbers[17], CREDIT_CARD_NUMBER, true, 0), | |
254 | |
255 ValidationCase(kInvalidNumbers[0], | |
256 CREDIT_CARD_NUMBER, | |
257 false, | |
258 IDS_PAYMENTS_CARD_NUMBER_INVALID_VALIDATION_MESSAGE), | |
259 ValidationCase(kInvalidNumbers[1], | |
260 CREDIT_CARD_NUMBER, | |
261 false, | |
262 IDS_PAYMENTS_CARD_NUMBER_INVALID_VALIDATION_MESSAGE), | |
263 ValidationCase(kInvalidNumbers[2], | |
264 CREDIT_CARD_NUMBER, | |
265 false, | |
266 IDS_PAYMENTS_CARD_NUMBER_INVALID_VALIDATION_MESSAGE), | |
267 ValidationCase(kInvalidNumbers[3], | |
268 CREDIT_CARD_NUMBER, | |
269 false, | |
270 IDS_PAYMENTS_CARD_NUMBER_INVALID_VALIDATION_MESSAGE))); | |
271 | |
272 INSTANTIATE_TEST_CASE_P( | |
273 CreditCardMonth, | 233 CreditCardMonth, |
274 AutofillTypeValidationTest, | 234 AutofillTypeValidationTest, |
275 testing::Values( | 235 testing::Values( |
276 ValidationCase("01", CREDIT_CARD_EXP_MONTH, true, 0), | 236 ValidationCase("01", CREDIT_CARD_EXP_MONTH, true, 0), |
277 ValidationCase("1", CREDIT_CARD_EXP_MONTH, true, 0), | 237 ValidationCase("1", CREDIT_CARD_EXP_MONTH, true, 0), |
278 ValidationCase("12", CREDIT_CARD_EXP_MONTH, true, 0), | 238 ValidationCase("12", CREDIT_CARD_EXP_MONTH, true, 0), |
279 ValidationCase( | 239 ValidationCase( |
280 "0", | 240 "0", |
281 CREDIT_CARD_EXP_MONTH, | 241 CREDIT_CARD_EXP_MONTH, |
282 false, | 242 false, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 "123", | 305 "123", |
346 CREDIT_CARD_EXP_4_DIGIT_YEAR, | 306 CREDIT_CARD_EXP_4_DIGIT_YEAR, |
347 false, | 307 false, |
348 IDS_PAYMENTS_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_YEAR), | 308 IDS_PAYMENTS_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_YEAR), |
349 ValidationCase( | 309 ValidationCase( |
350 "87", | 310 "87", |
351 CREDIT_CARD_EXP_4_DIGIT_YEAR, | 311 CREDIT_CARD_EXP_4_DIGIT_YEAR, |
352 false, | 312 false, |
353 IDS_PAYMENTS_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_YEAR))); | 313 IDS_PAYMENTS_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_YEAR))); |
354 | 314 |
| 315 struct CCNumberCase { |
| 316 CCNumberCase(const char* value, |
| 317 const std::set<std::string> supported_basic_card_networks, |
| 318 bool expected_valid, |
| 319 int expected_error_id) |
| 320 : value(value), |
| 321 supported_basic_card_networks(supported_basic_card_networks), |
| 322 expected_valid(expected_valid), |
| 323 expected_error_id(expected_error_id) {} |
| 324 ~CCNumberCase() {} |
| 325 |
| 326 const char* const value; |
| 327 const std::set<std::string> supported_basic_card_networks; |
| 328 const bool expected_valid; |
| 329 const int expected_error_id; |
| 330 }; |
| 331 |
| 332 class AutofillCCNumberValidationTest |
| 333 : public testing::TestWithParam<CCNumberCase> {}; |
| 334 |
| 335 TEST_P(AutofillCCNumberValidationTest, IsValidCreditCardNumber) { |
| 336 base::string16 error_message; |
| 337 EXPECT_EQ(GetParam().expected_valid, |
| 338 IsValidCreditCardNumberForBasicCardNetworks( |
| 339 ASCIIToUTF16(GetParam().value), |
| 340 GetParam().supported_basic_card_networks, &error_message)) |
| 341 << "Failed to validate CC number " << GetParam().value; |
| 342 if (!GetParam().expected_valid) { |
| 343 EXPECT_EQ(l10n_util::GetStringUTF16(GetParam().expected_error_id), |
| 344 error_message); |
| 345 } |
| 346 } |
| 347 |
| 348 const static std::set<std::string> kAllBasicCardNetworks{ |
| 349 "amex", "discover", "diners", "jcb", |
| 350 "mastercard", "mir", "unionpay", "visa"}; |
| 351 |
| 352 INSTANTIATE_TEST_CASE_P( |
| 353 CreditCardNumber, |
| 354 AutofillCCNumberValidationTest, |
| 355 testing::Values( |
| 356 CCNumberCase(kValidNumbers[0], kAllBasicCardNetworks, true, 0), |
| 357 CCNumberCase(kValidNumbers[1], kAllBasicCardNetworks, true, 0), |
| 358 CCNumberCase(kValidNumbers[2], kAllBasicCardNetworks, true, 0), |
| 359 // Generic card not supported. |
| 360 CCNumberCase(kValidNumbers[3], |
| 361 kAllBasicCardNetworks, |
| 362 false, |
| 363 IDS_PAYMENTS_VALIDATION_UNSUPPORTED_CREDIT_CARD_TYPE), |
| 364 |
| 365 CCNumberCase(kValidNumbers[4], kAllBasicCardNetworks, true, 0), |
| 366 CCNumberCase(kValidNumbers[5], kAllBasicCardNetworks, true, 0), |
| 367 CCNumberCase(kValidNumbers[6], kAllBasicCardNetworks, true, 0), |
| 368 CCNumberCase(kValidNumbers[7], kAllBasicCardNetworks, true, 0), |
| 369 CCNumberCase(kValidNumbers[8], kAllBasicCardNetworks, true, 0), |
| 370 CCNumberCase(kValidNumbers[9], kAllBasicCardNetworks, true, 0), |
| 371 CCNumberCase(kValidNumbers[10], kAllBasicCardNetworks, true, 0), |
| 372 CCNumberCase(kValidNumbers[11], kAllBasicCardNetworks, true, 0), |
| 373 CCNumberCase(kValidNumbers[12], kAllBasicCardNetworks, true, 0), |
| 374 CCNumberCase(kValidNumbers[13], kAllBasicCardNetworks, true, 0), |
| 375 CCNumberCase(kValidNumbers[14], kAllBasicCardNetworks, true, 0), |
| 376 // Generic cards not supported. |
| 377 CCNumberCase(kValidNumbers[15], |
| 378 kAllBasicCardNetworks, |
| 379 false, |
| 380 IDS_PAYMENTS_VALIDATION_UNSUPPORTED_CREDIT_CARD_TYPE), |
| 381 CCNumberCase(kValidNumbers[16], |
| 382 kAllBasicCardNetworks, |
| 383 false, |
| 384 IDS_PAYMENTS_VALIDATION_UNSUPPORTED_CREDIT_CARD_TYPE), |
| 385 |
| 386 CCNumberCase(kValidNumbers[17], kAllBasicCardNetworks, true, 0), |
| 387 |
| 388 CCNumberCase(kInvalidNumbers[0], |
| 389 kAllBasicCardNetworks, |
| 390 false, |
| 391 IDS_PAYMENTS_CARD_NUMBER_INVALID_VALIDATION_MESSAGE), |
| 392 CCNumberCase(kInvalidNumbers[1], |
| 393 kAllBasicCardNetworks, |
| 394 false, |
| 395 IDS_PAYMENTS_CARD_NUMBER_INVALID_VALIDATION_MESSAGE), |
| 396 CCNumberCase(kInvalidNumbers[2], |
| 397 kAllBasicCardNetworks, |
| 398 false, |
| 399 IDS_PAYMENTS_CARD_NUMBER_INVALID_VALIDATION_MESSAGE), |
| 400 CCNumberCase(kInvalidNumbers[3], |
| 401 kAllBasicCardNetworks, |
| 402 false, |
| 403 IDS_PAYMENTS_CARD_NUMBER_INVALID_VALIDATION_MESSAGE), |
| 404 |
| 405 // Valid numbers can still be invalid if the type is not supported. |
| 406 CCNumberCase(kValidNumbers[10], // Mastercard number. |
| 407 {"visa"}, |
| 408 false, |
| 409 IDS_PAYMENTS_VALIDATION_UNSUPPORTED_CREDIT_CARD_TYPE), |
| 410 CCNumberCase(kValidNumbers[12], // Visa number. |
| 411 {"jcb", "diners", "unionpay", "mastercard"}, |
| 412 false, |
| 413 IDS_PAYMENTS_VALIDATION_UNSUPPORTED_CREDIT_CARD_TYPE))); |
| 414 |
355 } // namespace autofill | 415 } // namespace autofill |
OLD | NEW |