1 // Copyright 2013 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.
7 #include "base/message_loop/message_loop.h"
8 #include "base/run_loop.h"
9 #include "google_apis/gaia/gaia_constants.h"
10 #include "google_apis/gaia/google_service_auth_error.h"
11 #include "google_apis/gaia/oauth2_access_token_consumer.h"
12 #include "google_apis/gaia/oauth2_access_token_fetcher_impl.h"
13 #include "google_apis/gaia/oauth2_token_service.h"
14 #include "google_apis/gaia/oauth2_token_service_test_util.h"
15 #include "net/http/http_status_code.h"
16 #include "net/url_request/test_url_fetcher_factory.h"
17 #include "net/url_request/url_fetcher_delegate.h"
18 #include "net/url_request/url_request_test_util.h"
19 #include "testing/gtest/include/gtest/gtest.h"
21 // A testing consumer that retries on error.
22 class RetryingTestingOAuth2TokenServiceConsumer
23 : public TestingOAuth2TokenServiceConsumer
{
25 RetryingTestingOAuth2TokenServiceConsumer(
26 OAuth2TokenService
* oauth2_service
,
27 const std::string
& account_id
)
28 : oauth2_service_(oauth2_service
),
29 account_id_(account_id
) {}
30 ~RetryingTestingOAuth2TokenServiceConsumer() override
{}
32 void OnGetTokenFailure(const OAuth2TokenService::Request
* request
,
33 const GoogleServiceAuthError
& error
) override
{
34 TestingOAuth2TokenServiceConsumer::OnGetTokenFailure(request
, error
);
35 request_
.reset(oauth2_service_
->StartRequest(
36 account_id_
, OAuth2TokenService::ScopeSet(), this).release());
39 OAuth2TokenService
* oauth2_service_
;
40 std::string account_id_
;
41 scoped_ptr
<OAuth2TokenService::Request
> request_
;
44 class TestOAuth2TokenService
: public OAuth2TokenService
{
46 explicit TestOAuth2TokenService(net::TestURLRequestContextGetter
* getter
)
47 : request_context_getter_(getter
) {
50 void CancelAllRequestsForTest() { CancelAllRequests(); }
52 void CancelRequestsForAccountForTest(const std::string
& account_id
) {
53 CancelRequestsForAccount(account_id
);
56 // For testing: set the refresh token to be used.
57 void set_refresh_token(const std::string
& account_id
,
58 const std::string
& refresh_token
) {
59 if (refresh_token
.empty())
60 refresh_tokens_
.erase(account_id
);
62 refresh_tokens_
[account_id
] = refresh_token
;
65 bool RefreshTokenIsAvailable(const std::string
& account_id
) const override
{
66 std::map
<std::string
, std::string
>::const_iterator it
=
67 refresh_tokens_
.find(account_id
);
69 return it
!= refresh_tokens_
.end();
73 // OAuth2TokenService implementation.
74 net::URLRequestContextGetter
* GetRequestContext() override
{
75 return request_context_getter_
.get();
78 OAuth2AccessTokenFetcher
* CreateAccessTokenFetcher(
79 const std::string
& account_id
,
80 net::URLRequestContextGetter
* getter
,
81 OAuth2AccessTokenConsumer
* consumer
) override
{
82 std::map
<std::string
, std::string
>::const_iterator it
=
83 refresh_tokens_
.find(account_id
);
84 DCHECK(it
!= refresh_tokens_
.end());
85 std::string
refresh_token(it
->second
);
86 return new OAuth2AccessTokenFetcherImpl(consumer
, getter
, refresh_token
);
89 std::map
<std::string
, std::string
> refresh_tokens_
;
90 scoped_refptr
<net::TestURLRequestContextGetter
> request_context_getter_
;
93 class OAuth2TokenServiceTest
: public testing::Test
{
95 void SetUp() override
{
96 oauth2_service_
.reset(
97 new TestOAuth2TokenService(new net::TestURLRequestContextGetter(
98 message_loop_
.message_loop_proxy())));
99 account_id_
= "test_user@gmail.com";
102 void TearDown() override
{
103 // Makes sure that all the clean up tasks are run.
104 base::RunLoop().RunUntilIdle();
108 base::MessageLoopForIO message_loop_
; // net:: stuff needs IO message loop.
109 net::TestURLFetcherFactory factory_
;
110 scoped_ptr
<TestOAuth2TokenService
> oauth2_service_
;
111 std::string account_id_
;
112 TestingOAuth2TokenServiceConsumer consumer_
;
115 TEST_F(OAuth2TokenServiceTest
, NoOAuth2RefreshToken
) {
116 scoped_ptr
<OAuth2TokenService::Request
> request(
117 oauth2_service_
->StartRequest(account_id_
, OAuth2TokenService::ScopeSet(),
119 base::RunLoop().RunUntilIdle();
121 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
122 EXPECT_EQ(1, consumer_
.number_of_errors_
);
125 TEST_F(OAuth2TokenServiceTest
, FailureShouldNotRetry
) {
126 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
127 scoped_ptr
<OAuth2TokenService::Request
> request(
128 oauth2_service_
->StartRequest(account_id_
,
129 OAuth2TokenService::ScopeSet(),
131 base::RunLoop().RunUntilIdle();
133 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
134 EXPECT_EQ(0, consumer_
.number_of_errors_
);
135 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
136 ASSERT_TRUE(fetcher
);
137 fetcher
->set_response_code(net::HTTP_UNAUTHORIZED
);
138 fetcher
->SetResponseString(std::string());
139 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
140 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
141 EXPECT_EQ(1, consumer_
.number_of_errors_
);
142 EXPECT_EQ(fetcher
, factory_
.GetFetcherByID(0));
145 TEST_F(OAuth2TokenServiceTest
, SuccessWithoutCaching
) {
146 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
147 scoped_ptr
<OAuth2TokenService::Request
> request(
148 oauth2_service_
->StartRequest(account_id_
,
149 OAuth2TokenService::ScopeSet(),
151 base::RunLoop().RunUntilIdle();
153 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
154 EXPECT_EQ(0, consumer_
.number_of_errors_
);
155 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
156 ASSERT_TRUE(fetcher
);
157 fetcher
->set_response_code(net::HTTP_OK
);
158 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
159 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
160 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
161 EXPECT_EQ(0, consumer_
.number_of_errors_
);
162 EXPECT_EQ("token", consumer_
.last_token_
);
165 TEST_F(OAuth2TokenServiceTest
, SuccessWithCaching
) {
166 OAuth2TokenService::ScopeSet scopes1
;
167 scopes1
.insert("s1");
168 scopes1
.insert("s2");
169 OAuth2TokenService::ScopeSet scopes1_same
;
170 scopes1_same
.insert("s2");
171 scopes1_same
.insert("s1");
172 OAuth2TokenService::ScopeSet scopes2
;
173 scopes2
.insert("s3");
175 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
178 scoped_ptr
<OAuth2TokenService::Request
> request(
179 oauth2_service_
->StartRequest(account_id_
, scopes1
, &consumer_
));
180 base::RunLoop().RunUntilIdle();
182 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
183 EXPECT_EQ(0, consumer_
.number_of_errors_
);
184 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
185 ASSERT_TRUE(fetcher
);
186 fetcher
->set_response_code(net::HTTP_OK
);
187 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
188 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
189 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
190 EXPECT_EQ(0, consumer_
.number_of_errors_
);
191 EXPECT_EQ("token", consumer_
.last_token_
);
193 // Second request to the same set of scopes, should return the same token
194 // without needing a network request.
195 scoped_ptr
<OAuth2TokenService::Request
> request2(
196 oauth2_service_
->StartRequest(account_id_
, scopes1_same
, &consumer_
));
197 base::RunLoop().RunUntilIdle();
199 // No new network fetcher.
200 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
201 EXPECT_EQ(0, consumer_
.number_of_errors_
);
202 EXPECT_EQ("token", consumer_
.last_token_
);
204 // Third request to a new set of scopes, should return another token.
205 scoped_ptr
<OAuth2TokenService::Request
> request3(
206 oauth2_service_
->StartRequest(account_id_
, scopes2
, &consumer_
));
207 base::RunLoop().RunUntilIdle();
208 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
209 EXPECT_EQ(0, consumer_
.number_of_errors_
);
210 fetcher
= factory_
.GetFetcherByID(0);
211 ASSERT_TRUE(fetcher
);
212 fetcher
->set_response_code(net::HTTP_OK
);
213 fetcher
->SetResponseString(GetValidTokenResponse("token2", 3600));
214 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
215 EXPECT_EQ(3, consumer_
.number_of_successful_tokens_
);
216 EXPECT_EQ(0, consumer_
.number_of_errors_
);
217 EXPECT_EQ("token2", consumer_
.last_token_
);
220 TEST_F(OAuth2TokenServiceTest
, SuccessAndExpirationAndFailure
) {
221 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
224 scoped_ptr
<OAuth2TokenService::Request
> request(
225 oauth2_service_
->StartRequest(account_id_
,
226 OAuth2TokenService::ScopeSet(),
228 base::RunLoop().RunUntilIdle();
229 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
230 EXPECT_EQ(0, consumer_
.number_of_errors_
);
231 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
232 ASSERT_TRUE(fetcher
);
233 fetcher
->set_response_code(net::HTTP_OK
);
234 fetcher
->SetResponseString(GetValidTokenResponse("token", 0));
235 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
236 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
237 EXPECT_EQ(0, consumer_
.number_of_errors_
);
238 EXPECT_EQ("token", consumer_
.last_token_
);
240 // Second request must try to access the network as the token has expired.
241 scoped_ptr
<OAuth2TokenService::Request
> request2(
242 oauth2_service_
->StartRequest(account_id_
,
243 OAuth2TokenService::ScopeSet(),
245 base::RunLoop().RunUntilIdle();
246 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
247 EXPECT_EQ(0, consumer_
.number_of_errors_
);
250 fetcher
= factory_
.GetFetcherByID(0);
251 ASSERT_TRUE(fetcher
);
252 fetcher
->set_response_code(net::HTTP_UNAUTHORIZED
);
253 fetcher
->SetResponseString(std::string());
254 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
255 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
256 EXPECT_EQ(1, consumer_
.number_of_errors_
);
259 TEST_F(OAuth2TokenServiceTest
, SuccessAndExpirationAndSuccess
) {
260 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
263 scoped_ptr
<OAuth2TokenService::Request
> request(
264 oauth2_service_
->StartRequest(account_id_
,
265 OAuth2TokenService::ScopeSet(),
267 base::RunLoop().RunUntilIdle();
268 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
269 EXPECT_EQ(0, consumer_
.number_of_errors_
);
270 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
271 ASSERT_TRUE(fetcher
);
272 fetcher
->set_response_code(net::HTTP_OK
);
273 fetcher
->SetResponseString(GetValidTokenResponse("token", 0));
274 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
275 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
276 EXPECT_EQ(0, consumer_
.number_of_errors_
);
277 EXPECT_EQ("token", consumer_
.last_token_
);
279 // Second request must try to access the network as the token has expired.
280 scoped_ptr
<OAuth2TokenService::Request
> request2(
281 oauth2_service_
->StartRequest(account_id_
,
282 OAuth2TokenService::ScopeSet(),
284 base::RunLoop().RunUntilIdle();
285 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
286 EXPECT_EQ(0, consumer_
.number_of_errors_
);
288 fetcher
= factory_
.GetFetcherByID(0);
289 ASSERT_TRUE(fetcher
);
290 fetcher
->set_response_code(net::HTTP_OK
);
291 fetcher
->SetResponseString(GetValidTokenResponse("another token", 0));
292 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
293 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
294 EXPECT_EQ(0, consumer_
.number_of_errors_
);
295 EXPECT_EQ("another token", consumer_
.last_token_
);
298 TEST_F(OAuth2TokenServiceTest
, RequestDeletedBeforeCompletion
) {
299 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
301 scoped_ptr
<OAuth2TokenService::Request
> request(
302 oauth2_service_
->StartRequest(account_id_
,
303 OAuth2TokenService::ScopeSet(),
305 base::RunLoop().RunUntilIdle();
306 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
307 EXPECT_EQ(0, consumer_
.number_of_errors_
);
308 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
309 ASSERT_TRUE(fetcher
);
313 fetcher
->set_response_code(net::HTTP_OK
);
314 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
315 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
316 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
317 EXPECT_EQ(0, consumer_
.number_of_errors_
);
320 TEST_F(OAuth2TokenServiceTest
, RequestDeletedAfterCompletion
) {
321 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
323 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
324 account_id_
, OAuth2TokenService::ScopeSet(), &consumer_
));
325 base::RunLoop().RunUntilIdle();
326 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
327 ASSERT_TRUE(fetcher
);
328 fetcher
->set_response_code(net::HTTP_OK
);
329 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
330 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
331 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
332 EXPECT_EQ(0, consumer_
.number_of_errors_
);
333 EXPECT_EQ("token", consumer_
.last_token_
);
337 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
338 EXPECT_EQ(0, consumer_
.number_of_errors_
);
339 EXPECT_EQ("token", consumer_
.last_token_
);
342 TEST_F(OAuth2TokenServiceTest
, MultipleRequestsForTheSameScopesWithOneDeleted
) {
343 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
345 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
346 account_id_
, OAuth2TokenService::ScopeSet(), &consumer_
));
347 base::RunLoop().RunUntilIdle();
348 scoped_ptr
<OAuth2TokenService::Request
> request2(
349 oauth2_service_
->StartRequest(account_id_
, OAuth2TokenService::ScopeSet(),
351 base::RunLoop().RunUntilIdle();
355 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
356 ASSERT_TRUE(fetcher
);
357 fetcher
->set_response_code(net::HTTP_OK
);
358 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
359 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
360 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
361 EXPECT_EQ(0, consumer_
.number_of_errors_
);
364 TEST_F(OAuth2TokenServiceTest
, ClearedRefreshTokenFailsSubsequentRequests
) {
365 // We have a valid refresh token; the first request is successful.
366 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
367 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
368 account_id_
, OAuth2TokenService::ScopeSet(), &consumer_
));
369 base::RunLoop().RunUntilIdle();
370 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
371 ASSERT_TRUE(fetcher
);
372 fetcher
->set_response_code(net::HTTP_OK
);
373 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
374 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
375 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
376 EXPECT_EQ(0, consumer_
.number_of_errors_
);
377 EXPECT_EQ("token", consumer_
.last_token_
);
379 // The refresh token is no longer available; subsequent requests fail.
380 oauth2_service_
->set_refresh_token(account_id_
, "");
381 request
= oauth2_service_
->StartRequest(account_id_
,
382 OAuth2TokenService::ScopeSet(), &consumer_
);
383 base::RunLoop().RunUntilIdle();
384 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
385 EXPECT_EQ(1, consumer_
.number_of_errors_
);
388 TEST_F(OAuth2TokenServiceTest
,
389 ChangedRefreshTokenDoesNotAffectInFlightRequests
) {
390 oauth2_service_
->set_refresh_token(account_id_
, "first refreshToken");
391 OAuth2TokenService::ScopeSet scopes
;
394 OAuth2TokenService::ScopeSet scopes1
;
398 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
399 account_id_
, scopes
, &consumer_
));
400 base::RunLoop().RunUntilIdle();
401 net::TestURLFetcher
* fetcher1
= factory_
.GetFetcherByID(0);
402 ASSERT_TRUE(fetcher1
);
404 // Note |request| is still pending when the refresh token changes.
405 oauth2_service_
->set_refresh_token(account_id_
, "second refreshToken");
407 // A 2nd request (using the new refresh token) that occurs and completes
408 // while the 1st request is in flight is successful.
409 TestingOAuth2TokenServiceConsumer consumer2
;
410 scoped_ptr
<OAuth2TokenService::Request
> request2(
411 oauth2_service_
->StartRequest(account_id_
, scopes1
, &consumer2
));
412 base::RunLoop().RunUntilIdle();
414 net::TestURLFetcher
* fetcher2
= factory_
.GetFetcherByID(0);
415 fetcher2
->set_response_code(net::HTTP_OK
);
416 fetcher2
->SetResponseString(GetValidTokenResponse("second token", 3600));
417 fetcher2
->delegate()->OnURLFetchComplete(fetcher2
);
418 EXPECT_EQ(1, consumer2
.number_of_successful_tokens_
);
419 EXPECT_EQ(0, consumer2
.number_of_errors_
);
420 EXPECT_EQ("second token", consumer2
.last_token_
);
422 fetcher1
->set_response_code(net::HTTP_OK
);
423 fetcher1
->SetResponseString(GetValidTokenResponse("first token", 3600));
424 fetcher1
->delegate()->OnURLFetchComplete(fetcher1
);
425 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
426 EXPECT_EQ(0, consumer_
.number_of_errors_
);
427 EXPECT_EQ("first token", consumer_
.last_token_
);
430 TEST_F(OAuth2TokenServiceTest
, ServiceShutDownBeforeFetchComplete
) {
431 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
432 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
433 account_id_
, OAuth2TokenService::ScopeSet(), &consumer_
));
434 base::RunLoop().RunUntilIdle();
435 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
436 EXPECT_EQ(0, consumer_
.number_of_errors_
);
438 // The destructor should cancel all in-flight fetchers.
439 oauth2_service_
.reset(NULL
);
441 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
442 EXPECT_EQ(1, consumer_
.number_of_errors_
);
445 TEST_F(OAuth2TokenServiceTest
, RetryingConsumer
) {
446 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
447 RetryingTestingOAuth2TokenServiceConsumer
consumer(oauth2_service_
.get(),
449 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
450 account_id_
, OAuth2TokenService::ScopeSet(), &consumer
));
451 base::RunLoop().RunUntilIdle();
452 EXPECT_EQ(0, consumer
.number_of_successful_tokens_
);
453 EXPECT_EQ(0, consumer
.number_of_errors_
);
455 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
456 ASSERT_TRUE(fetcher
);
457 fetcher
->set_response_code(net::HTTP_UNAUTHORIZED
);
458 fetcher
->SetResponseString(std::string());
459 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
460 EXPECT_EQ(0, consumer
.number_of_successful_tokens_
);
461 EXPECT_EQ(1, consumer
.number_of_errors_
);
463 fetcher
= factory_
.GetFetcherByID(0);
464 ASSERT_TRUE(fetcher
);
465 fetcher
->set_response_code(net::HTTP_UNAUTHORIZED
);
466 fetcher
->SetResponseString(std::string());
467 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
468 EXPECT_EQ(0, consumer
.number_of_successful_tokens_
);
469 EXPECT_EQ(2, consumer
.number_of_errors_
);
472 TEST_F(OAuth2TokenServiceTest
, InvalidateToken
) {
473 OAuth2TokenService::ScopeSet scopes
;
474 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
477 scoped_ptr
<OAuth2TokenService::Request
> request(
478 oauth2_service_
->StartRequest(account_id_
, scopes
, &consumer_
));
479 base::RunLoop().RunUntilIdle();
481 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
482 EXPECT_EQ(0, consumer_
.number_of_errors_
);
483 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
484 ASSERT_TRUE(fetcher
);
485 fetcher
->set_response_code(net::HTTP_OK
);
486 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
487 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
488 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
489 EXPECT_EQ(0, consumer_
.number_of_errors_
);
490 EXPECT_EQ("token", consumer_
.last_token_
);
492 // Second request, should return the same token without needing a network
494 scoped_ptr
<OAuth2TokenService::Request
> request2(
495 oauth2_service_
->StartRequest(account_id_
, scopes
, &consumer_
));
496 base::RunLoop().RunUntilIdle();
498 // No new network fetcher.
499 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
500 EXPECT_EQ(0, consumer_
.number_of_errors_
);
501 EXPECT_EQ("token", consumer_
.last_token_
);
503 // Invalidating the token should return a new token on the next request.
504 oauth2_service_
->InvalidateToken(account_id_
, scopes
, consumer_
.last_token_
);
505 scoped_ptr
<OAuth2TokenService::Request
> request3(
506 oauth2_service_
->StartRequest(account_id_
, scopes
, &consumer_
));
507 base::RunLoop().RunUntilIdle();
508 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
509 EXPECT_EQ(0, consumer_
.number_of_errors_
);
510 fetcher
= factory_
.GetFetcherByID(0);
511 ASSERT_TRUE(fetcher
);
512 fetcher
->set_response_code(net::HTTP_OK
);
513 fetcher
->SetResponseString(GetValidTokenResponse("token2", 3600));
514 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
515 EXPECT_EQ(3, consumer_
.number_of_successful_tokens_
);
516 EXPECT_EQ(0, consumer_
.number_of_errors_
);
517 EXPECT_EQ("token2", consumer_
.last_token_
);
520 TEST_F(OAuth2TokenServiceTest
, CancelAllRequests
) {
521 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
522 scoped_ptr
<OAuth2TokenService::Request
> request(
523 oauth2_service_
->StartRequest(account_id_
, OAuth2TokenService::ScopeSet(),
526 oauth2_service_
->set_refresh_token("account_id_2", "refreshToken2");
527 scoped_ptr
<OAuth2TokenService::Request
> request2(
528 oauth2_service_
->StartRequest(account_id_
, OAuth2TokenService::ScopeSet(),
531 base::RunLoop().RunUntilIdle();
532 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
533 EXPECT_EQ(0, consumer_
.number_of_errors_
);
535 oauth2_service_
->CancelAllRequestsForTest();
537 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
538 EXPECT_EQ(2, consumer_
.number_of_errors_
);
541 TEST_F(OAuth2TokenServiceTest
, CancelRequestsForAccount
) {
542 OAuth2TokenService::ScopeSet scope_set_1
;
543 scope_set_1
.insert("scope1");
544 scope_set_1
.insert("scope2");
545 OAuth2TokenService::ScopeSet
scope_set_2(scope_set_1
.begin(),
547 scope_set_2
.insert("scope3");
549 oauth2_service_
->set_refresh_token(account_id_
, "refreshToken");
550 scoped_ptr
<OAuth2TokenService::Request
> request1(
551 oauth2_service_
->StartRequest(account_id_
, scope_set_1
, &consumer_
));
552 scoped_ptr
<OAuth2TokenService::Request
> request2(
553 oauth2_service_
->StartRequest(account_id_
, scope_set_2
, &consumer_
));
555 std::string
account_id_2("account_id_2");
556 oauth2_service_
->set_refresh_token(account_id_2
, "refreshToken2");
557 scoped_ptr
<OAuth2TokenService::Request
> request3(
558 oauth2_service_
->StartRequest(account_id_2
, scope_set_1
, &consumer_
));
560 base::RunLoop().RunUntilIdle();
561 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
562 EXPECT_EQ(0, consumer_
.number_of_errors_
);
564 oauth2_service_
->CancelRequestsForAccountForTest(account_id_
);
566 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
567 EXPECT_EQ(2, consumer_
.number_of_errors_
);
569 oauth2_service_
->CancelRequestsForAccountForTest(account_id_2
);
571 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
572 EXPECT_EQ(3, consumer_
.number_of_errors_
);
575 TEST_F(OAuth2TokenServiceTest
, SameScopesRequestedForDifferentClients
) {
576 std::string
client_id_1("client1");
577 std::string
client_secret_1("secret1");
578 std::string
client_id_2("client2");
579 std::string
client_secret_2("secret2");
580 std::set
<std::string
> scope_set
;
581 scope_set
.insert("scope1");
582 scope_set
.insert("scope2");
584 std::string
refresh_token("refreshToken");
585 oauth2_service_
->set_refresh_token(account_id_
, refresh_token
);
587 scoped_ptr
<OAuth2TokenService::Request
> request1(
588 oauth2_service_
->StartRequestForClient(account_id_
,
593 scoped_ptr
<OAuth2TokenService::Request
> request2(
594 oauth2_service_
->StartRequestForClient(account_id_
,
599 // Start a request that should be duplicate of |request1|.
600 scoped_ptr
<OAuth2TokenService::Request
> request3(
601 oauth2_service_
->StartRequestForClient(account_id_
,
606 base::RunLoop().RunUntilIdle();
609 oauth2_service_
->GetNumPendingRequestsForTesting(
614 oauth2_service_
->GetNumPendingRequestsForTesting(
620 TEST_F(OAuth2TokenServiceTest
, RequestParametersOrderTest
) {
621 OAuth2TokenService::ScopeSet set_0
;
622 OAuth2TokenService::ScopeSet set_1
;
625 OAuth2TokenService::RequestParameters params
[] = {
626 OAuth2TokenService::RequestParameters("0", "0", set_0
),
627 OAuth2TokenService::RequestParameters("0", "0", set_1
),
628 OAuth2TokenService::RequestParameters("0", "1", set_0
),
629 OAuth2TokenService::RequestParameters("0", "1", set_1
),
630 OAuth2TokenService::RequestParameters("1", "0", set_0
),
631 OAuth2TokenService::RequestParameters("1", "0", set_1
),
632 OAuth2TokenService::RequestParameters("1", "1", set_0
),
633 OAuth2TokenService::RequestParameters("1", "1", set_1
),
636 for (size_t i
= 0; i
< arraysize(params
); i
++) {
637 for (size_t j
= 0; j
< arraysize(params
); j
++) {
639 EXPECT_FALSE(params
[i
] < params
[j
]) << " i=" << i
<< ", j=" << j
;
640 EXPECT_FALSE(params
[j
] < params
[i
]) << " i=" << i
<< ", j=" << j
;
642 EXPECT_TRUE(params
[i
] < params
[j
]) << " i=" << i
<< ", j=" << j
;
643 EXPECT_FALSE(params
[j
] < params
[i
]) << " i=" << i
<< ", j=" << j
;
645 EXPECT_TRUE(params
[j
] < params
[i
]) << " i=" << i
<< ", j=" << j
;
646 EXPECT_FALSE(params
[i
] < params
[j
]) << " i=" << i
<< ", j=" << j
;