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 48a392ac6e008bacedd3b032132a18ed9ed61198..942e66351ac8ee78b81e11a9262ca7543422b374 100644 |
--- a/chrome/browser/extensions/api/identity/identity_apitest.cc |
+++ b/chrome/browser/extensions/api/identity/identity_apitest.cc |
@@ -2,6 +2,10 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <set> |
+#include <string> |
+#include <vector> |
+ |
#include "base/command_line.h" |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
@@ -18,10 +22,12 @@ |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_window.h" |
#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/extensions/api/identity.h" |
#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" |
#include "chrome/test/base/in_process_browser_test.h" |
#include "chrome/test/base/test_switches.h" |
#include "components/signin/core/browser/signin_manager.h" |
+#include "components/signin/core/common/profile_management_switches.h" |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/notification_source.h" |
#include "content/public/test/test_utils.h" |
@@ -344,6 +350,136 @@ class MockQueuedMintRequest : public IdentityMintRequestQueue::Request { |
MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType)); |
}; |
+class IdentityGetAccountsFunctionTest : public ExtensionBrowserTest { |
+ virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
+ command_line->AppendSwitch(switches::kExtensionsMultiAccount); |
+ } |
+ |
+ protected: |
+ void SetAccountState(AccountIds ids, bool is_signed_in) { |
+ IdentityAPI::GetFactoryInstance()->Get(profile())->SetAccountStateForTest( |
+ 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( |
+ new IdentityGetAccountsFunction); |
+ func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); |
+ if (!utils::RunFunction( |
+ func.get(), std::string("[]"), browser(), utils::NONE)) { |
+ return GenerateFailureResult(accounts, NULL) |
+ << "getAccounts did not return a result."; |
+ } |
+ const base::ListValue* results = func->GetResultList(); |
+ if (!results || (results->GetSize() != accounts.size())) |
+ return GenerateFailureResult(accounts, results); |
+ |
+ std::set<std::string> result_ids; |
+ for (base::ListValue::const_iterator it = results->begin(); |
+ it != results->end(); |
+ ++it) { |
+ scoped_ptr<api::identity::AccountInfo> info = |
+ api::identity::AccountInfo::FromValue(**it); |
+ if (info.get()) |
+ result_ids.insert(info->id); |
+ else |
+ return GenerateFailureResult(accounts, results); |
+ } |
+ |
+ for (std::vector<std::string>::const_iterator it = accounts.begin(); |
+ it != accounts.end(); |
+ ++it) { |
+ if (result_ids.find(*it) == result_ids.end()) |
+ return GenerateFailureResult(accounts, results); |
+ } |
+ |
+ return testing::AssertionResult(true); |
+ } |
+ |
+ testing::AssertionResult GenerateFailureResult( |
+ const ::std::vector<std::string>& accounts, |
+ const base::ListValue* results) { |
+ testing::Message msg("Expected: "); |
+ for (std::vector<std::string>::const_iterator it = accounts.begin(); |
+ it != accounts.end(); |
+ ++it) { |
+ msg << *it << " "; |
+ } |
+ msg << "Actual: "; |
+ if (!results) { |
+ msg << "NULL"; |
+ } else { |
+ for (base::ListValue::const_iterator it = results->begin(); |
+ it != results->end(); |
+ ++it) { |
+ scoped_ptr<api::identity::AccountInfo> info = |
+ api::identity::AccountInfo::FromValue(**it); |
+ if (info.get()) |
+ msg << info->id << " "; |
+ else |
+ msg << *it << "<-" << (*it)->GetType() << " "; |
+ } |
+ } |
+ |
+ return testing::AssertionFailure(msg); |
+ } |
+}; |
+ |
+IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, MultiAccountOn) { |
+ EXPECT_TRUE(switches::IsExtensionsMultiAccount()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, NoneSignedIn) { |
+ EXPECT_TRUE(ExpectGetAccounts(std::vector<std::string>())); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, |
+ PrimaryAccountSignedIn) { |
+ SetAccountState(CreateIds("primary@example.com", "1"), true); |
+ std::vector<std::string> primary; |
+ primary.push_back("1"); |
+ EXPECT_TRUE(ExpectGetAccounts(primary)); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, TwoAccountsSignedIn) { |
+ SetAccountState(CreateIds("primary@example.com", "1"), true); |
+ SetAccountState(CreateIds("secondary@example.com", "2"), true); |
+ std::vector<std::string> two_accounts; |
+ two_accounts.push_back("1"); |
+ two_accounts.push_back("2"); |
+ EXPECT_TRUE(ExpectGetAccounts(two_accounts)); |
+} |
+ |
+class IdentityOldProfilesGetAccountsFunctionTest |
+ : public IdentityGetAccountsFunctionTest { |
+ virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
+ // Don't add the multi-account switch that parent class would have. |
+ } |
+}; |
+ |
+IN_PROC_BROWSER_TEST_F(IdentityOldProfilesGetAccountsFunctionTest, |
+ MultiAccountOff) { |
+ EXPECT_FALSE(switches::IsExtensionsMultiAccount()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(IdentityOldProfilesGetAccountsFunctionTest, |
+ TwoAccountsSignedIn) { |
+ SetAccountState(CreateIds("primary@example.com", "1"), true); |
+ SetAccountState(CreateIds("secondary@example.com", "2"), true); |
+ std::vector<std::string> only_primary; |
+ only_primary.push_back("1"); |
+ EXPECT_TRUE(ExpectGetAccounts(only_primary)); |
+} |
+ |
class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { |
protected: |
enum OAuth2Fields { |