oauth2_token_service_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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.
4
5#include <string>
6
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.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"
20
21// A testing consumer that retries on error.
22class RetryingTestingOAuth2TokenServiceConsumer
23    : public TestingOAuth2TokenServiceConsumer {
24 public:
25  RetryingTestingOAuth2TokenServiceConsumer(
26      OAuth2TokenService* oauth2_service)
27      : oauth2_service_(oauth2_service) {}
28  virtual ~RetryingTestingOAuth2TokenServiceConsumer() {}
29
30  virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
31                                 const GoogleServiceAuthError& error) OVERRIDE {
32    TestingOAuth2TokenServiceConsumer::OnGetTokenFailure(request, error);
33    request_.reset(oauth2_service_->StartRequest(
34        std::set<std::string>(), this).release());
35  }
36
37  OAuth2TokenService* oauth2_service_;
38  scoped_ptr<OAuth2TokenService::Request> request_;
39};
40
41class TestOAuth2TokenService : public OAuth2TokenService {
42 public:
43  explicit TestOAuth2TokenService(net::TestURLRequestContextGetter* getter)
44      : request_context_getter_(getter) {
45  }
46
47  void CancelAllRequestsForTest() { CancelAllRequests(); }
48
49  void CancelRequestsForTokenForTest(const std::string& refresh_token) {
50    CancelRequestsForToken(refresh_token);
51  }
52
53  // For testing: set the refresh token to be used.
54  void set_refresh_token(const std::string& refresh_token) {
55    refresh_token_ = refresh_token;
56  }
57
58 protected:
59  virtual std::string GetRefreshToken() OVERRIDE { return refresh_token_; }
60
61 private:
62  // OAuth2TokenService implementation.
63  virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE {
64    return request_context_getter_.get();
65  }
66
67  std::string refresh_token_;
68  scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
69};
70
71class OAuth2TokenServiceTest : public testing::Test {
72 public:
73  virtual void SetUp() OVERRIDE {
74    oauth2_service_.reset(
75        new TestOAuth2TokenService(new net::TestURLRequestContextGetter(
76            message_loop_.message_loop_proxy())));
77  }
78
79  virtual void TearDown() OVERRIDE {
80    // Makes sure that all the clean up tasks are run.
81    base::RunLoop().RunUntilIdle();
82  }
83
84 protected:
85  base::MessageLoopForIO message_loop_;  // net:: stuff needs IO message loop.
86  net::TestURLFetcherFactory factory_;
87  scoped_ptr<TestOAuth2TokenService> oauth2_service_;
88  TestingOAuth2TokenServiceConsumer consumer_;
89};
90
91TEST_F(OAuth2TokenServiceTest, NoOAuth2RefreshToken) {
92  scoped_ptr<OAuth2TokenService::Request> request(
93      oauth2_service_->StartRequest(std::set<std::string>(), &consumer_));
94  base::RunLoop().RunUntilIdle();
95
96  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
97  EXPECT_EQ(1, consumer_.number_of_errors_);
98}
99
100TEST_F(OAuth2TokenServiceTest, FailureShouldNotRetry) {
101  oauth2_service_->set_refresh_token("refreshToken");
102  scoped_ptr<OAuth2TokenService::Request> request(
103      oauth2_service_->StartRequest(std::set<std::string>(), &consumer_));
104  base::RunLoop().RunUntilIdle();
105
106  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
107  EXPECT_EQ(0, consumer_.number_of_errors_);
108  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
109  ASSERT_TRUE(fetcher);
110  fetcher->set_response_code(net::HTTP_UNAUTHORIZED);
111  fetcher->SetResponseString(std::string());
112  fetcher->delegate()->OnURLFetchComplete(fetcher);
113  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
114  EXPECT_EQ(1, consumer_.number_of_errors_);
115  EXPECT_EQ(fetcher, factory_.GetFetcherByID(0));
116}
117
118TEST_F(OAuth2TokenServiceTest, SuccessWithoutCaching) {
119  oauth2_service_->set_refresh_token("refreshToken");
120  scoped_ptr<OAuth2TokenService::Request> request(
121      oauth2_service_->StartRequest(std::set<std::string>(), &consumer_));
122  base::RunLoop().RunUntilIdle();
123
124  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
125  EXPECT_EQ(0, consumer_.number_of_errors_);
126  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
127  ASSERT_TRUE(fetcher);
128  fetcher->set_response_code(net::HTTP_OK);
129  fetcher->SetResponseString(GetValidTokenResponse("token", 3600));
130  fetcher->delegate()->OnURLFetchComplete(fetcher);
131  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
132  EXPECT_EQ(0, consumer_.number_of_errors_);
133  EXPECT_EQ("token", consumer_.last_token_);
134}
135
136TEST_F(OAuth2TokenServiceTest, SuccessWithCaching) {
137  std::set<std::string> scopes1;
138  scopes1.insert("s1");
139  scopes1.insert("s2");
140  std::set<std::string> scopes1_same;
141  scopes1_same.insert("s2");
142  scopes1_same.insert("s1");
143  std::set<std::string> scopes2;
144  scopes2.insert("s3");
145
146  oauth2_service_->set_refresh_token("refreshToken");
147
148  // First request.
149  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
150      scopes1, &consumer_));
151  base::RunLoop().RunUntilIdle();
152
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_);
163
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(scopes1_same, &consumer_));
168  base::RunLoop().RunUntilIdle();
169
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_);
174
175  // Third request to a new set of scopes, should return another token.
176  scoped_ptr<OAuth2TokenService::Request> request3(
177      oauth2_service_->StartRequest(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_);
189}
190
191TEST_F(OAuth2TokenServiceTest, SuccessAndExpirationAndFailure) {
192  oauth2_service_->set_refresh_token("refreshToken");
193
194  // First request.
195  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
196      std::set<std::string>(), &consumer_));
197  base::RunLoop().RunUntilIdle();
198  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
199  EXPECT_EQ(0, consumer_.number_of_errors_);
200  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
201  ASSERT_TRUE(fetcher);
202  fetcher->set_response_code(net::HTTP_OK);
203  fetcher->SetResponseString(GetValidTokenResponse("token", 0));
204  fetcher->delegate()->OnURLFetchComplete(fetcher);
205  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
206  EXPECT_EQ(0, consumer_.number_of_errors_);
207  EXPECT_EQ("token", consumer_.last_token_);
208
209  // Second request must try to access the network as the token has expired.
210  scoped_ptr<OAuth2TokenService::Request> request2(
211      oauth2_service_->StartRequest(std::set<std::string>(), &consumer_));
212  base::RunLoop().RunUntilIdle();
213  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
214  EXPECT_EQ(0, consumer_.number_of_errors_);
215
216  // Network failure.
217  fetcher = factory_.GetFetcherByID(0);
218  ASSERT_TRUE(fetcher);
219  fetcher->set_response_code(net::HTTP_UNAUTHORIZED);
220  fetcher->SetResponseString(std::string());
221  fetcher->delegate()->OnURLFetchComplete(fetcher);
222  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
223  EXPECT_EQ(1, consumer_.number_of_errors_);
224}
225
226TEST_F(OAuth2TokenServiceTest, SuccessAndExpirationAndSuccess) {
227  oauth2_service_->set_refresh_token("refreshToken");
228
229  // First request.
230  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
231      std::set<std::string>(), &consumer_));
232  base::RunLoop().RunUntilIdle();
233  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
234  EXPECT_EQ(0, consumer_.number_of_errors_);
235  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
236  ASSERT_TRUE(fetcher);
237  fetcher->set_response_code(net::HTTP_OK);
238  fetcher->SetResponseString(GetValidTokenResponse("token", 0));
239  fetcher->delegate()->OnURLFetchComplete(fetcher);
240  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
241  EXPECT_EQ(0, consumer_.number_of_errors_);
242  EXPECT_EQ("token", consumer_.last_token_);
243
244  // Second request must try to access the network as the token has expired.
245  scoped_ptr<OAuth2TokenService::Request> request2(
246      oauth2_service_->StartRequest(std::set<std::string>(), &consumer_));
247  base::RunLoop().RunUntilIdle();
248  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
249  EXPECT_EQ(0, consumer_.number_of_errors_);
250
251  fetcher = factory_.GetFetcherByID(0);
252  ASSERT_TRUE(fetcher);
253  fetcher->set_response_code(net::HTTP_OK);
254  fetcher->SetResponseString(GetValidTokenResponse("another token", 0));
255  fetcher->delegate()->OnURLFetchComplete(fetcher);
256  EXPECT_EQ(2, consumer_.number_of_successful_tokens_);
257  EXPECT_EQ(0, consumer_.number_of_errors_);
258  EXPECT_EQ("another token", consumer_.last_token_);
259}
260
261TEST_F(OAuth2TokenServiceTest, RequestDeletedBeforeCompletion) {
262  oauth2_service_->set_refresh_token("refreshToken");
263
264  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
265      std::set<std::string>(), &consumer_));
266  base::RunLoop().RunUntilIdle();
267  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
268  EXPECT_EQ(0, consumer_.number_of_errors_);
269  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
270  ASSERT_TRUE(fetcher);
271
272  request.reset();
273
274  fetcher->set_response_code(net::HTTP_OK);
275  fetcher->SetResponseString(GetValidTokenResponse("token", 3600));
276  fetcher->delegate()->OnURLFetchComplete(fetcher);
277  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
278  EXPECT_EQ(0, consumer_.number_of_errors_);
279}
280
281TEST_F(OAuth2TokenServiceTest, RequestDeletedAfterCompletion) {
282  oauth2_service_->set_refresh_token("refreshToken");
283
284  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
285      std::set<std::string>(), &consumer_));
286  base::RunLoop().RunUntilIdle();
287  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
288  ASSERT_TRUE(fetcher);
289  fetcher->set_response_code(net::HTTP_OK);
290  fetcher->SetResponseString(GetValidTokenResponse("token", 3600));
291  fetcher->delegate()->OnURLFetchComplete(fetcher);
292  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
293  EXPECT_EQ(0, consumer_.number_of_errors_);
294  EXPECT_EQ("token", consumer_.last_token_);
295
296  request.reset();
297
298  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
299  EXPECT_EQ(0, consumer_.number_of_errors_);
300  EXPECT_EQ("token", consumer_.last_token_);
301}
302
303TEST_F(OAuth2TokenServiceTest, MultipleRequestsForTheSameScopesWithOneDeleted) {
304  oauth2_service_->set_refresh_token("refreshToken");
305
306  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
307      std::set<std::string>(), &consumer_));
308  base::RunLoop().RunUntilIdle();
309  scoped_ptr<OAuth2TokenService::Request> request2(
310      oauth2_service_->StartRequest(std::set<std::string>(), &consumer_));
311  base::RunLoop().RunUntilIdle();
312
313  request.reset();
314
315  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
316  ASSERT_TRUE(fetcher);
317  fetcher->set_response_code(net::HTTP_OK);
318  fetcher->SetResponseString(GetValidTokenResponse("token", 3600));
319  fetcher->delegate()->OnURLFetchComplete(fetcher);
320  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
321  EXPECT_EQ(0, consumer_.number_of_errors_);
322}
323
324TEST_F(OAuth2TokenServiceTest, ClearedRefreshTokenFailsSubsequentRequests) {
325  // We have a valid refresh token; the first request is successful.
326  oauth2_service_->set_refresh_token("refreshToken");
327  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
328      std::set<std::string>(), &consumer_));
329  base::RunLoop().RunUntilIdle();
330  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
331  ASSERT_TRUE(fetcher);
332  fetcher->set_response_code(net::HTTP_OK);
333  fetcher->SetResponseString(GetValidTokenResponse("token", 3600));
334  fetcher->delegate()->OnURLFetchComplete(fetcher);
335  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
336  EXPECT_EQ(0, consumer_.number_of_errors_);
337  EXPECT_EQ("token", consumer_.last_token_);
338
339  // The refresh token is no longer available; subsequent requests fail.
340  oauth2_service_->set_refresh_token("");
341  request = oauth2_service_->StartRequest(std::set<std::string>(), &consumer_);
342  base::RunLoop().RunUntilIdle();
343  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
344  EXPECT_EQ(1, consumer_.number_of_errors_);
345}
346
347TEST_F(OAuth2TokenServiceTest,
348       ChangedRefreshTokenDoesNotAffectInFlightRequests) {
349  oauth2_service_->set_refresh_token("first refreshToken");
350  std::set<std::string> scopes;
351  scopes.insert("s1");
352  scopes.insert("s2");
353
354  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
355      scopes, &consumer_));
356  base::RunLoop().RunUntilIdle();
357  net::TestURLFetcher* fetcher1 = factory_.GetFetcherByID(0);
358  ASSERT_TRUE(fetcher1);
359
360  // Note |request| is still pending when the refresh token changes.
361  oauth2_service_->set_refresh_token("second refreshToken");
362
363  // A 2nd request (using the new refresh token) that occurs and completes
364  // while the 1st request is in flight is successful.
365  TestingOAuth2TokenServiceConsumer consumer2;
366  scoped_ptr<OAuth2TokenService::Request> request2(
367      oauth2_service_->StartRequest(scopes, &consumer2));
368  base::RunLoop().RunUntilIdle();
369
370  net::TestURLFetcher* fetcher2 = factory_.GetFetcherByID(0);
371  fetcher2->set_response_code(net::HTTP_OK);
372  fetcher2->SetResponseString(GetValidTokenResponse("second token", 3600));
373  fetcher2->delegate()->OnURLFetchComplete(fetcher2);
374  EXPECT_EQ(1, consumer2.number_of_successful_tokens_);
375  EXPECT_EQ(0, consumer2.number_of_errors_);
376  EXPECT_EQ("second token", consumer2.last_token_);
377
378  fetcher1->set_response_code(net::HTTP_OK);
379  fetcher1->SetResponseString(GetValidTokenResponse("first token", 3600));
380  fetcher1->delegate()->OnURLFetchComplete(fetcher1);
381  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
382  EXPECT_EQ(0, consumer_.number_of_errors_);
383  EXPECT_EQ("first token", consumer_.last_token_);
384}
385
386TEST_F(OAuth2TokenServiceTest, ServiceShutDownBeforeFetchComplete) {
387  oauth2_service_->set_refresh_token("refreshToken");
388  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
389      std::set<std::string>(), &consumer_));
390  base::RunLoop().RunUntilIdle();
391  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
392  EXPECT_EQ(0, consumer_.number_of_errors_);
393
394  // The destructor should cancel all in-flight fetchers.
395  oauth2_service_.reset(NULL);
396
397  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
398  EXPECT_EQ(1, consumer_.number_of_errors_);
399}
400
401TEST_F(OAuth2TokenServiceTest, RetryingConsumer) {
402  oauth2_service_->set_refresh_token("refreshToken");
403  RetryingTestingOAuth2TokenServiceConsumer consumer(oauth2_service_.get());
404  scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest(
405      std::set<std::string>(), &consumer));
406  base::RunLoop().RunUntilIdle();
407  EXPECT_EQ(0, consumer.number_of_successful_tokens_);
408  EXPECT_EQ(0, consumer.number_of_errors_);
409
410  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
411  ASSERT_TRUE(fetcher);
412  fetcher->set_response_code(net::HTTP_UNAUTHORIZED);
413  fetcher->SetResponseString(std::string());
414  fetcher->delegate()->OnURLFetchComplete(fetcher);
415  EXPECT_EQ(0, consumer.number_of_successful_tokens_);
416  EXPECT_EQ(1, consumer.number_of_errors_);
417
418  fetcher = factory_.GetFetcherByID(0);
419  ASSERT_TRUE(fetcher);
420  fetcher->set_response_code(net::HTTP_UNAUTHORIZED);
421  fetcher->SetResponseString(std::string());
422  fetcher->delegate()->OnURLFetchComplete(fetcher);
423  EXPECT_EQ(0, consumer.number_of_successful_tokens_);
424  EXPECT_EQ(2, consumer.number_of_errors_);
425}
426
427TEST_F(OAuth2TokenServiceTest, InvalidateToken) {
428  std::set<std::string> scopes;
429  oauth2_service_->set_refresh_token("refreshToken");
430
431  // First request.
432  scoped_ptr<OAuth2TokenService::Request> request(
433      oauth2_service_->StartRequest(scopes, &consumer_));
434  base::RunLoop().RunUntilIdle();
435
436  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
437  EXPECT_EQ(0, consumer_.number_of_errors_);
438  net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
439  ASSERT_TRUE(fetcher);
440  fetcher->set_response_code(net::HTTP_OK);
441  fetcher->SetResponseString(GetValidTokenResponse("token", 3600));
442  fetcher->delegate()->OnURLFetchComplete(fetcher);
443  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
444  EXPECT_EQ(0, consumer_.number_of_errors_);
445  EXPECT_EQ("token", consumer_.last_token_);
446
447  // Second request, should return the same token without needing a network
448  // request.
449  scoped_ptr<OAuth2TokenService::Request> request2(
450      oauth2_service_->StartRequest(scopes, &consumer_));
451  base::RunLoop().RunUntilIdle();
452
453  // No new network fetcher.
454  EXPECT_EQ(2, consumer_.number_of_successful_tokens_);
455  EXPECT_EQ(0, consumer_.number_of_errors_);
456  EXPECT_EQ("token", consumer_.last_token_);
457
458  // Invalidating the token should return a new token on the next request.
459  oauth2_service_->InvalidateToken(scopes, consumer_.last_token_);
460  scoped_ptr<OAuth2TokenService::Request> request3(
461      oauth2_service_->StartRequest(scopes, &consumer_));
462  base::RunLoop().RunUntilIdle();
463  EXPECT_EQ(2, consumer_.number_of_successful_tokens_);
464  EXPECT_EQ(0, consumer_.number_of_errors_);
465  fetcher = factory_.GetFetcherByID(0);
466  ASSERT_TRUE(fetcher);
467  fetcher->set_response_code(net::HTTP_OK);
468  fetcher->SetResponseString(GetValidTokenResponse("token2", 3600));
469  fetcher->delegate()->OnURLFetchComplete(fetcher);
470  EXPECT_EQ(3, consumer_.number_of_successful_tokens_);
471  EXPECT_EQ(0, consumer_.number_of_errors_);
472  EXPECT_EQ("token2", consumer_.last_token_);
473}
474
475TEST_F(OAuth2TokenServiceTest, CancelAllRequests) {
476  oauth2_service_->set_refresh_token("refreshToken");
477  scoped_ptr<OAuth2TokenService::Request> request(
478      oauth2_service_->StartRequest(std::set<std::string>(), &consumer_));
479
480  oauth2_service_->set_refresh_token("refreshToken2");
481  scoped_ptr<OAuth2TokenService::Request> request2(
482      oauth2_service_->StartRequest(std::set<std::string>(), &consumer_));
483
484  base::RunLoop().RunUntilIdle();
485  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
486  EXPECT_EQ(0, consumer_.number_of_errors_);
487
488  oauth2_service_->CancelAllRequestsForTest();
489
490  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
491  EXPECT_EQ(2, consumer_.number_of_errors_);
492}
493
494TEST_F(OAuth2TokenServiceTest, CancelRequestsForToken) {
495  std::set<std::string> scope_set_1;
496  scope_set_1.insert("scope1");
497  scope_set_1.insert("scope2");
498  std::set<std::string> scope_set_2(scope_set_1.begin(), scope_set_1.end());
499  scope_set_2.insert("scope3");
500
501  oauth2_service_->set_refresh_token("refreshToken");
502  scoped_ptr<OAuth2TokenService::Request> request1(
503      oauth2_service_->StartRequest(scope_set_1, &consumer_));
504  scoped_ptr<OAuth2TokenService::Request> request2(
505      oauth2_service_->StartRequest(scope_set_2, &consumer_));
506
507  oauth2_service_->set_refresh_token("refreshToken2");
508  scoped_ptr<OAuth2TokenService::Request> request3(
509      oauth2_service_->StartRequest(scope_set_1, &consumer_));
510
511  base::RunLoop().RunUntilIdle();
512  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
513  EXPECT_EQ(0, consumer_.number_of_errors_);
514
515  oauth2_service_->CancelRequestsForTokenForTest("refreshToken");
516
517  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
518  EXPECT_EQ(2, consumer_.number_of_errors_);
519
520  oauth2_service_->CancelRequestsForTokenForTest("refreshToken2");
521
522  EXPECT_EQ(0, consumer_.number_of_successful_tokens_);
523  EXPECT_EQ(3, consumer_.number_of_errors_);
524}
525
526TEST_F(OAuth2TokenServiceTest, SameScopesRequestedForDifferentClients) {
527  std::string client_id_1("client1");
528  std::string client_secret_1("secret1");
529  std::string client_id_2("client2");
530  std::string client_secret_2("secret2");
531  std::set<std::string> scope_set;
532  scope_set.insert("scope1");
533  scope_set.insert("scope2");
534
535  std::string refresh_token("refreshToken");
536  oauth2_service_->set_refresh_token(refresh_token);
537
538  scoped_ptr<OAuth2TokenService::Request> request1(
539      oauth2_service_->StartRequestForClient(client_id_1,
540                                             client_secret_1,
541                                             scope_set,
542                                             &consumer_));
543  scoped_ptr<OAuth2TokenService::Request> request2(
544      oauth2_service_->StartRequestForClient(client_id_2,
545                                             client_secret_2,
546                                             scope_set,
547                                             &consumer_));
548  // Start a request that should be duplicate of |request1|.
549  scoped_ptr<OAuth2TokenService::Request> request3(
550      oauth2_service_->StartRequestForClient(client_id_1,
551                                             client_secret_1,
552                                             scope_set,
553                                             &consumer_));
554  base::RunLoop().RunUntilIdle();
555
556  ASSERT_EQ(2U,
557            oauth2_service_->GetNumPendingRequestsForTesting(
558                client_id_1,
559                refresh_token,
560                scope_set));
561   ASSERT_EQ(1U,
562             oauth2_service_->GetNumPendingRequestsForTesting(
563                client_id_2,
564                refresh_token,
565                scope_set));
566}
567
568TEST_F(OAuth2TokenServiceTest, ClientScopeSetOrderTest) {
569  OAuth2TokenService::ScopeSet set_0;
570  OAuth2TokenService::ScopeSet set_1;
571  set_1.insert("1");
572
573  OAuth2TokenService::ClientScopeSet sets[] = {
574      OAuth2TokenService::ClientScopeSet("0", set_0),
575      OAuth2TokenService::ClientScopeSet("0", set_1),
576      OAuth2TokenService::ClientScopeSet("1", set_0),
577      OAuth2TokenService::ClientScopeSet("1", set_1),
578  };
579
580  for (size_t i = 0; i < arraysize(sets); i++) {
581    for (size_t j = 0; j < arraysize(sets); j++) {
582      if (i == j) {
583        EXPECT_FALSE(sets[i] < sets[j]) << " i=" << i << ", j=" << j;
584        EXPECT_FALSE(sets[j] < sets[i]) << " i=" << i << ", j=" << j;
585      } else if (i < j) {
586        EXPECT_TRUE(sets[i] < sets[j]) << " i=" << i << ", j=" << j;
587        EXPECT_FALSE(sets[j] < sets[i]) << " i=" << i << ", j=" << j;
588      } else {
589        EXPECT_TRUE(sets[j] < sets[i]) << " i=" << i << ", j=" << j;
590        EXPECT_FALSE(sets[i] < sets[j]) << " i=" << i << ", j=" << j;
591      }
592    }
593  }
594}
595
596TEST_F(OAuth2TokenServiceTest, FetchParametersOrderTest) {
597  OAuth2TokenService::ScopeSet set_0;
598  OAuth2TokenService::ScopeSet set_1;
599  set_1.insert("1");
600
601  OAuth2TokenService::FetchParameters params[] = {
602      OAuth2TokenService::FetchParameters("0", "0", set_0),
603      OAuth2TokenService::FetchParameters("0", "0", set_1),
604      OAuth2TokenService::FetchParameters("0", "1", set_0),
605      OAuth2TokenService::FetchParameters("0", "1", set_1),
606      OAuth2TokenService::FetchParameters("1", "0", set_0),
607      OAuth2TokenService::FetchParameters("1", "0", set_1),
608      OAuth2TokenService::FetchParameters("1", "1", set_0),
609      OAuth2TokenService::FetchParameters("1", "1", set_1),
610  };
611
612  for (size_t i = 0; i < arraysize(params); i++) {
613    for (size_t j = 0; j < arraysize(params); j++) {
614      if (i == j) {
615        EXPECT_FALSE(params[i] < params[j]) << " i=" << i << ", j=" << j;
616        EXPECT_FALSE(params[j] < params[i]) << " i=" << i << ", j=" << j;
617      } else if (i < j) {
618        EXPECT_TRUE(params[i] < params[j]) << " i=" << i << ", j=" << j;
619        EXPECT_FALSE(params[j] < params[i]) << " i=" << i << ", j=" << j;
620      } else {
621        EXPECT_TRUE(params[j] < params[i]) << " i=" << i << ", j=" << j;
622        EXPECT_FALSE(params[i] < params[j]) << " i=" << i << ", j=" << j;
623      }
624    }
625  }
626}
627