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

Side by Side Diff: chrome/browser/extensions/api/identity/identity_apitest.cc

Issue 15148007: Identity API: web-based scope approval dialogs for getAuthToken (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address reviewer comments Created 7 years, 7 months 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/string_util.h" 5 #include "base/string_util.h"
6 #include "base/stringprintf.h" 6 #include "base/stringprintf.h"
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "chrome/browser/extensions/api/identity/identity_api.h" 8 #include "chrome/browser/extensions/api/identity/identity_api.h"
9 #include "chrome/browser/extensions/extension_apitest.h" 9 #include "chrome/browser/extensions/extension_apitest.h"
10 #include "chrome/browser/extensions/extension_browsertest.h" 10 #include "chrome/browser/extensions/extension_browsertest.h"
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 186
187 ProfileKeyedService* IdentityAPITestFactory(content::BrowserContext* profile) { 187 ProfileKeyedService* IdentityAPITestFactory(content::BrowserContext* profile) {
188 return new IdentityAPI(static_cast<Profile*>(profile)); 188 return new IdentityAPI(static_cast<Profile*>(profile));
189 } 189 }
190 190
191 } // namespace 191 } // namespace
192 192
193 class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { 193 class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction {
194 public: 194 public:
195 MockGetAuthTokenFunction() : login_ui_result_(true), 195 MockGetAuthTokenFunction() : login_ui_result_(true),
196 install_ui_result_(false), 196 scope_ui_result_(true),
197 login_ui_shown_(false), 197 login_ui_shown_(false),
198 install_ui_shown_(false) { 198 scope_ui_shown_(false) {
199 } 199 }
200 200
201 void set_login_ui_result(bool result) { 201 void set_login_ui_result(bool result) {
202 login_ui_result_ = result; 202 login_ui_result_ = result;
203 } 203 }
204 204
205 void set_install_ui_result(bool result) { 205 void set_scope_ui_failure(GaiaWebAuthFlow::Failure failure) {
206 install_ui_result_ = result; 206 scope_ui_result_ = false;
207 scope_ui_failure_ = failure;
208 }
209
210 void set_scope_ui_oauth_error(const std::string& oauth_error) {
211 scope_ui_result_ = false;
212 scope_ui_failure_ = GaiaWebAuthFlow::OAUTH_ERROR;
213 scope_ui_oauth_error_ = oauth_error;
207 } 214 }
208 215
209 bool login_ui_shown() const { 216 bool login_ui_shown() const {
210 return login_ui_shown_; 217 return login_ui_shown_;
211 } 218 }
212 219
213 bool install_ui_shown() const { 220 bool scope_ui_shown() const {
214 return install_ui_shown_; 221 return scope_ui_shown_;
215 } 222 }
216 223
217 virtual void ShowLoginPopup() OVERRIDE { 224 virtual void ShowLoginPopup() OVERRIDE {
218 EXPECT_FALSE(login_ui_shown_); 225 EXPECT_FALSE(login_ui_shown_);
219 login_ui_shown_ = true; 226 login_ui_shown_ = true;
220 if (login_ui_result_) 227 if (login_ui_result_)
221 SigninSuccess("fake_refresh_token"); 228 SigninSuccess("fake_refresh_token");
222 else 229 else
223 SigninFailed(); 230 SigninFailed();
224 } 231 }
225 232
226 virtual void ShowOAuthApprovalDialog( 233 virtual void ShowOAuthApprovalDialog(
227 const IssueAdviceInfo& issue_advice) OVERRIDE { 234 const IssueAdviceInfo& issue_advice) OVERRIDE {
228 install_ui_shown_ = true; 235 scope_ui_shown_ = true;
229 // Call InstallUIProceed or InstallUIAbort based on the flag. 236
230 if (install_ui_result_) 237 if (scope_ui_result_) {
231 InstallUIProceed(); 238 OnGaiaFlowCompleted(kAccessToken, "3600");
232 else 239 } else if (scope_ui_failure_ == GaiaWebAuthFlow::SERVICE_AUTH_ERROR) {
233 InstallUIAbort(true); 240 GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED);
241 OnGaiaFlowFailure(scope_ui_failure_, error, "");
242 } else {
243 GoogleServiceAuthError error(GoogleServiceAuthError::NONE);
244 OnGaiaFlowFailure(scope_ui_failure_, error, scope_ui_oauth_error_);
245 }
234 } 246 }
235 247
236 MOCK_CONST_METHOD0(HasLoginToken, bool()); 248 MOCK_CONST_METHOD0(HasLoginToken, bool());
237 MOCK_METHOD1(CreateMintTokenFlow, 249 MOCK_METHOD1(CreateMintTokenFlow,
238 OAuth2MintTokenFlow* (OAuth2MintTokenFlow::Mode mode)); 250 OAuth2MintTokenFlow* (OAuth2MintTokenFlow::Mode mode));
239 251
240 private: 252 private:
241 ~MockGetAuthTokenFunction() {} 253 ~MockGetAuthTokenFunction() {}
242 bool login_ui_result_; 254 bool login_ui_result_;
243 bool install_ui_result_; 255 bool scope_ui_result_;
256 GaiaWebAuthFlow::Failure scope_ui_failure_;
257 std::string scope_ui_oauth_error_;
244 bool login_ui_shown_; 258 bool login_ui_shown_;
245 bool install_ui_shown_; 259 bool scope_ui_shown_;
246 }; 260 };
247 261
248 class MockQueuedMintRequest : public IdentityMintRequestQueue::Request { 262 class MockQueuedMintRequest : public IdentityMintRequestQueue::Request {
249 public: 263 public:
250 MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType)); 264 MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType));
251 }; 265 };
252 266
253 class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { 267 class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest {
254 protected: 268 protected:
255 enum OAuth2Fields { 269 enum OAuth2Fields {
(...skipping 27 matching lines...) Expand all
283 }; 297 };
284 298
285 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 299 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
286 NoClientId) { 300 NoClientId) {
287 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 301 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
288 func->set_extension(CreateExtension(SCOPES)); 302 func->set_extension(CreateExtension(SCOPES));
289 std::string error = utils::RunFunctionAndReturnError( 303 std::string error = utils::RunFunctionAndReturnError(
290 func.get(), "[{}]", browser()); 304 func.get(), "[{}]", browser());
291 EXPECT_EQ(std::string(errors::kInvalidClientId), error); 305 EXPECT_EQ(std::string(errors::kInvalidClientId), error);
292 EXPECT_FALSE(func->login_ui_shown()); 306 EXPECT_FALSE(func->login_ui_shown());
293 EXPECT_FALSE(func->install_ui_shown()); 307 EXPECT_FALSE(func->scope_ui_shown());
294 } 308 }
295 309
296 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 310 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
297 NoScopes) { 311 NoScopes) {
298 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 312 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
299 func->set_extension(CreateExtension(CLIENT_ID)); 313 func->set_extension(CreateExtension(CLIENT_ID));
300 std::string error = utils::RunFunctionAndReturnError( 314 std::string error = utils::RunFunctionAndReturnError(
301 func.get(), "[{}]", browser()); 315 func.get(), "[{}]", browser());
302 EXPECT_EQ(std::string(errors::kInvalidScopes), error); 316 EXPECT_EQ(std::string(errors::kInvalidScopes), error);
303 EXPECT_FALSE(func->login_ui_shown()); 317 EXPECT_FALSE(func->login_ui_shown());
304 EXPECT_FALSE(func->install_ui_shown()); 318 EXPECT_FALSE(func->scope_ui_shown());
305 } 319 }
306 320
307 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 321 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
308 NonInteractiveNotSignedIn) { 322 NonInteractiveNotSignedIn) {
309 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 323 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
310 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 324 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
311 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 325 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false));
312 std::string error = utils::RunFunctionAndReturnError( 326 std::string error = utils::RunFunctionAndReturnError(
313 func.get(), "[{}]", browser()); 327 func.get(), "[{}]", browser());
314 EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 328 EXPECT_EQ(std::string(errors::kUserNotSignedIn), error);
315 EXPECT_FALSE(func->login_ui_shown()); 329 EXPECT_FALSE(func->login_ui_shown());
316 EXPECT_FALSE(func->install_ui_shown()); 330 EXPECT_FALSE(func->scope_ui_shown());
317 } 331 }
318 332
319 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 333 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
320 NonInteractiveMintFailure) { 334 NonInteractiveMintFailure) {
321 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 335 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
322 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 336 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
323 EXPECT_CALL(*func.get(), HasLoginToken()) 337 EXPECT_CALL(*func.get(), HasLoginToken())
324 .WillOnce(Return(true)); 338 .WillOnce(Return(true));
325 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 339 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
326 TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 340 TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get());
327 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 341 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
328 std::string error = utils::RunFunctionAndReturnError( 342 std::string error = utils::RunFunctionAndReturnError(
329 func.get(), "[{}]", browser()); 343 func.get(), "[{}]", browser());
330 EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 344 EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false));
331 EXPECT_FALSE(func->login_ui_shown()); 345 EXPECT_FALSE(func->login_ui_shown());
332 EXPECT_FALSE(func->install_ui_shown()); 346 EXPECT_FALSE(func->scope_ui_shown());
333 } 347 }
334 348
335 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 349 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
336 NonInteractiveMintAdviceSuccess) { 350 NonInteractiveMintAdviceSuccess) {
337 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 351 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
338 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 352 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
339 func->set_extension(extension); 353 func->set_extension(extension);
340 EXPECT_CALL(*func.get(), HasLoginToken()) 354 EXPECT_CALL(*func.get(), HasLoginToken())
341 .WillOnce(Return(true)); 355 .WillOnce(Return(true));
342 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 356 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
343 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 357 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
344 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 358 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
345 std::string error = utils::RunFunctionAndReturnError( 359 std::string error = utils::RunFunctionAndReturnError(
346 func.get(), "[{}]", browser()); 360 func.get(), "[{}]", browser());
347 EXPECT_EQ(std::string(errors::kNoGrant), error); 361 EXPECT_EQ(std::string(errors::kNoGrant), error);
348 EXPECT_FALSE(func->login_ui_shown()); 362 EXPECT_FALSE(func->login_ui_shown());
349 EXPECT_FALSE(func->install_ui_shown()); 363 EXPECT_FALSE(func->scope_ui_shown());
350 364
351 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension); 365 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
352 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE, 366 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE,
353 id_api()->GetCachedToken(extension->id(), 367 id_api()->GetCachedToken(extension->id(),
354 oauth2_info.scopes).status()); 368 oauth2_info.scopes).status());
355 } 369 }
356 370
357 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 371 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
358 NonInteractiveMintBadCredentials) { 372 NonInteractiveMintBadCredentials) {
359 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 373 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
360 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 374 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
361 EXPECT_CALL(*func.get(), HasLoginToken()) 375 EXPECT_CALL(*func.get(), HasLoginToken())
362 .WillOnce(Return(true)); 376 .WillOnce(Return(true));
363 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 377 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
364 TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); 378 TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get());
365 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 379 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
366 std::string error = utils::RunFunctionAndReturnError( 380 std::string error = utils::RunFunctionAndReturnError(
367 func.get(), "[{}]", browser()); 381 func.get(), "[{}]", browser());
368 EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 382 EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false));
369 EXPECT_FALSE(func->login_ui_shown()); 383 EXPECT_FALSE(func->login_ui_shown());
370 EXPECT_FALSE(func->install_ui_shown()); 384 EXPECT_FALSE(func->scope_ui_shown());
371 } 385 }
372 386
373 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 387 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
374 NonInteractiveSuccess) { 388 NonInteractiveSuccess) {
375 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 389 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
376 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 390 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
377 func->set_extension(extension); 391 func->set_extension(extension);
378 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension); 392 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
379 EXPECT_CALL(*func.get(), HasLoginToken()) 393 EXPECT_CALL(*func.get(), HasLoginToken())
380 .WillOnce(Return(true)); 394 .WillOnce(Return(true));
381 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 395 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
382 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 396 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
383 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 397 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
384 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 398 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
385 func.get(), "[{}]", browser())); 399 func.get(), "[{}]", browser()));
386 std::string access_token; 400 std::string access_token;
387 EXPECT_TRUE(value->GetAsString(&access_token)); 401 EXPECT_TRUE(value->GetAsString(&access_token));
388 EXPECT_EQ(std::string(kAccessToken), access_token); 402 EXPECT_EQ(std::string(kAccessToken), access_token);
389 EXPECT_FALSE(func->login_ui_shown()); 403 EXPECT_FALSE(func->login_ui_shown());
390 EXPECT_FALSE(func->install_ui_shown()); 404 EXPECT_FALSE(func->scope_ui_shown());
391 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 405 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
392 id_api()->GetCachedToken(extension->id(), 406 id_api()->GetCachedToken(extension->id(),
393 oauth2_info.scopes).status()); 407 oauth2_info.scopes).status());
394 } 408 }
395 409
396 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 410 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
397 InteractiveLoginCanceled) { 411 InteractiveLoginCanceled) {
398 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 412 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
399 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 413 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
400 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 414 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false));
401 func->set_login_ui_result(false); 415 func->set_login_ui_result(false);
402 std::string error = utils::RunFunctionAndReturnError( 416 std::string error = utils::RunFunctionAndReturnError(
403 func.get(), "[{\"interactive\": true}]", browser()); 417 func.get(), "[{\"interactive\": true}]", browser());
404 EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 418 EXPECT_EQ(std::string(errors::kUserNotSignedIn), error);
405 EXPECT_TRUE(func->login_ui_shown()); 419 EXPECT_TRUE(func->login_ui_shown());
406 EXPECT_FALSE(func->install_ui_shown()); 420 EXPECT_FALSE(func->scope_ui_shown());
407 } 421 }
408 422
409 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 423 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
410 InteractiveMintBadCredentialsLoginCanceled) { 424 InteractiveMintBadCredentialsLoginCanceled) {
411 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 425 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
412 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 426 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
413 EXPECT_CALL(*func.get(), HasLoginToken()) 427 EXPECT_CALL(*func.get(), HasLoginToken())
414 .WillOnce(Return(true)); 428 .WillOnce(Return(true));
415 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 429 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
416 TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); 430 TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get());
417 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 431 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
418 func->set_login_ui_result(false); 432 func->set_login_ui_result(false);
419 std::string error = utils::RunFunctionAndReturnError( 433 std::string error = utils::RunFunctionAndReturnError(
420 func.get(), "[{\"interactive\": true}]", browser()); 434 func.get(), "[{\"interactive\": true}]", browser());
421 EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 435 EXPECT_EQ(std::string(errors::kUserNotSignedIn), error);
422 EXPECT_TRUE(func->login_ui_shown()); 436 EXPECT_TRUE(func->login_ui_shown());
423 EXPECT_FALSE(func->install_ui_shown()); 437 EXPECT_FALSE(func->scope_ui_shown());
424 } 438 }
425 439
426 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 440 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
427 InteractiveLoginSuccessNoToken) { 441 InteractiveLoginSuccessNoToken) {
428 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 442 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
429 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 443 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
430 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 444 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false));
431 func->set_login_ui_result(false); 445 func->set_login_ui_result(false);
432 std::string error = utils::RunFunctionAndReturnError( 446 std::string error = utils::RunFunctionAndReturnError(
433 func.get(), "[{\"interactive\": true}]", browser()); 447 func.get(), "[{\"interactive\": true}]", browser());
434 EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 448 EXPECT_EQ(std::string(errors::kUserNotSignedIn), error);
435 EXPECT_TRUE(func->login_ui_shown()); 449 EXPECT_TRUE(func->login_ui_shown());
436 EXPECT_FALSE(func->install_ui_shown()); 450 EXPECT_FALSE(func->scope_ui_shown());
437 } 451 }
438 452
439 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 453 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
440 InteractiveLoginSuccessMintFailure) { 454 InteractiveLoginSuccessMintFailure) {
441 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 455 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
442 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 456 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
443 EXPECT_CALL(*func.get(), HasLoginToken()) 457 EXPECT_CALL(*func.get(), HasLoginToken())
444 .WillOnce(Return(false)); 458 .WillOnce(Return(false));
445 func->set_login_ui_result(true); 459 func->set_login_ui_result(true);
446 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 460 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
447 TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 461 TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get());
448 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 462 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
449 std::string error = utils::RunFunctionAndReturnError( 463 std::string error = utils::RunFunctionAndReturnError(
450 func.get(), "[{\"interactive\": true}]", browser()); 464 func.get(), "[{\"interactive\": true}]", browser());
451 EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 465 EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false));
452 EXPECT_TRUE(func->login_ui_shown()); 466 EXPECT_TRUE(func->login_ui_shown());
453 EXPECT_FALSE(func->install_ui_shown()); 467 EXPECT_FALSE(func->scope_ui_shown());
454 } 468 }
455 469
456 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 470 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
457 InteractiveLoginSuccessMintSuccess) { 471 InteractiveLoginSuccessMintSuccess) {
458 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 472 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
459 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 473 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
460 EXPECT_CALL(*func.get(), HasLoginToken()) 474 EXPECT_CALL(*func.get(), HasLoginToken())
461 .WillOnce(Return(false)); 475 .WillOnce(Return(false));
462 func->set_login_ui_result(true); 476 func->set_login_ui_result(true);
463 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 477 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
464 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 478 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
465 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 479 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
466 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 480 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
467 func.get(), "[{\"interactive\": true}]", browser())); 481 func.get(), "[{\"interactive\": true}]", browser()));
468 std::string access_token; 482 std::string access_token;
469 EXPECT_TRUE(value->GetAsString(&access_token)); 483 EXPECT_TRUE(value->GetAsString(&access_token));
470 EXPECT_EQ(std::string(kAccessToken), access_token); 484 EXPECT_EQ(std::string(kAccessToken), access_token);
471 EXPECT_TRUE(func->login_ui_shown()); 485 EXPECT_TRUE(func->login_ui_shown());
472 EXPECT_FALSE(func->install_ui_shown()); 486 EXPECT_FALSE(func->scope_ui_shown());
473 } 487 }
474 488
475 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 489 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
476 InteractiveLoginSuccessApprovalAborted) { 490 InteractiveLoginSuccessApprovalAborted) {
477 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 491 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
478 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 492 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
479 EXPECT_CALL(*func.get(), HasLoginToken()) 493 EXPECT_CALL(*func.get(), HasLoginToken())
480 .WillOnce(Return(false)); 494 .WillOnce(Return(false));
481 func->set_login_ui_result(true); 495 func->set_login_ui_result(true);
482 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 496 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
483 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 497 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
484 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 498 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
485 func->set_install_ui_result(false); 499 func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED);
486 std::string error = utils::RunFunctionAndReturnError( 500 std::string error = utils::RunFunctionAndReturnError(
487 func.get(), "[{\"interactive\": true}]", browser()); 501 func.get(), "[{\"interactive\": true}]", browser());
488 EXPECT_EQ(std::string(errors::kUserRejected), error); 502 EXPECT_EQ(std::string(errors::kUserRejected), error);
489 EXPECT_TRUE(func->login_ui_shown()); 503 EXPECT_TRUE(func->login_ui_shown());
490 EXPECT_TRUE(func->install_ui_shown()); 504 EXPECT_TRUE(func->scope_ui_shown());
491 } 505 }
492 506
493 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 507 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
494 InteractiveLoginSuccessApprovalDoneMintFailure) { 508 InteractiveLoginSuccessApprovalSuccess) {
509 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
495 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 510 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
496 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 511 func->set_extension(extension);
497 EXPECT_CALL(*func.get(), HasLoginToken()) 512 EXPECT_CALL(*func.get(), HasLoginToken())
498 .WillOnce(Return(false)); 513 .WillOnce(Return(false));
499 func->set_login_ui_result(true); 514 func->set_login_ui_result(true);
500 TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 515 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
501 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 516 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
502 TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow(
503 TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get());
504 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 517 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_))
505 .WillOnce(Return(flow1)) 518 .WillOnce(Return(flow));
506 .WillOnce(Return(flow2));
507 519
508 func->set_install_ui_result(true);
509 std::string error = utils::RunFunctionAndReturnError(
510 func.get(), "[{\"interactive\": true}]", browser());
511 EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false));
512 EXPECT_TRUE(func->login_ui_shown());
513 EXPECT_TRUE(func->install_ui_shown());
514 }
515
516 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
517 InteractiveLoginSuccessApprovalDoneMintSuccess) {
518 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
519 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
520 func->set_extension(extension);
521 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
522 EXPECT_CALL(*func.get(), HasLoginToken())
523 .WillOnce(Return(false));
524 func->set_login_ui_result(true);
525 TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow(
526 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
527 TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow(
528 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
529 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_))
530 .WillOnce(Return(flow1))
531 .WillOnce(Return(flow2));
532
533 func->set_install_ui_result(true);
534 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 520 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
535 func.get(), "[{\"interactive\": true}]", browser())); 521 func.get(), "[{\"interactive\": true}]", browser()));
536 std::string access_token; 522 std::string access_token;
537 EXPECT_TRUE(value->GetAsString(&access_token)); 523 EXPECT_TRUE(value->GetAsString(&access_token));
538 EXPECT_EQ(std::string(kAccessToken), access_token); 524 EXPECT_EQ(std::string(kAccessToken), access_token);
539 EXPECT_TRUE(func->login_ui_shown()); 525 EXPECT_TRUE(func->login_ui_shown());
540 EXPECT_TRUE(func->install_ui_shown()); 526 EXPECT_TRUE(func->scope_ui_shown());
541 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
542 id_api()->GetCachedToken(extension->id(),
543 oauth2_info.scopes).status());
544 } 527 }
545 528
546 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 529 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
547 InteractiveApprovalAborted) { 530 InteractiveApprovalAborted) {
548 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 531 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
549 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 532 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
550 EXPECT_CALL(*func.get(), HasLoginToken()) 533 EXPECT_CALL(*func.get(), HasLoginToken())
551 .WillOnce(Return(true)); 534 .WillOnce(Return(true));
552 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 535 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
553 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 536 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
554 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 537 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
555 func->set_install_ui_result(false); 538 func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED);
556 std::string error = utils::RunFunctionAndReturnError( 539 std::string error = utils::RunFunctionAndReturnError(
557 func.get(), "[{\"interactive\": true}]", browser()); 540 func.get(), "[{\"interactive\": true}]", browser());
558 EXPECT_EQ(std::string(errors::kUserRejected), error); 541 EXPECT_EQ(std::string(errors::kUserRejected), error);
559 EXPECT_FALSE(func->login_ui_shown()); 542 EXPECT_FALSE(func->login_ui_shown());
560 EXPECT_TRUE(func->install_ui_shown()); 543 EXPECT_TRUE(func->scope_ui_shown());
561 } 544 }
562 545
563 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 546 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
564 InteractiveApprovalDoneMintSuccess) { 547 InteractiveApprovalInvalidRedirect) {
565 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 548 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
566 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 549 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
567 EXPECT_CALL(*func.get(), HasLoginToken()) 550 EXPECT_CALL(*func.get(), HasLoginToken())
568 .WillOnce(Return(true)); 551 .WillOnce(Return(true));
569 TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 552 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
570 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 553 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
571 TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow( 554 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
572 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 555 func->set_scope_ui_failure(GaiaWebAuthFlow::INVALID_REDIRECT);
556 std::string error = utils::RunFunctionAndReturnError(
557 func.get(), "[{\"interactive\": true}]", browser());
558 EXPECT_EQ(std::string(errors::kInvalidRedirect), error);
559 EXPECT_FALSE(func->login_ui_shown());
560 EXPECT_TRUE(func->scope_ui_shown());
561 }
562
563 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
564 InteractiveApprovalConnectionFailure) {
565 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
566 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
567 EXPECT_CALL(*func.get(), HasLoginToken())
568 .WillOnce(Return(true));
569 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
570 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
571 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
572 func->set_scope_ui_failure(GaiaWebAuthFlow::SERVICE_AUTH_ERROR);
573 std::string error = utils::RunFunctionAndReturnError(
574 func.get(), "[{\"interactive\": true}]", browser());
575 EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false));
576 EXPECT_FALSE(func->login_ui_shown());
577 EXPECT_TRUE(func->scope_ui_shown());
578 }
579
580 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
581 InteractiveApprovalOAuthErrors) {
582 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
583
584 std::map<std::string, std::string> error_map;
585 error_map.insert(std::make_pair("access_denied", errors::kUserRejected));
586 error_map.insert(std::make_pair("invalid_scope", errors::kInvalidScopes));
587 error_map.insert(std::make_pair(
588 "unmapped_error", std::string(errors::kAuthFailure) + "unmapped_error"));
589
590 for (std::map<std::string, std::string>::const_iterator
591 it = error_map.begin();
592 it != error_map.end();
593 ++it) {
594 scoped_refptr<MockGetAuthTokenFunction> func(
595 new MockGetAuthTokenFunction());
596 func->set_extension(extension);
597 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true));
598 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
599 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
600 ON_CALL(*func.get(), CreateMintTokenFlow(_)).WillByDefault(Return(flow));
601 func->set_scope_ui_oauth_error(it->first);
602 std::string error = utils::RunFunctionAndReturnError(
603 func.get(), "[{\"interactive\": true}]", browser());
604 EXPECT_EQ(it->second, error);
605 EXPECT_FALSE(func->login_ui_shown());
606 EXPECT_TRUE(func->scope_ui_shown());
607 }
608 }
609
610 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
611 InteractiveApprovalSuccess) {
612 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
613 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
614 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
615 func->set_extension(extension);
616 EXPECT_CALL(*func.get(), HasLoginToken())
617 .WillOnce(Return(true));
618 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
619 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
573 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 620 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_))
574 .WillOnce(Return(flow1)) 621 .WillOnce(Return(flow));
575 .WillOnce(Return(flow2));
576 622
577 func->set_install_ui_result(true);
578 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 623 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
579 func.get(), "[{\"interactive\": true}]", browser())); 624 func.get(), "[{\"interactive\": true}]", browser()));
580 std::string access_token; 625 std::string access_token;
581 EXPECT_TRUE(value->GetAsString(&access_token)); 626 EXPECT_TRUE(value->GetAsString(&access_token));
582 EXPECT_EQ(std::string(kAccessToken), access_token); 627 EXPECT_EQ(std::string(kAccessToken), access_token);
583 EXPECT_FALSE(func->login_ui_shown()); 628 EXPECT_FALSE(func->login_ui_shown());
584 EXPECT_TRUE(func->install_ui_shown()); 629 EXPECT_TRUE(func->scope_ui_shown());
585 }
586 630
587 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 631 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
588 InteractiveApprovalDoneMintBadCredentials) { 632 id_api()->GetCachedToken(extension->id(),
589 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 633 oauth2_info.scopes).status());
590 func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
591 EXPECT_CALL(*func.get(), HasLoginToken())
592 .WillOnce(Return(true));
593 TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow(
594 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
595 TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow(
596 TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get());
597 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_))
598 .WillOnce(Return(flow1))
599 .WillOnce(Return(flow2));
600
601 func->set_install_ui_result(true);
602 std::string error = utils::RunFunctionAndReturnError(
603 func.get(), "[{\"interactive\": true}]", browser());
604 EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false));
605 EXPECT_FALSE(func->login_ui_shown());
606 EXPECT_TRUE(func->install_ui_shown());
607 } 634 }
608 635
609 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveQueue) { 636 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveQueue) {
610 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 637 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
611 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 638 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
612 func->set_extension(extension); 639 func->set_extension(extension);
613 640
614 // Create a fake request to block the queue. 641 // Create a fake request to block the queue.
615 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension); 642 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
616 std::set<std::string> scopes(oauth2_info.scopes.begin(), 643 std::set<std::string> scopes(oauth2_info.scopes.begin(),
(...skipping 21 matching lines...) Expand all
638 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 665 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
639 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 666 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
640 667
641 queue->RequestComplete(type, extension->id(), scopes, &queued_request); 668 queue->RequestComplete(type, extension->id(), scopes, &queued_request);
642 669
643 scoped_ptr<base::Value> value(WaitForSingleResult(func)); 670 scoped_ptr<base::Value> value(WaitForSingleResult(func));
644 std::string access_token; 671 std::string access_token;
645 EXPECT_TRUE(value->GetAsString(&access_token)); 672 EXPECT_TRUE(value->GetAsString(&access_token));
646 EXPECT_EQ(std::string(kAccessToken), access_token); 673 EXPECT_EQ(std::string(kAccessToken), access_token);
647 EXPECT_FALSE(func->login_ui_shown()); 674 EXPECT_FALSE(func->login_ui_shown());
648 EXPECT_FALSE(func->install_ui_shown()); 675 EXPECT_FALSE(func->scope_ui_shown());
649 } 676 }
650 677
651 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, InteractiveQueue) { 678 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, InteractiveQueue) {
652 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 679 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
653 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 680 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
654 func->set_extension(extension); 681 func->set_extension(extension);
655 682
656 // Create a fake request to block the queue. 683 // Create a fake request to block the queue.
657 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension); 684 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
658 std::set<std::string> scopes(oauth2_info.scopes.begin(), 685 std::set<std::string> scopes(oauth2_info.scopes.begin(),
(...skipping 11 matching lines...) Expand all
670 697
671 // The real request will start processing, but wait in the queue behind 698 // The real request will start processing, but wait in the queue behind
672 // the blocker. 699 // the blocker.
673 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 700 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true));
674 TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 701 TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow(
675 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 702 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
676 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow1)); 703 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow1));
677 RunFunctionAsync(func, "[{\"interactive\": true}]"); 704 RunFunctionAsync(func, "[{\"interactive\": true}]");
678 // Verify that we have fetched the login token and run the first flow. 705 // Verify that we have fetched the login token and run the first flow.
679 testing::Mock::VerifyAndClearExpectations(func); 706 testing::Mock::VerifyAndClearExpectations(func);
680 EXPECT_FALSE(func->install_ui_shown()); 707 EXPECT_FALSE(func->scope_ui_shown());
681 708
682 // The UI will be displayed and the second flow will be created 709 // The UI will be displayed and a token retrieved after the first
683 // after the first queued request clears. 710 // queued request clears.
684 func->set_install_ui_result(true);
685 TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow(
686 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
687 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow2));
688
689 queue->RequestComplete(type, extension->id(), scopes, &queued_request); 711 queue->RequestComplete(type, extension->id(), scopes, &queued_request);
690 712
691 scoped_ptr<base::Value> value(WaitForSingleResult(func)); 713 scoped_ptr<base::Value> value(WaitForSingleResult(func));
692 std::string access_token; 714 std::string access_token;
693 EXPECT_TRUE(value->GetAsString(&access_token)); 715 EXPECT_TRUE(value->GetAsString(&access_token));
694 EXPECT_EQ(std::string(kAccessToken), access_token); 716 EXPECT_EQ(std::string(kAccessToken), access_token);
695 EXPECT_FALSE(func->login_ui_shown()); 717 EXPECT_FALSE(func->login_ui_shown());
696 EXPECT_TRUE(func->install_ui_shown()); 718 EXPECT_TRUE(func->scope_ui_shown());
697 } 719 }
698 720
699 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 721 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
700 InteractiveQueuedNoninteractiveFails) { 722 InteractiveQueuedNoninteractiveFails) {
701 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 723 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
702 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 724 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
703 func->set_extension(extension); 725 func->set_extension(extension);
704 726
705 // Create a fake request to block the interactive queue. 727 // Create a fake request to block the interactive queue.
706 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension); 728 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
(...skipping 10 matching lines...) Expand all
717 EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 739 EXPECT_CALL(queued_request, StartMintToken(type)).Times(1);
718 queue->RequestStart(type, extension->id(), scopes, &queued_request); 740 queue->RequestStart(type, extension->id(), scopes, &queued_request);
719 741
720 // Non-interactive requests fail without hitting GAIA, because a 742 // Non-interactive requests fail without hitting GAIA, because a
721 // consent UI is known to be up. 743 // consent UI is known to be up.
722 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 744 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true));
723 std::string error = utils::RunFunctionAndReturnError( 745 std::string error = utils::RunFunctionAndReturnError(
724 func.get(), "[{}]", browser()); 746 func.get(), "[{}]", browser());
725 EXPECT_EQ(std::string(errors::kNoGrant), error); 747 EXPECT_EQ(std::string(errors::kNoGrant), error);
726 EXPECT_FALSE(func->login_ui_shown()); 748 EXPECT_FALSE(func->login_ui_shown());
727 EXPECT_FALSE(func->install_ui_shown()); 749 EXPECT_FALSE(func->scope_ui_shown());
728 750
729 queue->RequestComplete(type, extension->id(), scopes, &queued_request); 751 queue->RequestComplete(type, extension->id(), scopes, &queued_request);
730 } 752 }
731 753
732 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 754 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
733 NonInteractiveCacheHit) { 755 NonInteractiveCacheHit) {
734 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 756 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
735 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 757 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
736 func->set_extension(extension); 758 func->set_extension(extension);
737 759
738 // pre-populate the cache with a token 760 // pre-populate the cache with a token
739 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension); 761 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
740 IdentityTokenCacheValue token(kAccessToken, 762 IdentityTokenCacheValue token(kAccessToken,
741 base::TimeDelta::FromSeconds(3600)); 763 base::TimeDelta::FromSeconds(3600));
742 id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token); 764 id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token);
743 765
744 // Get a token. Should not require a GAIA request. 766 // Get a token. Should not require a GAIA request.
745 EXPECT_CALL(*func.get(), HasLoginToken()) 767 EXPECT_CALL(*func.get(), HasLoginToken())
746 .WillOnce(Return(true)); 768 .WillOnce(Return(true));
747 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 769 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
748 func.get(), "[{}]", browser())); 770 func.get(), "[{}]", browser()));
749 std::string access_token; 771 std::string access_token;
750 EXPECT_TRUE(value->GetAsString(&access_token)); 772 EXPECT_TRUE(value->GetAsString(&access_token));
751 EXPECT_EQ(std::string(kAccessToken), access_token); 773 EXPECT_EQ(std::string(kAccessToken), access_token);
752 EXPECT_FALSE(func->login_ui_shown()); 774 EXPECT_FALSE(func->login_ui_shown());
753 EXPECT_FALSE(func->install_ui_shown()); 775 EXPECT_FALSE(func->scope_ui_shown());
754 } 776 }
755 777
756 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 778 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
757 NonInteractiveIssueAdviceCacheHit) { 779 NonInteractiveIssueAdviceCacheHit) {
758 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 780 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
759 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 781 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
760 func->set_extension(extension); 782 func->set_extension(extension);
761 783
762 // pre-populate the cache with advice 784 // pre-populate the cache with advice
763 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension); 785 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
764 IssueAdviceInfo info; 786 IssueAdviceInfo info;
765 IdentityTokenCacheValue token(info); 787 IdentityTokenCacheValue token(info);
766 id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token); 788 id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token);
767 789
768 // Should return an error without a GAIA request. 790 // Should return an error without a GAIA request.
769 EXPECT_CALL(*func.get(), HasLoginToken()) 791 EXPECT_CALL(*func.get(), HasLoginToken())
770 .WillOnce(Return(true)); 792 .WillOnce(Return(true));
771 std::string error = utils::RunFunctionAndReturnError( 793 std::string error = utils::RunFunctionAndReturnError(
772 func.get(), "[{}]", browser()); 794 func.get(), "[{}]", browser());
773 EXPECT_EQ(std::string(errors::kNoGrant), error); 795 EXPECT_EQ(std::string(errors::kNoGrant), error);
774 EXPECT_FALSE(func->login_ui_shown()); 796 EXPECT_FALSE(func->login_ui_shown());
775 EXPECT_FALSE(func->install_ui_shown()); 797 EXPECT_FALSE(func->scope_ui_shown());
776 } 798 }
777 799
778 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 800 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
779 InteractiveCacheHit) { 801 InteractiveCacheHit) {
780 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 802 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
781 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 803 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
782 func->set_extension(extension); 804 func->set_extension(extension);
783 805
784 // Create a fake request to block the queue. 806 // Create a fake request to block the queue.
785 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension); 807 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
(...skipping 23 matching lines...) Expand all
809 // When we wake up the request, it returns the cached token without 831 // When we wake up the request, it returns the cached token without
810 // displaying a UI, or hitting GAIA. 832 // displaying a UI, or hitting GAIA.
811 833
812 queue->RequestComplete(type, extension->id(), scopes, &queued_request); 834 queue->RequestComplete(type, extension->id(), scopes, &queued_request);
813 835
814 scoped_ptr<base::Value> value(WaitForSingleResult(func)); 836 scoped_ptr<base::Value> value(WaitForSingleResult(func));
815 std::string access_token; 837 std::string access_token;
816 EXPECT_TRUE(value->GetAsString(&access_token)); 838 EXPECT_TRUE(value->GetAsString(&access_token));
817 EXPECT_EQ(std::string(kAccessToken), access_token); 839 EXPECT_EQ(std::string(kAccessToken), access_token);
818 EXPECT_FALSE(func->login_ui_shown()); 840 EXPECT_FALSE(func->login_ui_shown());
819 EXPECT_FALSE(func->install_ui_shown()); 841 EXPECT_FALSE(func->scope_ui_shown());
820 } 842 }
821 843
822 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 844 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
823 LoginInvalidatesTokenCache) { 845 LoginInvalidatesTokenCache) {
824 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 846 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
825 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 847 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
826 func->set_extension(extension); 848 func->set_extension(extension);
827 849
828 // pre-populate the cache with a token 850 // pre-populate the cache with a token
829 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension); 851 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension);
830 IdentityTokenCacheValue token(kAccessToken, 852 IdentityTokenCacheValue token(kAccessToken,
831 base::TimeDelta::FromSeconds(3600)); 853 base::TimeDelta::FromSeconds(3600));
832 id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token); 854 id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token);
833 855
834 // Because the user is not signed in, the token will be removed, 856 // Because the user is not signed in, the token will be removed,
835 // and we'll hit GAIA for new tokens. 857 // and we'll hit GAIA for new tokens.
836 EXPECT_CALL(*func.get(), HasLoginToken()) 858 EXPECT_CALL(*func.get(), HasLoginToken())
837 .WillOnce(Return(false)); 859 .WillOnce(Return(false));
838 func->set_login_ui_result(true); 860 func->set_login_ui_result(true);
839 TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 861 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
840 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 862 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
841 TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow(
842 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
843 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 863 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_))
844 .WillOnce(Return(flow1)) 864 .WillOnce(Return(flow));
845 .WillOnce(Return(flow2));
846 865
847 func->set_install_ui_result(true);
848 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 866 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
849 func.get(), "[{\"interactive\": true}]", browser())); 867 func.get(), "[{\"interactive\": true}]", browser()));
850 std::string access_token; 868 std::string access_token;
851 EXPECT_TRUE(value->GetAsString(&access_token)); 869 EXPECT_TRUE(value->GetAsString(&access_token));
852 EXPECT_EQ(std::string(kAccessToken), access_token); 870 EXPECT_EQ(std::string(kAccessToken), access_token);
853 EXPECT_TRUE(func->login_ui_shown()); 871 EXPECT_TRUE(func->login_ui_shown());
854 EXPECT_TRUE(func->install_ui_shown()); 872 EXPECT_TRUE(func->scope_ui_shown());
855 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 873 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
856 id_api()->GetCachedToken(extension->id(), 874 id_api()->GetCachedToken(extension->id(),
857 oauth2_info.scopes).status()); 875 oauth2_info.scopes).status());
858 } 876 }
859 877
860 class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest { 878 class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest {
861 protected: 879 protected:
862 bool InvalidateDefaultToken() { 880 bool InvalidateDefaultToken() {
863 scoped_refptr<IdentityRemoveCachedAuthTokenFunction> func( 881 scoped_refptr<IdentityRemoveCachedAuthTokenFunction> func(
864 new IdentityRemoveCachedAuthTokenFunction); 882 new IdentityRemoveCachedAuthTokenFunction);
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1060 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
1043 function, args, browser())); 1061 function, args, browser()));
1044 1062
1045 std::string url; 1063 std::string url;
1046 EXPECT_TRUE(value->GetAsString(&url)); 1064 EXPECT_TRUE(value->GetAsString(&url));
1047 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1065 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"),
1048 url); 1066 url);
1049 } 1067 }
1050 1068
1051 } // namespace extensions 1069 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/identity/identity_api.cc ('k') | chrome/browser/extensions/api/identity/web_auth_flow.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698