fake_profile_oauth2_token_service.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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 "chrome/browser/signin/fake_profile_oauth2_token_service.h" 6 7#include "base/message_loop/message_loop.h" 8#include "components/signin/core/browser/signin_account_id_helper.h" 9 10FakeProfileOAuth2TokenService::PendingRequest::PendingRequest() { 11} 12 13FakeProfileOAuth2TokenService::PendingRequest::~PendingRequest() { 14} 15 16FakeProfileOAuth2TokenService::FakeProfileOAuth2TokenService() 17 : auto_post_fetch_response_on_message_loop_(false), 18 weak_ptr_factory_(this) { 19 SigninAccountIdHelper::SetDisableForTest(true); 20} 21 22FakeProfileOAuth2TokenService::~FakeProfileOAuth2TokenService() { 23 SigninAccountIdHelper::SetDisableForTest(false); 24} 25 26bool FakeProfileOAuth2TokenService::RefreshTokenIsAvailable( 27 const std::string& account_id) const { 28 return !GetRefreshToken(account_id).empty(); 29} 30 31void FakeProfileOAuth2TokenService::LoadCredentials( 32 const std::string& primary_account_id) { 33 // Empty implementation as FakeProfileOAuth2TokenService does not have any 34 // credentials to load. 35} 36 37std::vector<std::string> FakeProfileOAuth2TokenService::GetAccounts() { 38 std::vector<std::string> account_ids; 39 for (std::map<std::string, std::string>::const_iterator iter = 40 refresh_tokens_.begin(); iter != refresh_tokens_.end(); ++iter) { 41 account_ids.push_back(iter->first); 42 } 43 return account_ids; 44} 45 46void FakeProfileOAuth2TokenService::UpdateCredentials( 47 const std::string& account_id, 48 const std::string& refresh_token) { 49 IssueRefreshTokenForUser(account_id, refresh_token); 50} 51 52void FakeProfileOAuth2TokenService::IssueRefreshToken( 53 const std::string& token) { 54 IssueRefreshTokenForUser("account_id", token); 55} 56 57void FakeProfileOAuth2TokenService::IssueRefreshTokenForUser( 58 const std::string& account_id, 59 const std::string& token) { 60 if (token.empty()) { 61 refresh_tokens_.erase(account_id); 62 FireRefreshTokenRevoked(account_id); 63 } else { 64 refresh_tokens_[account_id] = token; 65 FireRefreshTokenAvailable(account_id); 66 // TODO(atwilson): Maybe we should also call FireRefreshTokensLoaded() here? 67 } 68} 69 70void FakeProfileOAuth2TokenService::IssueAllRefreshTokensLoaded() { 71 FireRefreshTokensLoaded(); 72} 73 74void FakeProfileOAuth2TokenService::IssueAllTokensForAccount( 75 const std::string& account_id, 76 const std::string& access_token, 77 const base::Time& expiration) { 78 CompleteRequests(account_id, 79 true, 80 ScopeSet(), 81 GoogleServiceAuthError::AuthErrorNone(), 82 access_token, 83 expiration); 84} 85 86void FakeProfileOAuth2TokenService::IssueErrorForAllPendingRequestsForAccount( 87 const std::string& account_id, 88 const GoogleServiceAuthError& error) { 89 CompleteRequests(account_id, 90 true, 91 ScopeSet(), 92 error, 93 std::string(), 94 base::Time()); 95} 96 97void FakeProfileOAuth2TokenService::IssueTokenForScope( 98 const ScopeSet& scope, 99 const std::string& access_token, 100 const base::Time& expiration) { 101 CompleteRequests("", 102 false, 103 scope, 104 GoogleServiceAuthError::AuthErrorNone(), 105 access_token, 106 expiration); 107} 108 109void FakeProfileOAuth2TokenService::IssueErrorForScope( 110 const ScopeSet& scope, 111 const GoogleServiceAuthError& error) { 112 CompleteRequests("", false, scope, error, std::string(), base::Time()); 113} 114 115void FakeProfileOAuth2TokenService::IssueErrorForAllPendingRequests( 116 const GoogleServiceAuthError& error) { 117 CompleteRequests("", true, ScopeSet(), error, std::string(), base::Time()); 118} 119 120void FakeProfileOAuth2TokenService::IssueTokenForAllPendingRequests( 121 const std::string& access_token, 122 const base::Time& expiration) { 123 CompleteRequests("", 124 true, 125 ScopeSet(), 126 GoogleServiceAuthError::AuthErrorNone(), 127 access_token, 128 expiration); 129} 130 131void FakeProfileOAuth2TokenService::CompleteRequests( 132 const std::string& account_id, 133 bool all_scopes, 134 const ScopeSet& scope, 135 const GoogleServiceAuthError& error, 136 const std::string& access_token, 137 const base::Time& expiration) { 138 std::vector<FakeProfileOAuth2TokenService::PendingRequest> requests = 139 GetPendingRequests(); 140 141 // Walk the requests and notify the callbacks. 142 for (std::vector<PendingRequest>::iterator it = pending_requests_.begin(); 143 it != pending_requests_.end(); ++it) { 144 if (!it->request) 145 continue; 146 147 bool scope_matches = all_scopes || it->scopes == scope; 148 bool account_matches = account_id.empty() || account_id == it->account_id; 149 if (account_matches && scope_matches) 150 it->request->InformConsumer(error, access_token, expiration); 151 } 152} 153 154std::string FakeProfileOAuth2TokenService::GetRefreshToken( 155 const std::string& account_id) const { 156 std::map<std::string, std::string>::const_iterator it = 157 refresh_tokens_.find(account_id); 158 if (it != refresh_tokens_.end()) 159 return it->second; 160 return std::string(); 161} 162 163net::URLRequestContextGetter* 164FakeProfileOAuth2TokenService::GetRequestContext() { 165 return NULL; 166} 167 168std::vector<FakeProfileOAuth2TokenService::PendingRequest> 169FakeProfileOAuth2TokenService::GetPendingRequests() { 170 std::vector<PendingRequest> valid_requests; 171 for (std::vector<PendingRequest>::iterator it = pending_requests_.begin(); 172 it != pending_requests_.end(); ++it) { 173 if (it->request) 174 valid_requests.push_back(*it); 175 } 176 return valid_requests; 177} 178 179void FakeProfileOAuth2TokenService::FetchOAuth2Token( 180 RequestImpl* request, 181 const std::string& account_id, 182 net::URLRequestContextGetter* getter, 183 const std::string& client_id, 184 const std::string& client_secret, 185 const ScopeSet& scopes) { 186 PendingRequest pending_request; 187 pending_request.account_id = account_id; 188 pending_request.client_id = client_id; 189 pending_request.client_secret = client_secret; 190 pending_request.scopes = scopes; 191 pending_request.request = request->AsWeakPtr(); 192 pending_requests_.push_back(pending_request); 193 194 if (auto_post_fetch_response_on_message_loop_) { 195 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 196 &FakeProfileOAuth2TokenService::IssueAllTokensForAccount, 197 weak_ptr_factory_.GetWeakPtr(), 198 account_id, 199 "access_token", 200 base::Time::Max())); 201 } 202} 203 204OAuth2AccessTokenFetcher* 205FakeProfileOAuth2TokenService::CreateAccessTokenFetcher( 206 const std::string& account_id, 207 net::URLRequestContextGetter* getter, 208 OAuth2AccessTokenConsumer* consumer) { 209 NOTREACHED(); 210 return NULL; 211} 212 213void FakeProfileOAuth2TokenService::InvalidateOAuth2Token( 214 const std::string& account_id, 215 const std::string& client_id, 216 const ScopeSet& scopes, 217 const std::string& access_token) { 218 // Do nothing, as we don't have a cache from which to remove the token. 219} 220