fake_oauth2_access_token_manager.cc 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Copyright 2019 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. #include "google_apis/gaia/fake_oauth2_access_token_manager.h"
  5. #include <memory>
  6. #include "base/bind.h"
  7. #include "base/location.h"
  8. #include "base/task/single_thread_task_runner.h"
  9. #include "base/threading/thread_task_runner_handle.h"
  10. #include "services/network/public/cpp/shared_url_loader_factory.h"
  11. using TokenResponseBuilder = OAuth2AccessTokenConsumer::TokenResponse::Builder;
  12. FakeOAuth2AccessTokenManager::PendingRequest::PendingRequest() = default;
  13. FakeOAuth2AccessTokenManager::PendingRequest::PendingRequest(
  14. const PendingRequest& other) = default;
  15. FakeOAuth2AccessTokenManager::PendingRequest::~PendingRequest() = default;
  16. FakeOAuth2AccessTokenManager::FakeOAuth2AccessTokenManager(
  17. OAuth2AccessTokenManager::Delegate* delegate)
  18. : OAuth2AccessTokenManager(delegate),
  19. auto_post_fetch_response_on_message_loop_(false) {}
  20. FakeOAuth2AccessTokenManager::~FakeOAuth2AccessTokenManager() = default;
  21. void FakeOAuth2AccessTokenManager::IssueAllTokensForAccount(
  22. const CoreAccountId& account_id,
  23. const std::string& access_token,
  24. const base::Time& expiration) {
  25. DCHECK(!auto_post_fetch_response_on_message_loop_);
  26. CompleteRequests(account_id, true, FakeOAuth2AccessTokenManager::ScopeSet(),
  27. GoogleServiceAuthError::AuthErrorNone(),
  28. TokenResponseBuilder()
  29. .WithAccessToken(access_token)
  30. .WithExpirationTime(expiration)
  31. .build());
  32. }
  33. void FakeOAuth2AccessTokenManager::IssueAllTokensForAccount(
  34. const CoreAccountId& account_id,
  35. const OAuth2AccessTokenConsumer::TokenResponse& token_response) {
  36. DCHECK(!auto_post_fetch_response_on_message_loop_);
  37. CompleteRequests(account_id, true, FakeOAuth2AccessTokenManager::ScopeSet(),
  38. GoogleServiceAuthError::AuthErrorNone(), token_response);
  39. }
  40. void FakeOAuth2AccessTokenManager::IssueErrorForAllPendingRequestsForAccount(
  41. const CoreAccountId& account_id,
  42. const GoogleServiceAuthError& error) {
  43. DCHECK(!auto_post_fetch_response_on_message_loop_);
  44. CompleteRequests(account_id, true, FakeOAuth2AccessTokenManager::ScopeSet(),
  45. error, OAuth2AccessTokenConsumer::TokenResponse());
  46. }
  47. void FakeOAuth2AccessTokenManager::IssueTokenForScope(
  48. const FakeOAuth2AccessTokenManager::ScopeSet& scope,
  49. const std::string& access_token,
  50. const base::Time& expiration) {
  51. DCHECK(!auto_post_fetch_response_on_message_loop_);
  52. CompleteRequests(CoreAccountId(), false, scope,
  53. GoogleServiceAuthError::AuthErrorNone(),
  54. TokenResponseBuilder()
  55. .WithAccessToken(access_token)
  56. .WithExpirationTime(expiration)
  57. .build());
  58. }
  59. void FakeOAuth2AccessTokenManager::IssueTokenForScope(
  60. const FakeOAuth2AccessTokenManager::ScopeSet& scope,
  61. const OAuth2AccessTokenConsumer::TokenResponse& token_response) {
  62. DCHECK(!auto_post_fetch_response_on_message_loop_);
  63. CompleteRequests(CoreAccountId(), false, scope,
  64. GoogleServiceAuthError::AuthErrorNone(), token_response);
  65. }
  66. void FakeOAuth2AccessTokenManager::IssueErrorForScope(
  67. const FakeOAuth2AccessTokenManager::ScopeSet& scope,
  68. const GoogleServiceAuthError& error) {
  69. DCHECK(!auto_post_fetch_response_on_message_loop_);
  70. CompleteRequests(CoreAccountId(), false, scope, error,
  71. OAuth2AccessTokenConsumer::TokenResponse());
  72. }
  73. void FakeOAuth2AccessTokenManager::IssueErrorForAllPendingRequests(
  74. const GoogleServiceAuthError& error) {
  75. DCHECK(!auto_post_fetch_response_on_message_loop_);
  76. CompleteRequests(CoreAccountId(), true,
  77. FakeOAuth2AccessTokenManager::ScopeSet(), error,
  78. OAuth2AccessTokenConsumer::TokenResponse());
  79. }
  80. void FakeOAuth2AccessTokenManager::IssueTokenForAllPendingRequests(
  81. const std::string& access_token,
  82. const base::Time& expiration) {
  83. DCHECK(!auto_post_fetch_response_on_message_loop_);
  84. CompleteRequests(CoreAccountId(), true,
  85. FakeOAuth2AccessTokenManager::ScopeSet(),
  86. GoogleServiceAuthError::AuthErrorNone(),
  87. TokenResponseBuilder()
  88. .WithAccessToken(access_token)
  89. .WithExpirationTime(expiration)
  90. .build());
  91. }
  92. void FakeOAuth2AccessTokenManager::IssueTokenForAllPendingRequests(
  93. const OAuth2AccessTokenConsumer::TokenResponse& token_response) {
  94. DCHECK(!auto_post_fetch_response_on_message_loop_);
  95. CompleteRequests(CoreAccountId(), true,
  96. FakeOAuth2AccessTokenManager::ScopeSet(),
  97. GoogleServiceAuthError::AuthErrorNone(), token_response);
  98. }
  99. void FakeOAuth2AccessTokenManager::CompleteRequests(
  100. const CoreAccountId& account_id,
  101. bool all_scopes,
  102. const FakeOAuth2AccessTokenManager::ScopeSet& scope,
  103. const GoogleServiceAuthError& error,
  104. const OAuth2AccessTokenConsumer::TokenResponse& token_response) {
  105. std::vector<FakeOAuth2AccessTokenManager::PendingRequest> requests =
  106. GetPendingRequests();
  107. // Walk the requests and notify the callbacks.
  108. for (auto it = requests.begin(); it != requests.end(); ++it) {
  109. // Consumers can drop requests in response to callbacks on other requests
  110. // (e.g., OAuthMultiloginFetcher clears all of its requests when it gets an
  111. // error on any of them).
  112. if (!it->request)
  113. continue;
  114. bool scope_matches = all_scopes || it->scopes == scope;
  115. bool account_matches = account_id.empty() || account_id == it->account_id;
  116. if (account_matches && scope_matches) {
  117. for (auto& diagnostic_observer : GetDiagnosticsObserversForTesting()) {
  118. diagnostic_observer.OnFetchAccessTokenComplete(
  119. account_id, it->request->GetConsumerId(), scope, error,
  120. base::Time());
  121. }
  122. it->request->InformConsumer(error, token_response);
  123. }
  124. }
  125. }
  126. std::vector<FakeOAuth2AccessTokenManager::PendingRequest>
  127. FakeOAuth2AccessTokenManager::GetPendingRequests() {
  128. std::vector<PendingRequest> valid_requests;
  129. for (auto it = pending_requests_.begin(); it != pending_requests_.end();
  130. ++it) {
  131. if (it->request)
  132. valid_requests.push_back(*it);
  133. }
  134. return valid_requests;
  135. }
  136. void FakeOAuth2AccessTokenManager::CancelAllRequests() {
  137. CompleteRequests(
  138. CoreAccountId(), true, FakeOAuth2AccessTokenManager::ScopeSet(),
  139. GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED),
  140. OAuth2AccessTokenConsumer::TokenResponse());
  141. }
  142. void FakeOAuth2AccessTokenManager::CancelRequestsForAccount(
  143. const CoreAccountId& account_id) {
  144. CompleteRequests(
  145. account_id, true, FakeOAuth2AccessTokenManager::ScopeSet(),
  146. GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED),
  147. OAuth2AccessTokenConsumer::TokenResponse());
  148. }
  149. void FakeOAuth2AccessTokenManager::FetchOAuth2Token(
  150. FakeOAuth2AccessTokenManager::RequestImpl* request,
  151. const CoreAccountId& account_id,
  152. scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
  153. const std::string& client_id,
  154. const std::string& client_secret,
  155. const std::string& consumer_name,
  156. const FakeOAuth2AccessTokenManager::ScopeSet& scopes) {
  157. PendingRequest pending_request;
  158. pending_request.account_id = account_id;
  159. pending_request.client_id = client_id;
  160. pending_request.client_secret = client_secret;
  161. pending_request.url_loader_factory = url_loader_factory;
  162. pending_request.scopes = scopes;
  163. pending_request.request = request->AsWeakPtr();
  164. pending_requests_.push_back(pending_request);
  165. if (auto_post_fetch_response_on_message_loop_) {
  166. base::ThreadTaskRunnerHandle::Get()->PostTask(
  167. FROM_HERE,
  168. base::BindOnce(&FakeOAuth2AccessTokenManager::CompleteRequests,
  169. weak_ptr_factory_.GetWeakPtr(), account_id,
  170. /*all_scoped=*/true, scopes,
  171. GoogleServiceAuthError::AuthErrorNone(),
  172. TokenResponseBuilder()
  173. .WithAccessToken("access_token")
  174. .WithExpirationTime(base::Time::Max())
  175. .build()));
  176. }
  177. }
  178. void FakeOAuth2AccessTokenManager::InvalidateAccessTokenImpl(
  179. const CoreAccountId& account_id,
  180. const std::string& client_id,
  181. const FakeOAuth2AccessTokenManager::ScopeSet& scopes,
  182. const std::string& access_token) {
  183. for (auto& observer : GetDiagnosticsObserversForTesting())
  184. observer.OnAccessTokenRemoved(account_id, scopes);
  185. // Do nothing else, as we don't have a cache from which to remove the token.
  186. }