Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(358)

Side by Side Diff: chrome/browser/net/gaia/oauth2_login_token_fetcher_unittest.cc

Issue 8603009: Add a fetcher class to fetch an OAuth2 login scope token from ClientLogin credentials. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/net/gaia/oauth2_login_token_fetcher.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 // A complete set of unit tests for OAuth2LoginTokenFetcher.
6
7 #include <string>
8
9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop.h"
11 #include "chrome/browser/net/gaia/oauth2_login_token_consumer.h"
12 #include "chrome/browser/net/gaia/oauth2_login_token_fetcher.h"
13 #include "chrome/common/net/gaia/gaia_urls.h"
14 #include "chrome/common/net/gaia/google_service_auth_error.h"
15 #include "chrome/common/net/http_return.h"
16 #include "chrome/test/base/testing_profile.h"
17 #include "content/public/common/url_fetcher.h"
18 #include "content/public/common/url_fetcher_delegate.h"
19 #include "content/public/common/url_fetcher_factory.h"
20 #include "content/test/test_browser_thread.h"
21 #include "content/test/test_url_fetcher_factory.h"
22 #include "googleurl/src/gurl.h"
23 #include "net/url_request/url_request.h"
24 #include "net/url_request/url_request_status.h"
25 #include "testing/gmock/include/gmock/gmock.h"
26 #include "testing/gtest/include/gtest/gtest.h"
27
28 using content::BrowserThread;
29 using content::URLFetcher;
30 using content::URLFetcherDelegate;
31 using content::URLFetcherFactory;
32 using net::ResponseCookies;
33 using net::URLRequestStatus;
34 using testing::_;
35 using testing::Return;
36
37 namespace {
38 static const char kValidSetCookieHeader[] =
39 "oauth_code=test-code; Path=/test; Secure; HttpOnly";
40 static const char kSetCookieHeaderMissingSecure[] =
41 "oauth_code=test-code; Path=/test; HttpOnly";
42 static const char kSetCookieHeaderMissingHttpOnly[] =
43 "oauth_code=test-code; Path=/test; Secure";
44 static const char kSetCookieHeaderMissingOAuthCode[] =
45 "Path=/test; Secure; HttpOnly";
46 static const char kValidTokenResponse[] =
47 "{"
48 " \"refresh_token\": \"rt1\","
49 " \"access_token\": \"at1\""
50 "}";
51 static const char kTokenResponseNoRefreshToken[] =
52 "{"
53 " \"access_token\": \"at1\""
54 "}";
55 static const char kTokenResponseNoAccessToken[] =
56 "{"
57 " \"refresh_token\": \"rt1\""
58 "}";
59 }
60
61 class MockUrlFetcherFactory : public ScopedURLFetcherFactory,
62 public URLFetcherFactory {
63 public:
64 MockUrlFetcherFactory()
65 : ScopedURLFetcherFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
66 }
67 virtual ~MockUrlFetcherFactory() {}
68
69 MOCK_METHOD4(
70 CreateURLFetcher,
71 URLFetcher* (int id,
72 const GURL& url,
73 URLFetcher::RequestType request_type,
74 URLFetcherDelegate* d));
75 };
76
77 class MockOAuth2LoginTokenConsumer : public OAuth2LoginTokenConsumer {
78 public:
79 MockOAuth2LoginTokenConsumer() {}
80 ~MockOAuth2LoginTokenConsumer() {}
81
82 MOCK_METHOD2(OnGetTokenSuccess, void(const std::string& refresh_token,
83 const std::string& access_token));
84 MOCK_METHOD1(OnGetTokenFailure,
85 void(const GoogleServiceAuthError& error));
86 };
87
88 class OAuth2LoginTokenFetcherTest : public testing::Test {
89 public:
90 OAuth2LoginTokenFetcherTest()
91 : ui_thread_(BrowserThread::UI, &message_loop_),
92 fetcher_(&consumer_, profile_.GetRequestContext(), "test") {
93 }
94
95 virtual ~OAuth2LoginTokenFetcherTest() { }
96
97 virtual TestURLFetcher* SetupGetAuthCode(
98 bool fetch_succeeds, int response_code, const std::string& cookie) {
99 GURL url(GaiaUrls::GetInstance()->client_login_to_oauth2_url());
100 TestURLFetcher* url_fetcher = new TestURLFetcher(0, url, &fetcher_);
101 URLRequestStatus::Status status =
102 fetch_succeeds ? URLRequestStatus::SUCCESS : URLRequestStatus::FAILED;
103 url_fetcher->set_status(URLRequestStatus(status, 0));
104
105 if (response_code != 0)
106 url_fetcher->set_response_code(response_code);
107
108 if (!cookie.empty()) {
109 ResponseCookies cookies;
110 cookies.push_back(cookie);
111 url_fetcher->set_cookies(cookies);
112 }
113
114 EXPECT_CALL(factory_, CreateURLFetcher(_, url, _, _))
115 .WillOnce(Return(url_fetcher));
116 return url_fetcher;
117 }
118
119 virtual TestURLFetcher* SetupGetTokenPair(
120 bool fetch_succeeds, int response_code, const std::string& body) {
121 GURL url(GaiaUrls::GetInstance()->oauth2_token_url());
122 TestURLFetcher* url_fetcher = new TestURLFetcher(0, url, &fetcher_);
123 URLRequestStatus::Status status =
124 fetch_succeeds ? URLRequestStatus::SUCCESS : URLRequestStatus::FAILED;
125 url_fetcher->set_status(URLRequestStatus(status, 0));
126
127 if (response_code != 0)
128 url_fetcher->set_response_code(response_code);
129
130 if (!body.empty())
131 url_fetcher->SetResponseString(body);
132
133 EXPECT_CALL(factory_, CreateURLFetcher(_, url, _, _))
134 .WillOnce(Return(url_fetcher));
135 return url_fetcher;
136 }
137
138 protected:
139 MessageLoop message_loop_;
140 content::TestBrowserThread ui_thread_;
141 MockUrlFetcherFactory factory_;
142 MockOAuth2LoginTokenConsumer consumer_;
143 TestingProfile profile_;
144 OAuth2LoginTokenFetcher fetcher_;
145 };
146
147 TEST_F(OAuth2LoginTokenFetcherTest, GetAuthCodeRequestFailure) {
148 TestURLFetcher* url_fetcher = SetupGetAuthCode(false, 0, "");
149 EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1);
150 fetcher_.Start("auth_token");
151 fetcher_.OnURLFetchComplete(url_fetcher);
152 }
153
154 TEST_F(OAuth2LoginTokenFetcherTest, GetAuthCodeResponseCodeFailure) {
155 TestURLFetcher* url_fetcher = SetupGetAuthCode(true, RC_FORBIDDEN, "");
156 EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1);
157 fetcher_.Start("auth_token");
158 fetcher_.OnURLFetchComplete(url_fetcher);
159 }
160
161 TEST_F(OAuth2LoginTokenFetcherTest, GetAuthCodeResponseMissingSecure) {
162 TestURLFetcher* url_fetcher = SetupGetAuthCode(
163 true, RC_REQUEST_OK, kSetCookieHeaderMissingSecure);
164 EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1);
165 fetcher_.Start("auth_token");
166 fetcher_.OnURLFetchComplete(url_fetcher);
167 }
168
169 TEST_F(OAuth2LoginTokenFetcherTest, GetAuthCodeResponseMissingHttpOnly) {
170 TestURLFetcher* url_fetcher = SetupGetAuthCode(
171 true, RC_REQUEST_OK, kSetCookieHeaderMissingHttpOnly);
172 EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1);
173 fetcher_.Start("auth_token");
174 fetcher_.OnURLFetchComplete(url_fetcher);
175 }
176
177 TEST_F(OAuth2LoginTokenFetcherTest, GetAuthCodeResponseMissingOAuthCode) {
178 TestURLFetcher* url_fetcher = SetupGetAuthCode(
179 true, RC_REQUEST_OK, kSetCookieHeaderMissingOAuthCode);
180 EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1);
181 fetcher_.Start("auth_token");
182 fetcher_.OnURLFetchComplete(url_fetcher);
183 }
184
185 TEST_F(OAuth2LoginTokenFetcherTest, GetTokenPairRequestFailure) {
186 TestURLFetcher* url_fetcher1 = SetupGetAuthCode(
187 true, RC_REQUEST_OK, kValidSetCookieHeader);
188 TestURLFetcher* url_fetcher2 = SetupGetTokenPair(false, 0, "");
189 EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1);
190 fetcher_.Start("auth_token");
191 fetcher_.OnURLFetchComplete(url_fetcher1);
192 fetcher_.OnURLFetchComplete(url_fetcher2);
193 }
194
195 TEST_F(OAuth2LoginTokenFetcherTest, GetTokenPairResponseCodeFailure) {
196 TestURLFetcher* url_fetcher1 = SetupGetAuthCode(
197 true, RC_REQUEST_OK, kValidSetCookieHeader);
198 TestURLFetcher* url_fetcher2 = SetupGetTokenPair(true, RC_FORBIDDEN, "");
199 EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1);
200 fetcher_.Start("auth_token");
201 fetcher_.OnURLFetchComplete(url_fetcher1);
202 fetcher_.OnURLFetchComplete(url_fetcher2);
203 }
204
205 TEST_F(OAuth2LoginTokenFetcherTest, GetTokenPairResponseMissingRefreshToken) {
206 TestURLFetcher* url_fetcher1 = SetupGetAuthCode(
207 true, RC_REQUEST_OK, kValidSetCookieHeader);
208 TestURLFetcher* url_fetcher2 = SetupGetTokenPair(
209 true, RC_REQUEST_OK, kTokenResponseNoRefreshToken);
210 EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1);
211 fetcher_.Start("auth_token");
212 fetcher_.OnURLFetchComplete(url_fetcher1);
213 fetcher_.OnURLFetchComplete(url_fetcher2);
214 }
215
216 TEST_F(OAuth2LoginTokenFetcherTest, GetTokenPairResponseMissingAccessToken) {
217 TestURLFetcher* url_fetcher1 = SetupGetAuthCode(
218 true, RC_REQUEST_OK, kValidSetCookieHeader);
219 TestURLFetcher* url_fetcher2 = SetupGetTokenPair(
220 true, RC_REQUEST_OK, kTokenResponseNoAccessToken);
221 EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1);
222 fetcher_.Start("auth_token");
223 fetcher_.OnURLFetchComplete(url_fetcher1);
224 fetcher_.OnURLFetchComplete(url_fetcher2);
225 }
226
227 TEST_F(OAuth2LoginTokenFetcherTest, Success) {
228 TestURLFetcher* url_fetcher1 = SetupGetAuthCode(
229 true, RC_REQUEST_OK, kValidSetCookieHeader);
230 TestURLFetcher* url_fetcher2 = SetupGetTokenPair(
231 true, RC_REQUEST_OK, kValidTokenResponse);
232 EXPECT_CALL(consumer_, OnGetTokenSuccess("rt1", "at1")).Times(1);
233 fetcher_.Start("auth_token");
234 fetcher_.OnURLFetchComplete(url_fetcher1);
235 fetcher_.OnURLFetchComplete(url_fetcher2);
236 }
237
238 TEST_F(OAuth2LoginTokenFetcherTest, ParseGetAuthCodeResponse) {
239 { // No cookies.
240 TestURLFetcher url_fetcher(0, GURL("www.google.com"), NULL);
241
242 std::string auth_code;
243 EXPECT_FALSE(OAuth2LoginTokenFetcher::ParseGetAuthCodeResponse(
244 &url_fetcher, &auth_code));
245 EXPECT_TRUE(auth_code.empty());
246 }
247 { // Some cookies, nothing appropriate.
248 ResponseCookies cookies;
249 cookies.push_back("foo");
250 cookies.push_back("oauth_code=foo");
251 cookies.push_back(kSetCookieHeaderMissingOAuthCode);
252 TestURLFetcher url_fetcher(0, GURL("www.google.com"), NULL);
253 url_fetcher.set_cookies(cookies);
254
255 std::string auth_code;
256 EXPECT_FALSE(OAuth2LoginTokenFetcher::ParseGetAuthCodeResponse(
257 &url_fetcher, &auth_code));
258 EXPECT_TRUE(auth_code.empty());
259 }
260 { // Single cookie: a valid one.
261 ResponseCookies cookies;
262 cookies.push_back(kValidSetCookieHeader);
263 TestURLFetcher url_fetcher(0, GURL("www.google.com"), NULL);
264 url_fetcher.set_cookies(cookies);
265
266 std::string auth_code;
267 EXPECT_TRUE(OAuth2LoginTokenFetcher::ParseGetAuthCodeResponse(
268 &url_fetcher, &auth_code));
269 EXPECT_EQ("test-code", auth_code);
270 }
271 { // Some cookies: with a valid one.
272 ResponseCookies cookies;
273 cookies.push_back(kSetCookieHeaderMissingSecure);
274 cookies.push_back(kSetCookieHeaderMissingHttpOnly);
275 cookies.push_back(kSetCookieHeaderMissingOAuthCode);
276 cookies.push_back(kValidSetCookieHeader);
277 TestURLFetcher url_fetcher(0, GURL("www.google.com"), NULL);
278 url_fetcher.set_cookies(cookies);
279
280 std::string auth_code;
281 EXPECT_TRUE(OAuth2LoginTokenFetcher::ParseGetAuthCodeResponse(
282 &url_fetcher, &auth_code));
283 EXPECT_EQ("test-code", auth_code);
284 }
285 }
286
287 TEST_F(OAuth2LoginTokenFetcherTest, ParseGetTokenPairResponse) {
288 { // No body.
289 TestURLFetcher url_fetcher(0, GURL("www.google.com"), NULL);
290
291 std::string rt;
292 std::string at;
293 EXPECT_FALSE(OAuth2LoginTokenFetcher::ParseGetTokenPairResponse(
294 &url_fetcher, &rt, &at));
295 EXPECT_TRUE(rt.empty());
296 EXPECT_TRUE(at.empty());
297 }
298 { // Bad json.
299 TestURLFetcher url_fetcher(0, GURL("www.google.com"), NULL);
300 url_fetcher.SetResponseString("foo");
301
302 std::string rt;
303 std::string at;
304 EXPECT_FALSE(OAuth2LoginTokenFetcher::ParseGetTokenPairResponse(
305 &url_fetcher, &rt, &at));
306 EXPECT_TRUE(rt.empty());
307 EXPECT_TRUE(at.empty());
308 }
309 { // Valid json: refresh token missing.
310 TestURLFetcher url_fetcher(0, GURL("www.google.com"), NULL);
311 url_fetcher.SetResponseString(kTokenResponseNoRefreshToken);
312
313 std::string rt;
314 std::string at;
315 EXPECT_FALSE(OAuth2LoginTokenFetcher::ParseGetTokenPairResponse(
316 &url_fetcher, &rt, &at));
317 EXPECT_TRUE(rt.empty());
318 EXPECT_TRUE(at.empty());
319 }
320 { // Valid json: access token missing.
321 TestURLFetcher url_fetcher(0, GURL("www.google.com"), NULL);
322 url_fetcher.SetResponseString(kTokenResponseNoAccessToken);
323
324 std::string rt;
325 std::string at;
326 EXPECT_FALSE(OAuth2LoginTokenFetcher::ParseGetTokenPairResponse(
327 &url_fetcher, &rt, &at));
328 EXPECT_TRUE(rt.empty());
329 EXPECT_TRUE(at.empty());
330 }
331 { // Valid json: all good.
332 TestURLFetcher url_fetcher(0, GURL("www.google.com"), NULL);
333 url_fetcher.SetResponseString(kValidTokenResponse);
334
335 std::string rt;
336 std::string at;
337 EXPECT_TRUE(OAuth2LoginTokenFetcher::ParseGetTokenPairResponse(
338 &url_fetcher, &rt, &at));
339 EXPECT_EQ("rt1", rt);
340 EXPECT_EQ("at1", at);
341 }
342 }
OLDNEW
« no previous file with comments | « chrome/browser/net/gaia/oauth2_login_token_fetcher.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698