Chromium Code Reviews| Index: chrome/browser/extensions/api/identity/identity_apitest.cc |
| diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc |
| index e9200b10911222dbbad12a61827e3e02a45518f2..5d21cafc0eb1e3899e92650c54646753290415fe 100644 |
| --- a/chrome/browser/extensions/api/identity/identity_apitest.cc |
| +++ b/chrome/browser/extensions/api/identity/identity_apitest.cc |
| @@ -19,6 +19,10 @@ |
| #include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/guest_view/guest_view_base.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" |
| +#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" |
| +#include "chrome/browser/signin/fake_signin_manager.h" |
| +#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
| #include "chrome/browser/signin/signin_manager_factory.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_window.h" |
| @@ -347,13 +351,107 @@ class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { |
| bool scope_ui_shown_; |
| }; |
| +// TODO(courage): Replace MockGetAuthTokenFunction with |
| +// FakeGetAuthTokenFunction in all tests. |
| + |
| +class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction { |
| + public: |
| + FakeGetAuthTokenFunction() |
| + : login_access_token_result_(true), |
| + login_ui_result_(true), |
| + scope_ui_result_(true), |
| + login_ui_shown_(false), |
| + scope_ui_shown_(false) {} |
| + |
| + void set_login_access_token_result(bool result) { |
| + login_access_token_result_ = result; |
| + } |
| + |
| + void set_login_ui_result(bool result) { login_ui_result_ = result; } |
| + |
| + void set_mint_token_flow(scoped_ptr<OAuth2MintTokenFlow> flow) { |
| + flow_ = flow.Pass(); |
| + } |
| + |
| + void set_scope_ui_failure(GaiaWebAuthFlow::Failure failure) { |
| + scope_ui_result_ = false; |
| + scope_ui_failure_ = failure; |
| + } |
| + |
| + void set_scope_ui_oauth_error(const std::string& oauth_error) { |
| + scope_ui_result_ = false; |
| + scope_ui_failure_ = GaiaWebAuthFlow::OAUTH_ERROR; |
| + scope_ui_oauth_error_ = oauth_error; |
| + } |
| + |
| + bool login_ui_shown() const { return login_ui_shown_; } |
| + |
| + bool scope_ui_shown() const { return scope_ui_shown_; } |
| + |
| + std::string login_access_token() const { return login_access_token_; } |
| + |
| + virtual void ShowLoginPopup() OVERRIDE { |
| + EXPECT_FALSE(login_ui_shown_); |
| + login_ui_shown_ = true; |
| + if (login_ui_result_) |
| + SigninSuccess(); |
| + else |
| + SigninFailed(); |
| + } |
| + |
| + virtual void ShowOAuthApprovalDialog( |
| + const IssueAdviceInfo& issue_advice) OVERRIDE { |
| + scope_ui_shown_ = true; |
| + |
| + if (scope_ui_result_) { |
| + OnGaiaFlowCompleted(kAccessToken, "3600"); |
| + } else if (scope_ui_failure_ == GaiaWebAuthFlow::SERVICE_AUTH_ERROR) { |
| + GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); |
| + OnGaiaFlowFailure(scope_ui_failure_, error, ""); |
| + } else { |
| + GoogleServiceAuthError error(GoogleServiceAuthError::NONE); |
| + OnGaiaFlowFailure(scope_ui_failure_, error, scope_ui_oauth_error_); |
| + } |
| + } |
| + |
| + virtual OAuth2MintTokenFlow* CreateMintTokenFlow( |
| + const std::string& login_access_token) OVERRIDE { |
| + EXPECT_TRUE(login_access_token_.empty()); |
| + login_access_token_ = login_access_token; |
| + return flow_.release(); |
| + } |
| + |
| + private: |
| + virtual ~FakeGetAuthTokenFunction() {} |
| + bool login_access_token_result_; |
| + bool login_ui_result_; |
| + bool scope_ui_result_; |
| + GaiaWebAuthFlow::Failure scope_ui_failure_; |
| + std::string scope_ui_oauth_error_; |
| + bool login_ui_shown_; |
| + bool scope_ui_shown_; |
| + |
| + scoped_ptr<OAuth2MintTokenFlow> flow_; |
| + |
| + std::string login_access_token_; |
| +}; |
| + |
| class MockQueuedMintRequest : public IdentityMintRequestQueue::Request { |
| public: |
| MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType)); |
| }; |
| +AccountIds CreateIds(std::string email, std::string obfid) { |
| + AccountIds ids; |
| + ids.account_key = email; |
| + ids.email = email; |
| + ids.gaia = obfid; |
| + return ids; |
| +} |
| + |
| class IdentityGetAccountsFunctionTest : public ExtensionBrowserTest { |
| virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
| + ExtensionBrowserTest::SetUpCommandLine(command_line); |
| command_line->AppendSwitch(switches::kExtensionsMultiAccount); |
| } |
| @@ -363,14 +461,6 @@ class IdentityGetAccountsFunctionTest : public ExtensionBrowserTest { |
| ids, is_signed_in); |
| } |
| - AccountIds CreateIds(std::string email, std::string obfid) { |
| - AccountIds ids; |
| - ids.account_key = email; |
| - ids.email = email; |
| - ids.gaia = obfid; |
| - return ids; |
| - } |
| - |
| testing::AssertionResult ExpectGetAccounts( |
| const std::vector<std::string>& accounts) { |
| scoped_refptr<IdentityGetAccountsFunction> func( |
| @@ -492,6 +582,60 @@ IN_PROC_BROWSER_TEST_F(IdentityOldProfilesGetAccountsFunctionTest, |
| } |
| class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { |
| + public: |
| + virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
| + AsyncExtensionBrowserTest::SetUpCommandLine(command_line); |
| + command_line->AppendSwitch(switches::kExtensionsMultiAccount); |
| + } |
| + |
| + virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { |
| + AsyncExtensionBrowserTest::SetUpInProcessBrowserTestFixture(); |
| + |
| + will_create_browser_context_services_subscription_ = |
| + BrowserContextDependencyManager::GetInstance() |
| + ->RegisterWillCreateBrowserContextServicesCallbackForTesting( |
| + base::Bind(&GetAuthTokenFunctionTest:: |
| + OnWillCreateBrowserContextServices, |
| + base::Unretained(this))) |
| + .Pass(); |
| + } |
| + |
| + void OnWillCreateBrowserContextServices(content::BrowserContext* context) { |
| + // Replace the signin manager and token service with fakes. Do this ahead of |
| + // creating the browser so that a bunch of classes don't register as |
| + // observers and end up needing to unregister when the fake is substituted. |
| + SigninManagerFactory::GetInstance()->SetTestingFactory( |
| + context, &FakeSigninManagerBase::Build); |
| + ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory( |
| + context, &BuildFakeProfileOAuth2TokenService); |
| + } |
| + |
| + virtual void SetUpOnMainThread() OVERRIDE { |
| + AsyncExtensionBrowserTest::SetUpOnMainThread(); |
| + |
| + // Grab references to the fake signin manager and token service. |
| + signin_manager_ = static_cast<FakeSigninManagerForTesting*>( |
| + SigninManagerFactory::GetInstance()->GetForProfile(profile())); |
| + ASSERT_TRUE(signin_manager_); |
| + token_service_ = static_cast<FakeProfileOAuth2TokenService*>( |
| + ProfileOAuth2TokenServiceFactory::GetInstance()->GetForProfile( |
| + profile())); |
| + ASSERT_TRUE(token_service_); |
| + } |
| + |
| + void SignIn(const std::string account_key) { |
| +#if defined(OS_CHROMEOS) |
| + signin_manager_->SetAuthenticatedUsername(account_key); |
| +#else |
| + signin_manager_->SignIn(account_key, "password"); |
| +#endif |
| + } |
| + |
| + void SetAccountState(AccountIds ids, bool is_signed_in) { |
| + IdentityAPI::GetFactoryInstance()->Get(profile())->SetAccountStateForTest( |
| + ids, is_signed_in); |
| + } |
| + |
| protected: |
| enum OAuth2Fields { |
| NONE = 0, |
| @@ -500,6 +644,9 @@ class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { |
| AS_COMPONENT = 4 |
| }; |
| + FakeSigninManagerForTesting* signin_manager_; |
| + FakeProfileOAuth2TokenService* token_service_; |
| + |
| virtual ~GetAuthTokenFunctionTest() {} |
| // Helper to create an extension with specific OAuth2Info fields set. |
| @@ -544,8 +691,10 @@ class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { |
| id_api()->SetCachedToken(key, token_data); |
| } |
| - const IdentityTokenCacheValue& GetCachedToken() { |
| - ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); |
| + const IdentityTokenCacheValue& GetCachedToken(std::string account_id) { |
| + if (account_id.empty()) |
| + account_id = GetPrimaryAccountId(); |
| + ExtensionTokenKey key(extension_id_, account_id, oauth_scopes_); |
| return id_api()->GetCachedToken(key); |
| } |
| @@ -564,6 +713,9 @@ class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { |
| private: |
| std::string extension_id_; |
| std::set<std::string> oauth_scopes_; |
| + |
| + scoped_ptr<base::CallbackList<void(content::BrowserContext*)>::Subscription> |
| + will_create_browser_context_services_subscription_; |
| }; |
| IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
| @@ -644,7 +796,7 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
| EXPECT_FALSE(func->scope_ui_shown()); |
| EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE, |
| - GetCachedToken().status()); |
| + GetCachedToken(std::string()).status()); |
| } |
| IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
| @@ -707,7 +859,7 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
| EXPECT_FALSE(func->login_ui_shown()); |
| EXPECT_FALSE(func->scope_ui_shown()); |
| EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
| - GetCachedToken().status()); |
| + GetCachedToken(std::string()).status()); |
| } |
| IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
| @@ -963,7 +1115,7 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
| EXPECT_TRUE(func->scope_ui_shown()); |
| EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
| - GetCachedToken().status()); |
| + GetCachedToken(std::string()).status()); |
| } |
| IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveQueue) { |
| @@ -1224,7 +1376,7 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
| EXPECT_TRUE(func->login_ui_shown()); |
| EXPECT_TRUE(func->scope_ui_shown()); |
| EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
| - GetCachedToken().status()); |
| + GetCachedToken(std::string()).status()); |
| } |
| IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithChromeClientId) { |
| @@ -1246,6 +1398,96 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithNormalClientId) { |
| EXPECT_EQ("client1", func->GetOAuth2ClientId()); |
| } |
| +IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiDefaultUser) { |
| + SignIn("primary@example.com"); |
| + token_service_->IssueRefreshTokenForUser("primary@example.com", |
| + "refresh_token"); |
| + SetAccountState(CreateIds("primary@example.com", "1"), true); |
| + SetAccountState(CreateIds("secondary@example.com", "2"), true); |
| + |
| + scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); |
| + scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); |
| + func->set_extension(extension.get()); |
| + func->set_mint_token_flow( |
| + scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( |
| + TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); |
| + |
| + RunFunctionAsync(func.get(), "[{}]"); |
| + |
| + token_service_->IssueAllTokensForAccount( |
| + "primary@example.com", |
| + "access_token-primary@example.com", |
| + base::Time::Now() + base::TimeDelta::FromSeconds(3600)); |
| + |
| + scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); |
| + std::string access_token; |
| + EXPECT_TRUE(value->GetAsString(&access_token)); |
| + EXPECT_EQ(std::string(kAccessToken), access_token); |
| + EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
| + GetCachedToken(std::string()).status()); |
| + EXPECT_EQ("access_token-primary@example.com", func->login_access_token()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiPrimaryUser) { |
| + SignIn("primary@example.com"); |
| + token_service_->IssueRefreshTokenForUser("primary@example.com", |
| + "refresh_token"); |
| + SetAccountState(CreateIds("primary@example.com", "1"), true); |
| + SetAccountState(CreateIds("secondary@example.com", "2"), true); |
| + |
| + scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); |
| + scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); |
| + func->set_extension(extension.get()); |
| + func->set_mint_token_flow( |
| + scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( |
| + TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); |
| + |
| + RunFunctionAsync(func.get(), "[{\"account\": { \"id\": \"1\" } }]"); |
| + |
| + token_service_->IssueAllTokensForAccount( |
| + "primary@example.com", |
| + "access_token-primary@example.com", |
| + base::Time::Now() + base::TimeDelta::FromSeconds(3600)); |
| + |
| + scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); |
| + std::string access_token; |
| + EXPECT_TRUE(value->GetAsString(&access_token)); |
| + EXPECT_EQ(std::string(kAccessToken), access_token); |
| + EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
| + GetCachedToken(std::string()).status()); |
| + EXPECT_EQ("access_token-primary@example.com", func->login_access_token()); |
| +} |
| + |
| +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
|
| + SignIn("primary@example.com"); |
| + token_service_->IssueRefreshTokenForUser("secondary@example.com", |
| + "refresh_token"); |
| + SetAccountState(CreateIds("primary@example.com", "1"), true); |
| + SetAccountState(CreateIds("secondary@example.com", "2"), true); |
| + |
| + scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); |
| + scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); |
| + func->set_extension(extension.get()); |
| + func->set_mint_token_flow( |
| + scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( |
| + TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); |
| + |
| + RunFunctionAsync(func.get(), "[{\"account\": { \"id\": \"2\" } }]"); |
| + |
| + token_service_->IssueAllTokensForAccount( |
| + "secondary@example.com", |
| + "access_token-secondary@example.com", |
| + base::Time::Now() + base::TimeDelta::FromSeconds(3600)); |
| + |
| + scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); |
| + std::string access_token; |
| + EXPECT_TRUE(value->GetAsString(&access_token)); |
| + EXPECT_EQ(std::string(kAccessToken), access_token); |
| + EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, |
| + GetCachedToken("secondary@example.com").status()); |
| + EXPECT_EQ("access_token-secondary@example.com", func->login_access_token()); |
| +} |
| + |
| class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest { |
| protected: |
| bool InvalidateDefaultToken() { |
| @@ -1317,6 +1559,7 @@ IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, MatchingToken) { |
| class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest { |
| public: |
| virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
| + AsyncExtensionBrowserTest::SetUpCommandLine(command_line); |
| // Reduce performance test variance by disabling background networking. |
| command_line->AppendSwitch(switches::kDisableBackgroundNetworking); |
| } |