1 // Copyright (c) 2012 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 // A complete set of unit tests for GaiaOAuthClient.
9 #include "base/message_loop.h"
10 #include "base/string_number_conversions.h"
11 #include "base/string_util.h"
12 #include "chrome/test/base/testing_profile.h"
13 #include "google_apis/gaia/gaia_oauth_client.h"
14 #include "googleurl/src/gurl.h"
15 #include "net/base/net_errors.h"
16 #include "net/http/http_status_code.h"
17 #include "net/url_request/test_url_fetcher_factory.h"
18 #include "net/url_request/url_fetcher_delegate.h"
19 #include "net/url_request/url_request_status.h"
20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h"
26 // Responds as though OAuth returned from the server.
27 class MockOAuthFetcher
: public net::TestURLFetcher
{
29 MockOAuthFetcher(int response_code
,
30 int max_failure_count
,
32 const std::string
& results
,
33 net::URLFetcher::RequestType request_type
,
34 net::URLFetcherDelegate
* d
)
35 : net::TestURLFetcher(0, url
, d
),
36 max_failure_count_(max_failure_count
),
37 current_failure_count_(0) {
39 set_response_code(response_code
);
40 SetResponseString(results
);
43 virtual ~MockOAuthFetcher() { }
45 virtual void Start() {
46 if ((GetResponseCode() != net::HTTP_OK
) && (max_failure_count_
!= -1) &&
47 (current_failure_count_
== max_failure_count_
)) {
48 set_response_code(net::HTTP_OK
);
51 net::URLRequestStatus::Status code
= net::URLRequestStatus::SUCCESS
;
52 if (GetResponseCode() != net::HTTP_OK
) {
53 code
= net::URLRequestStatus::FAILED
;
54 current_failure_count_
++;
56 set_status(net::URLRequestStatus(code
, 0));
58 delegate()->OnURLFetchComplete(this);
62 int max_failure_count_
;
63 int current_failure_count_
;
64 DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcher
);
67 class MockOAuthFetcherFactory
: public net::URLFetcherFactory
,
68 public net::ScopedURLFetcherFactory
{
70 MockOAuthFetcherFactory()
71 : net::ScopedURLFetcherFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
72 response_code_(net::HTTP_OK
) {
74 ~MockOAuthFetcherFactory() {}
75 virtual net::URLFetcher
* CreateURLFetcher(
78 net::URLFetcher::RequestType request_type
,
79 net::URLFetcherDelegate
* d
) {
80 return new MockOAuthFetcher(
88 void set_response_code(int response_code
) {
89 response_code_
= response_code
;
91 void set_max_failure_count(int count
) {
92 max_failure_count_
= count
;
94 void set_results(const std::string
& results
) {
99 int max_failure_count_
;
100 std::string results_
;
101 DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcherFactory
);
104 const std::string kTestAccessToken
= "1/fFAGRNJru1FTz70BzhT3Zg";
105 const std::string kTestRefreshToken
=
106 "1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ";
107 const std::string kTestUserEmail
= "a_user@gmail.com";
108 const int kTestExpiresIn
= 3920;
110 const std::string kDummyGetTokensResult
=
111 "{\"access_token\":\"" + kTestAccessToken
+ "\","
112 "\"expires_in\":" + base::IntToString(kTestExpiresIn
) + ","
113 "\"refresh_token\":\"" + kTestRefreshToken
+ "\"}";
115 const std::string kDummyRefreshTokenResult
=
116 "{\"access_token\":\"" + kTestAccessToken
+ "\","
117 "\"expires_in\":" + base::IntToString(kTestExpiresIn
) + "}";
119 const std::string kDummyUserInfoResult
=
120 "{\"email\":\"" + kTestUserEmail
+ "\"}";
125 class GaiaOAuthClientTest
: public testing::Test
{
127 GaiaOAuthClientTest() {}
129 TestingProfile profile_
;
131 MessageLoop message_loop_
;
134 class MockGaiaOAuthClientDelegate
: public gaia::GaiaOAuthClient::Delegate
{
136 MockGaiaOAuthClientDelegate() {}
137 ~MockGaiaOAuthClientDelegate() {}
139 MOCK_METHOD3(OnGetTokensResponse
, void(const std::string
& refresh_token
,
140 const std::string
& access_token
,
141 int expires_in_seconds
));
142 MOCK_METHOD2(OnRefreshTokenResponse
, void(const std::string
& access_token
,
143 int expires_in_seconds
));
144 MOCK_METHOD1(OnGetUserInfoResponse
, void(const std::string
& user_email
));
145 MOCK_METHOD0(OnOAuthError
, void());
146 MOCK_METHOD1(OnNetworkError
, void(int response_code
));
149 TEST_F(GaiaOAuthClientTest
, NetworkFailure
) {
150 int response_code
= net::HTTP_INTERNAL_SERVER_ERROR
;
152 MockGaiaOAuthClientDelegate delegate
;
153 EXPECT_CALL(delegate
, OnNetworkError(response_code
))
156 TestingProfile profile
;
158 MockOAuthFetcherFactory factory
;
159 factory
.set_response_code(response_code
);
160 factory
.set_max_failure_count(4);
162 OAuthClientInfo client_info
;
163 client_info
.client_id
= "test_client_id";
164 client_info
.client_secret
= "test_client_secret";
165 client_info
.redirect_uri
= "test_redirect_uri";
166 GaiaOAuthClient
auth(kGaiaOAuth2Url
,
167 profile_
.GetRequestContext());
168 auth
.GetTokensFromAuthCode(client_info
, "auth_code", 2, &delegate
);
171 TEST_F(GaiaOAuthClientTest
, NetworkFailureRecover
) {
172 int response_code
= net::HTTP_INTERNAL_SERVER_ERROR
;
174 MockGaiaOAuthClientDelegate delegate
;
175 EXPECT_CALL(delegate
, OnGetTokensResponse(kTestRefreshToken
, kTestAccessToken
,
176 kTestExpiresIn
)).Times(1);
178 TestingProfile profile
;
180 MockOAuthFetcherFactory factory
;
181 factory
.set_response_code(response_code
);
182 factory
.set_max_failure_count(4);
183 factory
.set_results(kDummyGetTokensResult
);
185 OAuthClientInfo client_info
;
186 client_info
.client_id
= "test_client_id";
187 client_info
.client_secret
= "test_client_secret";
188 client_info
.redirect_uri
= "test_redirect_uri";
189 GaiaOAuthClient
auth(kGaiaOAuth2Url
,
190 profile_
.GetRequestContext());
191 auth
.GetTokensFromAuthCode(client_info
, "auth_code", -1, &delegate
);
194 TEST_F(GaiaOAuthClientTest
, OAuthFailure
) {
195 int response_code
= net::HTTP_BAD_REQUEST
;
197 MockGaiaOAuthClientDelegate delegate
;
198 EXPECT_CALL(delegate
, OnOAuthError()).Times(1);
200 TestingProfile profile
;
202 MockOAuthFetcherFactory factory
;
203 factory
.set_response_code(response_code
);
204 factory
.set_max_failure_count(-1);
205 factory
.set_results(kDummyGetTokensResult
);
207 OAuthClientInfo client_info
;
208 client_info
.client_id
= "test_client_id";
209 client_info
.client_secret
= "test_client_secret";
210 client_info
.redirect_uri
= "test_redirect_uri";
211 GaiaOAuthClient
auth(kGaiaOAuth2Url
,
212 profile_
.GetRequestContext());
213 auth
.GetTokensFromAuthCode(client_info
, "auth_code", -1, &delegate
);
217 TEST_F(GaiaOAuthClientTest
, GetTokensSuccess
) {
218 MockGaiaOAuthClientDelegate delegate
;
219 EXPECT_CALL(delegate
, OnGetTokensResponse(kTestRefreshToken
, kTestAccessToken
,
220 kTestExpiresIn
)).Times(1);
222 TestingProfile profile
;
224 MockOAuthFetcherFactory factory
;
225 factory
.set_results(kDummyGetTokensResult
);
227 OAuthClientInfo client_info
;
228 client_info
.client_id
= "test_client_id";
229 client_info
.client_secret
= "test_client_secret";
230 client_info
.redirect_uri
= "test_redirect_uri";
231 GaiaOAuthClient
auth(kGaiaOAuth2Url
,
232 profile_
.GetRequestContext());
233 auth
.GetTokensFromAuthCode(client_info
, "auth_code", -1, &delegate
);
236 TEST_F(GaiaOAuthClientTest
, RefreshTokenSuccess
) {
237 MockGaiaOAuthClientDelegate delegate
;
238 EXPECT_CALL(delegate
, OnRefreshTokenResponse(kTestAccessToken
,
239 kTestExpiresIn
)).Times(1);
241 TestingProfile profile
;
243 MockOAuthFetcherFactory factory
;
244 factory
.set_results(kDummyRefreshTokenResult
);
246 OAuthClientInfo client_info
;
247 client_info
.client_id
= "test_client_id";
248 client_info
.client_secret
= "test_client_secret";
249 client_info
.redirect_uri
= "test_redirect_uri";
250 GaiaOAuthClient
auth(kGaiaOAuth2Url
,
251 profile_
.GetRequestContext());
252 auth
.RefreshToken(client_info
, "refresh_token", -1, &delegate
);
255 TEST_F(GaiaOAuthClientTest
, GetUserInfo
) {
256 MockGaiaOAuthClientDelegate delegate
;
257 EXPECT_CALL(delegate
, OnGetUserInfoResponse(kTestUserEmail
)).Times(1);
259 TestingProfile profile
;
261 MockOAuthFetcherFactory factory
;
262 factory
.set_results(kDummyUserInfoResult
);
264 OAuthClientInfo client_info
;
265 client_info
.client_id
= "test_client_id";
266 client_info
.client_secret
= "test_client_secret";
267 client_info
.redirect_uri
= "test_redirect_uri";
268 GaiaOAuthClient
auth(kGaiaOAuth2Url
,
269 profile_
.GetRequestContext());
270 auth
.GetUserInfo("access_token", 1, &delegate
);