1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/autofill/autofill_common_test.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/credit_card.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests credit card summary string generation.  This test simulates a variety
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of different possible summary strings.  Variations occur based on the
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// existence of credit card number, month, and year fields.
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CreditCardTest, PreviewSummaryAndObfuscatedNumberStrings) {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Case 0: empty credit card.
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CreditCard credit_card0;
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 summary0 = credit_card0.Label();
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(string16(), summary0);
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 obfuscated0 = credit_card0.ObfuscatedNumber();
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(string16(), obfuscated0);
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Case 00: Empty credit card with empty strings.
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CreditCard credit_card00;
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  autofill_test::SetCreditCardInfo(&credit_card00,
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      "John Dillinger", "", "", "");
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 summary00 = credit_card00.Label();
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(string16(ASCIIToUTF16("John Dillinger")), summary00);
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 obfuscated00 = credit_card00.ObfuscatedNumber();
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(string16(), obfuscated00);
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Case 1: No credit card number.
32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CreditCard credit_card1;
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  autofill_test::SetCreditCardInfo(&credit_card1,
34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      "John Dillinger", "", "01", "2010");
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 summary1 = credit_card1.Label();
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(string16(ASCIIToUTF16("John Dillinger")), summary1);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 obfuscated1 = credit_card1.ObfuscatedNumber();
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(string16(), obfuscated1);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Case 2: No month.
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CreditCard credit_card2;
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  autofill_test::SetCreditCardInfo(&credit_card2,
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "John Dillinger", "5105 1051 0510 5100", "", "2010");
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 summary2 = credit_card2.Label();
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("************5100"), summary2);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 obfuscated2 = credit_card2.ObfuscatedNumber();
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated2);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Case 3: No year.
50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CreditCard credit_card3;
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  autofill_test::SetCreditCardInfo(&credit_card3,
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "John Dillinger", "5105 1051 0510 5100", "01", "");
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 summary3 = credit_card3.Label();
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("************5100"), summary3);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 obfuscated3 = credit_card3.ObfuscatedNumber();
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated3);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Case 4: Have everything.
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CreditCard credit_card4;
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  autofill_test::SetCreditCardInfo(&credit_card4,
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "John Dillinger", "5105 1051 0510 5100", "01", "2010");
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 summary4 = credit_card4.Label();
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("************5100, Exp: 01/2010"), summary4);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 obfuscated4 = credit_card4.ObfuscatedNumber();
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated4);
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(CreditCardTest, AssignmentOperator) {
6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CreditCard a, b;
7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Result of assignment should be logically equal to the original profile.
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  autofill_test::SetCreditCardInfo(&a, "John Dillinger",
7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                   "123456789012", "01", "2010");
7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  b = a;
7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(a == b);
7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Assignment to self should not change the profile value.
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  a = a;
7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(a == b);
8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(CreditCardTest, IsValidCreditCardNumber) {
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const string16 valid_numbers[] = {
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("378282246310005"),
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("3714 4963 5398 431"),
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("3787-3449-3671-000"),
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("5610591081018250"),
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("3056 9309 0259 04"),
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("3852-0000-0232-37"),
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("6011111111111117"),
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("6011 0009 9013 9424"),
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("3530-1113-3330-0000"),
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("3566002020360505"),
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("5555 5555 5555 4444"),
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("5105-1051-0510-5100"),
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("4111111111111111"),
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("4012 8888 8888 1881"),
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("4222-2222-2222-2"),
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("5019717010103742"),
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("6331101999990016"),
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const string16 invalid_numbers[] = {
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("4111 1111 112"), /* too short */
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("41111111111111111115"), /* too long */
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("4111-1111-1111-1110"), /* wrong Luhn checksum */
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASCIIToUTF16("3056 9309 0259 04aa"), /* non-digit characters */
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < arraysize(valid_numbers); ++i) {
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SCOPED_TRACE(valid_numbers[i]);
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_TRUE(CreditCard::IsValidCreditCardNumber(valid_numbers[i]));
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < arraysize(invalid_numbers); ++i) {
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SCOPED_TRACE(invalid_numbers[i]);
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_FALSE(CreditCard::IsValidCreditCardNumber(invalid_numbers[i]));
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
120dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(CreditCardTest, InvalidMastercardNumber) {
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CreditCard card;
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  autofill_test::SetCreditCardInfo(&card, "Baby Face Nelson",
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   "5200000000000004", "01", "2010");
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ("genericCC", card.type());
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Verify that we preserve exactly what the user typed for credit card numbers.
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(CreditCardTest, SetInfoCreditCardNumber) {
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CreditCard card;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  autofill_test::SetCreditCardInfo(&card, "Bob Dylan",
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   "4321-5432-6543-xxxx", "07", "2013");
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("4321-5432-6543-xxxx"),
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            card.GetInfo(CREDIT_CARD_NUMBER));
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
137