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