OLD | NEW |
---|---|
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 <set> | 5 #include <set> |
6 #include <string> | 6 #include <string> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/values.h" | 12 #include "base/values.h" |
13 #include "chrome/browser/chrome_notification_types.h" | 13 #include "chrome/browser/chrome_notification_types.h" |
14 #include "chrome/browser/extensions/api/identity/identity_api.h" | 14 #include "chrome/browser/extensions/api/identity/identity_api.h" |
15 #include "chrome/browser/extensions/component_loader.h" | 15 #include "chrome/browser/extensions/component_loader.h" |
16 #include "chrome/browser/extensions/extension_apitest.h" | 16 #include "chrome/browser/extensions/extension_apitest.h" |
17 #include "chrome/browser/extensions/extension_browsertest.h" | 17 #include "chrome/browser/extensions/extension_browsertest.h" |
18 #include "chrome/browser/extensions/extension_function_test_utils.h" | 18 #include "chrome/browser/extensions/extension_function_test_utils.h" |
19 #include "chrome/browser/extensions/extension_service.h" | 19 #include "chrome/browser/extensions/extension_service.h" |
20 #include "chrome/browser/guest_view/guest_view_base.h" | 20 #include "chrome/browser/guest_view/guest_view_base.h" |
21 #include "chrome/browser/profiles/profile.h" | 21 #include "chrome/browser/profiles/profile.h" |
22 #include "chrome/browser/signin/fake_profile_oauth2_token_service.h" | |
23 #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" | |
24 #include "chrome/browser/signin/fake_signin_manager.h" | |
25 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | |
22 #include "chrome/browser/signin/signin_manager_factory.h" | 26 #include "chrome/browser/signin/signin_manager_factory.h" |
23 #include "chrome/browser/ui/browser.h" | 27 #include "chrome/browser/ui/browser.h" |
24 #include "chrome/browser/ui/browser_window.h" | 28 #include "chrome/browser/ui/browser_window.h" |
25 #include "chrome/common/chrome_switches.h" | 29 #include "chrome/common/chrome_switches.h" |
26 #include "chrome/common/extensions/api/identity.h" | 30 #include "chrome/common/extensions/api/identity.h" |
27 #include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" | 31 #include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" |
28 #include "chrome/test/base/in_process_browser_test.h" | 32 #include "chrome/test/base/in_process_browser_test.h" |
29 #include "chrome/test/base/test_switches.h" | 33 #include "chrome/test/base/test_switches.h" |
30 #include "components/signin/core/browser/signin_manager.h" | 34 #include "components/signin/core/browser/signin_manager.h" |
31 #include "components/signin/core/common/profile_management_switches.h" | 35 #include "components/signin/core/common/profile_management_switches.h" |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
340 ~MockGetAuthTokenFunction() {} | 344 ~MockGetAuthTokenFunction() {} |
341 bool login_access_token_result_; | 345 bool login_access_token_result_; |
342 bool login_ui_result_; | 346 bool login_ui_result_; |
343 bool scope_ui_result_; | 347 bool scope_ui_result_; |
344 GaiaWebAuthFlow::Failure scope_ui_failure_; | 348 GaiaWebAuthFlow::Failure scope_ui_failure_; |
345 std::string scope_ui_oauth_error_; | 349 std::string scope_ui_oauth_error_; |
346 bool login_ui_shown_; | 350 bool login_ui_shown_; |
347 bool scope_ui_shown_; | 351 bool scope_ui_shown_; |
348 }; | 352 }; |
349 | 353 |
354 // TODO(courage): Replace MockGetAuthTokenFunction with | |
355 // FakeGetAuthTokenFunction in all tests. | |
356 | |
357 class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction { | |
358 public: | |
359 FakeGetAuthTokenFunction() | |
360 : login_access_token_result_(true), | |
361 login_ui_result_(true), | |
362 scope_ui_result_(true), | |
363 login_ui_shown_(false), | |
364 scope_ui_shown_(false) {} | |
365 | |
366 void set_login_access_token_result(bool result) { | |
367 login_access_token_result_ = result; | |
368 } | |
369 | |
370 void set_login_ui_result(bool result) { login_ui_result_ = result; } | |
371 | |
372 void set_mint_token_flow(scoped_ptr<OAuth2MintTokenFlow> flow) { | |
373 flow_ = flow.Pass(); | |
374 } | |
375 | |
376 void set_scope_ui_failure(GaiaWebAuthFlow::Failure failure) { | |
377 scope_ui_result_ = false; | |
378 scope_ui_failure_ = failure; | |
379 } | |
380 | |
381 void set_scope_ui_oauth_error(const std::string& oauth_error) { | |
382 scope_ui_result_ = false; | |
383 scope_ui_failure_ = GaiaWebAuthFlow::OAUTH_ERROR; | |
384 scope_ui_oauth_error_ = oauth_error; | |
385 } | |
386 | |
387 bool login_ui_shown() const { return login_ui_shown_; } | |
388 | |
389 bool scope_ui_shown() const { return scope_ui_shown_; } | |
390 | |
391 std::string login_access_token() const { return login_access_token_; } | |
392 | |
393 virtual void ShowLoginPopup() OVERRIDE { | |
394 EXPECT_FALSE(login_ui_shown_); | |
395 login_ui_shown_ = true; | |
396 if (login_ui_result_) | |
397 SigninSuccess(); | |
398 else | |
399 SigninFailed(); | |
400 } | |
401 | |
402 virtual void ShowOAuthApprovalDialog( | |
403 const IssueAdviceInfo& issue_advice) OVERRIDE { | |
404 scope_ui_shown_ = true; | |
405 | |
406 if (scope_ui_result_) { | |
407 OnGaiaFlowCompleted(kAccessToken, "3600"); | |
408 } else if (scope_ui_failure_ == GaiaWebAuthFlow::SERVICE_AUTH_ERROR) { | |
409 GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); | |
410 OnGaiaFlowFailure(scope_ui_failure_, error, ""); | |
411 } else { | |
412 GoogleServiceAuthError error(GoogleServiceAuthError::NONE); | |
413 OnGaiaFlowFailure(scope_ui_failure_, error, scope_ui_oauth_error_); | |
414 } | |
415 } | |
416 | |
417 virtual OAuth2MintTokenFlow* CreateMintTokenFlow( | |
418 const std::string& login_access_token) OVERRIDE { | |
419 EXPECT_TRUE(login_access_token_.empty()); | |
420 login_access_token_ = login_access_token; | |
421 return flow_.release(); | |
422 } | |
423 | |
424 private: | |
425 virtual ~FakeGetAuthTokenFunction() {} | |
426 bool login_access_token_result_; | |
427 bool login_ui_result_; | |
428 bool scope_ui_result_; | |
429 GaiaWebAuthFlow::Failure scope_ui_failure_; | |
430 std::string scope_ui_oauth_error_; | |
431 bool login_ui_shown_; | |
432 bool scope_ui_shown_; | |
433 | |
434 scoped_ptr<OAuth2MintTokenFlow> flow_; | |
435 | |
436 std::string login_access_token_; | |
437 }; | |
438 | |
350 class MockQueuedMintRequest : public IdentityMintRequestQueue::Request { | 439 class MockQueuedMintRequest : public IdentityMintRequestQueue::Request { |
351 public: | 440 public: |
352 MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType)); | 441 MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType)); |
353 }; | 442 }; |
354 | 443 |
444 AccountIds CreateIds(std::string email, std::string obfid) { | |
445 AccountIds ids; | |
446 ids.account_key = email; | |
447 ids.email = email; | |
448 ids.gaia = obfid; | |
449 return ids; | |
450 } | |
451 | |
355 class IdentityGetAccountsFunctionTest : public ExtensionBrowserTest { | 452 class IdentityGetAccountsFunctionTest : public ExtensionBrowserTest { |
356 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 453 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
454 ExtensionBrowserTest::SetUpCommandLine(command_line); | |
357 command_line->AppendSwitch(switches::kExtensionsMultiAccount); | 455 command_line->AppendSwitch(switches::kExtensionsMultiAccount); |
358 } | 456 } |
359 | 457 |
360 protected: | 458 protected: |
361 void SetAccountState(AccountIds ids, bool is_signed_in) { | 459 void SetAccountState(AccountIds ids, bool is_signed_in) { |
362 IdentityAPI::GetFactoryInstance()->Get(profile())->SetAccountStateForTest( | 460 IdentityAPI::GetFactoryInstance()->Get(profile())->SetAccountStateForTest( |
363 ids, is_signed_in); | 461 ids, is_signed_in); |
364 } | 462 } |
365 | 463 |
366 AccountIds CreateIds(std::string email, std::string obfid) { | |
367 AccountIds ids; | |
368 ids.account_key = email; | |
369 ids.email = email; | |
370 ids.gaia = obfid; | |
371 return ids; | |
372 } | |
373 | |
374 testing::AssertionResult ExpectGetAccounts( | 464 testing::AssertionResult ExpectGetAccounts( |
375 const std::vector<std::string>& accounts) { | 465 const std::vector<std::string>& accounts) { |
376 scoped_refptr<IdentityGetAccountsFunction> func( | 466 scoped_refptr<IdentityGetAccountsFunction> func( |
377 new IdentityGetAccountsFunction); | 467 new IdentityGetAccountsFunction); |
378 func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); | 468 func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); |
379 if (!utils::RunFunction( | 469 if (!utils::RunFunction( |
380 func.get(), std::string("[]"), browser(), utils::NONE)) { | 470 func.get(), std::string("[]"), browser(), utils::NONE)) { |
381 return GenerateFailureResult(accounts, NULL) | 471 return GenerateFailureResult(accounts, NULL) |
382 << "getAccounts did not return a result."; | 472 << "getAccounts did not return a result."; |
383 } | 473 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
485 IN_PROC_BROWSER_TEST_F(IdentityOldProfilesGetAccountsFunctionTest, | 575 IN_PROC_BROWSER_TEST_F(IdentityOldProfilesGetAccountsFunctionTest, |
486 TwoAccountsSignedIn) { | 576 TwoAccountsSignedIn) { |
487 SetAccountState(CreateIds("primary@example.com", "1"), true); | 577 SetAccountState(CreateIds("primary@example.com", "1"), true); |
488 SetAccountState(CreateIds("secondary@example.com", "2"), true); | 578 SetAccountState(CreateIds("secondary@example.com", "2"), true); |
489 std::vector<std::string> only_primary; | 579 std::vector<std::string> only_primary; |
490 only_primary.push_back("1"); | 580 only_primary.push_back("1"); |
491 EXPECT_TRUE(ExpectGetAccounts(only_primary)); | 581 EXPECT_TRUE(ExpectGetAccounts(only_primary)); |
492 } | 582 } |
493 | 583 |
494 class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { | 584 class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { |
585 public: | |
586 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | |
587 AsyncExtensionBrowserTest::SetUpCommandLine(command_line); | |
588 command_line->AppendSwitch(switches::kExtensionsMultiAccount); | |
589 } | |
590 | |
591 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { | |
592 AsyncExtensionBrowserTest::SetUpInProcessBrowserTestFixture(); | |
593 | |
594 will_create_browser_context_services_subscription_ = | |
595 BrowserContextDependencyManager::GetInstance() | |
596 ->RegisterWillCreateBrowserContextServicesCallbackForTesting( | |
597 base::Bind(&GetAuthTokenFunctionTest:: | |
598 OnWillCreateBrowserContextServices, | |
599 base::Unretained(this))) | |
600 .Pass(); | |
601 } | |
602 | |
603 void OnWillCreateBrowserContextServices(content::BrowserContext* context) { | |
604 // Replace the signin manager and token service with fakes. Do this ahead of | |
605 // creating the browser so that a bunch of classes don't register as | |
606 // observers and end up needing to unregister when the fake is substituted. | |
607 SigninManagerFactory::GetInstance()->SetTestingFactory( | |
608 context, &FakeSigninManagerBase::Build); | |
609 ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory( | |
610 context, &BuildFakeProfileOAuth2TokenService); | |
611 } | |
612 | |
613 virtual void SetUpOnMainThread() OVERRIDE { | |
614 AsyncExtensionBrowserTest::SetUpOnMainThread(); | |
615 | |
616 // Grab references to the fake signin manager and token service. | |
617 signin_manager_ = static_cast<FakeSigninManagerForTesting*>( | |
618 SigninManagerFactory::GetInstance()->GetForProfile(profile())); | |
619 ASSERT_TRUE(signin_manager_); | |
620 token_service_ = static_cast<FakeProfileOAuth2TokenService*>( | |
621 ProfileOAuth2TokenServiceFactory::GetInstance()->GetForProfile( | |
622 profile())); | |
623 ASSERT_TRUE(token_service_); | |
624 } | |
625 | |
626 void SignIn(const std::string account_key) { | |
627 #if defined(OS_CHROMEOS) | |
628 signin_manager_->SetAuthenticatedUsername(account_key); | |
629 #else | |
630 signin_manager_->SignIn(account_key, "password"); | |
631 #endif | |
632 } | |
633 | |
634 void SetAccountState(AccountIds ids, bool is_signed_in) { | |
635 IdentityAPI::GetFactoryInstance()->Get(profile())->SetAccountStateForTest( | |
636 ids, is_signed_in); | |
637 } | |
638 | |
495 protected: | 639 protected: |
496 enum OAuth2Fields { | 640 enum OAuth2Fields { |
497 NONE = 0, | 641 NONE = 0, |
498 CLIENT_ID = 1, | 642 CLIENT_ID = 1, |
499 SCOPES = 2, | 643 SCOPES = 2, |
500 AS_COMPONENT = 4 | 644 AS_COMPONENT = 4 |
501 }; | 645 }; |
502 | 646 |
647 FakeSigninManagerForTesting* signin_manager_; | |
648 FakeProfileOAuth2TokenService* token_service_; | |
649 | |
503 virtual ~GetAuthTokenFunctionTest() {} | 650 virtual ~GetAuthTokenFunctionTest() {} |
504 | 651 |
505 // Helper to create an extension with specific OAuth2Info fields set. | 652 // Helper to create an extension with specific OAuth2Info fields set. |
506 // |fields_to_set| should be computed by using fields of Oauth2Fields enum. | 653 // |fields_to_set| should be computed by using fields of Oauth2Fields enum. |
507 const Extension* CreateExtension(int fields_to_set) { | 654 const Extension* CreateExtension(int fields_to_set) { |
508 const Extension* ext; | 655 const Extension* ext; |
509 base::FilePath manifest_path = | 656 base::FilePath manifest_path = |
510 test_data_dir_.AppendASCII("platform_apps/oauth2"); | 657 test_data_dir_.AppendASCII("platform_apps/oauth2"); |
511 base::FilePath component_manifest_path = | 658 base::FilePath component_manifest_path = |
512 test_data_dir_.AppendASCII("packaged_app/component_oauth2"); | 659 test_data_dir_.AppendASCII("packaged_app/component_oauth2"); |
(...skipping 24 matching lines...) Expand all Loading... | |
537 SigninManagerBase* signin_manager = | 684 SigninManagerBase* signin_manager = |
538 SigninManagerFactory::GetForProfile(browser()->profile()); | 685 SigninManagerFactory::GetForProfile(browser()->profile()); |
539 return signin_manager->GetAuthenticatedAccountId(); | 686 return signin_manager->GetAuthenticatedAccountId(); |
540 } | 687 } |
541 | 688 |
542 void SetCachedToken(const IdentityTokenCacheValue& token_data) { | 689 void SetCachedToken(const IdentityTokenCacheValue& token_data) { |
543 ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); | 690 ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); |
544 id_api()->SetCachedToken(key, token_data); | 691 id_api()->SetCachedToken(key, token_data); |
545 } | 692 } |
546 | 693 |
547 const IdentityTokenCacheValue& GetCachedToken() { | 694 const IdentityTokenCacheValue& GetCachedToken(std::string account_id) { |
548 ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); | 695 if (account_id.empty()) |
696 account_id = GetPrimaryAccountId(); | |
697 ExtensionTokenKey key(extension_id_, account_id, oauth_scopes_); | |
549 return id_api()->GetCachedToken(key); | 698 return id_api()->GetCachedToken(key); |
550 } | 699 } |
551 | 700 |
552 void QueueRequestStart(IdentityMintRequestQueue::MintType type, | 701 void QueueRequestStart(IdentityMintRequestQueue::MintType type, |
553 IdentityMintRequestQueue::Request* request) { | 702 IdentityMintRequestQueue::Request* request) { |
554 ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); | 703 ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); |
555 id_api()->mint_queue()->RequestStart(type, key, request); | 704 id_api()->mint_queue()->RequestStart(type, key, request); |
556 } | 705 } |
557 | 706 |
558 void QueueRequestComplete(IdentityMintRequestQueue::MintType type, | 707 void QueueRequestComplete(IdentityMintRequestQueue::MintType type, |
559 IdentityMintRequestQueue::Request* request) { | 708 IdentityMintRequestQueue::Request* request) { |
560 ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); | 709 ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); |
561 id_api()->mint_queue()->RequestComplete(type, key, request); | 710 id_api()->mint_queue()->RequestComplete(type, key, request); |
562 } | 711 } |
563 | 712 |
564 private: | 713 private: |
565 std::string extension_id_; | 714 std::string extension_id_; |
566 std::set<std::string> oauth_scopes_; | 715 std::set<std::string> oauth_scopes_; |
716 | |
717 scoped_ptr<base::CallbackList<void(content::BrowserContext*)>::Subscription> | |
718 will_create_browser_context_services_subscription_; | |
567 }; | 719 }; |
568 | 720 |
569 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, | 721 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
570 NoClientId) { | 722 NoClientId) { |
571 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); | 723 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); |
572 func->set_extension(CreateExtension(SCOPES)); | 724 func->set_extension(CreateExtension(SCOPES)); |
573 std::string error = utils::RunFunctionAndReturnError( | 725 std::string error = utils::RunFunctionAndReturnError( |
574 func.get(), "[{}]", browser()); | 726 func.get(), "[{}]", browser()); |
575 EXPECT_EQ(std::string(errors::kInvalidClientId), error); | 727 EXPECT_EQ(std::string(errors::kInvalidClientId), error); |
576 EXPECT_FALSE(func->login_ui_shown()); | 728 EXPECT_FALSE(func->login_ui_shown()); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
637 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( | 789 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( |
638 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); | 790 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); |
639 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); | 791 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); |
640 std::string error = utils::RunFunctionAndReturnError( | 792 std::string error = utils::RunFunctionAndReturnError( |
641 func.get(), "[{}]", browser()); | 793 func.get(), "[{}]", browser()); |
642 EXPECT_EQ(std::string(errors::kNoGrant), error); | 794 EXPECT_EQ(std::string(errors::kNoGrant), error); |
643 EXPECT_FALSE(func->login_ui_shown()); | 795 EXPECT_FALSE(func->login_ui_shown()); |
644 EXPECT_FALSE(func->scope_ui_shown()); | 796 EXPECT_FALSE(func->scope_ui_shown()); |
645 | 797 |
646 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE, | 798 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE, |
647 GetCachedToken().status()); | 799 GetCachedToken(std::string()).status()); |
648 } | 800 } |
649 | 801 |
650 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, | 802 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
651 NonInteractiveMintBadCredentials) { | 803 NonInteractiveMintBadCredentials) { |
652 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); | 804 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); |
653 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); | 805 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); |
654 EXPECT_CALL(*func.get(), HasLoginToken()) | 806 EXPECT_CALL(*func.get(), HasLoginToken()) |
655 .WillOnce(Return(true)); | 807 .WillOnce(Return(true)); |
656 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( | 808 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( |
657 TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); | 809 TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
700 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); | 852 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); |
701 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); | 853 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); |
702 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( | 854 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( |
703 func.get(), "[{}]", browser())); | 855 func.get(), "[{}]", browser())); |
704 std::string access_token; | 856 std::string access_token; |
705 EXPECT_TRUE(value->GetAsString(&access_token)); | 857 EXPECT_TRUE(value->GetAsString(&access_token)); |
706 EXPECT_EQ(std::string(kAccessToken), access_token); | 858 EXPECT_EQ(std::string(kAccessToken), access_token); |
707 EXPECT_FALSE(func->login_ui_shown()); | 859 EXPECT_FALSE(func->login_ui_shown()); |
708 EXPECT_FALSE(func->scope_ui_shown()); | 860 EXPECT_FALSE(func->scope_ui_shown()); |
709 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, | 861 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
710 GetCachedToken().status()); | 862 GetCachedToken(std::string()).status()); |
711 } | 863 } |
712 | 864 |
713 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, | 865 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
714 InteractiveLoginCanceled) { | 866 InteractiveLoginCanceled) { |
715 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); | 867 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); |
716 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); | 868 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); |
717 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); | 869 EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); |
718 func->set_login_ui_result(false); | 870 func->set_login_ui_result(false); |
719 std::string error = utils::RunFunctionAndReturnError( | 871 std::string error = utils::RunFunctionAndReturnError( |
720 func.get(), "[{\"interactive\": true}]", browser()); | 872 func.get(), "[{\"interactive\": true}]", browser()); |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
956 | 1108 |
957 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( | 1109 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( |
958 func.get(), "[{\"interactive\": true}]", browser())); | 1110 func.get(), "[{\"interactive\": true}]", browser())); |
959 std::string access_token; | 1111 std::string access_token; |
960 EXPECT_TRUE(value->GetAsString(&access_token)); | 1112 EXPECT_TRUE(value->GetAsString(&access_token)); |
961 EXPECT_EQ(std::string(kAccessToken), access_token); | 1113 EXPECT_EQ(std::string(kAccessToken), access_token); |
962 EXPECT_FALSE(func->login_ui_shown()); | 1114 EXPECT_FALSE(func->login_ui_shown()); |
963 EXPECT_TRUE(func->scope_ui_shown()); | 1115 EXPECT_TRUE(func->scope_ui_shown()); |
964 | 1116 |
965 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, | 1117 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
966 GetCachedToken().status()); | 1118 GetCachedToken(std::string()).status()); |
967 } | 1119 } |
968 | 1120 |
969 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveQueue) { | 1121 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveQueue) { |
970 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); | 1122 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); |
971 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); | 1123 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); |
972 func->set_extension(extension.get()); | 1124 func->set_extension(extension.get()); |
973 | 1125 |
974 // Create a fake request to block the queue. | 1126 // Create a fake request to block the queue. |
975 MockQueuedMintRequest queued_request; | 1127 MockQueuedMintRequest queued_request; |
976 IdentityMintRequestQueue::MintType type = | 1128 IdentityMintRequestQueue::MintType type = |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1217 .WillOnce(Return(flow)); | 1369 .WillOnce(Return(flow)); |
1218 | 1370 |
1219 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( | 1371 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( |
1220 func.get(), "[{\"interactive\": true}]", browser())); | 1372 func.get(), "[{\"interactive\": true}]", browser())); |
1221 std::string access_token; | 1373 std::string access_token; |
1222 EXPECT_TRUE(value->GetAsString(&access_token)); | 1374 EXPECT_TRUE(value->GetAsString(&access_token)); |
1223 EXPECT_EQ(std::string(kAccessToken), access_token); | 1375 EXPECT_EQ(std::string(kAccessToken), access_token); |
1224 EXPECT_TRUE(func->login_ui_shown()); | 1376 EXPECT_TRUE(func->login_ui_shown()); |
1225 EXPECT_TRUE(func->scope_ui_shown()); | 1377 EXPECT_TRUE(func->scope_ui_shown()); |
1226 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, | 1378 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
1227 GetCachedToken().status()); | 1379 GetCachedToken(std::string()).status()); |
1228 } | 1380 } |
1229 | 1381 |
1230 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithChromeClientId) { | 1382 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithChromeClientId) { |
1231 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); | 1383 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); |
1232 scoped_refptr<const Extension> extension( | 1384 scoped_refptr<const Extension> extension( |
1233 CreateExtension(SCOPES | AS_COMPONENT)); | 1385 CreateExtension(SCOPES | AS_COMPONENT)); |
1234 func->set_extension(extension.get()); | 1386 func->set_extension(extension.get()); |
1235 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); | 1387 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); |
1236 EXPECT_TRUE(oauth2_info.client_id.empty()); | 1388 EXPECT_TRUE(oauth2_info.client_id.empty()); |
1237 EXPECT_FALSE(func->GetOAuth2ClientId().empty()); | 1389 EXPECT_FALSE(func->GetOAuth2ClientId().empty()); |
1238 EXPECT_NE("client1", func->GetOAuth2ClientId()); | 1390 EXPECT_NE("client1", func->GetOAuth2ClientId()); |
1239 } | 1391 } |
1240 | 1392 |
1241 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithNormalClientId) { | 1393 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithNormalClientId) { |
1242 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); | 1394 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); |
1243 scoped_refptr<const Extension> extension( | 1395 scoped_refptr<const Extension> extension( |
1244 CreateExtension(CLIENT_ID | SCOPES | AS_COMPONENT)); | 1396 CreateExtension(CLIENT_ID | SCOPES | AS_COMPONENT)); |
1245 func->set_extension(extension.get()); | 1397 func->set_extension(extension.get()); |
1246 EXPECT_EQ("client1", func->GetOAuth2ClientId()); | 1398 EXPECT_EQ("client1", func->GetOAuth2ClientId()); |
1247 } | 1399 } |
1248 | 1400 |
1401 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiDefaultUser) { | |
1402 SignIn("primary@example.com"); | |
1403 token_service_->IssueRefreshTokenForUser("primary@example.com", | |
1404 "refresh_token"); | |
1405 SetAccountState(CreateIds("primary@example.com", "1"), true); | |
1406 SetAccountState(CreateIds("secondary@example.com", "2"), true); | |
1407 | |
1408 scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); | |
1409 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); | |
1410 func->set_extension(extension.get()); | |
1411 func->set_mint_token_flow( | |
1412 scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( | |
1413 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); | |
1414 | |
1415 RunFunctionAsync(func.get(), "[{}]"); | |
1416 | |
1417 token_service_->IssueAllTokensForAccount( | |
1418 "primary@example.com", | |
1419 "access_token-primary@example.com", | |
1420 base::Time::Now() + base::TimeDelta::FromSeconds(3600)); | |
1421 | |
1422 scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); | |
1423 std::string access_token; | |
1424 EXPECT_TRUE(value->GetAsString(&access_token)); | |
1425 EXPECT_EQ(std::string(kAccessToken), access_token); | |
1426 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, | |
1427 GetCachedToken(std::string()).status()); | |
1428 EXPECT_EQ("access_token-primary@example.com", func->login_access_token()); | |
1429 } | |
1430 | |
1431 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiPrimaryUser) { | |
1432 SignIn("primary@example.com"); | |
1433 token_service_->IssueRefreshTokenForUser("primary@example.com", | |
1434 "refresh_token"); | |
1435 SetAccountState(CreateIds("primary@example.com", "1"), true); | |
1436 SetAccountState(CreateIds("secondary@example.com", "2"), true); | |
1437 | |
1438 scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); | |
1439 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); | |
1440 func->set_extension(extension.get()); | |
1441 func->set_mint_token_flow( | |
1442 scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( | |
1443 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); | |
1444 | |
1445 RunFunctionAsync(func.get(), "[{\"account\": { \"id\": \"1\" } }]"); | |
1446 | |
1447 token_service_->IssueAllTokensForAccount( | |
1448 "primary@example.com", | |
1449 "access_token-primary@example.com", | |
1450 base::Time::Now() + base::TimeDelta::FromSeconds(3600)); | |
1451 | |
1452 scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); | |
1453 std::string access_token; | |
1454 EXPECT_TRUE(value->GetAsString(&access_token)); | |
1455 EXPECT_EQ(std::string(kAccessToken), access_token); | |
1456 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, | |
1457 GetCachedToken(std::string()).status()); | |
1458 EXPECT_EQ("access_token-primary@example.com", func->login_access_token()); | |
1459 } | |
1460 | |
1461 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiSecondaryUser) { | |
fgorski
2014/06/03 23:46:41
are you planning to add negative tests for seconda
Michael Courage
2014/06/04 23:37:38
TODO added
| |
1462 SignIn("primary@example.com"); | |
1463 token_service_->IssueRefreshTokenForUser("secondary@example.com", | |
1464 "refresh_token"); | |
1465 SetAccountState(CreateIds("primary@example.com", "1"), true); | |
1466 SetAccountState(CreateIds("secondary@example.com", "2"), true); | |
1467 | |
1468 scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); | |
1469 scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); | |
1470 func->set_extension(extension.get()); | |
1471 func->set_mint_token_flow( | |
1472 scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( | |
1473 TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); | |
1474 | |
1475 RunFunctionAsync(func.get(), "[{\"account\": { \"id\": \"2\" } }]"); | |
1476 | |
1477 token_service_->IssueAllTokensForAccount( | |
1478 "secondary@example.com", | |
1479 "access_token-secondary@example.com", | |
1480 base::Time::Now() + base::TimeDelta::FromSeconds(3600)); | |
1481 | |
1482 scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); | |
1483 std::string access_token; | |
1484 EXPECT_TRUE(value->GetAsString(&access_token)); | |
1485 EXPECT_EQ(std::string(kAccessToken), access_token); | |
1486 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, | |
1487 GetCachedToken("secondary@example.com").status()); | |
1488 EXPECT_EQ("access_token-secondary@example.com", func->login_access_token()); | |
1489 } | |
1490 | |
1249 class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest { | 1491 class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest { |
1250 protected: | 1492 protected: |
1251 bool InvalidateDefaultToken() { | 1493 bool InvalidateDefaultToken() { |
1252 scoped_refptr<IdentityRemoveCachedAuthTokenFunction> func( | 1494 scoped_refptr<IdentityRemoveCachedAuthTokenFunction> func( |
1253 new IdentityRemoveCachedAuthTokenFunction); | 1495 new IdentityRemoveCachedAuthTokenFunction); |
1254 func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); | 1496 func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); |
1255 return utils::RunFunction( | 1497 return utils::RunFunction( |
1256 func.get(), | 1498 func.get(), |
1257 std::string("[{\"token\": \"") + kAccessToken + "\"}]", | 1499 std::string("[{\"token\": \"") + kAccessToken + "\"}]", |
1258 browser(), | 1500 browser(), |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1310 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, | 1552 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
1311 GetCachedToken().status()); | 1553 GetCachedToken().status()); |
1312 EXPECT_TRUE(InvalidateDefaultToken()); | 1554 EXPECT_TRUE(InvalidateDefaultToken()); |
1313 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, | 1555 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, |
1314 GetCachedToken().status()); | 1556 GetCachedToken().status()); |
1315 } | 1557 } |
1316 | 1558 |
1317 class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest { | 1559 class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest { |
1318 public: | 1560 public: |
1319 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 1561 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
1562 AsyncExtensionBrowserTest::SetUpCommandLine(command_line); | |
1320 // Reduce performance test variance by disabling background networking. | 1563 // Reduce performance test variance by disabling background networking. |
1321 command_line->AppendSwitch(switches::kDisableBackgroundNetworking); | 1564 command_line->AppendSwitch(switches::kDisableBackgroundNetworking); |
1322 } | 1565 } |
1323 }; | 1566 }; |
1324 | 1567 |
1325 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, UserCloseWindow) { | 1568 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, UserCloseWindow) { |
1326 net::SpawnedTestServer https_server( | 1569 net::SpawnedTestServer https_server( |
1327 net::SpawnedTestServer::TYPE_HTTPS, | 1570 net::SpawnedTestServer::TYPE_HTTPS, |
1328 net::SpawnedTestServer::kLocalhost, | 1571 net::SpawnedTestServer::kLocalhost, |
1329 base::FilePath(FILE_PATH_LITERAL( | 1572 base::FilePath(FILE_PATH_LITERAL( |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1475 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), | 1718 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), |
1476 url); | 1719 url); |
1477 } | 1720 } |
1478 | 1721 |
1479 } // namespace extensions | 1722 } // namespace extensions |
1480 | 1723 |
1481 // Tests the chrome.identity API implemented by custom JS bindings . | 1724 // Tests the chrome.identity API implemented by custom JS bindings . |
1482 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ChromeIdentityJsBindings) { | 1725 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ChromeIdentityJsBindings) { |
1483 ASSERT_TRUE(RunExtensionTest("identity/js_bindings")) << message_; | 1726 ASSERT_TRUE(RunExtensionTest("identity/js_bindings")) << message_; |
1484 } | 1727 } |
OLD | NEW |