Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / components / signin / ios / browser / profile_oauth2_token_service_ios_unittest.mm
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.
4
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"
14
15 class ProfileOAuth2TokenServiceIOSTest : public testing::Test,
16                                          public OAuth2TokenService::Consumer,
17                                          public OAuth2TokenService::Observer {
18  public:
19   ProfileOAuth2TokenServiceIOSTest()
20       : OAuth2TokenService::Consumer("test_consumer_id"),
21         factory_(NULL),
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) {}
28
29   virtual void SetUp() OVERRIDE {
30     factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_revoke_url(),
31                              "",
32                              net::HTTP_OK,
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);
38   }
39
40   virtual void TearDown() OVERRIDE {
41     oauth2_service_.RemoveObserver(this);
42     oauth2_service_.Shutdown();
43   }
44
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_;
50   }
51
52   virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
53                                  const GoogleServiceAuthError& error) OVERRIDE {
54     ++access_token_failure_;
55     last_access_token_error_ = error;
56   };
57
58   // OAuth2TokenService::Observer implementation.
59   virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE {
60     ++token_available_count_;
61   }
62   virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE {
63     ++token_revoked_count_;
64   }
65   virtual void OnRefreshTokensLoaded() OVERRIDE { ++tokens_loaded_count_; }
66
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;
73   }
74
75  protected:
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_;
88 };
89
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"));
99
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"));
107 }
108
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"));
123
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"));
133 }
134
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();
141
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();
148
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"));
157 }
158
159 TEST_F(ProfileOAuth2TokenServiceIOSTest, StartRequestSuccess) {
160   fake_provider_->AddAccount("account_id_1");
161   oauth2_service_.LoadCredentials("account_id_1");
162   base::RunLoop().RunUntilIdle();
163
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_);
172
173   ResetObserverCounts();
174   fake_provider_->IssueAccessTokenForAllRequests();
175   base::RunLoop().RunUntilIdle();
176   EXPECT_EQ(1, access_token_success_);
177   EXPECT_EQ(0, access_token_failure_);
178 }
179
180 TEST_F(ProfileOAuth2TokenServiceIOSTest, StartRequestFailure) {
181   fake_provider_->AddAccount("account_id_1");
182   oauth2_service_.LoadCredentials("account_id_1");
183   base::RunLoop().RunUntilIdle();
184
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_);
193
194   ResetObserverCounts();
195   fake_provider_->IssueAccessTokenErrorForAllRequests();
196   base::RunLoop().RunUntilIdle();
197   EXPECT_EQ(0, access_token_success_);
198   EXPECT_EQ(1, access_token_failure_);
199 }
200
201 TEST_F(ProfileOAuth2TokenServiceIOSTest, Migration) {
202   fake_provider_->set_using_shared_authentication(false);
203   oauth2_service_.LoadCredentials("account_id_1");
204   base::RunLoop().RunUntilIdle();
205
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(
217                 "account_id_1"));
218   EXPECT_EQ("pre_sso_refresh_token_2",
219             oauth2_service_.GetRefreshTokenWhenNotUsingSharedAuthentication(
220                 "account_id_2"));
221
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"));
230
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"));
240 }
241
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"));
248
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"));
257
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());
268
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"));
276 }