Index: components/autofill/content/browser/wallet/real_pan_wallet_client_unittest.cc |
diff --git a/components/autofill/content/browser/wallet/real_pan_wallet_client_unittest.cc b/components/autofill/content/browser/wallet/real_pan_wallet_client_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8ed271572b945bc9121d1d9b3f7d4ded8fd2c7f4 |
--- /dev/null |
+++ b/components/autofill/content/browser/wallet/real_pan_wallet_client_unittest.cc |
@@ -0,0 +1,154 @@ |
+// Copyright 2015 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 "base/command_line.h" |
+#include "components/autofill/core/browser/autofill_test_utils.h" |
+#include "components/autofill/core/browser/wallet/real_pan_wallet_client.h" |
+#include "components/autofill/core/common/autofill_switches.h" |
+#include "content/public/test/test_browser_thread_bundle.h" |
+#include "google_apis/gaia/fake_identity_provider.h" |
+#include "google_apis/gaia/fake_oauth2_token_service.h" |
+#include "net/url_request/test_url_fetcher_factory.h" |
+#include "net/url_request/url_request_test_util.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace autofill { |
+namespace wallet { |
+ |
+class RealPanWalletClientTest : public testing::Test, |
+ public RealPanWalletClient::Delegate { |
+ public: |
+ RealPanWalletClientTest() : result_(AutofillClient::SUCCESS) {} |
+ ~RealPanWalletClientTest() override {} |
+ |
+ void SetUp() override { |
+ // Silence the warning for mismatching sync and wallet servers. |
+ base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
+ switches::kWalletServiceUseSandbox, "0"); |
+ |
+ request_context_ = new net::TestURLRequestContextGetter( |
+ base::MessageLoopProxy::current()); |
+ token_service_.reset(new FakeOAuth2TokenService()); |
+ identity_provider_.reset(new FakeIdentityProvider(token_service_.get())); |
+ client_.reset(new RealPanWalletClient(request_context_.get(), this)); |
+ } |
+ |
+ void TearDown() override { client_.reset(); } |
+ |
+ // RealPanWalletClient::Delegate |
+ |
+ IdentityProvider* GetIdentityProvider() override { |
+ return identity_provider_.get(); |
+ } |
+ |
+ void OnDidGetRealPan(AutofillClient::GetRealPanResult result, |
+ const std::string& real_pan) override { |
+ result_ = result; |
+ real_pan_ = real_pan; |
+ } |
+ |
+ protected: |
+ void StartUnmasking() { |
+ token_service_->AddAccount("example@gmail.com"); |
+ identity_provider_->LogIn("example@gmail.com"); |
+ CreditCard card = test::GetMaskedServerCard(); |
+ CardUnmaskDelegate::UnmaskResponse response; |
+ response.cvc = base::ASCIIToUTF16("123"); |
+ client_->UnmaskCard(card, response); |
+ } |
+ |
+ void IssueOAuthToken() { |
+ token_service_->IssueAllTokensForAccount( |
+ "example@gmail.com", |
+ "totally_real_token", |
+ base::Time::Now() + base::TimeDelta::FromDays(10)); |
+ |
+ // Verify the auth header. |
+ net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ net::HttpRequestHeaders request_headers; |
+ fetcher->GetExtraRequestHeaders(&request_headers); |
+ std::string auth_header_value; |
+ EXPECT_TRUE(request_headers.GetHeader( |
+ net::HttpRequestHeaders::kAuthorization, |
+ &auth_header_value)) << request_headers.ToString(); |
+ EXPECT_EQ("Bearer totally_real_token", auth_header_value); |
+ } |
+ |
+ void ReturnResponse(net::HttpStatusCode response_code, |
+ const std::string& response_body) { |
+ net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_TRUE(fetcher); |
+ fetcher->set_response_code(response_code); |
+ fetcher->SetResponseString(response_body); |
+ fetcher->delegate()->OnURLFetchComplete(fetcher); |
+ } |
+ |
+ AutofillClient::GetRealPanResult result_; |
+ std::string real_pan_; |
+ |
+ content::TestBrowserThreadBundle thread_bundle_; |
+ net::TestURLFetcherFactory factory_; |
+ scoped_refptr<net::TestURLRequestContextGetter> request_context_; |
+ scoped_ptr<FakeOAuth2TokenService> token_service_; |
+ scoped_ptr<FakeIdentityProvider> identity_provider_; |
+ scoped_ptr<RealPanWalletClient> client_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(RealPanWalletClientTest); |
+}; |
+ |
+TEST_F(RealPanWalletClientTest, OAuthError) { |
+ StartUnmasking(); |
+ token_service_->IssueErrorForAllPendingRequestsForAccount( |
+ "example@gmail.com", |
+ GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
+ EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_); |
+ EXPECT_TRUE(real_pan_.empty()); |
+} |
+ |
+TEST_F(RealPanWalletClientTest, Success) { |
+ StartUnmasking(); |
+ IssueOAuthToken(); |
+ ReturnResponse(net::HTTP_OK, "{ \"pan\": \"1234\" }"); |
+ EXPECT_EQ(AutofillClient::SUCCESS, result_); |
+ EXPECT_EQ("1234", real_pan_); |
+} |
+ |
+TEST_F(RealPanWalletClientTest, RetryFailure) { |
+ StartUnmasking(); |
+ IssueOAuthToken(); |
+ ReturnResponse(net::HTTP_OK, "{ \"error\": { \"code\": \"INTERNAL\" } }"); |
+ EXPECT_EQ(AutofillClient::TRY_AGAIN_FAILURE, result_); |
+ EXPECT_EQ("", real_pan_); |
please use gerrit instead
2015/03/25 22:03:12
EXPECT_TRUE(real_pan_.empty());
Evan Stade
2015/03/25 22:03:58
that gives less useful output when it fails
ditto
|
+} |
+ |
+// TODO(estade): enable when https://codereview.chromium.org/1028313006/ |
+// lands. |
+TEST_F(RealPanWalletClientTest, DISABLED_PermanentFailure) { |
+ StartUnmasking(); |
+ IssueOAuthToken(); |
+ ReturnResponse(net::HTTP_OK, |
+ "{ \"error\": { \"code\": \"ANYTHING_ELSE\" } }"); |
+ EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_); |
+ EXPECT_EQ("", real_pan_); |
please use gerrit instead
2015/03/25 22:03:12
EXPECT_TRUE(real_pan_.empty());
|
+} |
+ |
+TEST_F(RealPanWalletClientTest, NetworkError) { |
+ StartUnmasking(); |
+ IssueOAuthToken(); |
+ ReturnResponse(net::HTTP_REQUEST_TIMEOUT, std::string()); |
+ EXPECT_EQ(AutofillClient::NETWORK_ERROR, result_); |
+ EXPECT_EQ("", real_pan_); |
please use gerrit instead
2015/03/25 22:03:12
EXPECT_TRUE(real_pan_.empty());
|
+} |
+ |
+TEST_F(RealPanWalletClientTest, OtherError) { |
+ StartUnmasking(); |
+ IssueOAuthToken(); |
+ ReturnResponse(net::HTTP_FORBIDDEN, std::string()); |
+ EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_); |
+ EXPECT_EQ("", real_pan_); |
please use gerrit instead
2015/03/25 22:03:12
EXPECT_TRUE(real_pan_.empty());
|
+} |
+ |
+} // namespace autofill |
+} // namespace wallet |