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/threading/thread.h"
13 #include "google_apis/gaia/fake_oauth2_token_service.h"
14 #include "google_apis/gaia/google_service_auth_error.h"
15 #include "google_apis/gaia/oauth2_token_service.h"
16 #include "testing/gtest/include/gtest/gtest.h"
20 const char kAccessToken
[] = "access_token";
21 const char kAccountId
[] = "test_user@gmail.com";
22 const char kScope
[] = "SCOPE";
24 class TestingOAuth2TokenServiceConsumer
: public OAuth2TokenService::Consumer
{
26 TestingOAuth2TokenServiceConsumer();
27 ~TestingOAuth2TokenServiceConsumer() override
;
29 void OnGetTokenSuccess(const OAuth2TokenService::Request
* request
,
30 const std::string
& access_token
,
31 const base::Time
& expiration_time
) override
;
32 void OnGetTokenFailure(const OAuth2TokenService::Request
* request
,
33 const GoogleServiceAuthError
& error
) override
;
35 int num_get_token_success_
;
36 int num_get_token_failure_
;
37 std::string last_token_
;
38 GoogleServiceAuthError last_error_
;
41 TestingOAuth2TokenServiceConsumer::TestingOAuth2TokenServiceConsumer()
42 : OAuth2TokenService::Consumer("test"),
43 num_get_token_success_(0),
44 num_get_token_failure_(0),
45 last_error_(GoogleServiceAuthError::AuthErrorNone()) {
48 TestingOAuth2TokenServiceConsumer::~TestingOAuth2TokenServiceConsumer() {
51 void TestingOAuth2TokenServiceConsumer::OnGetTokenSuccess(
52 const OAuth2TokenService::Request
* request
,
53 const std::string
& token
,
54 const base::Time
& expiration_date
) {
56 ++num_get_token_success_
;
59 void TestingOAuth2TokenServiceConsumer::OnGetTokenFailure(
60 const OAuth2TokenService::Request
* request
,
61 const GoogleServiceAuthError
& error
) {
63 ++num_get_token_failure_
;
66 // A mock implementation of an OAuth2TokenService.
68 // Use SetResponse to vary the response to token requests.
69 class MockOAuth2TokenService
: public FakeOAuth2TokenService
{
71 MockOAuth2TokenService();
72 ~MockOAuth2TokenService() override
;
74 void SetResponse(const GoogleServiceAuthError
& error
,
75 const std::string
& access_token
,
76 const base::Time
& expiration
);
78 int num_invalidate_token() const { return num_invalidate_token_
; }
80 const std::string
& last_token_invalidated() const {
81 return last_token_invalidated_
;
85 void FetchOAuth2Token(RequestImpl
* request
,
86 const std::string
& account_id
,
87 net::URLRequestContextGetter
* getter
,
88 const std::string
& client_id
,
89 const std::string
& client_secret
,
90 const ScopeSet
& scopes
) override
;
92 void InvalidateOAuth2Token(const std::string
& account_id
,
93 const std::string
& client_id
,
94 const ScopeSet
& scopes
,
95 const std::string
& access_token
) override
;
98 GoogleServiceAuthError response_error_
;
99 std::string response_access_token_
;
100 base::Time response_expiration_
;
101 int num_invalidate_token_
;
102 std::string last_token_invalidated_
;
105 MockOAuth2TokenService::MockOAuth2TokenService()
106 : response_error_(GoogleServiceAuthError::AuthErrorNone()),
107 response_access_token_(kAccessToken
),
108 response_expiration_(base::Time::Max()),
109 num_invalidate_token_(0) {
112 MockOAuth2TokenService::~MockOAuth2TokenService() {
115 void MockOAuth2TokenService::SetResponse(const GoogleServiceAuthError
& error
,
116 const std::string
& access_token
,
117 const base::Time
& expiration
) {
118 response_error_
= error
;
119 response_access_token_
= access_token
;
120 response_expiration_
= expiration
;
123 void MockOAuth2TokenService::FetchOAuth2Token(
124 RequestImpl
* request
,
125 const std::string
& account_id
,
126 net::URLRequestContextGetter
* getter
,
127 const std::string
& client_id
,
128 const std::string
& client_secret
,
129 const ScopeSet
& scopes
) {
130 base::MessageLoop::current()->PostTask(
132 base::Bind(&OAuth2TokenService::RequestImpl::InformConsumer
,
133 request
->AsWeakPtr(),
135 response_access_token_
,
136 response_expiration_
));
139 void MockOAuth2TokenService::InvalidateOAuth2Token(
140 const std::string
& account_id
,
141 const std::string
& client_id
,
142 const ScopeSet
& scopes
,
143 const std::string
& access_token
) {
144 ++num_invalidate_token_
;
145 last_token_invalidated_
= access_token
;
148 class OAuth2TokenServiceRequestTest
: public testing::Test
{
150 void SetUp() override
;
151 void TearDown() override
;
154 class Provider
: public OAuth2TokenServiceRequest::TokenServiceProvider
{
156 Provider(const scoped_refptr
<base::SingleThreadTaskRunner
>& task_runner
,
157 OAuth2TokenService
* token_service
);
159 scoped_refptr
<base::SingleThreadTaskRunner
> GetTokenServiceTaskRunner()
161 OAuth2TokenService
* GetTokenService() override
;
164 ~Provider() override
;
166 scoped_refptr
<base::SingleThreadTaskRunner
> task_runner_
;
167 OAuth2TokenService
* token_service_
;
170 base::MessageLoop ui_loop_
;
171 OAuth2TokenService::ScopeSet scopes_
;
172 scoped_ptr
<MockOAuth2TokenService
> oauth2_service_
;
173 scoped_refptr
<OAuth2TokenServiceRequest::TokenServiceProvider
> provider_
;
174 TestingOAuth2TokenServiceConsumer consumer_
;
177 void OAuth2TokenServiceRequestTest::SetUp() {
178 scopes_
.insert(kScope
);
179 oauth2_service_
.reset(new MockOAuth2TokenService
);
180 oauth2_service_
->AddAccount(kAccountId
);
182 new Provider(base::MessageLoopProxy::current(), oauth2_service_
.get());
185 void OAuth2TokenServiceRequestTest::TearDown() {
186 // Run the loop to execute any pending tasks that may free resources.
187 ui_loop_
.RunUntilIdle();
190 OAuth2TokenServiceRequestTest::Provider::Provider(
191 const scoped_refptr
<base::SingleThreadTaskRunner
>& task_runner
,
192 OAuth2TokenService
* token_service
)
193 : task_runner_(task_runner
), token_service_(token_service
) {
196 scoped_refptr
<base::SingleThreadTaskRunner
>
197 OAuth2TokenServiceRequestTest::Provider::GetTokenServiceTaskRunner() {
201 OAuth2TokenService
* OAuth2TokenServiceRequestTest::Provider::GetTokenService() {
202 return token_service_
;
205 OAuth2TokenServiceRequestTest::Provider::~Provider() {
208 TEST_F(OAuth2TokenServiceRequestTest
, CreateAndStart_Failure
) {
209 oauth2_service_
->SetResponse(
210 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE
),
213 scoped_ptr
<OAuth2TokenServiceRequest
> request(
214 OAuth2TokenServiceRequest::CreateAndStart(
215 provider_
.get(), kAccountId
, scopes_
, &consumer_
));
216 ui_loop_
.RunUntilIdle();
217 EXPECT_EQ(0, consumer_
.num_get_token_success_
);
218 EXPECT_EQ(1, consumer_
.num_get_token_failure_
);
219 EXPECT_EQ(GoogleServiceAuthError::SERVICE_UNAVAILABLE
,
220 consumer_
.last_error_
.state());
221 EXPECT_EQ(0, oauth2_service_
->num_invalidate_token());
224 TEST_F(OAuth2TokenServiceRequestTest
, CreateAndStart_Success
) {
225 scoped_ptr
<OAuth2TokenServiceRequest
> request(
226 OAuth2TokenServiceRequest::CreateAndStart(
227 provider_
.get(), kAccountId
, scopes_
, &consumer_
));
228 ui_loop_
.RunUntilIdle();
229 EXPECT_EQ(1, consumer_
.num_get_token_success_
);
230 EXPECT_EQ(0, consumer_
.num_get_token_failure_
);
231 EXPECT_EQ(kAccessToken
, consumer_
.last_token_
);
232 EXPECT_EQ(0, oauth2_service_
->num_invalidate_token());
235 TEST_F(OAuth2TokenServiceRequestTest
,
236 CreateAndStart_DestroyRequestBeforeCompletes
) {
237 scoped_ptr
<OAuth2TokenServiceRequest
> request(
238 OAuth2TokenServiceRequest::CreateAndStart(
239 provider_
.get(), kAccountId
, scopes_
, &consumer_
));
241 ui_loop_
.RunUntilIdle();
242 EXPECT_EQ(0, consumer_
.num_get_token_success_
);
243 EXPECT_EQ(0, consumer_
.num_get_token_failure_
);
244 EXPECT_EQ(0, oauth2_service_
->num_invalidate_token());
247 TEST_F(OAuth2TokenServiceRequestTest
,
248 CreateAndStart_DestroyRequestAfterCompletes
) {
249 scoped_ptr
<OAuth2TokenServiceRequest
> request(
250 OAuth2TokenServiceRequest::CreateAndStart(
251 provider_
.get(), kAccountId
, scopes_
, &consumer_
));
252 ui_loop_
.RunUntilIdle();
254 EXPECT_EQ(1, consumer_
.num_get_token_success_
);
255 EXPECT_EQ(0, consumer_
.num_get_token_failure_
);
256 EXPECT_EQ(kAccessToken
, consumer_
.last_token_
);
257 EXPECT_EQ(0, oauth2_service_
->num_invalidate_token());
260 TEST_F(OAuth2TokenServiceRequestTest
, InvalidateToken
) {
261 OAuth2TokenServiceRequest::InvalidateToken(
262 provider_
.get(), kAccountId
, scopes_
, kAccessToken
);
263 ui_loop_
.RunUntilIdle();
264 EXPECT_EQ(0, consumer_
.num_get_token_success_
);
265 EXPECT_EQ(0, consumer_
.num_get_token_failure_
);
266 EXPECT_EQ(kAccessToken
, oauth2_service_
->last_token_invalidated());
267 EXPECT_EQ(1, oauth2_service_
->num_invalidate_token());