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 "google_apis/gaia/oauth2_token_service_request.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <set> 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <string> 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <vector> 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/threading/thread.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "google_apis/gaia/fake_oauth2_token_service.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace { 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kAccessToken[] = "access_token"; 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kAccountId[] = "test_user@gmail.com"; 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kScope[] = "SCOPE"; 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class TestingOAuth2TokenServiceConsumer : public OAuth2TokenService::Consumer { 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestingOAuth2TokenServiceConsumer(); 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~TestingOAuth2TokenServiceConsumer(); 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request, 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& access_token, 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Time& expiration_time) OVERRIDE; 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request, 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GoogleServiceAuthError& error) OVERRIDE; 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int num_get_token_success_; 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int num_get_token_failure_; 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string last_token_; 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GoogleServiceAuthError last_error_; 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TestingOAuth2TokenServiceConsumer::TestingOAuth2TokenServiceConsumer() 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : OAuth2TokenService::Consumer("test"), 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) num_get_token_success_(0), 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) num_get_token_failure_(0), 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_error_(GoogleServiceAuthError::AuthErrorNone()) { 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TestingOAuth2TokenServiceConsumer::~TestingOAuth2TokenServiceConsumer() { 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void TestingOAuth2TokenServiceConsumer::OnGetTokenSuccess( 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const OAuth2TokenService::Request* request, 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& token, 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Time& expiration_date) { 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_token_ = token; 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ++num_get_token_success_; 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void TestingOAuth2TokenServiceConsumer::OnGetTokenFailure( 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const OAuth2TokenService::Request* request, 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GoogleServiceAuthError& error) { 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_error_ = error; 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ++num_get_token_failure_; 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// A mock implementation of an OAuth2TokenService. 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use SetResponse to vary the response to token requests. 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class MockOAuth2TokenService : public FakeOAuth2TokenService { 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MockOAuth2TokenService(); 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~MockOAuth2TokenService(); 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SetResponse(const GoogleServiceAuthError& error, 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& access_token, 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Time& expiration); 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int num_invalidate_token() const { return num_invalidate_token_; } 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& last_token_invalidated() const { 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return last_token_invalidated_; 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected: 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void FetchOAuth2Token(RequestImpl* request, 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& account_id, 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestContextGetter* getter, 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& client_id, 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& client_secret, 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ScopeSet& scopes) OVERRIDE; 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void InvalidateOAuth2Token(const std::string& account_id, 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& client_id, 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ScopeSet& scopes, 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& access_token) OVERRIDE; 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GoogleServiceAuthError response_error_; 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string response_access_token_; 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time response_expiration_; 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int num_invalidate_token_; 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string last_token_invalidated_; 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MockOAuth2TokenService::MockOAuth2TokenService() 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : response_error_(GoogleServiceAuthError::AuthErrorNone()), 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) response_access_token_(kAccessToken), 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) response_expiration_(base::Time::Max()), 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) num_invalidate_token_(0) { 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MockOAuth2TokenService::~MockOAuth2TokenService() { 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MockOAuth2TokenService::SetResponse(const GoogleServiceAuthError& error, 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& access_token, 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Time& expiration) { 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) response_error_ = error; 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) response_access_token_ = access_token; 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) response_expiration_ = expiration; 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MockOAuth2TokenService::FetchOAuth2Token( 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RequestImpl* request, 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& account_id, 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestContextGetter* getter, 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& client_id, 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& client_secret, 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ScopeSet& scopes) { 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::MessageLoop::current()->PostTask( 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FROM_HERE, 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&OAuth2TokenService::RequestImpl::InformConsumer, 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request->AsWeakPtr(), 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) response_error_, 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) response_access_token_, 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) response_expiration_)); 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MockOAuth2TokenService::InvalidateOAuth2Token( 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& account_id, 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& client_id, 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ScopeSet& scopes, 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& access_token) { 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ++num_invalidate_token_; 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_token_invalidated_ = access_token; 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class OAuth2TokenServiceRequestTest : public testing::Test { 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SetUp() OVERRIDE; 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void TearDown() OVERRIDE; 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected: 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class Provider : public OAuth2TokenServiceRequest::TokenServiceProvider { 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Provider(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OAuth2TokenService* token_service); 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual scoped_refptr<base::SingleThreadTaskRunner> 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetTokenServiceTaskRunner() OVERRIDE; 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual OAuth2TokenService* GetTokenService() OVERRIDE; 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual ~Provider(); 1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OAuth2TokenService* token_service_; 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::MessageLoop ui_loop_; 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OAuth2TokenService::ScopeSet scopes_; 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<MockOAuth2TokenService> oauth2_service_; 1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<OAuth2TokenServiceRequest::TokenServiceProvider> provider_; 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestingOAuth2TokenServiceConsumer consumer_; 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void OAuth2TokenServiceRequestTest::SetUp() { 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scopes_.insert(kScope); 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) oauth2_service_.reset(new MockOAuth2TokenService); 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) oauth2_service_->AddAccount(kAccountId); 1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_ = 1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new Provider(base::MessageLoopProxy::current(), oauth2_service_.get()); 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void OAuth2TokenServiceRequestTest::TearDown() { 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Run the loop to execute any pending tasks that may free resources. 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui_loop_.RunUntilIdle(); 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)OAuth2TokenServiceRequestTest::Provider::Provider( 18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OAuth2TokenService* token_service) 19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : task_runner_(task_runner), token_service_(token_service) { 19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_refptr<base::SingleThreadTaskRunner> 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)OAuth2TokenServiceRequestTest::Provider::GetTokenServiceTaskRunner() { 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return task_runner_; 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)OAuth2TokenService* OAuth2TokenServiceRequestTest::Provider::GetTokenService() { 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return token_service_; 20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)OAuth2TokenServiceRequestTest::Provider::~Provider() { 2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(OAuth2TokenServiceRequestTest, CreateAndStart_Failure) { 20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) oauth2_service_->SetResponse( 20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE), 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string(), 21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time()); 21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2TokenServiceRequest> request( 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OAuth2TokenServiceRequest::CreateAndStart( 21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) provider_.get(), kAccountId, scopes_, &consumer_)); 21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui_loop_.RunUntilIdle(); 21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, consumer_.num_get_token_success_); 21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1, consumer_.num_get_token_failure_); 21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::SERVICE_UNAVAILABLE, 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) consumer_.last_error_.state()); 21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, oauth2_service_->num_invalidate_token()); 22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(OAuth2TokenServiceRequestTest, CreateAndStart_Success) { 22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2TokenServiceRequest> request( 22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OAuth2TokenServiceRequest::CreateAndStart( 22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) provider_.get(), kAccountId, scopes_, &consumer_)); 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui_loop_.RunUntilIdle(); 22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1, consumer_.num_get_token_success_); 22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, consumer_.num_get_token_failure_); 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kAccessToken, consumer_.last_token_); 23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, oauth2_service_->num_invalidate_token()); 23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(OAuth2TokenServiceRequestTest, 23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateAndStart_DestroyRequestBeforeCompletes) { 23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2TokenServiceRequest> request( 23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OAuth2TokenServiceRequest::CreateAndStart( 23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) provider_.get(), kAccountId, scopes_, &consumer_)); 23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request.reset(); 23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui_loop_.RunUntilIdle(); 24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, consumer_.num_get_token_success_); 24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, consumer_.num_get_token_failure_); 24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, oauth2_service_->num_invalidate_token()); 24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(OAuth2TokenServiceRequestTest, 24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateAndStart_DestroyRequestAfterCompletes) { 24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2TokenServiceRequest> request( 24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OAuth2TokenServiceRequest::CreateAndStart( 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) provider_.get(), kAccountId, scopes_, &consumer_)); 25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui_loop_.RunUntilIdle(); 25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request.reset(); 25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1, consumer_.num_get_token_success_); 25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, consumer_.num_get_token_failure_); 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kAccessToken, consumer_.last_token_); 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, oauth2_service_->num_invalidate_token()); 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(OAuth2TokenServiceRequestTest, InvalidateToken) { 25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OAuth2TokenServiceRequest::InvalidateToken( 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) provider_.get(), kAccountId, scopes_, kAccessToken); 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui_loop_.RunUntilIdle(); 26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, consumer_.num_get_token_success_); 26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, consumer_.num_get_token_failure_); 26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kAccessToken, oauth2_service_->last_token_invalidated()); 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1, oauth2_service_->num_invalidate_token()); 26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace 269