Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(920)

Unified Diff: components/autofill/core/browser/payments/full_card_request_unittest.cc

Issue 1899893002: Card unmasking without form filling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use the credit card number field in metrics tests, because ios single-field form fill will not requ… Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/autofill/core/browser/payments/full_card_request.cc ('k') | components/components_tests.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/autofill/core/browser/payments/full_card_request_unittest.cc
diff --git a/components/autofill/core/browser/payments/full_card_request_unittest.cc b/components/autofill/core/browser/payments/full_card_request_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0ef2c4114d499e1c357dc5a1041564f93e604b6a
--- /dev/null
+++ b/components/autofill/core/browser/payments/full_card_request_unittest.cc
@@ -0,0 +1,408 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/payments/full_card_request.h"
+
+#include "base/command_line.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/payments/payments_client.h"
+#include "components/autofill/core/browser/personal_data_manager.h"
+#include "components/autofill/core/browser/test_autofill_client.h"
+#include "components/autofill/core/browser/test_autofill_driver.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace autofill {
+namespace payments {
+
+using testing::_;
+
+// The consumer of the full card request API.
+class MockDelegate : public FullCardRequest::Delegate,
+ public base::SupportsWeakPtr<MockDelegate> {
+ public:
+ MOCK_METHOD2(OnFullCardDetails,
+ void(const CreditCard&, const base::string16&));
+ MOCK_METHOD0(OnFullCardError, void());
+};
+
+// The autofill client.
+class MockAutofillClient : public TestAutofillClient {
+ public:
+ MOCK_METHOD3(ShowUnmaskPrompt,
+ void(const CreditCard&,
+ UnmaskCardReason,
+ base::WeakPtr<CardUnmaskDelegate>));
+ MOCK_METHOD1(OnUnmaskVerificationResult,
+ void(AutofillClient::PaymentsRpcResult));
+};
+
+// The test fixture for full card request.
+class FullCardRequestTest : public testing::Test,
+ public PaymentsClientDelegate {
+ public:
+ FullCardRequestTest()
+ : personal_data_("en_US"),
+ request_context_(new net::TestURLRequestContextGetter(
+ base::ThreadTaskRunnerHandle::Get())),
+ payments_client_(request_context_.get(), this),
+ request_(&autofill_client_, &payments_client_, &personal_data_) {
+ // Silence the warning from PaymentsClient about matching sync and Payments
+ // server types.
+ base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+ "sync-url", "https://google.com");
+ }
+
+ ~FullCardRequestTest() override {}
+
+ MockAutofillClient* client() { return &autofill_client_; }
+
+ FullCardRequest* request() { return &request_; }
+
+ CardUnmaskDelegate* ui_delegate() { return (CardUnmaskDelegate*)&request_; }
+
+ MockDelegate* delegate() { return &delegate_; }
+
+ // PaymentsClientDelegate:
+ void OnDidGetRealPan(AutofillClient::PaymentsRpcResult result,
+ const std::string& real_pan) override {
+ request_.OnDidGetRealPan(result, real_pan);
+ }
+
+ private:
+ // PaymentsClientDelegate:
+ IdentityProvider* GetIdentityProvider() override {
+ return autofill_client_.GetIdentityProvider();
+ }
+ void OnDidGetUploadDetails(
+ AutofillClient::PaymentsRpcResult result,
+ const base::string16& context_token,
+ std::unique_ptr<base::DictionaryValue> legal_message) override {
+ ASSERT_TRUE(false) << "No upload details in this test";
+ }
+ void OnDidUploadCard(AutofillClient::PaymentsRpcResult result) override {
+ ASSERT_TRUE(false) << "No card uploads in this test.";
+ }
+
+ base::MessageLoop message_loop_;
+ PersonalDataManager personal_data_;
+ MockAutofillClient autofill_client_;
+ scoped_refptr<net::TestURLRequestContextGetter> request_context_;
+ PaymentsClient payments_client_;
+ MockDelegate delegate_;
+ FullCardRequest request_;
+
+ DISALLOW_COPY_AND_ASSIGN(FullCardRequestTest);
+};
+
+// Matches the |arg| credit card to the given |record_type| and |card_number|.
+MATCHER_P2(CardMatches, record_type, card_number, "") {
+ return arg.record_type() == record_type &&
+ arg.GetRawInfo(CREDIT_CARD_NUMBER) == base::ASCIIToUTF16(card_number);
+}
+
+// Matches the |arg| credit card to the given |record_type|, card |number|,
+// expiration |month|, and expiration |year|.
+MATCHER_P4(CardMatches, record_type, number, month, year, "") {
+ return arg.record_type() == record_type &&
+ arg.GetRawInfo(CREDIT_CARD_NUMBER) == base::ASCIIToUTF16(number) &&
+ arg.GetRawInfo(CREDIT_CARD_EXP_MONTH) == base::ASCIIToUTF16(month) &&
+ arg.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR) ==
+ base::ASCIIToUTF16(year);
+}
+
+// Verify getting the full PAN and the CVC for a masked server card.
+TEST_F(FullCardRequestTest, GetFullCardPanAndCvcForMaskedServerCard) {
+ EXPECT_CALL(
+ *delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ request()->GetFullCard(
+ CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
+ AutofillClient::UNMASK_FOR_AUTOFILL, delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ ui_delegate()->OnUnmaskResponse(response);
+ OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// Verify getting the CVC for a local card.
+TEST_F(FullCardRequestTest, GetFullCardPanAndCvcForLocalCard) {
+ EXPECT_CALL(*delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::LOCAL_CARD, "4111"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ request()->GetFullCard(CreditCard(base::ASCIIToUTF16("4111"), 12, 2050),
+ AutofillClient::UNMASK_FOR_AUTOFILL,
+ delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ ui_delegate()->OnUnmaskResponse(response);
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// Verify getting the CVC for an unmasked server card.
+TEST_F(FullCardRequestTest, GetFullCardPanAndCvcForFullServerCard) {
+ EXPECT_CALL(
+ *delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ CreditCard full_server_card(base::ASCIIToUTF16("4111"), 12, 2050);
+ full_server_card.set_record_type(CreditCard::FULL_SERVER_CARD);
+ request()->GetFullCard(full_server_card, AutofillClient::UNMASK_FOR_AUTOFILL,
+ delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ ui_delegate()->OnUnmaskResponse(response);
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// Only one request at a time should be allowed.
+TEST_F(FullCardRequestTest, OneRequestAtATime) {
+ EXPECT_CALL(*delegate(), OnFullCardError());
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(_)).Times(0);
+
+ request()->GetFullCard(
+ CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id_1"),
+ AutofillClient::UNMASK_FOR_AUTOFILL, delegate()->AsWeakPtr());
+ request()->GetFullCard(
+ CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id_2"),
+ AutofillClient::UNMASK_FOR_PAYMENT_REQUEST, delegate()->AsWeakPtr());
+}
+
+// After the first request completes, it's OK to start the second request.
+TEST_F(FullCardRequestTest, SecondRequestOkAfterFirstFinished) {
+ EXPECT_CALL(*delegate(), OnFullCardError()).Times(0);
+ EXPECT_CALL(*delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::LOCAL_CARD, "4111"),
+ base::ASCIIToUTF16("123")))
+ .Times(2);
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _)).Times(2);
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS))
+ .Times(2);
+
+ request()->GetFullCard(CreditCard(base::ASCIIToUTF16("4111"), 12, 2050),
+ AutofillClient::UNMASK_FOR_AUTOFILL,
+ delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ ui_delegate()->OnUnmaskResponse(response);
+ ui_delegate()->OnUnmaskPromptClosed();
+
+ request()->GetFullCard(CreditCard(base::ASCIIToUTF16("4111"), 12, 2050),
+ AutofillClient::UNMASK_FOR_AUTOFILL,
+ delegate()->AsWeakPtr());
+ ui_delegate()->OnUnmaskResponse(response);
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// If the user cancels the CVC prompt,
+// FullCardRequest::Delegate::OnFullCardError() should be invoked.
+TEST_F(FullCardRequestTest, ClosePromptWithoutUserInput) {
+ EXPECT_CALL(*delegate(), OnFullCardError());
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(_)).Times(0);
+
+ request()->GetFullCard(
+ CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
+ AutofillClient::UNMASK_FOR_AUTOFILL, delegate()->AsWeakPtr());
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// If the server provides an empty PAN,
+// FullCardRequest::Delegate::OnFullCardError() should be invoked.
+TEST_F(FullCardRequestTest, EmptyFullPan) {
+ EXPECT_CALL(*delegate(), OnFullCardError());
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(),
+ OnUnmaskVerificationResult(AutofillClient::PERMANENT_FAILURE));
+
+ request()->GetFullCard(
+ CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
+ AutofillClient::UNMASK_FOR_AUTOFILL, delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ ui_delegate()->OnUnmaskResponse(response);
+ OnDidGetRealPan(AutofillClient::PERMANENT_FAILURE, "");
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// Verify updating expiration date for a masked server card.
+TEST_F(FullCardRequestTest, UpdateExpDateForMaskedServerCard) {
+ EXPECT_CALL(*delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::FULL_SERVER_CARD,
+ "4111", "12", "2050"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ request()->GetFullCard(
+ CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
+ AutofillClient::UNMASK_FOR_AUTOFILL, delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ response.exp_month = base::ASCIIToUTF16("12");
+ response.exp_year = base::ASCIIToUTF16("2050");
+ ui_delegate()->OnUnmaskResponse(response);
+ OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// Verify updating expiration date for an unmasked server card.
+TEST_F(FullCardRequestTest, UpdateExpDateForFullServerCard) {
+ EXPECT_CALL(*delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::FULL_SERVER_CARD,
+ "4111", "12", "2050"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ CreditCard full_server_card(base::ASCIIToUTF16("4111"), 10, 2000);
+ full_server_card.set_record_type(CreditCard::FULL_SERVER_CARD);
+ request()->GetFullCard(full_server_card, AutofillClient::UNMASK_FOR_AUTOFILL,
+ delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ response.exp_month = base::ASCIIToUTF16("12");
+ response.exp_year = base::ASCIIToUTF16("2050");
+ ui_delegate()->OnUnmaskResponse(response);
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// Verify updating expiration date for a local card.
+TEST_F(FullCardRequestTest, UpdateExpDateForLocalCard) {
+ EXPECT_CALL(*delegate(), OnFullCardDetails(CardMatches(CreditCard::LOCAL_CARD,
+ "4111", "12", "2050"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ request()->GetFullCard(CreditCard(base::ASCIIToUTF16("4111"), 10, 2000),
+ AutofillClient::UNMASK_FOR_AUTOFILL,
+ delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ response.exp_month = base::ASCIIToUTF16("12");
+ response.exp_year = base::ASCIIToUTF16("2050");
+ ui_delegate()->OnUnmaskResponse(response);
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// Verify saving full PAN on disk.
+TEST_F(FullCardRequestTest, SaveRealPan) {
+ EXPECT_CALL(*delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::FULL_SERVER_CARD,
+ "4111", "12", "2050"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ request()->GetFullCard(
+ CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
+ AutofillClient::UNMASK_FOR_AUTOFILL, delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ response.exp_month = base::ASCIIToUTF16("12");
+ response.exp_year = base::ASCIIToUTF16("2050");
+ response.should_store_pan = true;
+ ui_delegate()->OnUnmaskResponse(response);
+ OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// Verify getting full PAN and CVC for PaymentRequest.
+TEST_F(FullCardRequestTest, UnmaskForPaymentRequest) {
+ EXPECT_CALL(
+ *delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ request()->GetFullCard(
+ CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
+ AutofillClient::UNMASK_FOR_PAYMENT_REQUEST, delegate()->AsWeakPtr());
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ ui_delegate()->OnUnmaskResponse(response);
+ OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
+ ui_delegate()->OnUnmaskPromptClosed();
+}
+
+// Verify that FullCardRequest::IsGettingFullCard() is true until the server
+// returns the full PAN for a masked card.
+TEST_F(FullCardRequestTest, IsGettingFullCardForMaskedServerCard) {
+ EXPECT_CALL(
+ *delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::FULL_SERVER_CARD, "4111"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ EXPECT_FALSE(request()->IsGettingFullCard());
+
+ request()->GetFullCard(
+ CreditCard(CreditCard::MASKED_SERVER_CARD, "server_id"),
+ AutofillClient::UNMASK_FOR_AUTOFILL, delegate()->AsWeakPtr());
+
+ EXPECT_TRUE(request()->IsGettingFullCard());
+
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ ui_delegate()->OnUnmaskResponse(response);
+
+ EXPECT_TRUE(request()->IsGettingFullCard());
+
+ OnDidGetRealPan(AutofillClient::SUCCESS, "4111");
+
+ EXPECT_FALSE(request()->IsGettingFullCard());
+
+ ui_delegate()->OnUnmaskPromptClosed();
+
+ EXPECT_FALSE(request()->IsGettingFullCard());
+}
+
+// Verify that FullCardRequest::IsGettingFullCard() is true until the user types
+// in the CVC for a card that is not masked.
+TEST_F(FullCardRequestTest, IsGettingFullCardForLocalCard) {
+ EXPECT_CALL(*delegate(),
+ OnFullCardDetails(CardMatches(CreditCard::LOCAL_CARD, "4111"),
+ base::ASCIIToUTF16("123")));
+ EXPECT_CALL(*client(), ShowUnmaskPrompt(_, _, _));
+ EXPECT_CALL(*client(), OnUnmaskVerificationResult(AutofillClient::SUCCESS));
+
+ EXPECT_FALSE(request()->IsGettingFullCard());
+
+ request()->GetFullCard(CreditCard(base::ASCIIToUTF16("4111"), 12, 2050),
+ AutofillClient::UNMASK_FOR_AUTOFILL,
+ delegate()->AsWeakPtr());
+
+ EXPECT_TRUE(request()->IsGettingFullCard());
+
+ CardUnmaskDelegate::UnmaskResponse response;
+ response.cvc = base::ASCIIToUTF16("123");
+ ui_delegate()->OnUnmaskResponse(response);
+
+ EXPECT_FALSE(request()->IsGettingFullCard());
+
+ ui_delegate()->OnUnmaskPromptClosed();
+
+ EXPECT_FALSE(request()->IsGettingFullCard());
+}
+
+} // namespace payments
+} // namespace autofill
« no previous file with comments | « components/autofill/core/browser/payments/full_card_request.cc ('k') | components/components_tests.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698