146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <string> 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <vector> 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/message_loop/message_loop.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/strings/string_util.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/signin/core/browser/account_service_flag_fetcher.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/url_request/url_request_test_util.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kAccountId[] = "user@gmail.com"; 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kDifferentAccountId[] = "some_other_user@gmail.com"; 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const int kGaiaAuthFetcherURLFetcherID = 0; 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// TODO(treib): This class should really live in components/signin/ next to the 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// AccountServiceFlagFetcher, but it uses the FakePO2TS which lives in 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// chrome/browser/ (because it uses the AndroidPO2TS which depends on stuff from 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// chrome/browser/). So when the AndroidPO2TS is componentized, then this should 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// move as well. 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class AccountServiceFlagFetcherTest : public testing::Test { 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountServiceFlagFetcherTest() 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : request_context_(new net::TestURLRequestContextGetter( 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::MessageLoopProxy::current())) { 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) service_flags_.push_back("some_flag"); 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) service_flags_.push_back("another_flag"); 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) service_flags_.push_back("andonemore"); 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MOCK_METHOD2(OnFlagsFetched, 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void(AccountServiceFlagFetcher::ResultCode result, 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::vector<std::string>& flags)); 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected: 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcher* GetLoginURLFetcher() { 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcher* fetcher = 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) url_fetcher_factory_.GetFetcherByID(kGaiaAuthFetcherURLFetcherID); 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(fetcher); 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(GaiaUrls::GetInstance()->oauth1_login_url(), 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->GetOriginalURL()); 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return fetcher; 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcher* GetGetUserInfoURLFetcher() { 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcher* fetcher = 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) url_fetcher_factory_.GetFetcherByID(kGaiaAuthFetcherURLFetcherID); 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(fetcher); 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(GaiaUrls::GetInstance()->get_user_info_url(), 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->GetOriginalURL()); 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return fetcher; 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SendValidLoginResponse() { 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcher* fetcher = GetLoginURLFetcher(); 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_status( 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0)); 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->SetResponseString(std::string("SID=sid\nLSID=lsid\nAuth=auth\n")); 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SendFailedLoginResponse() { 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcher* fetcher = GetLoginURLFetcher(); 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_status( 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestStatus(net::URLRequestStatus::CANCELED, 0)); 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->SetResponseString(std::string()); 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SendValidGetUserInfoResponse() { 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcher* fetcher = GetGetUserInfoURLFetcher(); 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_status( 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0)); 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->SetResponseString(BuildGetUserInfoResponse()); 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SendInvalidGetUserInfoResponse() { 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcher* fetcher = GetGetUserInfoURLFetcher(); 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_status( 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0)); 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->SetResponseString(std::string("allServicesIsMissing=true")); 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SendFailedGetUserInfoResponse() { 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcher* fetcher = GetGetUserInfoURLFetcher(); 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_status( 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestStatus(net::URLRequestStatus::CANCELED, 0)); 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->SetResponseString(std::string()); 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string BuildGetUserInfoResponse() const { 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return "allServices=" + JoinString(service_flags_, ','); 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::MessageLoop message_loop_; 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeProfileOAuth2TokenService token_service_; 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<net::TestURLRequestContextGetter> request_context_; 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::TestURLFetcherFactory url_fetcher_factory_; 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::ResponseCookies cookies_; 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<std::string> service_flags_; 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, Success) { 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.UpdateCredentials(kAccountId, "refresh_token"); 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountServiceFlagFetcher fetcher( 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &token_service_, 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_context_.get(), 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched, 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Since a refresh token is already available, we should immediately get a 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // request for an access token. 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, token_service_.GetPendingRequests().size()); 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.IssueAllTokensForAccount( 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token", 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendValidLoginResponse(); 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SUCCESS, 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) service_flags_)); 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendValidGetUserInfoResponse(); 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, SuccessAfterWaitingForRefreshToken) { 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountServiceFlagFetcher fetcher( 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &token_service_, 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_context_.get(), 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched, 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Since there is no refresh token yet, we should not get a request for an 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // access token at this point. 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, token_service_.GetPendingRequests().size()); 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.UpdateCredentials(kAccountId, "refresh_token"); 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Now there is a refresh token and we should have got a request for an 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // access token. 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, token_service_.GetPendingRequests().size()); 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.IssueAllTokensForAccount( 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token", 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendValidLoginResponse(); 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SUCCESS, 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) service_flags_)); 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendValidGetUserInfoResponse(); 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, NoRefreshToken) { 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountServiceFlagFetcher fetcher( 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &token_service_, 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_context_.get(), 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched, 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.UpdateCredentials(kDifferentAccountId, "refresh_token"); 18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Credentials for a different user should be ignored, i.e. not result in a 19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // request for an access token. 19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, token_service_.GetPendingRequests().size()); 19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // After all refresh tokens have been loaded, there is still no token for our 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // user, so we expect a token error. 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::TOKEN_ERROR, 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<std::string>())); 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.IssueAllRefreshTokensLoaded(); 19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, GetTokenFailure) { 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.UpdateCredentials(kAccountId, "refresh_token"); 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountServiceFlagFetcher fetcher( 20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &token_service_, 20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_context_.get(), 20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched, 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // On failure to get an access token we expect a token error. 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::TOKEN_ERROR, 21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<std::string>())); 21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.IssueErrorForAllPendingRequestsForAccount( 21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); 21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, ClientLoginFailure) { 22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.UpdateCredentials(kAccountId, "refresh_token"); 22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountServiceFlagFetcher fetcher( 22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &token_service_, 22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_context_.get(), 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched, 22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.IssueAllTokensForAccount( 23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token", 23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Login failure should result in a service error. 23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SERVICE_ERROR, 23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<std::string>())); 23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendFailedLoginResponse(); 23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, GetUserInfoInvalidResponse) { 24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.UpdateCredentials(kAccountId, "refresh_token"); 24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountServiceFlagFetcher fetcher( 24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &token_service_, 24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_context_.get(), 24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched, 24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.IssueAllTokensForAccount( 25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token", 25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendValidLoginResponse(); 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Invalid response data from GetUserInfo should result in a service error. 25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SERVICE_ERROR, 25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<std::string>())); 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendInvalidGetUserInfoResponse(); 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, GetUserInfoFailure) { 26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.UpdateCredentials(kAccountId, "refresh_token"); 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountServiceFlagFetcher fetcher( 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &token_service_, 26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_context_.get(), 27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched, 27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.IssueAllTokensForAccount( 27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token", 27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendValidLoginResponse(); 27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Failed GetUserInfo call should result in a service error. 28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SERVICE_ERROR, 28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<std::string>())); 28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendFailedGetUserInfoResponse(); 28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, DestroyFetcher) { 28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.UpdateCredentials(kAccountId, "refresh_token"); 28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // When the fetcher is destroyed before the request completes, OnFlagsFetched 29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // should not be called. 29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnFlagsFetched(testing::_, testing::_)).Times(0); 29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountServiceFlagFetcher fetcher( 29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &token_service_, 29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_context_.get(), 29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched, 29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_.IssueAllTokensForAccount( 30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kAccountId, 30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token", 30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendValidLoginResponse(); 30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Do not send a GetUserInfo response, but make sure the request is there. 30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetGetUserInfoURLFetcher(); 30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 309