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

Unified Diff: chrome/browser/extensions/api/identity/identity_apitest.cc

Issue 293063002: Multiple account support in chrome.identity.getAuthToken (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix build errors on mac and chrome OS Created 6 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 side-by-side diff with in-line comments
Download patch
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) {
+ 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);
}

Powered by Google App Engine
This is Rietveld 408576698