1 // Copyright 2014 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.
5 #include "base/run_loop.h"
6 #include "components/signin/core/browser/profile_oauth2_token_service.h"
7 #include "components/signin/core/browser/test_signin_client.h"
8 #include "components/signin/ios/browser/profile_oauth2_token_service_ios.h"
9 #include "google_apis/gaia/gaia_urls.h"
10 #include "google_apis/gaia/oauth2_token_service_test_util.h"
11 #include "ios/public/test/fake_profile_oauth2_token_service_ios_provider.h"
12 #include "net/url_request/test_url_fetcher_factory.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 class ProfileOAuth2TokenServiceIOSTest : public testing::Test,
16 public OAuth2TokenService::Consumer,
17 public OAuth2TokenService::Observer {
19 ProfileOAuth2TokenServiceIOSTest()
20 : OAuth2TokenService::Consumer("test_consumer_id"),
22 token_available_count_(0),
23 token_revoked_count_(0),
24 tokens_loaded_count_(0),
25 access_token_success_(0),
26 access_token_failure_(0),
27 last_access_token_error_(GoogleServiceAuthError::NONE) {}
29 virtual void SetUp() OVERRIDE {
30 factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_revoke_url(),
33 net::URLRequestStatus::SUCCESS);
34 fake_provider_ = client_.GetIOSProviderAsFake();
35 fake_provider_->set_using_shared_authentication(true);
36 oauth2_service_.Initialize(&client_);
37 oauth2_service_.AddObserver(this);
40 virtual void TearDown() OVERRIDE {
41 oauth2_service_.RemoveObserver(this);
42 oauth2_service_.Shutdown();
45 // OAuth2TokenService::Consumer implementation.
46 virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
47 const std::string& access_token,
48 const base::Time& expiration_time) OVERRIDE {
49 ++access_token_success_;
52 virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
53 const GoogleServiceAuthError& error) OVERRIDE {
54 ++access_token_failure_;
55 last_access_token_error_ = error;
58 // OAuth2TokenService::Observer implementation.
59 virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE {
60 ++token_available_count_;
62 virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE {
63 ++token_revoked_count_;
65 virtual void OnRefreshTokensLoaded() OVERRIDE { ++tokens_loaded_count_; }
67 void ResetObserverCounts() {
68 token_available_count_ = 0;
69 token_revoked_count_ = 0;
70 tokens_loaded_count_ = 0;
71 token_available_count_ = 0;
72 access_token_failure_ = 0;
76 base::MessageLoop message_loop_;
77 net::FakeURLFetcherFactory factory_;
78 TestSigninClient client_;
79 ios::FakeProfileOAuth2TokenServiceIOSProvider* fake_provider_;
80 ProfileOAuth2TokenServiceIOS oauth2_service_;
81 TestingOAuth2TokenServiceConsumer consumer_;
82 int token_available_count_;
83 int token_revoked_count_;
84 int tokens_loaded_count_;
85 int access_token_success_;
86 int access_token_failure_;
87 GoogleServiceAuthError last_access_token_error_;
90 TEST_F(ProfileOAuth2TokenServiceIOSTest, LoadRevokeCredentialsOneAccount) {
91 fake_provider_->AddAccount("account_id");
92 oauth2_service_.LoadCredentials("account_id");
93 base::RunLoop().RunUntilIdle();
94 EXPECT_EQ(1, token_available_count_);
95 EXPECT_EQ(1, tokens_loaded_count_);
96 EXPECT_EQ(0, token_revoked_count_);
97 EXPECT_EQ(1U, oauth2_service_.GetAccounts().size());
98 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id"));
100 ResetObserverCounts();
101 oauth2_service_.RevokeAllCredentials();
102 EXPECT_EQ(0, token_available_count_);
103 EXPECT_EQ(0, tokens_loaded_count_);
104 EXPECT_EQ(1, token_revoked_count_);
105 EXPECT_EQ(0U, oauth2_service_.GetAccounts().size());
106 EXPECT_FALSE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));
109 TEST_F(ProfileOAuth2TokenServiceIOSTest,
110 LoadRevokeCredentialsMultipleAccounts) {
111 fake_provider_->AddAccount("account_id_1");
112 fake_provider_->AddAccount("account_id_2");
113 fake_provider_->AddAccount("account_id_3");
114 oauth2_service_.LoadCredentials("account_id_1");
115 base::RunLoop().RunUntilIdle();
116 EXPECT_EQ(3, token_available_count_);
117 EXPECT_EQ(1, tokens_loaded_count_);
118 EXPECT_EQ(0, token_revoked_count_);
119 EXPECT_EQ(3U, oauth2_service_.GetAccounts().size());
120 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));
121 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_2"));
122 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_3"));
124 ResetObserverCounts();
125 oauth2_service_.RevokeAllCredentials();
126 EXPECT_EQ(0, token_available_count_);
127 EXPECT_EQ(0, tokens_loaded_count_);
128 EXPECT_EQ(3, token_revoked_count_);
129 EXPECT_EQ(0U, oauth2_service_.GetAccounts().size());
130 EXPECT_FALSE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));
131 EXPECT_FALSE(oauth2_service_.RefreshTokenIsAvailable("account_id_2"));
132 EXPECT_FALSE(oauth2_service_.RefreshTokenIsAvailable("account_id_3"));
135 TEST_F(ProfileOAuth2TokenServiceIOSTest, ReloadCredentials) {
136 fake_provider_->AddAccount("account_id_1");
137 fake_provider_->AddAccount("account_id_2");
138 fake_provider_->AddAccount("account_id_3");
139 oauth2_service_.LoadCredentials("account_id_1");
140 base::RunLoop().RunUntilIdle();
142 // Change the accounts.
143 ResetObserverCounts();
144 fake_provider_->ClearAccounts();
145 fake_provider_->AddAccount("account_id_1");
146 fake_provider_->AddAccount("account_id_4");
147 oauth2_service_.ReloadCredentials();
149 EXPECT_EQ(1, token_available_count_);
150 EXPECT_EQ(0, tokens_loaded_count_);
151 EXPECT_EQ(2, token_revoked_count_);
152 EXPECT_EQ(2U, oauth2_service_.GetAccounts().size());
153 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));
154 EXPECT_FALSE(oauth2_service_.RefreshTokenIsAvailable("account_id_2"));
155 EXPECT_FALSE(oauth2_service_.RefreshTokenIsAvailable("account_id_3"));
156 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_4"));
159 TEST_F(ProfileOAuth2TokenServiceIOSTest, StartRequestSuccess) {
160 fake_provider_->AddAccount("account_id_1");
161 oauth2_service_.LoadCredentials("account_id_1");
162 base::RunLoop().RunUntilIdle();
164 // Fetch access tokens.
165 ResetObserverCounts();
166 OAuth2TokenService::ScopeSet scopes;
167 scopes.insert("scope");
168 scoped_ptr<OAuth2TokenService::Request> request(
169 oauth2_service_.StartRequest("account_id_1", scopes, this));
170 EXPECT_EQ(0, access_token_success_);
171 EXPECT_EQ(0, access_token_failure_);
173 ResetObserverCounts();
174 fake_provider_->IssueAccessTokenForAllRequests();
175 base::RunLoop().RunUntilIdle();
176 EXPECT_EQ(1, access_token_success_);
177 EXPECT_EQ(0, access_token_failure_);
180 TEST_F(ProfileOAuth2TokenServiceIOSTest, StartRequestFailure) {
181 fake_provider_->AddAccount("account_id_1");
182 oauth2_service_.LoadCredentials("account_id_1");
183 base::RunLoop().RunUntilIdle();
185 // Fetch access tokens.
186 ResetObserverCounts();
187 OAuth2TokenService::ScopeSet scopes;
188 scopes.insert("scope");
189 scoped_ptr<OAuth2TokenService::Request> request(
190 oauth2_service_.StartRequest("account_id_1", scopes, this));
191 EXPECT_EQ(0, access_token_success_);
192 EXPECT_EQ(0, access_token_failure_);
194 ResetObserverCounts();
195 fake_provider_->IssueAccessTokenErrorForAllRequests();
196 base::RunLoop().RunUntilIdle();
197 EXPECT_EQ(0, access_token_success_);
198 EXPECT_EQ(1, access_token_failure_);
201 TEST_F(ProfileOAuth2TokenServiceIOSTest, Migration) {
202 fake_provider_->set_using_shared_authentication(false);
203 oauth2_service_.LoadCredentials("account_id_1");
204 base::RunLoop().RunUntilIdle();
206 ResetObserverCounts();
207 oauth2_service_.UpdateCredentials("account_id_1", "pre_sso_refresh_token_1");
208 oauth2_service_.UpdateCredentials("account_id_2", "pre_sso_refresh_token_2");
209 EXPECT_EQ(2, token_available_count_);
210 EXPECT_EQ(0, tokens_loaded_count_);
211 EXPECT_EQ(0, token_revoked_count_);
212 EXPECT_EQ(2U, oauth2_service_.GetAccounts().size());
213 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));
214 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_2"));
215 EXPECT_EQ("pre_sso_refresh_token_1",
216 oauth2_service_.GetRefreshTokenWhenNotUsingSharedAuthentication(
218 EXPECT_EQ("pre_sso_refresh_token_2",
219 oauth2_service_.GetRefreshTokenWhenNotUsingSharedAuthentication(
222 ResetObserverCounts();
223 oauth2_service_.StartUsingSharedAuthentication();
224 EXPECT_EQ(0, token_available_count_);
225 EXPECT_EQ(0, tokens_loaded_count_);
226 EXPECT_EQ(2, token_revoked_count_);
227 EXPECT_EQ(0U, oauth2_service_.GetAccounts().size());
228 EXPECT_FALSE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));
229 EXPECT_FALSE(oauth2_service_.RefreshTokenIsAvailable("account_id_2"));
231 ResetObserverCounts();
232 fake_provider_->AddAccount("account_id_1");
233 oauth2_service_.ReloadCredentials();
234 EXPECT_EQ(1, token_available_count_);
235 EXPECT_EQ(0, tokens_loaded_count_);
236 EXPECT_EQ(0, token_revoked_count_);
237 EXPECT_EQ(1U, oauth2_service_.GetAccounts().size());
238 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));
239 EXPECT_FALSE(oauth2_service_.RefreshTokenIsAvailable("account_id_2"));
242 TEST_F(ProfileOAuth2TokenServiceIOSTest, ForceInvalidGrantResponses) {
243 fake_provider_->set_using_shared_authentication(false);
244 oauth2_service_.LoadCredentials("account_id_1");
245 base::RunLoop().RunUntilIdle();
246 oauth2_service_.UpdateCredentials("account_id_1", "pre_sso_refresh_token_1");
247 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));
249 // First call revokes the existing token and then updates the credentials
250 // with a fake token.
251 ResetObserverCounts();
252 oauth2_service_.ForceInvalidGrantResponses();
253 EXPECT_EQ(1, token_available_count_);
254 EXPECT_EQ(0, tokens_loaded_count_);
255 EXPECT_EQ(1, token_revoked_count_);
256 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));
258 // Fetching access tokens fails with invalid grant responses.
259 OAuth2TokenService::ScopeSet scopes;
260 scopes.insert("scope");
261 scoped_ptr<OAuth2TokenService::Request> request(
262 oauth2_service_.StartRequest("account_id_1", scopes, this));
263 base::RunLoop().RunUntilIdle();
264 EXPECT_EQ(0, access_token_success_);
265 EXPECT_EQ(1, access_token_failure_);
266 EXPECT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS,
267 last_access_token_error_.state());
269 // Second call to force invalid grant responses is ignored.
270 ResetObserverCounts();
271 oauth2_service_.ForceInvalidGrantResponses();
272 EXPECT_EQ(0, token_available_count_);
273 EXPECT_EQ(0, tokens_loaded_count_);
274 EXPECT_EQ(0, token_revoked_count_);
275 EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id_1"));