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