1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/guid.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/autofill/core/browser/autofill_test_utils.h"
93240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "components/autofill/core/browser/autofill_type.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_scaled_resources.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* const kValidNumbers[] = {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "378282246310005",
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3714 4963 5398 431",
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3787-3449-3671-000",
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5610591081018250",
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3056 9309 0259 04",
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3852-0000-0232-37",
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "6011111111111117",
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "6011 0009 9013 9424",
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3530-1113-3330-0000",
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3566002020360505",
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5555 5555 5555 4444",
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5105-1051-0510-5100",
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4111111111111111",
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4012 8888 8888 1881",
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4222-2222-2222-2",
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5019717010103742",
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "6331101999990016",
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // A UnionPay card that doesn't pass the Luhn checksum
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  "6200000000000000",
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* const kInvalidNumbers[] = {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4111 1111 112", /* too short */
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "41111111111111111115", /* too long */
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4111-1111-1111-1110", /* wrong Luhn checksum */
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3056 9309 0259 04aa", /* non-digit characters */
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests credit card summary string generation.  This test simulates a variety
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of different possible summary strings.  Variations occur based on the
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// existence of credit card number, month, and year fields.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, PreviewSummaryAndObfuscatedNumberStrings) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 0: empty credit card.
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card0(base::GenerateGUID(), "https://www.example.com/");
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary0 = credit_card0.Label();
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), summary0);
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated0 = credit_card0.ObfuscatedNumber();
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), obfuscated0);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 00: Empty credit card with empty strings.
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card00(base::GenerateGUID(), "https://www.example.com/");
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&credit_card00,"John Dillinger", "", "", "");
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary00 = credit_card00.Label();
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(ASCIIToUTF16("John Dillinger")), summary00);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated00 = credit_card00.ObfuscatedNumber();
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), obfuscated00);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 1: No credit card number.
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card1(base::GenerateGUID(), "https://www.example.com/");
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&credit_card1,"John Dillinger", "", "01", "2010");
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary1 = credit_card1.Label();
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(ASCIIToUTF16("John Dillinger")), summary1);
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated1 = credit_card1.ObfuscatedNumber();
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), obfuscated1);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 2: No month.
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card2(base::GenerateGUID(), "https://www.example.com/");
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card2, "John Dillinger", "5105 1051 0510 5100", "", "2010");
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary2 = credit_card2.Label();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), summary2);
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated2 = credit_card2.ObfuscatedNumber();
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated2);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 3: No year.
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card3(base::GenerateGUID(), "https://www.example.com/");
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card3, "John Dillinger", "5105 1051 0510 5100", "01", "");
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary3 = credit_card3.Label();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), summary3);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated3 = credit_card3.ObfuscatedNumber();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated3);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 4: Have everything.
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card4(base::GenerateGUID(), "https://www.example.com/");
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card4, "John Dillinger", "5105 1051 0510 5100", "01", "2010");
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary4 = credit_card4.Label();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100, Exp: 01/2010"), summary4);
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated4 = credit_card4.ObfuscatedNumber();
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated4);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 5: Very long credit card
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card5(base::GenerateGUID(), "https://www.example.com/");
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card5,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "John Dillinger",
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "0123456789 0123456789 0123456789 5105 1051 0510 5100", "01", "2010");
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary5 = credit_card5.Label();
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("********************5100, Exp: 01/2010"), summary5);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated5 = credit_card5.ObfuscatedNumber();
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("********************5100"), obfuscated5);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, AssignmentOperator) {
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard a(base::GenerateGUID(), "some origin");
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test::SetCreditCardInfo(&a, "John Dillinger", "123456789012", "01", "2010");
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Result of assignment should be logically equal to the original profile.
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard b(base::GenerateGUID(), "some other origin");
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  b = a;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(a == b);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Assignment to self should not change the profile value.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  a = a;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(a == b);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CreditCardTest, Copy) {
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard a(base::GenerateGUID(), "https://www.example.com");
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test::SetCreditCardInfo(&a, "John Dillinger", "123456789012", "01", "2010");
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Clone should be logically equal to the original.
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreditCard b(a);
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(a == b);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CreditCardTest, Compare) {
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard a(base::GenerateGUID(), std::string());
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard b(base::GenerateGUID(), std::string());
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Empty cards are the same.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, a.Compare(b));
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GUIDs don't count.
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  a.set_guid(base::GenerateGUID());
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  b.set_guid(base::GenerateGUID());
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, a.Compare(b));
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Origins don't count.
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  a.set_origin("apple");
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  b.set_origin("banana");
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, a.Compare(b));
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Different values produce non-zero results.
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&a, "Jimmy", NULL, NULL, NULL);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&b, "Ringo", NULL, NULL, NULL);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_GT(0, a.Compare(b));
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LT(0, b.Compare(a));
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test we get the correct icon for each card type.
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(CreditCardTest, IconResourceId) {
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_AMEX,
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kAmericanExpressCard));
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_DINERS,
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kDinersCard));
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_DISCOVER,
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kDiscoverCard));
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_JCB,
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kJCBCard));
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_MASTERCARD,
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kMasterCard));
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_VISA,
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kVisaCard));
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(CreditCardTest, UpdateFromImportedCard) {
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreditCard original_card(base::GenerateGUID(), "https://www.example.com");
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test::SetCreditCardInfo(
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      &original_card, "John Dillinger", "123456789012", "09", "2017");
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreditCard a = original_card;
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The new card has a different name, expiration date, and origin.
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreditCard b = a;
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_guid(base::GenerateGUID());
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_origin("https://www.example.org");
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("J. Dillinger"));
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("08"));
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2019"));
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("https://www.example.org", a.origin());
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with no name set for |b|.
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NAME, base::string16());
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("https://www.example.org", a.origin());
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("John Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with only the original card having a verified origin.
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |a| should be unchanged.
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a.set_origin("Chrome settings");
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("J. Dillinger"));
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Chrome settings", a.origin());
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("John Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("09"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2017"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with only the new card having a verified origin.
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_origin("Chrome settings");
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Chrome settings", a.origin());
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, with both cards having a verified origin.
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a.set_origin("Chrome Autofill dialog");
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_origin("Chrome settings");
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Chrome settings", a.origin());
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with |b| having a different card number.
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |a| should be unchanged.
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(a.UpdateFromImportedCard(b, "en-US"));
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(original_card, a);
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, IsComplete) {
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(card.IsComplete());
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Wally T. Walrus"));
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(card.IsComplete());
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(card.IsComplete());
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2014"));
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kValidNumbers); ++i) {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(kValidNumbers[i]);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kValidNumbers[i]));
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(card.IsComplete());
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kInvalidNumbers); ++i) {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(kInvalidNumbers[i]);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kInvalidNumbers[i]));
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(card.IsComplete());
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(CreditCardTest, IsValid) {
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CreditCard card;
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Invalid because expired
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("1"));
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2010"));
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(card.IsValid());
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Invalid because card number is not complete
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("12"));
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("9999"));
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("41111"));
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(card.IsValid());
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Valid
291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("12"));
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("9999"));
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(card.IsValid());
295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, InvalidMastercardNumber) {
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&card, "Baby Face Nelson",
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "5200000000000004", "01", "2010");
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kMasterCard, card.type());
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(card.IsComplete());
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that we preserve exactly what the user typed for credit card numbers.
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, SetRawInfoCreditCardNumber) {
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&card, "Bob Dylan",
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "4321-5432-6543-xxxx", "07", "2013");
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("4321-5432-6543-xxxx"),
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            card.GetRawInfo(CREDIT_CARD_NUMBER));
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that we can handle both numeric and named months.
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, SetExpirationMonth) {
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("05"));
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("05"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(5, card.expiration_month());
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("7"));
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(7, card.expiration_month());
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should fail, and preserve the previous value.
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("January"));
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(7, card.expiration_month());
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  card.SetInfo(
3343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      AutofillType(CREDIT_CARD_EXP_MONTH), ASCIIToUTF16("January"), "en-US");
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("01"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, card.expiration_month());
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  card.SetInfo(
3393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      AutofillType(CREDIT_CARD_EXP_MONTH), ASCIIToUTF16("Apr"), "en-US");
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("04"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4, card.expiration_month());
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardType) {
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The card type cannot be set directly.
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_TYPE, ASCIIToUTF16("Visa"));
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), card.GetRawInfo(CREDIT_CARD_TYPE));
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting the number should implicitly set the type.
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111 1111 1111 1111"));
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Visa"), card.GetRawInfo(CREDIT_CARD_TYPE));
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardVerificationCode) {
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The verification code cannot be set, as Chrome does not store this data.
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, ASCIIToUTF16("999"));
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(CreditCardTest, GetCreditCardType) {
366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct {
367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string card_number;
368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string type;
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool is_valid;
370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } test_cases[] = {
371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // The relevant sample numbers from
372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "378282246310005", kAmericanExpressCard, true },
374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "371449635398431", kAmericanExpressCard, true },
375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "378734493671000", kAmericanExpressCard, true },
376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "30569309025904", kDinersCard, true },
377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "38520000023237", kDinersCard, true },
378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011111111111117", kDiscoverCard, true },
379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000990139424", kDiscoverCard, true },
380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3530111333300000", kJCBCard, true },
381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3566002020360505", kJCBCard, true },
382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5555555555554444", kMasterCard, true },
383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5105105105105100", kMasterCard, true },
384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4111111111111111", kVisaCard, true },
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4012888888881881", kVisaCard, true },
386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4222222222222", kVisaCard, true },
387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // The relevant sample numbers from
389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // http://auricsystems.com/support-center/sample-credit-card-numbers/
390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "343434343434343", kAmericanExpressCard, true },
391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "371144371144376", kAmericanExpressCard, true },
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "341134113411347", kAmericanExpressCard, true },
393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36438936438936", kDinersCard, true },
394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36110361103612", kDinersCard, true },
395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36111111111111", kDinersCard, true },
396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011016011016011", kDiscoverCard, true },
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000990139424", kDiscoverCard, true },
398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000000000004", kDiscoverCard, true },
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000995500000", kDiscoverCard, true },
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6500000000000002", kDiscoverCard, true },
401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3566002020360505", kJCBCard, true },
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3528000000000007", kJCBCard, true },
403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5500005555555559", kMasterCard, true },
404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5555555555555557", kMasterCard, true },
405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5454545454545454", kMasterCard, true },
406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5555515555555551", kMasterCard, true },
407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5405222222222226", kMasterCard, true },
408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5478050000000007", kMasterCard, true },
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5111005111051128", kMasterCard, true },
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5112345112345114", kMasterCard, true },
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5115915115915118", kMasterCard, true },
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // A UnionPay card that doesn't pass the Luhn checksum
4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    { "6200000000000000", kUnionPay, true },
4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Empty string
417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { std::string(), kGenericCard, false },
418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Non-numeric
420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "garbage", kGenericCard, false },
421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4garbage", kVisaCard, false },
422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Fails Luhn check.
424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4111111111111112", kVisaCard, false },
425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Invalid length.
427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3434343434343434", kAmericanExpressCard, false },
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "411111111111116", kVisaCard, false },
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Issuer Identification Numbers (IINs) that Chrome recognizes.
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4", kVisaCard, false },
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "34", kAmericanExpressCard, false },
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "37", kAmericanExpressCard, false },
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "300", kDinersCard, false },
435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "301", kDinersCard, false },
436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "302", kDinersCard, false },
437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "303", kDinersCard, false },
438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "304", kDinersCard, false },
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "305", kDinersCard, false },
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3095", kDinersCard, false },
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36", kDinersCard, false },
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "38", kDinersCard, false },
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "39", kDinersCard, false },
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011", kDiscoverCard, false },
445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "644", kDiscoverCard, false },
446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "645", kDiscoverCard, false },
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "646", kDiscoverCard, false },
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "647", kDiscoverCard, false },
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "648", kDiscoverCard, false },
450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "649", kDiscoverCard, false },
451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "65", kDiscoverCard, false },
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3528", kJCBCard, false },
453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3531", kJCBCard, false },
454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3589", kJCBCard, false },
455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "51", kMasterCard, false },
456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "52", kMasterCard, false },
457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "53", kMasterCard, false },
458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "54", kMasterCard, false },
459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "55", kMasterCard, false },
4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    { "62", kUnionPay, false },
461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Not enough data to determine an IIN uniquely.
463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3", kGenericCard, false },
464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "30", kGenericCard, false },
465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "309", kGenericCard, false },
466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "35", kGenericCard, false },
467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5", kGenericCard, false },
468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6", kGenericCard, false },
469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "60", kGenericCard, false },
470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "601", kGenericCard, false },
471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "64", kGenericCard, false },
472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Unknown IINs.
474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "0", kGenericCard, false },
475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "1", kGenericCard, false },
476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "2", kGenericCard, false },
477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "306", kGenericCard, false },
478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "307", kGenericCard, false },
479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "308", kGenericCard, false },
480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3091", kGenericCard, false },
481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3094", kGenericCard, false },
482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3096", kGenericCard, false },
483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "31", kGenericCard, false },
484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "32", kGenericCard, false },
485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "33", kGenericCard, false },
486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "351", kGenericCard, false },
487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3527", kGenericCard, false },
488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "359", kGenericCard, false },
489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "50", kGenericCard, false },
490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "56", kGenericCard, false },
491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "57", kGenericCard, false },
492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "58", kGenericCard, false },
493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "59", kGenericCard, false },
494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "600", kGenericCard, false },
495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "602", kGenericCard, false },
496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "603", kGenericCard, false },
497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "604", kGenericCard, false },
498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "605", kGenericCard, false },
499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "606", kGenericCard, false },
500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "607", kGenericCard, false },
501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "608", kGenericCard, false },
502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "609", kGenericCard, false },
503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "61", kGenericCard, false },
504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "63", kGenericCard, false },
505eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "640", kGenericCard, false },
506eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "641", kGenericCard, false },
507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "642", kGenericCard, false },
508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "643", kGenericCard, false },
509eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "66", kGenericCard, false },
510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "67", kGenericCard, false },
511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "68", kGenericCard, false },
512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "69", kGenericCard, false },
513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "7", kGenericCard, false },
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "8", kGenericCard, false },
515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "9", kGenericCard, false },
516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Oddball case: Unknown issuer, but valid Luhn check and plausible length.
518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "7000700070007000", kGenericCard, true },
519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 card_number = ASCIIToUTF16(test_cases[i].card_number);
523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE(card_number);
524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_cases[i].type, CreditCard::GetCreditCardType(card_number));
525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_cases[i].is_valid, IsValidCreditCardNumber(card_number));
526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
530