1 // Copyright 2016 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 "components/autofill/core/browser/payments/full_card_request.h"
6
7 #include "base/command_line.h"
8 #include "base/macros.h"
9 #include "base/memory/weak_ptr.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/test/scoped_feature_list.h"
12 #include "base/test/task_environment.h"
13 #include "base/threading/thread_task_runner_handle.h"
14 #include "base/time/time.h"
15 #include "components/autofill/core/browser/autofill_test_utils.h"
16 #include "components/autofill/core/browser/data_model/credit_card.h"
17 #include "components/autofill/core/browser/payments/payments_client.h"
18 #include "components/autofill/core/browser/personal_data_manager.h"
19 #include "components/autofill/core/browser/test_autofill_client.h"
20 #include "components/autofill/core/browser/test_autofill_driver.h"
21 #include "components/autofill/core/browser/test_personal_data_manager.h"
22 #include "components/autofill/core/common/autofill_clock.h"
23 #include "components/autofill/core/common/autofill_payments_features.h"
24 #include "net/url_request/url_request_test_util.h"
25 #include "services/network/public/cpp/shared_url_loader_factory.h"
26 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
27 #include "services/network/test/test_url_loader_factory.h"
28 #include "testing/gmock/include/gmock/gmock.h"
29 #include "testing/gtest/include/gtest/gtest.h"
30
31 namespace autofill {
32 namespace payments {
33
34 using testing::_;
35
36 // The consumer of the full card request API.
37 class MockResultDelegate : public FullCardRequest::ResultDelegate,
38 public base::SupportsWeakPtr<MockResultDelegate> {
39 public:
40 MOCK_METHOD3(OnFullCardRequestSucceeded,
41 void(const payments::FullCardRequest&,
42 const CreditCard&,
43 const base::string16&));
44 MOCK_METHOD0(OnFullCardRequestFailed, void());
45 };
46
47 // The delegate responsible for displaying the unmask prompt UI.
48 class MockUIDelegate : public FullCardRequest::UIDelegate,
49 public base::SupportsWeakPtr<MockUIDelegate> {
50 public:
51 MOCK_METHOD3(ShowUnmaskPrompt,
52 void(const CreditCard&,
53 AutofillClient::UnmaskCardReason,
54 base::WeakPtr<CardUnmaskDelegate>));
55 MOCK_METHOD1(OnUnmaskVerificationResult,
56 void(AutofillClient::PaymentsRpcResult));
57 MOCK_CONST_METHOD0(ShouldOfferFidoAuth, bool());
58 };
59
60 // The personal data manager.
61 class MockPersonalDataManager : public TestPersonalDataManager {
62 public:
MockPersonalDataManager()63 MockPersonalDataManager() {}
~MockPersonalDataManager()64 ~MockPersonalDataManager() override {}
65 MOCK_CONST_METHOD0(IsSyncFeatureEnabled, bool());
66 MOCK_METHOD1(UpdateCreditCard, void(const CreditCard& credit_card));
67 MOCK_METHOD1(UpdateServerCreditCard, void(const CreditCard& credit_card));
68 };
69
70 // TODO(crbug.com/881835): Simplify this test setup.
71 // The test fixture for full card request.
72 class FullCardRequestTest : public testing::Test {
73 public:
FullCardRequestTest()74 FullCardRequestTest()
75 : request_context_(new net::TestURLRequestContextGetter(
76 base::ThreadTaskRunnerHandle::Get())),
77 test_shared_loader_factory_(
78 base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
79 &test_url_loader_factory_)) {
80 payments_client_ = std::make_unique<PaymentsClient>(
81 test_shared_loader_factory_, autofill_client_.GetIdentityManager(),
82 &personal_data_);
83 request_ = std::make_unique<FullCardRequest>(
84 &autofill_client_, payments_client_.get(), &personal_data_);
85 personal_data_.SetAccountInfoForPayments(
86 autofill_client_.GetIdentityManager()->GetPrimaryAccountInfo());
87 // Silence the warning from PaymentsClient about matching sync and Payments
88 // server types.
89 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
90 "sync-url", "https://google.com");
91 }
92
~FullCardRequestTest()93 ~FullCardRequestTest() override {}
94
personal_data()95 MockPersonalDataManager* personal_data() { return &personal_data_; }
96
request()97 FullCardRequest* request() { return request_.get(); }
98
card_unmask_delegate()99 CardUnmaskDelegate* card_unmask_delegate() {
100 return static_cast<CardUnmaskDelegate*>(request_.get());
101 }
102
result_delegate()103 MockResultDelegate* result_delegate() { return &result_delegate_; }
104
ui_delegate()105 MockUIDelegate* ui_delegate() { return &ui_delegate_; }
106
OnDidGetRealPan(AutofillClient::PaymentsRpcResult result,const std::string & real_pan)107 void OnDidGetRealPan(AutofillClient::PaymentsRpcResult result,
108 const std::string& real_pan) {
109 payments::PaymentsClient::UnmaskResponseDetails response;
110 request_->OnDidGetRealPan(result, response.with_real_pan(real_pan));
111 }
112
OnDidGetRealPanWithDcvv(AutofillClient::PaymentsRpcResult result,const std::string & real_pan,const std::string & dcvv)113 void OnDidGetRealPanWithDcvv(AutofillClient::PaymentsRpcResult result,
114 const std::string& real_pan,
115 const std::string& dcvv) {
116 payments::PaymentsClient::UnmaskResponseDetails response;
117 request_->OnDidGetRealPan(result,
118 response.with_real_pan(real_pan).with_dcvv(dcvv));
119 }
120
121 protected:
122 base::test::ScopedFeatureList scoped_feature_list_;
123
124 private:
125 base::test::SingleThreadTaskEnvironment task_environment_;
126 MockPersonalDataManager personal_data_;
127 MockResultDelegate result_delegate_;
128 MockUIDelegate ui_delegate_;
129 TestAutofillClient autofill_client_;
130 scoped_refptr<net::TestURLRequestContextGetter> request_context_;
131 network::TestURLLoaderFactory test_url_loader_factory_;
132 scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
133 std::unique_ptr<PaymentsClient> payments_client_;
134 std::unique_ptr<FullCardRequest> request_;
135
136 DISALLOW_COPY_AND_ASSIGN(FullCardRequestTest);
137 };
138
139 // Matches the |arg| credit card to the given |record_type| and |card_number|.
140 MATCHER_P2(CardMatches, record_type, card_number, "") {
141 return arg.record_type() == record_type &&
142 arg.GetRawInfo(CREDIT_CARD_NUMBER) == base::ASCIIToUTF16(card_number);
143 }
144
145 // Matches the |arg| credit card to the given |record_type|, card |number|,
146 // expiration |month|, and expiration |year|.
147 MATCHER_P4(CardMatches, record_type, number, month, year, "") {
148 return arg.record_type() == record_type &&
149 arg.GetRawInfo(CREDIT_CARD_NUMBER) == base::ASCIIToUTF16(number) &&
150 arg.GetRawInfo(CREDIT_CARD_EXP_MONTH) == base::ASCIIToUTF16(month) &&
151 arg.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR) ==
152 base::ASCIIToUTF16(year);
153 }
154
155 // Verify getting the full PAN and the CVC for a masked server card.
TEST_F(FullCardRequestTest,GetFullCardPanAndCvcForMaskedServerCardViaCvc)156 TEST_F(FullCardRequestTest, GetFullCardPanAndCvcForMaskedServerCardViaCvc) {
157 EXPECT_CALL(*result_delegate(),
158 OnFullCardRequestSucceeded(
159 testing::Ref(*request()),
160 CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
161 base::ASCIIToUTF16("123")));
162 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
163 EXPECT_CALL(*ui_delegate(),
164 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
165
166 request()->GetFullCard(
167 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
168 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
169 ui_delegate()->AsWeakPtr());
170 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
171 details.cvc = base::ASCIIToUTF16("123");
172 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
173 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
174 card_unmask_delegate()->OnUnmaskPromptClosed();
175 }
176
177 // Verify getting the full PAN and the dCVV for a masked server card when cloud
178 // tokenization is enabled.
TEST_F(FullCardRequestTest,GetFullCardPanAndDcvvForMaskedServerCardViaDcvv)179 TEST_F(FullCardRequestTest, GetFullCardPanAndDcvvForMaskedServerCardViaDcvv) {
180 scoped_feature_list_.InitAndEnableFeature(
181 features::kAutofillAlwaysReturnCloudTokenizedCard);
182 EXPECT_CALL(*result_delegate(),
183 OnFullCardRequestSucceeded(
184 testing::Ref(*request()),
185 CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
186 base::ASCIIToUTF16("321")));
187 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
188 EXPECT_CALL(*ui_delegate(),
189 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
190
191 request()->GetFullCard(
192 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
193 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
194 ui_delegate()->AsWeakPtr());
195 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
196 details.cvc = base::ASCIIToUTF16("123");
197 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
198 OnDidGetRealPanWithDcvv(AutofillClient::SUCCESS, "4111", "321");
199 card_unmask_delegate()->OnUnmaskPromptClosed();
200 }
201
202 // Verify getting the full PAN for a masked server card when cloud
203 // tokenization is enabled but no dCVV is returned.
TEST_F(FullCardRequestTest,GetFullCardPanForMaskedServerCardWithoutDcvv)204 TEST_F(FullCardRequestTest, GetFullCardPanForMaskedServerCardWithoutDcvv) {
205 scoped_feature_list_.InitAndEnableFeature(
206 features::kAutofillAlwaysReturnCloudTokenizedCard);
207 EXPECT_CALL(*result_delegate(),
208 OnFullCardRequestSucceeded(
209 testing::Ref(*request()),
210 CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
211 base::ASCIIToUTF16("123")));
212 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
213 EXPECT_CALL(*ui_delegate(),
214 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
215
216 request()->GetFullCard(
217 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
218 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
219 ui_delegate()->AsWeakPtr());
220 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
221 details.cvc = base::ASCIIToUTF16("123");
222 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
223 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
224 card_unmask_delegate()->OnUnmaskPromptClosed();
225 }
226
227 // Verify getting the full PAN for a masked server card.
TEST_F(FullCardRequestTest,GetFullCardPanAndCvcForMaskedServerCardViaFido)228 TEST_F(FullCardRequestTest, GetFullCardPanAndCvcForMaskedServerCardViaFido) {
229 EXPECT_CALL(*result_delegate(),
230 OnFullCardRequestSucceeded(
231 testing::Ref(*request()),
232 CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
233 base::ASCIIToUTF16("")));
234
235 request()->GetFullCardViaFIDO(
236 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
237 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
238 base::Value(base::Value::Type::DICTIONARY));
239 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
240 }
241
242 // Verify getting the CVC for a local card.
TEST_F(FullCardRequestTest,GetFullCardPanAndCvcForLocalCard)243 TEST_F(FullCardRequestTest, GetFullCardPanAndCvcForLocalCard) {
244 EXPECT_CALL(
245 *result_delegate(),
246 OnFullCardRequestSucceeded(testing::Ref(*request()),
247 CardMatches(CreditCard::LOCAL_CARD, "4111"),
248 base::ASCIIToUTF16("123")));
249 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
250 EXPECT_CALL(*ui_delegate(),
251 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
252
253 CreditCard card;
254 test::SetCreditCardInfo(&card, nullptr, "4111", "12", "2050", "1");
255 request()->GetFullCard(card, AutofillClient::UNMASK_FOR_AUTOFILL,
256 result_delegate()->AsWeakPtr(),
257 ui_delegate()->AsWeakPtr());
258 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
259 details.cvc = base::ASCIIToUTF16("123");
260 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
261 card_unmask_delegate()->OnUnmaskPromptClosed();
262 }
263
264 // Verify getting the CVC for an unmasked server card.
TEST_F(FullCardRequestTest,GetFullCardPanAndCvcForFullServerCard)265 TEST_F(FullCardRequestTest, GetFullCardPanAndCvcForFullServerCard) {
266 EXPECT_CALL(*result_delegate(),
267 OnFullCardRequestSucceeded(
268 testing::Ref(*request()),
269 CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
270 base::ASCIIToUTF16("123")));
271 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
272 EXPECT_CALL(*ui_delegate(),
273 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
274
275 CreditCard full_server_card(CreditCard::FULL_SERVER_CARD, "server_id");
276 test::SetCreditCardInfo(&full_server_card, nullptr, "4111", "12", "2050",
277 "1");
278 request()->GetFullCard(full_server_card, AutofillClient::UNMASK_FOR_AUTOFILL,
279 result_delegate()->AsWeakPtr(),
280 ui_delegate()->AsWeakPtr());
281 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
282 details.cvc = base::ASCIIToUTF16("123");
283 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
284 card_unmask_delegate()->OnUnmaskPromptClosed();
285 }
286
287 // Verify getting the CVC for an unmasked server card with EXPIRED server
288 // status.
TEST_F(FullCardRequestTest,GetFullCardPanAndCvcForFullServerCardInExpiredStatus)289 TEST_F(FullCardRequestTest,
290 GetFullCardPanAndCvcForFullServerCardInExpiredStatus) {
291 EXPECT_CALL(*result_delegate(), OnFullCardRequestSucceeded(
292 testing::Ref(*request()),
293 CardMatches(CreditCard::FULL_SERVER_CARD,
294 "4111", "12", "2051"),
295 base::ASCIIToUTF16("123")));
296 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
297 EXPECT_CALL(*personal_data(), UpdateServerCreditCard(_)).Times(0);
298 EXPECT_CALL(*ui_delegate(),
299 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
300
301 CreditCard full_server_card(CreditCard::FULL_SERVER_CARD, "server_id");
302 test::SetCreditCardInfo(&full_server_card, nullptr, "4111", "12", "2050",
303 "1");
304 full_server_card.SetServerStatus(CreditCard::EXPIRED);
305 request()->GetFullCard(full_server_card, AutofillClient::UNMASK_FOR_AUTOFILL,
306 result_delegate()->AsWeakPtr(),
307 ui_delegate()->AsWeakPtr());
308 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
309 details.cvc = base::ASCIIToUTF16("123");
310 details.exp_year = base::ASCIIToUTF16("2051");
311 details.exp_month = base::ASCIIToUTF16("12");
312 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
313 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
314 card_unmask_delegate()->OnUnmaskPromptClosed();
315 }
316
317 // Verify getting the CVC for an unmasked server card with OK status, but
318 // expiration date in the past.
TEST_F(FullCardRequestTest,GetFullCardPanAndCvcForExpiredFullServerCard)319 TEST_F(FullCardRequestTest, GetFullCardPanAndCvcForExpiredFullServerCard) {
320 EXPECT_CALL(*result_delegate(), OnFullCardRequestSucceeded(
321 testing::Ref(*request()),
322 CardMatches(CreditCard::FULL_SERVER_CARD,
323 "4111", "12", "2051"),
324 base::ASCIIToUTF16("123")));
325 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
326 EXPECT_CALL(*personal_data(), UpdateServerCreditCard(_)).Times(0);
327 EXPECT_CALL(*ui_delegate(),
328 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
329
330 base::Time::Exploded today;
331 AutofillClock::Now().LocalExplode(&today);
332 CreditCard full_server_card(CreditCard::FULL_SERVER_CARD, "server_id");
333 test::SetCreditCardInfo(&full_server_card, nullptr, "4111", "12",
334 base::StringPrintf("%d", today.year - 1).c_str(),
335 "1");
336 full_server_card.SetServerStatus(CreditCard::OK);
337 request()->GetFullCard(full_server_card, AutofillClient::UNMASK_FOR_AUTOFILL,
338 result_delegate()->AsWeakPtr(),
339 ui_delegate()->AsWeakPtr());
340 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
341 details.cvc = base::ASCIIToUTF16("123");
342 details.exp_year = base::ASCIIToUTF16("2051");
343 details.exp_month = base::ASCIIToUTF16("12");
344 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
345 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
346 card_unmask_delegate()->OnUnmaskPromptClosed();
347 }
348
349 // Only one request at a time should be allowed.
TEST_F(FullCardRequestTest,OneRequestAtATime)350 TEST_F(FullCardRequestTest, OneRequestAtATime) {
351 EXPECT_CALL(*result_delegate(), OnFullCardRequestFailed());
352 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
353 EXPECT_CALL(*ui_delegate(), OnUnmaskVerificationResult(_)).Times(0);
354
355 request()->GetFullCard(
356 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id_1"),
357 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
358 ui_delegate()->AsWeakPtr());
359 request()->GetFullCard(
360 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id_2"),
361 AutofillClient::UNMASK_FOR_PAYMENT_REQUEST,
362 result_delegate()->AsWeakPtr(), ui_delegate()->AsWeakPtr());
363 }
364
365 // After the first request completes, it's OK to start the second request.
TEST_F(FullCardRequestTest,SecondRequestOkAfterFirstFinished)366 TEST_F(FullCardRequestTest, SecondRequestOkAfterFirstFinished) {
367 EXPECT_CALL(*result_delegate(), OnFullCardRequestFailed()).Times(0);
368 EXPECT_CALL(
369 *result_delegate(),
370 OnFullCardRequestSucceeded(testing::Ref(*request()),
371 CardMatches(CreditCard::LOCAL_CARD, "4111"),
372 base::ASCIIToUTF16("123")))
373 .Times(2);
374 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _)).Times(2);
375 EXPECT_CALL(*ui_delegate(),
376 OnUnmaskVerificationResult(AutofillClient::SUCCESS))
377 .Times(2);
378
379 CreditCard card;
380 test::SetCreditCardInfo(&card, nullptr, "4111", "12", "2050", "1");
381 request()->GetFullCard(card, AutofillClient::UNMASK_FOR_AUTOFILL,
382 result_delegate()->AsWeakPtr(),
383 ui_delegate()->AsWeakPtr());
384 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
385 details.cvc = base::ASCIIToUTF16("123");
386 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
387 card_unmask_delegate()->OnUnmaskPromptClosed();
388
389 request()->GetFullCard(card, AutofillClient::UNMASK_FOR_AUTOFILL,
390 result_delegate()->AsWeakPtr(),
391 ui_delegate()->AsWeakPtr());
392 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
393 card_unmask_delegate()->OnUnmaskPromptClosed();
394 }
395
396 // If the user cancels the CVC prompt,
397 // FullCardRequest::Delegate::OnFullCardRequestFailed() should be invoked.
TEST_F(FullCardRequestTest,ClosePromptWithoutUserInput)398 TEST_F(FullCardRequestTest, ClosePromptWithoutUserInput) {
399 EXPECT_CALL(*result_delegate(), OnFullCardRequestFailed());
400 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
401 EXPECT_CALL(*ui_delegate(), OnUnmaskVerificationResult(_)).Times(0);
402
403 request()->GetFullCard(
404 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
405 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
406 ui_delegate()->AsWeakPtr());
407 card_unmask_delegate()->OnUnmaskPromptClosed();
408 }
409
410 // If the server provides an empty PAN with PERMANENT_FAILURE error,
411 // FullCardRequest::Delegate::OnFullCardRequestFailed() should be invoked.
TEST_F(FullCardRequestTest,PermanentFailure)412 TEST_F(FullCardRequestTest, PermanentFailure) {
413 EXPECT_CALL(*result_delegate(), OnFullCardRequestFailed());
414 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
415 EXPECT_CALL(*ui_delegate(),
416 OnUnmaskVerificationResult(AutofillClient::PERMANENT_FAILURE));
417
418 request()->GetFullCard(
419 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
420 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
421 ui_delegate()->AsWeakPtr());
422 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
423 details.cvc = base::ASCIIToUTF16("123");
424 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
425 OnDidGetRealPan(AutofillClient::PERMANENT_FAILURE, "");
426 card_unmask_delegate()->OnUnmaskPromptClosed();
427 }
428
429 // If the server provides an empty PAN with NETWORK_ERROR error,
430 // FullCardRequest::Delegate::OnFullCardRequestFailed() should be invoked.
TEST_F(FullCardRequestTest,NetworkError)431 TEST_F(FullCardRequestTest, NetworkError) {
432 EXPECT_CALL(*result_delegate(), OnFullCardRequestFailed());
433 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
434 EXPECT_CALL(*ui_delegate(),
435 OnUnmaskVerificationResult(AutofillClient::NETWORK_ERROR));
436
437 request()->GetFullCard(
438 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
439 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
440 ui_delegate()->AsWeakPtr());
441 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
442 details.cvc = base::ASCIIToUTF16("123");
443 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
444 OnDidGetRealPan(AutofillClient::NETWORK_ERROR, "");
445 card_unmask_delegate()->OnUnmaskPromptClosed();
446 }
447
448 // If the server provides an empty PAN with TRY_AGAIN_FAILURE, the user can
449 // manually cancel out of the dialog.
TEST_F(FullCardRequestTest,TryAgainFailureGiveUp)450 TEST_F(FullCardRequestTest, TryAgainFailureGiveUp) {
451 EXPECT_CALL(*result_delegate(), OnFullCardRequestFailed());
452 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
453 EXPECT_CALL(*ui_delegate(),
454 OnUnmaskVerificationResult(AutofillClient::TRY_AGAIN_FAILURE));
455
456 request()->GetFullCard(
457 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
458 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
459 ui_delegate()->AsWeakPtr());
460 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
461 details.cvc = base::ASCIIToUTF16("123");
462 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
463 OnDidGetRealPan(AutofillClient::TRY_AGAIN_FAILURE, "");
464 card_unmask_delegate()->OnUnmaskPromptClosed();
465 }
466
467 // If the server provides an empty PAN with TRY_AGAIN_FAILURE, the user can
468 // correct their mistake and resubmit.
TEST_F(FullCardRequestTest,TryAgainFailureRetry)469 TEST_F(FullCardRequestTest, TryAgainFailureRetry) {
470 EXPECT_CALL(*result_delegate(), OnFullCardRequestFailed()).Times(0);
471 EXPECT_CALL(*result_delegate(),
472 OnFullCardRequestSucceeded(
473 testing::Ref(*request()),
474 CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
475 base::ASCIIToUTF16("123")));
476 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
477 EXPECT_CALL(*ui_delegate(),
478 OnUnmaskVerificationResult(AutofillClient::TRY_AGAIN_FAILURE));
479 EXPECT_CALL(*ui_delegate(),
480 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
481
482 request()->GetFullCard(
483 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
484 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
485 ui_delegate()->AsWeakPtr());
486 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
487 details.cvc = base::ASCIIToUTF16("789");
488 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
489 OnDidGetRealPan(AutofillClient::TRY_AGAIN_FAILURE, "");
490 details.cvc = base::ASCIIToUTF16("123");
491 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
492 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
493 card_unmask_delegate()->OnUnmaskPromptClosed();
494 }
495
496 // Verify updating expiration date for a masked server card.
TEST_F(FullCardRequestTest,UpdateExpDateForMaskedServerCard)497 TEST_F(FullCardRequestTest, UpdateExpDateForMaskedServerCard) {
498 EXPECT_CALL(*result_delegate(), OnFullCardRequestSucceeded(
499 testing::Ref(*request()),
500 CardMatches(CreditCard::FULL_SERVER_CARD,
501 "4111", "12", "2050"),
502 base::ASCIIToUTF16("123")));
503 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
504 EXPECT_CALL(*ui_delegate(),
505 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
506
507 request()->GetFullCard(
508 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
509 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
510 ui_delegate()->AsWeakPtr());
511 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
512 details.cvc = base::ASCIIToUTF16("123");
513 details.exp_month = base::ASCIIToUTF16("12");
514 details.exp_year = base::ASCIIToUTF16("2050");
515 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
516 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
517 card_unmask_delegate()->OnUnmaskPromptClosed();
518 }
519
520 // Verify updating expiration date for an unmasked server card.
TEST_F(FullCardRequestTest,UpdateExpDateForFullServerCard)521 TEST_F(FullCardRequestTest, UpdateExpDateForFullServerCard) {
522 EXPECT_CALL(*result_delegate(), OnFullCardRequestSucceeded(
523 testing::Ref(*request()),
524 CardMatches(CreditCard::FULL_SERVER_CARD,
525 "4111", "12", "2050"),
526 base::ASCIIToUTF16("123")));
527 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
528 EXPECT_CALL(*ui_delegate(),
529 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
530
531 CreditCard full_server_card(CreditCard::FULL_SERVER_CARD, "server_id");
532 test::SetCreditCardInfo(&full_server_card, nullptr, "4111", "10", "2000",
533 "1");
534 request()->GetFullCard(full_server_card, AutofillClient::UNMASK_FOR_AUTOFILL,
535 result_delegate()->AsWeakPtr(),
536 ui_delegate()->AsWeakPtr());
537 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
538 details.cvc = base::ASCIIToUTF16("123");
539 details.exp_month = base::ASCIIToUTF16("12");
540 details.exp_year = base::ASCIIToUTF16("2050");
541 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
542 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
543 card_unmask_delegate()->OnUnmaskPromptClosed();
544 }
545
546 // Verify updating expiration date for a local card.
TEST_F(FullCardRequestTest,UpdateExpDateForLocalCard)547 TEST_F(FullCardRequestTest, UpdateExpDateForLocalCard) {
548 EXPECT_CALL(*result_delegate(),
549 OnFullCardRequestSucceeded(
550 testing::Ref(*request()),
551 CardMatches(CreditCard::LOCAL_CARD, "4111", "12", "2051"),
552 base::ASCIIToUTF16("123")));
553 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
554 EXPECT_CALL(*personal_data(),
555 UpdateCreditCard(
556 CardMatches(CreditCard::LOCAL_CARD, "4111", "12", "2051")));
557 EXPECT_CALL(*ui_delegate(),
558 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
559
560 base::Time::Exploded today;
561 AutofillClock::Now().LocalExplode(&today);
562 CreditCard card;
563 test::SetCreditCardInfo(&card, nullptr, "4111", "10",
564 base::StringPrintf("%d", today.year - 1).c_str(),
565 "1");
566 request()->GetFullCard(card, AutofillClient::UNMASK_FOR_AUTOFILL,
567 result_delegate()->AsWeakPtr(),
568 ui_delegate()->AsWeakPtr());
569 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
570 details.cvc = base::ASCIIToUTF16("123");
571 details.exp_month = base::ASCIIToUTF16("12");
572 details.exp_year = base::ASCIIToUTF16("2051");
573 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
574 card_unmask_delegate()->OnUnmaskPromptClosed();
575 }
576
577 // Verify saving full PAN on disk.
TEST_F(FullCardRequestTest,SaveRealPan)578 TEST_F(FullCardRequestTest, SaveRealPan) {
579 EXPECT_CALL(*result_delegate(), OnFullCardRequestSucceeded(
580 testing::Ref(*request()),
581 CardMatches(CreditCard::FULL_SERVER_CARD,
582 "4111", "12", "2050"),
583 base::ASCIIToUTF16("123")));
584 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
585 EXPECT_CALL(*personal_data(),
586 UpdateServerCreditCard(CardMatches(CreditCard::FULL_SERVER_CARD,
587 "4111", "12", "2050")));
588 EXPECT_CALL(*ui_delegate(),
589 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
590
591 request()->GetFullCard(
592 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
593 AutofillClient::UNMASK_FOR_AUTOFILL, result_delegate()->AsWeakPtr(),
594 ui_delegate()->AsWeakPtr());
595 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
596 details.cvc = base::ASCIIToUTF16("123");
597 details.exp_month = base::ASCIIToUTF16("12");
598 details.exp_year = base::ASCIIToUTF16("2050");
599 details.should_store_pan = true;
600 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
601 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
602 card_unmask_delegate()->OnUnmaskPromptClosed();
603 }
604
605 // Verify getting full PAN and CVC for PaymentRequest.
TEST_F(FullCardRequestTest,UnmaskForPaymentRequest)606 TEST_F(FullCardRequestTest, UnmaskForPaymentRequest) {
607 EXPECT_CALL(*result_delegate(),
608 OnFullCardRequestSucceeded(
609 testing::Ref(*request()),
610 CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
611 base::ASCIIToUTF16("123")));
612 EXPECT_CALL(*ui_delegate(), ShowUnmaskPrompt(_, _, _));
613 EXPECT_CALL(*ui_delegate(),
614 OnUnmaskVerificationResult(AutofillClient::SUCCESS));
615
616 request()->GetFullCard(
617 CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
618 AutofillClient::UNMASK_FOR_PAYMENT_REQUEST,
619 result_delegate()->AsWeakPtr(), ui_delegate()->AsWeakPtr());
620 CardUnmaskDelegate::UserProvidedUnmaskDetails details;
621 details.cvc = base::ASCIIToUTF16("123");
622 card_unmask_delegate()->OnUnmaskPromptAccepted(details);
623 OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
624 card_unmask_delegate()->OnUnmaskPromptClosed();
625 }
626
627 } // namespace payments
628 } // namespace autofill
629