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/fake_oauth2_token_service_delegate.h"
10 #include "google_apis/gaia/gaia_constants.h"
11 #include "google_apis/gaia/google_service_auth_error.h"
12 #include "google_apis/gaia/oauth2_access_token_consumer.h"
13 #include "google_apis/gaia/oauth2_access_token_fetcher_impl.h"
14 #include "google_apis/gaia/oauth2_token_service.h"
15 #include "google_apis/gaia/oauth2_token_service_test_util.h"
16 #include "net/http/http_status_code.h"
17 #include "net/url_request/test_url_fetcher_factory.h"
18 #include "net/url_request/url_fetcher_delegate.h"
19 #include "net/url_request/url_request_test_util.h"
20 #include "testing/gtest/include/gtest/gtest.h"
22 // A testing consumer that retries on error.
23 class RetryingTestingOAuth2TokenServiceConsumer
24 : public TestingOAuth2TokenServiceConsumer
{
26 RetryingTestingOAuth2TokenServiceConsumer(
27 OAuth2TokenService
* oauth2_service
,
28 const std::string
& account_id
)
29 : oauth2_service_(oauth2_service
),
30 account_id_(account_id
) {}
31 ~RetryingTestingOAuth2TokenServiceConsumer() override
{}
33 void OnGetTokenFailure(const OAuth2TokenService::Request
* request
,
34 const GoogleServiceAuthError
& error
) override
{
35 TestingOAuth2TokenServiceConsumer::OnGetTokenFailure(request
, error
);
36 request_
.reset(oauth2_service_
->StartRequest(
37 account_id_
, OAuth2TokenService::ScopeSet(), this).release());
40 OAuth2TokenService
* oauth2_service_
;
41 std::string account_id_
;
42 scoped_ptr
<OAuth2TokenService::Request
> request_
;
45 class TestOAuth2TokenService
: public OAuth2TokenService
{
47 explicit TestOAuth2TokenService(FakeOAuth2TokenServiceDelegate
* delegate
)
48 : OAuth2TokenService(delegate
) {}
50 void CancelAllRequestsForTest() { CancelAllRequests(); }
52 void CancelRequestsForAccountForTest(const std::string
& account_id
) {
53 CancelRequestsForAccount(account_id
);
56 FakeOAuth2TokenServiceDelegate
* GetFakeOAuth2TokenServiceDelegate() {
57 return static_cast<FakeOAuth2TokenServiceDelegate
*>(GetDelegate());
61 class OAuth2TokenServiceTest
: public testing::Test
{
63 void SetUp() override
{
64 oauth2_service_
.reset(new TestOAuth2TokenService(
65 new FakeOAuth2TokenServiceDelegate(new net::TestURLRequestContextGetter(
66 message_loop_
.task_runner()))));
67 account_id_
= "test_user@gmail.com";
70 void TearDown() override
{
71 // Makes sure that all the clean up tasks are run.
72 base::RunLoop().RunUntilIdle();
76 base::MessageLoopForIO message_loop_
; // net:: stuff needs IO message loop.
77 net::TestURLFetcherFactory factory_
;
78 scoped_ptr
<TestOAuth2TokenService
> oauth2_service_
;
79 std::string account_id_
;
80 TestingOAuth2TokenServiceConsumer consumer_
;
83 TEST_F(OAuth2TokenServiceTest
, NoOAuth2RefreshToken
) {
84 scoped_ptr
<OAuth2TokenService::Request
> request(
85 oauth2_service_
->StartRequest(account_id_
, OAuth2TokenService::ScopeSet(),
87 base::RunLoop().RunUntilIdle();
89 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
90 EXPECT_EQ(1, consumer_
.number_of_errors_
);
93 TEST_F(OAuth2TokenServiceTest
, FailureShouldNotRetry
) {
94 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
95 account_id_
, "refreshToken");
96 scoped_ptr
<OAuth2TokenService::Request
> request(
97 oauth2_service_
->StartRequest(account_id_
,
98 OAuth2TokenService::ScopeSet(),
100 base::RunLoop().RunUntilIdle();
102 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
103 EXPECT_EQ(0, consumer_
.number_of_errors_
);
104 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
105 ASSERT_TRUE(fetcher
);
106 fetcher
->set_response_code(net::HTTP_UNAUTHORIZED
);
107 fetcher
->SetResponseString(std::string());
108 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
109 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
110 EXPECT_EQ(1, consumer_
.number_of_errors_
);
111 EXPECT_EQ(fetcher
, factory_
.GetFetcherByID(0));
114 TEST_F(OAuth2TokenServiceTest
, SuccessWithoutCaching
) {
115 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
116 account_id_
, "refreshToken");
117 scoped_ptr
<OAuth2TokenService::Request
> request(
118 oauth2_service_
->StartRequest(account_id_
,
119 OAuth2TokenService::ScopeSet(),
121 base::RunLoop().RunUntilIdle();
123 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
124 EXPECT_EQ(0, consumer_
.number_of_errors_
);
125 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
126 ASSERT_TRUE(fetcher
);
127 fetcher
->set_response_code(net::HTTP_OK
);
128 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
129 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
130 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
131 EXPECT_EQ(0, consumer_
.number_of_errors_
);
132 EXPECT_EQ("token", consumer_
.last_token_
);
135 TEST_F(OAuth2TokenServiceTest
, SuccessWithCaching
) {
136 OAuth2TokenService::ScopeSet scopes1
;
137 scopes1
.insert("s1");
138 scopes1
.insert("s2");
139 OAuth2TokenService::ScopeSet scopes1_same
;
140 scopes1_same
.insert("s2");
141 scopes1_same
.insert("s1");
142 OAuth2TokenService::ScopeSet scopes2
;
143 scopes2
.insert("s3");
145 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
146 account_id_
, "refreshToken");
149 scoped_ptr
<OAuth2TokenService::Request
> request(
150 oauth2_service_
->StartRequest(account_id_
, scopes1
, &consumer_
));
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_
);
164 // Second request to the same set of scopes, should return the same token
165 // without needing a network request.
166 scoped_ptr
<OAuth2TokenService::Request
> request2(
167 oauth2_service_
->StartRequest(account_id_
, scopes1_same
, &consumer_
));
168 base::RunLoop().RunUntilIdle();
170 // No new network fetcher.
171 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
172 EXPECT_EQ(0, consumer_
.number_of_errors_
);
173 EXPECT_EQ("token", consumer_
.last_token_
);
175 // Third request to a new set of scopes, should return another token.
176 scoped_ptr
<OAuth2TokenService::Request
> request3(
177 oauth2_service_
->StartRequest(account_id_
, scopes2
, &consumer_
));
178 base::RunLoop().RunUntilIdle();
179 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
180 EXPECT_EQ(0, consumer_
.number_of_errors_
);
181 fetcher
= factory_
.GetFetcherByID(0);
182 ASSERT_TRUE(fetcher
);
183 fetcher
->set_response_code(net::HTTP_OK
);
184 fetcher
->SetResponseString(GetValidTokenResponse("token2", 3600));
185 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
186 EXPECT_EQ(3, consumer_
.number_of_successful_tokens_
);
187 EXPECT_EQ(0, consumer_
.number_of_errors_
);
188 EXPECT_EQ("token2", consumer_
.last_token_
);
191 TEST_F(OAuth2TokenServiceTest
, SuccessAndExpirationAndFailure
) {
192 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
193 account_id_
, "refreshToken");
196 scoped_ptr
<OAuth2TokenService::Request
> request(
197 oauth2_service_
->StartRequest(account_id_
,
198 OAuth2TokenService::ScopeSet(),
200 base::RunLoop().RunUntilIdle();
201 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
202 EXPECT_EQ(0, consumer_
.number_of_errors_
);
203 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
204 ASSERT_TRUE(fetcher
);
205 fetcher
->set_response_code(net::HTTP_OK
);
206 fetcher
->SetResponseString(GetValidTokenResponse("token", 0));
207 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
208 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
209 EXPECT_EQ(0, consumer_
.number_of_errors_
);
210 EXPECT_EQ("token", consumer_
.last_token_
);
212 // Second request must try to access the network as the token has expired.
213 scoped_ptr
<OAuth2TokenService::Request
> request2(
214 oauth2_service_
->StartRequest(account_id_
,
215 OAuth2TokenService::ScopeSet(),
217 base::RunLoop().RunUntilIdle();
218 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
219 EXPECT_EQ(0, consumer_
.number_of_errors_
);
222 fetcher
= factory_
.GetFetcherByID(0);
223 ASSERT_TRUE(fetcher
);
224 fetcher
->set_response_code(net::HTTP_UNAUTHORIZED
);
225 fetcher
->SetResponseString(std::string());
226 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
227 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
228 EXPECT_EQ(1, consumer_
.number_of_errors_
);
231 TEST_F(OAuth2TokenServiceTest
, SuccessAndExpirationAndSuccess
) {
232 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
233 account_id_
, "refreshToken");
236 scoped_ptr
<OAuth2TokenService::Request
> request(
237 oauth2_service_
->StartRequest(account_id_
,
238 OAuth2TokenService::ScopeSet(),
240 base::RunLoop().RunUntilIdle();
241 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
242 EXPECT_EQ(0, consumer_
.number_of_errors_
);
243 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
244 ASSERT_TRUE(fetcher
);
245 fetcher
->set_response_code(net::HTTP_OK
);
246 fetcher
->SetResponseString(GetValidTokenResponse("token", 0));
247 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
248 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
249 EXPECT_EQ(0, consumer_
.number_of_errors_
);
250 EXPECT_EQ("token", consumer_
.last_token_
);
252 // Second request must try to access the network as the token has expired.
253 scoped_ptr
<OAuth2TokenService::Request
> request2(
254 oauth2_service_
->StartRequest(account_id_
,
255 OAuth2TokenService::ScopeSet(),
257 base::RunLoop().RunUntilIdle();
258 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
259 EXPECT_EQ(0, consumer_
.number_of_errors_
);
261 fetcher
= factory_
.GetFetcherByID(0);
262 ASSERT_TRUE(fetcher
);
263 fetcher
->set_response_code(net::HTTP_OK
);
264 fetcher
->SetResponseString(GetValidTokenResponse("another token", 0));
265 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
266 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
267 EXPECT_EQ(0, consumer_
.number_of_errors_
);
268 EXPECT_EQ("another token", consumer_
.last_token_
);
271 TEST_F(OAuth2TokenServiceTest
, RequestDeletedBeforeCompletion
) {
272 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
273 account_id_
, "refreshToken");
275 scoped_ptr
<OAuth2TokenService::Request
> request(
276 oauth2_service_
->StartRequest(account_id_
,
277 OAuth2TokenService::ScopeSet(),
279 base::RunLoop().RunUntilIdle();
280 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
281 EXPECT_EQ(0, consumer_
.number_of_errors_
);
282 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
283 ASSERT_TRUE(fetcher
);
287 fetcher
->set_response_code(net::HTTP_OK
);
288 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
289 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
290 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
291 EXPECT_EQ(0, consumer_
.number_of_errors_
);
294 TEST_F(OAuth2TokenServiceTest
, RequestDeletedAfterCompletion
) {
295 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
296 account_id_
, "refreshToken");
298 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
299 account_id_
, OAuth2TokenService::ScopeSet(), &consumer_
));
300 base::RunLoop().RunUntilIdle();
301 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
302 ASSERT_TRUE(fetcher
);
303 fetcher
->set_response_code(net::HTTP_OK
);
304 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
305 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
306 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
307 EXPECT_EQ(0, consumer_
.number_of_errors_
);
308 EXPECT_EQ("token", consumer_
.last_token_
);
312 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
313 EXPECT_EQ(0, consumer_
.number_of_errors_
);
314 EXPECT_EQ("token", consumer_
.last_token_
);
317 TEST_F(OAuth2TokenServiceTest
, MultipleRequestsForTheSameScopesWithOneDeleted
) {
318 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
319 account_id_
, "refreshToken");
321 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
322 account_id_
, OAuth2TokenService::ScopeSet(), &consumer_
));
323 base::RunLoop().RunUntilIdle();
324 scoped_ptr
<OAuth2TokenService::Request
> request2(
325 oauth2_service_
->StartRequest(account_id_
, OAuth2TokenService::ScopeSet(),
327 base::RunLoop().RunUntilIdle();
331 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
332 ASSERT_TRUE(fetcher
);
333 fetcher
->set_response_code(net::HTTP_OK
);
334 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
335 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
336 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
337 EXPECT_EQ(0, consumer_
.number_of_errors_
);
340 TEST_F(OAuth2TokenServiceTest
, ClearedRefreshTokenFailsSubsequentRequests
) {
341 // We have a valid refresh token; the first request is successful.
342 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
343 account_id_
, "refreshToken");
344 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
345 account_id_
, OAuth2TokenService::ScopeSet(), &consumer_
));
346 base::RunLoop().RunUntilIdle();
347 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
348 ASSERT_TRUE(fetcher
);
349 fetcher
->set_response_code(net::HTTP_OK
);
350 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
351 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
352 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
353 EXPECT_EQ(0, consumer_
.number_of_errors_
);
354 EXPECT_EQ("token", consumer_
.last_token_
);
356 // The refresh token is no longer available; subsequent requests fail.
357 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
359 request
= oauth2_service_
->StartRequest(account_id_
,
360 OAuth2TokenService::ScopeSet(), &consumer_
);
361 base::RunLoop().RunUntilIdle();
362 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
363 EXPECT_EQ(1, consumer_
.number_of_errors_
);
366 TEST_F(OAuth2TokenServiceTest
,
367 ChangedRefreshTokenDoesNotAffectInFlightRequests
) {
368 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
369 account_id_
, "first refreshToken");
370 OAuth2TokenService::ScopeSet scopes
;
373 OAuth2TokenService::ScopeSet scopes1
;
377 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
378 account_id_
, scopes
, &consumer_
));
379 base::RunLoop().RunUntilIdle();
380 net::TestURLFetcher
* fetcher1
= factory_
.GetFetcherByID(0);
381 ASSERT_TRUE(fetcher1
);
383 // Note |request| is still pending when the refresh token changes.
384 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
385 account_id_
, "second refreshToken");
387 // A 2nd request (using the new refresh token) that occurs and completes
388 // while the 1st request is in flight is successful.
389 TestingOAuth2TokenServiceConsumer consumer2
;
390 scoped_ptr
<OAuth2TokenService::Request
> request2(
391 oauth2_service_
->StartRequest(account_id_
, scopes1
, &consumer2
));
392 base::RunLoop().RunUntilIdle();
394 net::TestURLFetcher
* fetcher2
= factory_
.GetFetcherByID(0);
395 fetcher2
->set_response_code(net::HTTP_OK
);
396 fetcher2
->SetResponseString(GetValidTokenResponse("second token", 3600));
397 fetcher2
->delegate()->OnURLFetchComplete(fetcher2
);
398 EXPECT_EQ(1, consumer2
.number_of_successful_tokens_
);
399 EXPECT_EQ(0, consumer2
.number_of_errors_
);
400 EXPECT_EQ("second token", consumer2
.last_token_
);
402 fetcher1
->set_response_code(net::HTTP_OK
);
403 fetcher1
->SetResponseString(GetValidTokenResponse("first token", 3600));
404 fetcher1
->delegate()->OnURLFetchComplete(fetcher1
);
405 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
406 EXPECT_EQ(0, consumer_
.number_of_errors_
);
407 EXPECT_EQ("first token", consumer_
.last_token_
);
410 TEST_F(OAuth2TokenServiceTest
, ServiceShutDownBeforeFetchComplete
) {
411 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
412 account_id_
, "refreshToken");
413 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
414 account_id_
, OAuth2TokenService::ScopeSet(), &consumer_
));
415 base::RunLoop().RunUntilIdle();
416 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
417 EXPECT_EQ(0, consumer_
.number_of_errors_
);
419 // The destructor should cancel all in-flight fetchers.
420 oauth2_service_
.reset(NULL
);
422 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
423 EXPECT_EQ(1, consumer_
.number_of_errors_
);
426 TEST_F(OAuth2TokenServiceTest
, RetryingConsumer
) {
427 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
428 account_id_
, "refreshToken");
429 RetryingTestingOAuth2TokenServiceConsumer
consumer(oauth2_service_
.get(),
431 scoped_ptr
<OAuth2TokenService::Request
> request(oauth2_service_
->StartRequest(
432 account_id_
, OAuth2TokenService::ScopeSet(), &consumer
));
433 base::RunLoop().RunUntilIdle();
434 EXPECT_EQ(0, consumer
.number_of_successful_tokens_
);
435 EXPECT_EQ(0, consumer
.number_of_errors_
);
437 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
438 ASSERT_TRUE(fetcher
);
439 fetcher
->set_response_code(net::HTTP_UNAUTHORIZED
);
440 fetcher
->SetResponseString(std::string());
441 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
442 EXPECT_EQ(0, consumer
.number_of_successful_tokens_
);
443 EXPECT_EQ(1, consumer
.number_of_errors_
);
445 fetcher
= factory_
.GetFetcherByID(0);
446 ASSERT_TRUE(fetcher
);
447 fetcher
->set_response_code(net::HTTP_UNAUTHORIZED
);
448 fetcher
->SetResponseString(std::string());
449 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
450 EXPECT_EQ(0, consumer
.number_of_successful_tokens_
);
451 EXPECT_EQ(2, consumer
.number_of_errors_
);
454 TEST_F(OAuth2TokenServiceTest
, InvalidateToken
) {
455 OAuth2TokenService::ScopeSet scopes
;
456 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
457 account_id_
, "refreshToken");
460 scoped_ptr
<OAuth2TokenService::Request
> request(
461 oauth2_service_
->StartRequest(account_id_
, scopes
, &consumer_
));
462 base::RunLoop().RunUntilIdle();
464 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
465 EXPECT_EQ(0, consumer_
.number_of_errors_
);
466 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
467 ASSERT_TRUE(fetcher
);
468 fetcher
->set_response_code(net::HTTP_OK
);
469 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
470 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
471 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
472 EXPECT_EQ(0, consumer_
.number_of_errors_
);
473 EXPECT_EQ("token", consumer_
.last_token_
);
475 // Second request, should return the same token without needing a network
477 scoped_ptr
<OAuth2TokenService::Request
> request2(
478 oauth2_service_
->StartRequest(account_id_
, scopes
, &consumer_
));
479 base::RunLoop().RunUntilIdle();
481 // No new network fetcher.
482 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
483 EXPECT_EQ(0, consumer_
.number_of_errors_
);
484 EXPECT_EQ("token", consumer_
.last_token_
);
486 // Invalidating the token should return a new token on the next request.
487 oauth2_service_
->InvalidateAccessToken(account_id_
, scopes
,
488 consumer_
.last_token_
);
489 scoped_ptr
<OAuth2TokenService::Request
> request3(
490 oauth2_service_
->StartRequest(account_id_
, scopes
, &consumer_
));
491 base::RunLoop().RunUntilIdle();
492 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
493 EXPECT_EQ(0, consumer_
.number_of_errors_
);
494 fetcher
= factory_
.GetFetcherByID(0);
495 ASSERT_TRUE(fetcher
);
496 fetcher
->set_response_code(net::HTTP_OK
);
497 fetcher
->SetResponseString(GetValidTokenResponse("token2", 3600));
498 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
499 EXPECT_EQ(3, consumer_
.number_of_successful_tokens_
);
500 EXPECT_EQ(0, consumer_
.number_of_errors_
);
501 EXPECT_EQ("token2", consumer_
.last_token_
);
504 TEST_F(OAuth2TokenServiceTest
, CancelAllRequests
) {
505 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
506 account_id_
, "refreshToken");
507 scoped_ptr
<OAuth2TokenService::Request
> request(
508 oauth2_service_
->StartRequest(account_id_
, OAuth2TokenService::ScopeSet(),
511 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
512 "account_id_2", "refreshToken2");
513 scoped_ptr
<OAuth2TokenService::Request
> request2(
514 oauth2_service_
->StartRequest(account_id_
, OAuth2TokenService::ScopeSet(),
517 base::RunLoop().RunUntilIdle();
518 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
519 EXPECT_EQ(0, consumer_
.number_of_errors_
);
521 oauth2_service_
->CancelAllRequestsForTest();
523 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
524 EXPECT_EQ(2, consumer_
.number_of_errors_
);
527 TEST_F(OAuth2TokenServiceTest
, CancelRequestsForAccount
) {
528 OAuth2TokenService::ScopeSet scope_set_1
;
529 scope_set_1
.insert("scope1");
530 scope_set_1
.insert("scope2");
531 OAuth2TokenService::ScopeSet
scope_set_2(scope_set_1
.begin(),
533 scope_set_2
.insert("scope3");
535 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
536 account_id_
, "refreshToken");
537 scoped_ptr
<OAuth2TokenService::Request
> request1(
538 oauth2_service_
->StartRequest(account_id_
, scope_set_1
, &consumer_
));
539 scoped_ptr
<OAuth2TokenService::Request
> request2(
540 oauth2_service_
->StartRequest(account_id_
, scope_set_2
, &consumer_
));
542 std::string
account_id_2("account_id_2");
543 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
544 account_id_2
, "refreshToken2");
545 scoped_ptr
<OAuth2TokenService::Request
> request3(
546 oauth2_service_
->StartRequest(account_id_2
, scope_set_1
, &consumer_
));
548 base::RunLoop().RunUntilIdle();
549 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
550 EXPECT_EQ(0, consumer_
.number_of_errors_
);
552 oauth2_service_
->CancelRequestsForAccountForTest(account_id_
);
554 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
555 EXPECT_EQ(2, consumer_
.number_of_errors_
);
557 oauth2_service_
->CancelRequestsForAccountForTest(account_id_2
);
559 EXPECT_EQ(0, consumer_
.number_of_successful_tokens_
);
560 EXPECT_EQ(3, consumer_
.number_of_errors_
);
563 TEST_F(OAuth2TokenServiceTest
, SameScopesRequestedForDifferentClients
) {
564 std::string
client_id_1("client1");
565 std::string
client_secret_1("secret1");
566 std::string
client_id_2("client2");
567 std::string
client_secret_2("secret2");
568 std::set
<std::string
> scope_set
;
569 scope_set
.insert("scope1");
570 scope_set
.insert("scope2");
572 std::string
refresh_token("refreshToken");
573 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
574 account_id_
, refresh_token
);
576 scoped_ptr
<OAuth2TokenService::Request
> request1(
577 oauth2_service_
->StartRequestForClient(account_id_
,
582 scoped_ptr
<OAuth2TokenService::Request
> request2(
583 oauth2_service_
->StartRequestForClient(account_id_
,
588 // Start a request that should be duplicate of |request1|.
589 scoped_ptr
<OAuth2TokenService::Request
> request3(
590 oauth2_service_
->StartRequestForClient(account_id_
,
595 base::RunLoop().RunUntilIdle();
598 oauth2_service_
->GetNumPendingRequestsForTesting(
603 oauth2_service_
->GetNumPendingRequestsForTesting(
609 TEST_F(OAuth2TokenServiceTest
, RequestParametersOrderTest
) {
610 OAuth2TokenService::ScopeSet set_0
;
611 OAuth2TokenService::ScopeSet set_1
;
614 OAuth2TokenService::RequestParameters params
[] = {
615 OAuth2TokenService::RequestParameters("0", "0", set_0
),
616 OAuth2TokenService::RequestParameters("0", "0", set_1
),
617 OAuth2TokenService::RequestParameters("0", "1", set_0
),
618 OAuth2TokenService::RequestParameters("0", "1", set_1
),
619 OAuth2TokenService::RequestParameters("1", "0", set_0
),
620 OAuth2TokenService::RequestParameters("1", "0", set_1
),
621 OAuth2TokenService::RequestParameters("1", "1", set_0
),
622 OAuth2TokenService::RequestParameters("1", "1", set_1
),
625 for (size_t i
= 0; i
< arraysize(params
); i
++) {
626 for (size_t j
= 0; j
< arraysize(params
); j
++) {
628 EXPECT_FALSE(params
[i
] < params
[j
]) << " i=" << i
<< ", j=" << j
;
629 EXPECT_FALSE(params
[j
] < params
[i
]) << " i=" << i
<< ", j=" << j
;
631 EXPECT_TRUE(params
[i
] < params
[j
]) << " i=" << i
<< ", j=" << j
;
632 EXPECT_FALSE(params
[j
] < params
[i
]) << " i=" << i
<< ", j=" << j
;
634 EXPECT_TRUE(params
[j
] < params
[i
]) << " i=" << i
<< ", j=" << j
;
635 EXPECT_FALSE(params
[i
] < params
[j
]) << " i=" << i
<< ", j=" << j
;
641 TEST_F(OAuth2TokenServiceTest
, UpdateClearsCache
) {
642 std::string kEmail
= "test@gmail.com";
643 std::set
<std::string
> scope_list
;
644 scope_list
.insert("scope");
645 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
646 kEmail
, "refreshToken");
647 scoped_ptr
<OAuth2TokenService::Request
> request(
648 oauth2_service_
->StartRequest(kEmail
, scope_list
, &consumer_
));
649 base::RunLoop().RunUntilIdle();
650 net::TestURLFetcher
* fetcher
= factory_
.GetFetcherByID(0);
651 ASSERT_TRUE(fetcher
);
652 fetcher
->set_response_code(net::HTTP_OK
);
653 fetcher
->SetResponseString(GetValidTokenResponse("token", 3600));
654 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
655 EXPECT_EQ(1, consumer_
.number_of_successful_tokens_
);
656 EXPECT_EQ(0, consumer_
.number_of_errors_
);
657 EXPECT_EQ("token", consumer_
.last_token_
);
658 EXPECT_EQ(1, (int)oauth2_service_
->token_cache_
.size());
660 // Signs out and signs in
661 oauth2_service_
->RevokeAllCredentials();
663 EXPECT_EQ(0, (int)oauth2_service_
->token_cache_
.size());
664 oauth2_service_
->GetFakeOAuth2TokenServiceDelegate()->UpdateCredentials(
665 kEmail
, "refreshToken");
666 request
= oauth2_service_
->StartRequest(kEmail
, scope_list
, &consumer_
);
667 base::RunLoop().RunUntilIdle();
668 fetcher
= factory_
.GetFetcherByID(0);
669 // ASSERT_TRUE(fetcher);
670 fetcher
->set_response_code(net::HTTP_OK
);
671 fetcher
->SetResponseString(GetValidTokenResponse("another token", 3600));
672 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
673 EXPECT_EQ(2, consumer_
.number_of_successful_tokens_
);
674 EXPECT_EQ(0, consumer_
.number_of_errors_
);
675 EXPECT_EQ("another token", consumer_
.last_token_
);
676 EXPECT_EQ(1, (int)oauth2_service_
->token_cache_
.size());