OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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/basictypes.h" | |
6 #include "base/utf_string_conversions.h" | |
7 #include "chrome/browser/autofill/autofill_common_test.h" | |
8 #include "chrome/browser/autofill/credit_card.h" | |
9 #include "components/autofill/common/form_field_data.h" | |
10 #include "testing/gtest/include/gtest/gtest.h" | |
11 | |
12 namespace { | |
13 | |
14 // From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card
_numbers.htm | |
15 const char* const kValidNumbers[] = { | |
16 "378282246310005", | |
17 "3714 4963 5398 431", | |
18 "3787-3449-3671-000", | |
19 "5610591081018250", | |
20 "3056 9309 0259 04", | |
21 "3852-0000-0232-37", | |
22 "6011111111111117", | |
23 "6011 0009 9013 9424", | |
24 "3530-1113-3330-0000", | |
25 "3566002020360505", | |
26 "5555 5555 5555 4444", | |
27 "5105-1051-0510-5100", | |
28 "4111111111111111", | |
29 "4012 8888 8888 1881", | |
30 "4222-2222-2222-2", | |
31 "5019717010103742", | |
32 "6331101999990016", | |
33 }; | |
34 const char* const kInvalidNumbers[] = { | |
35 "4111 1111 112", /* too short */ | |
36 "41111111111111111115", /* too long */ | |
37 "4111-1111-1111-1110", /* wrong Luhn checksum */ | |
38 "3056 9309 0259 04aa", /* non-digit characters */ | |
39 }; | |
40 | |
41 } // namespace | |
42 | |
43 // Tests credit card summary string generation. This test simulates a variety | |
44 // of different possible summary strings. Variations occur based on the | |
45 // existence of credit card number, month, and year fields. | |
46 TEST(CreditCardTest, PreviewSummaryAndObfuscatedNumberStrings) { | |
47 // Case 0: empty credit card. | |
48 CreditCard credit_card0; | |
49 string16 summary0 = credit_card0.Label(); | |
50 EXPECT_EQ(string16(), summary0); | |
51 string16 obfuscated0 = credit_card0.ObfuscatedNumber(); | |
52 EXPECT_EQ(string16(), obfuscated0); | |
53 | |
54 // Case 00: Empty credit card with empty strings. | |
55 CreditCard credit_card00; | |
56 autofill_test::SetCreditCardInfo(&credit_card00, | |
57 "John Dillinger", "", "", ""); | |
58 string16 summary00 = credit_card00.Label(); | |
59 EXPECT_EQ(string16(ASCIIToUTF16("John Dillinger")), summary00); | |
60 string16 obfuscated00 = credit_card00.ObfuscatedNumber(); | |
61 EXPECT_EQ(string16(), obfuscated00); | |
62 | |
63 // Case 1: No credit card number. | |
64 CreditCard credit_card1; | |
65 autofill_test::SetCreditCardInfo(&credit_card1, | |
66 "John Dillinger", "", "01", "2010"); | |
67 string16 summary1 = credit_card1.Label(); | |
68 EXPECT_EQ(string16(ASCIIToUTF16("John Dillinger")), summary1); | |
69 string16 obfuscated1 = credit_card1.ObfuscatedNumber(); | |
70 EXPECT_EQ(string16(), obfuscated1); | |
71 | |
72 // Case 2: No month. | |
73 CreditCard credit_card2; | |
74 autofill_test::SetCreditCardInfo(&credit_card2, | |
75 "John Dillinger", "5105 1051 0510 5100", "", "2010"); | |
76 string16 summary2 = credit_card2.Label(); | |
77 EXPECT_EQ(ASCIIToUTF16("************5100"), summary2); | |
78 string16 obfuscated2 = credit_card2.ObfuscatedNumber(); | |
79 EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated2); | |
80 | |
81 // Case 3: No year. | |
82 CreditCard credit_card3; | |
83 autofill_test::SetCreditCardInfo(&credit_card3, | |
84 "John Dillinger", "5105 1051 0510 5100", "01", ""); | |
85 string16 summary3 = credit_card3.Label(); | |
86 EXPECT_EQ(ASCIIToUTF16("************5100"), summary3); | |
87 string16 obfuscated3 = credit_card3.ObfuscatedNumber(); | |
88 EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated3); | |
89 | |
90 // Case 4: Have everything. | |
91 CreditCard credit_card4; | |
92 autofill_test::SetCreditCardInfo(&credit_card4, | |
93 "John Dillinger", "5105 1051 0510 5100", "01", "2010"); | |
94 string16 summary4 = credit_card4.Label(); | |
95 EXPECT_EQ(ASCIIToUTF16("************5100, Exp: 01/2010"), summary4); | |
96 string16 obfuscated4 = credit_card4.ObfuscatedNumber(); | |
97 EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated4); | |
98 | |
99 // Case 5: Very long credit card | |
100 CreditCard credit_card5; | |
101 autofill_test::SetCreditCardInfo(&credit_card5, | |
102 "John Dillinger", | |
103 "0123456789 0123456789 0123456789 5105 1051 0510 5100", "01", "2010"); | |
104 string16 summary5 = credit_card5.Label(); | |
105 EXPECT_EQ(ASCIIToUTF16("********************5100, Exp: 01/2010"), summary5); | |
106 string16 obfuscated5 = credit_card5.ObfuscatedNumber(); | |
107 EXPECT_EQ(ASCIIToUTF16("********************5100"), obfuscated5); | |
108 } | |
109 | |
110 TEST(CreditCardTest, AssignmentOperator) { | |
111 CreditCard a, b; | |
112 | |
113 // Result of assignment should be logically equal to the original profile. | |
114 autofill_test::SetCreditCardInfo(&a, "John Dillinger", | |
115 "123456789012", "01", "2010"); | |
116 b = a; | |
117 EXPECT_TRUE(a == b); | |
118 | |
119 // Assignment to self should not change the profile value. | |
120 a = a; | |
121 EXPECT_TRUE(a == b); | |
122 } | |
123 | |
124 TEST(CreditCardTest, IsComplete) { | |
125 CreditCard card; | |
126 EXPECT_FALSE(card.IsComplete()); | |
127 card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Wally T. Walrus")); | |
128 EXPECT_FALSE(card.IsComplete()); | |
129 card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01")); | |
130 EXPECT_FALSE(card.IsComplete()); | |
131 card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2014")); | |
132 | |
133 for (size_t i = 0; i < arraysize(kValidNumbers); ++i) { | |
134 SCOPED_TRACE(kValidNumbers[i]); | |
135 card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kValidNumbers[i])); | |
136 EXPECT_TRUE(card.IsComplete()); | |
137 } | |
138 for (size_t i = 0; i < arraysize(kInvalidNumbers); ++i) { | |
139 SCOPED_TRACE(kInvalidNumbers[i]); | |
140 card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kInvalidNumbers[i])); | |
141 EXPECT_FALSE(card.IsComplete()); | |
142 } | |
143 } | |
144 | |
145 TEST(CreditCardTest, InvalidMastercardNumber) { | |
146 CreditCard card; | |
147 | |
148 autofill_test::SetCreditCardInfo(&card, "Baby Face Nelson", | |
149 "5200000000000004", "01", "2010"); | |
150 EXPECT_EQ("genericCC", card.type()); | |
151 } | |
152 | |
153 // Verify that we preserve exactly what the user typed for credit card numbers. | |
154 TEST(CreditCardTest, SetRawInfoCreditCardNumber) { | |
155 CreditCard card; | |
156 | |
157 autofill_test::SetCreditCardInfo(&card, "Bob Dylan", | |
158 "4321-5432-6543-xxxx", "07", "2013"); | |
159 EXPECT_EQ(ASCIIToUTF16("4321-5432-6543-xxxx"), | |
160 card.GetRawInfo(CREDIT_CARD_NUMBER)); | |
161 } | |
162 | |
163 // Verify that we can handle both numeric and named months. | |
164 TEST(CreditCardTest, SetExpirationMonth) { | |
165 CreditCard card; | |
166 | |
167 card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("05")); | |
168 EXPECT_EQ(ASCIIToUTF16("05"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH)); | |
169 | |
170 card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("7")); | |
171 EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH)); | |
172 | |
173 // This should fail, and preserve the previous value. | |
174 card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("January")); | |
175 EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH)); | |
176 | |
177 card.SetInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("January"), "en-US"); | |
178 EXPECT_EQ(ASCIIToUTF16("01"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH)); | |
179 | |
180 card.SetInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("Apr"), "en-US"); | |
181 EXPECT_EQ(ASCIIToUTF16("04"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH)); | |
182 } | |
183 | |
184 TEST(CreditCardTest, CreditCardType) { | |
185 CreditCard card; | |
186 | |
187 // The card type cannot be set directly. | |
188 card.SetRawInfo(CREDIT_CARD_TYPE, ASCIIToUTF16("Visa")); | |
189 EXPECT_EQ(string16(), card.GetRawInfo(CREDIT_CARD_TYPE)); | |
190 | |
191 // Setting the number should implicitly set the type. | |
192 card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111 1111 1111 1111")); | |
193 EXPECT_EQ(ASCIIToUTF16("Visa"), card.GetRawInfo(CREDIT_CARD_TYPE)); | |
194 } | |
195 | |
196 TEST(CreditCardTest, CreditCardVerificationCode) { | |
197 CreditCard card; | |
198 | |
199 // The verification code cannot be set, as Chrome does not store this data. | |
200 card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, ASCIIToUTF16("999")); | |
201 EXPECT_EQ(string16(), card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); | |
202 } | |
203 | |
204 | |
205 TEST(CreditCardTest, CreditCardMonthExact) { | |
206 const char* const kMonthsNumeric[] = { | |
207 "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", | |
208 }; | |
209 std::vector<string16> options(arraysize(kMonthsNumeric)); | |
210 for (size_t i = 0; i < arraysize(kMonthsNumeric); ++i) { | |
211 options[i] = ASCIIToUTF16(kMonthsNumeric[i]); | |
212 } | |
213 | |
214 FormFieldData field; | |
215 field.form_control_type = "select-one"; | |
216 field.option_values = options; | |
217 field.option_contents = options; | |
218 | |
219 CreditCard credit_card; | |
220 credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01")); | |
221 credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, &field); | |
222 EXPECT_EQ(ASCIIToUTF16("01"), field.value); | |
223 } | |
224 | |
225 TEST(CreditCardTest, CreditCardMonthAbbreviated) { | |
226 const char* const kMonthsAbbreviated[] = { | |
227 "Jan", "Feb", "Mar", "Apr", "May", "Jun", | |
228 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", | |
229 }; | |
230 std::vector<string16> options(arraysize(kMonthsAbbreviated)); | |
231 for (size_t i = 0; i < arraysize(kMonthsAbbreviated); ++i) { | |
232 options[i] = ASCIIToUTF16(kMonthsAbbreviated[i]); | |
233 } | |
234 | |
235 FormFieldData field; | |
236 field.form_control_type = "select-one"; | |
237 field.option_values = options; | |
238 field.option_contents = options; | |
239 | |
240 CreditCard credit_card; | |
241 credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01")); | |
242 credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, &field); | |
243 EXPECT_EQ(ASCIIToUTF16("Jan"), field.value); | |
244 } | |
245 | |
246 TEST(CreditCardTest, CreditCardMonthFull) { | |
247 const char* const kMonthsFull[] = { | |
248 "January", "February", "March", "April", "May", "June", | |
249 "July", "August", "September", "October", "November", "December", | |
250 }; | |
251 std::vector<string16> options(arraysize(kMonthsFull)); | |
252 for (size_t i = 0; i < arraysize(kMonthsFull); ++i) { | |
253 options[i] = ASCIIToUTF16(kMonthsFull[i]); | |
254 } | |
255 | |
256 FormFieldData field; | |
257 field.form_control_type = "select-one"; | |
258 field.option_values = options; | |
259 field.option_contents = options; | |
260 | |
261 CreditCard credit_card; | |
262 credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01")); | |
263 credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, &field); | |
264 EXPECT_EQ(ASCIIToUTF16("January"), field.value); | |
265 } | |
266 | |
267 TEST(CreditCardTest, CreditCardMonthNumeric) { | |
268 const char* const kMonthsNumeric[] = { | |
269 "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", | |
270 }; | |
271 std::vector<string16> options(arraysize(kMonthsNumeric)); | |
272 for (size_t i = 0; i < arraysize(kMonthsNumeric); ++i) { | |
273 options[i] = ASCIIToUTF16(kMonthsNumeric[i]); | |
274 } | |
275 | |
276 FormFieldData field; | |
277 field.form_control_type = "select-one"; | |
278 field.option_values = options; | |
279 field.option_contents = options; | |
280 | |
281 CreditCard credit_card; | |
282 credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01")); | |
283 credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, &field); | |
284 EXPECT_EQ(ASCIIToUTF16("1"), field.value); | |
285 } | |
286 | |
287 TEST(CreditCardTest, CreditCardTwoDigitYear) { | |
288 const char* const kYears[] = { | |
289 "12", "13", "14", "15", "16", "17", "18", "19" | |
290 }; | |
291 std::vector<string16> options(arraysize(kYears)); | |
292 for (size_t i = 0; i < arraysize(kYears); ++i) { | |
293 options[i] = ASCIIToUTF16(kYears[i]); | |
294 } | |
295 | |
296 FormFieldData field; | |
297 field.form_control_type = "select-one"; | |
298 field.option_values = options; | |
299 field.option_contents = options; | |
300 | |
301 CreditCard credit_card; | |
302 credit_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2017")); | |
303 credit_card.FillSelectControl(CREDIT_CARD_EXP_4_DIGIT_YEAR, &field); | |
304 EXPECT_EQ(ASCIIToUTF16("17"), field.value); | |
305 } | |
306 | |
307 TEST(CreditCardTest, CreditCardTypeSelectControl) { | |
308 const char* const kCreditCardTypes[] = { | |
309 "Visa", "Master Card", "AmEx", "discover" | |
310 }; | |
311 std::vector<string16> options(arraysize(kCreditCardTypes)); | |
312 for (size_t i = 0; i < arraysize(kCreditCardTypes); ++i) { | |
313 options[i] = ASCIIToUTF16(kCreditCardTypes[i]); | |
314 } | |
315 | |
316 FormFieldData field; | |
317 field.form_control_type = "select-one"; | |
318 field.option_values = options; | |
319 field.option_contents = options; | |
320 | |
321 // Credit card types are inferred from the numbers, so we use test numbers for | |
322 // each card type. Test card numbers are drawn from | |
323 // http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_num
bers.htm | |
324 | |
325 { | |
326 // Normal case: | |
327 CreditCard credit_card; | |
328 credit_card.SetRawInfo(CREDIT_CARD_NUMBER, | |
329 ASCIIToUTF16("4111111111111111")); | |
330 credit_card.FillSelectControl(CREDIT_CARD_TYPE, &field); | |
331 EXPECT_EQ(ASCIIToUTF16("Visa"), field.value); | |
332 } | |
333 | |
334 { | |
335 // Filling should be able to handle intervening whitespace: | |
336 CreditCard credit_card; | |
337 credit_card.SetRawInfo(CREDIT_CARD_NUMBER, | |
338 ASCIIToUTF16("5105105105105100")); | |
339 credit_card.FillSelectControl(CREDIT_CARD_TYPE, &field); | |
340 EXPECT_EQ(ASCIIToUTF16("Master Card"), field.value); | |
341 } | |
342 | |
343 { | |
344 // American Express is sometimes abbreviated as AmEx: | |
345 CreditCard credit_card; | |
346 credit_card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("371449635398431")); | |
347 credit_card.FillSelectControl(CREDIT_CARD_TYPE, &field); | |
348 EXPECT_EQ(ASCIIToUTF16("AmEx"), field.value); | |
349 } | |
350 | |
351 { | |
352 // Case insensitivity: | |
353 CreditCard credit_card; | |
354 credit_card.SetRawInfo(CREDIT_CARD_NUMBER, | |
355 ASCIIToUTF16("6011111111111117")); | |
356 credit_card.FillSelectControl(CREDIT_CARD_TYPE, &field); | |
357 EXPECT_EQ(ASCIIToUTF16("discover"), field.value); | |
358 } | |
359 } | |
OLD | NEW |