1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "google_apis/gaia/oauth2_token_service_request.h"
11 #include "base/bind.h"
12 #include "base/thread_task_runner_handle.h"
13 #include "base/threading/thread.h"
14 #include "google_apis/gaia/fake_oauth2_token_service.h"
15 #include "google_apis/gaia/google_service_auth_error.h"
16 #include "google_apis/gaia/oauth2_token_service.h"
17 #include "testing/gtest/include/gtest/gtest.h"
21 const char kAccessToken
[] = "access_token";
22 const char kAccountId
[] = "test_user@gmail.com";
23 const char kScope
[] = "SCOPE";
25 class TestingOAuth2TokenServiceConsumer
: public OAuth2TokenService::Consumer
{
27 TestingOAuth2TokenServiceConsumer();
28 ~TestingOAuth2TokenServiceConsumer() override
;
30 void OnGetTokenSuccess(const OAuth2TokenService::Request
* request
,
31 const std::string
& access_token
,
32 const base::Time
& expiration_time
) override
;
33 void OnGetTokenFailure(const OAuth2TokenService::Request
* request
,
34 const GoogleServiceAuthError
& error
) override
;
36 int num_get_token_success_
;
37 int num_get_token_failure_
;
38 std::string last_token_
;
39 GoogleServiceAuthError last_error_
;
42 TestingOAuth2TokenServiceConsumer::TestingOAuth2TokenServiceConsumer()
43 : OAuth2TokenService::Consumer("test"),
44 num_get_token_success_(0),
45 num_get_token_failure_(0),
46 last_error_(GoogleServiceAuthError::AuthErrorNone()) {
49 TestingOAuth2TokenServiceConsumer::~TestingOAuth2TokenServiceConsumer() {
52 void TestingOAuth2TokenServiceConsumer::OnGetTokenSuccess(
53 const OAuth2TokenService::Request
* request
,
54 const std::string
& token
,
55 const base::Time
& expiration_date
) {
57 ++num_get_token_success_
;
60 void TestingOAuth2TokenServiceConsumer::OnGetTokenFailure(
61 const OAuth2TokenService::Request
* request
,
62 const GoogleServiceAuthError
& error
) {
64 ++num_get_token_failure_
;
67 // A mock implementation of an OAuth2TokenService.
69 // Use SetResponse to vary the response to token requests.
70 class MockOAuth2TokenService
: public FakeOAuth2TokenService
{
72 MockOAuth2TokenService();
73 ~MockOAuth2TokenService() override
;
75 void SetResponse(const GoogleServiceAuthError
& error
,
76 const std::string
& access_token
,
77 const base::Time
& expiration
);
79 int num_invalidate_token() const { return num_invalidate_token_
; }
81 const std::string
& last_token_invalidated() const {
82 return last_token_invalidated_
;
86 void FetchOAuth2Token(RequestImpl
* request
,
87 const std::string
& account_id
,
88 net::URLRequestContextGetter
* getter
,
89 const std::string
& client_id
,
90 const std::string
& client_secret
,
91 const ScopeSet
& scopes
) override
;
93 void InvalidateAccessTokenImpl(const std::string
& account_id
,
94 const std::string
& client_id
,
95 const ScopeSet
& scopes
,
96 const std::string
& access_token
) override
;
99 GoogleServiceAuthError response_error_
;
100 std::string response_access_token_
;
101 base::Time response_expiration_
;
102 int num_invalidate_token_
;
103 std::string last_token_invalidated_
;
106 MockOAuth2TokenService::MockOAuth2TokenService()
107 : response_error_(GoogleServiceAuthError::AuthErrorNone()),
108 response_access_token_(kAccessToken
),
109 response_expiration_(base::Time::Max()),
110 num_invalidate_token_(0) {
113 MockOAuth2TokenService::~MockOAuth2TokenService() {
116 void MockOAuth2TokenService::SetResponse(const GoogleServiceAuthError
& error
,
117 const std::string
& access_token
,
118 const base::Time
& expiration
) {
119 response_error_
= error
;
120 response_access_token_
= access_token
;
121 response_expiration_
= expiration
;
124 void MockOAuth2TokenService::FetchOAuth2Token(
125 RequestImpl
* request
,
126 const std::string
& account_id
,
127 net::URLRequestContextGetter
* getter
,
128 const std::string
& client_id
,
129 const std::string
& client_secret
,
130 const ScopeSet
& scopes
) {
131 base::MessageLoop::current()->PostTask(
133 base::Bind(&OAuth2TokenService::RequestImpl::InformConsumer
,
134 request
->AsWeakPtr(),
136 response_access_token_
,
137 response_expiration_
));
140 void MockOAuth2TokenService::InvalidateAccessTokenImpl(
141 const std::string
& account_id
,
142 const std::string
& client_id
,
143 const ScopeSet
& scopes
,
144 const std::string
& access_token
) {
145 ++num_invalidate_token_
;
146 last_token_invalidated_
= access_token
;
149 class OAuth2TokenServiceRequestTest
: public testing::Test
{
151 void SetUp() override
;
152 void TearDown() override
;
155 class Provider
: public OAuth2TokenServiceRequest::TokenServiceProvider
{
157 Provider(const scoped_refptr
<base::SingleThreadTaskRunner
>& task_runner
,
158 OAuth2TokenService
* token_service
);
160 scoped_refptr
<base::SingleThreadTaskRunner
> GetTokenServiceTaskRunner()
162 OAuth2TokenService
* GetTokenService() override
;
165 ~Provider() override
;
167 scoped_refptr
<base::SingleThreadTaskRunner
> task_runner_
;
168 OAuth2TokenService
* token_service_
;
171 base::MessageLoop ui_loop_
;
172 OAuth2TokenService::ScopeSet scopes_
;
173 scoped_ptr
<MockOAuth2TokenService
> oauth2_service_
;
174 scoped_refptr
<OAuth2TokenServiceRequest::TokenServiceProvider
> provider_
;
175 TestingOAuth2TokenServiceConsumer consumer_
;
178 void OAuth2TokenServiceRequestTest::SetUp() {
179 scopes_
.insert(kScope
);
180 oauth2_service_
.reset(new MockOAuth2TokenService
);
181 oauth2_service_
->AddAccount(kAccountId
);
183 new Provider(base::ThreadTaskRunnerHandle::Get(), oauth2_service_
.get());
186 void OAuth2TokenServiceRequestTest::TearDown() {
187 // Run the loop to execute any pending tasks that may free resources.
188 ui_loop_
.RunUntilIdle();
191 OAuth2TokenServiceRequestTest::Provider::Provider(
192 const scoped_refptr
<base::SingleThreadTaskRunner
>& task_runner
,
193 OAuth2TokenService
* token_service
)
194 : task_runner_(task_runner
), token_service_(token_service
) {
197 scoped_refptr
<base::SingleThreadTaskRunner
>
198 OAuth2TokenServiceRequestTest::Provider::GetTokenServiceTaskRunner() {
202 OAuth2TokenService
* OAuth2TokenServiceRequestTest::Provider::GetTokenService() {
203 return token_service_
;
206 OAuth2TokenServiceRequestTest::Provider::~Provider() {
209 TEST_F(OAuth2TokenServiceRequestTest
, CreateAndStart_Failure
) {
210 oauth2_service_
->SetResponse(
211 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE
),
214 scoped_ptr
<OAuth2TokenServiceRequest
> request(
215 OAuth2TokenServiceRequest::CreateAndStart(
216 provider_
.get(), kAccountId
, scopes_
, &consumer_
));
217 ui_loop_
.RunUntilIdle();
218 EXPECT_EQ(0, consumer_
.num_get_token_success_
);
219 EXPECT_EQ(1, consumer_
.num_get_token_failure_
);
220 EXPECT_EQ(GoogleServiceAuthError::SERVICE_UNAVAILABLE
,
221 consumer_
.last_error_
.state());
222 EXPECT_EQ(0, oauth2_service_
->num_invalidate_token());
225 TEST_F(OAuth2TokenServiceRequestTest
, CreateAndStart_Success
) {
226 scoped_ptr
<OAuth2TokenServiceRequest
> request(
227 OAuth2TokenServiceRequest::CreateAndStart(
228 provider_
.get(), kAccountId
, scopes_
, &consumer_
));
229 ui_loop_
.RunUntilIdle();
230 EXPECT_EQ(1, consumer_
.num_get_token_success_
);
231 EXPECT_EQ(0, consumer_
.num_get_token_failure_
);
232 EXPECT_EQ(kAccessToken
, consumer_
.last_token_
);
233 EXPECT_EQ(0, oauth2_service_
->num_invalidate_token());
236 TEST_F(OAuth2TokenServiceRequestTest
,
237 CreateAndStart_DestroyRequestBeforeCompletes
) {
238 scoped_ptr
<OAuth2TokenServiceRequest
> request(
239 OAuth2TokenServiceRequest::CreateAndStart(
240 provider_
.get(), kAccountId
, scopes_
, &consumer_
));
242 ui_loop_
.RunUntilIdle();
243 EXPECT_EQ(0, consumer_
.num_get_token_success_
);
244 EXPECT_EQ(0, consumer_
.num_get_token_failure_
);
245 EXPECT_EQ(0, oauth2_service_
->num_invalidate_token());
248 TEST_F(OAuth2TokenServiceRequestTest
,
249 CreateAndStart_DestroyRequestAfterCompletes
) {
250 scoped_ptr
<OAuth2TokenServiceRequest
> request(
251 OAuth2TokenServiceRequest::CreateAndStart(
252 provider_
.get(), kAccountId
, scopes_
, &consumer_
));
253 ui_loop_
.RunUntilIdle();
255 EXPECT_EQ(1, consumer_
.num_get_token_success_
);
256 EXPECT_EQ(0, consumer_
.num_get_token_failure_
);
257 EXPECT_EQ(kAccessToken
, consumer_
.last_token_
);
258 EXPECT_EQ(0, oauth2_service_
->num_invalidate_token());
261 TEST_F(OAuth2TokenServiceRequestTest
, InvalidateToken
) {
262 OAuth2TokenServiceRequest::InvalidateToken(
263 provider_
.get(), kAccountId
, scopes_
, kAccessToken
);
264 ui_loop_
.RunUntilIdle();
265 EXPECT_EQ(0, consumer_
.num_get_token_success_
);
266 EXPECT_EQ(0, consumer_
.num_get_token_failure_
);
267 EXPECT_EQ(kAccessToken
, oauth2_service_
->last_token_invalidated());
268 EXPECT_EQ(1, oauth2_service_
->num_invalidate_token());