Index: chrome/browser/extensions/api/identity/identity_event_router_unittest.cc |
diff --git a/chrome/browser/extensions/api/identity/identity_event_router_unittest.cc b/chrome/browser/extensions/api/identity/identity_event_router_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..da2b434104e79c776d477a5910b1ef9d9f30468d |
--- /dev/null |
+++ b/chrome/browser/extensions/api/identity/identity_event_router_unittest.cc |
@@ -0,0 +1,291 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/extensions/api/identity/identity_event_router.h" |
+ |
+#include <map> |
+#include <string> |
+#include <vector> |
+ |
+#include "base/command_line.h" |
+#include "base/files/file_path.h" |
+#include "base/path_service.h" |
+#include "base/stl_util.h" |
+#include "base/strings/stringprintf.h" |
+#include "base/values.h" |
+#include "chrome/browser/extensions/event_router.h" |
+#include "chrome/browser/extensions/extension_service.h" |
+#include "chrome/browser/extensions/extension_system.h" |
+#include "chrome/browser/extensions/extension_system_factory.h" |
+#include "chrome/browser/extensions/test_extension_service.h" |
+#include "chrome/browser/extensions/test_extension_system.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/common/chrome_paths.h" |
+#include "chrome/common/extensions/api/identity.h" |
+#include "chrome/common/extensions/extension.h" |
+#include "chrome/common/extensions/extension_builder.h" |
+#include "chrome/common/extensions/extension_set.h" |
+#include "chrome/common/extensions/permissions/permissions_data.h" |
+#include "chrome/common/extensions/value_builder.h" |
+#include "chrome/test/base/testing_profile.h" |
+#include "content/public/test/mock_render_process_host.h" |
+#include "content/public/test/test_browser_thread_bundle.h" |
+#include "extensions/common/permissions/api_permission.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+struct EventInfo { |
+ std::string user_id; |
+ std::string email; |
+ bool is_signed_in; |
+}; |
+ |
+class FakeEventRouter : public extensions::EventRouter { |
+ public: |
+ explicit FakeEventRouter(Profile* profile) : EventRouter(profile, NULL) {} |
+ |
+ virtual void DispatchEventToExtension( |
+ const std::string& extension_id, |
+ scoped_ptr<extensions::Event> event) OVERRIDE { |
+ EventInfo event_info; |
+ base::DictionaryValue* event_object = NULL; |
+ EXPECT_TRUE(event->event_args->GetDictionary(0, &event_object)); |
+ EXPECT_TRUE(event_object->GetString("id", &event_info.user_id)); |
+ event_object->GetString("email", &event_info.email); |
+ |
+ EXPECT_TRUE(event->event_args->GetBoolean(1, &event_info.is_signed_in)); |
+ |
+ EXPECT_FALSE(ContainsKey(extension_id_to_event_, extension_id)); |
+ extension_id_to_event_[extension_id] = event_info; |
+ } |
+ |
+ size_t GetEventCount() { |
+ return extension_id_to_event_.size(); |
+ } |
+ |
+ bool ContainsExtensionId(const std::string extension_id) { |
+ return ContainsKey(extension_id_to_event_, extension_id); |
+ } |
+ |
+ const EventInfo& GetEventInfo(const std::string extension_id) { |
+ return extension_id_to_event_[extension_id]; |
+ } |
+ |
+ private: |
+ std::map<std::string, EventInfo> extension_id_to_event_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeEventRouter); |
+}; |
+ |
+class FakeExtensionService : public TestExtensionService { |
+ public: |
+ FakeExtensionService() {} |
+ virtual ~FakeExtensionService() {} |
+ |
+ virtual const ExtensionSet* extensions() const OVERRIDE { |
+ return &extensions_; |
+ } |
+ |
+ virtual void AddExtension(const extensions::Extension* extension) OVERRIDE { |
+ extensions_.Insert(extension); |
+ } |
+ |
+ private: |
+ ExtensionSet extensions_; |
+}; |
+ |
+class FakeExtensionSystem : public extensions::TestExtensionSystem { |
+ public: |
+ explicit FakeExtensionSystem(Profile* profile) |
+ : extensions::TestExtensionSystem(profile) {} |
+ |
+ virtual extensions::EventRouter* event_router() OVERRIDE { |
+ return fake_event_router(); |
+ } |
+ |
+ virtual ExtensionService* extension_service() OVERRIDE { |
+ ExtensionServiceInterface* as_interface = |
+ static_cast<ExtensionServiceInterface*>(&fake_extension_service_); |
+ return static_cast<ExtensionService*>(as_interface); |
+ } |
+ |
+ FakeEventRouter* fake_event_router() { |
+ if (!fake_event_router_) |
+ fake_event_router_.reset(new FakeEventRouter(profile_)); |
+ return fake_event_router_.get(); |
+ } |
+ |
+ private: |
+ FakeExtensionService fake_extension_service_; |
+ scoped_ptr<FakeEventRouter> fake_event_router_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeExtensionSystem); |
+}; |
+ |
+BrowserContextKeyedService* BuildFakeExtensionSystem( |
+ content::BrowserContext* profile) { |
+ return new FakeExtensionSystem(static_cast<Profile*>(profile)); |
+} |
+ |
+} // namespace |
+ |
+namespace extensions { |
+ |
+class IdentityEventRouterTest : public testing::Test { |
+ public: |
+ IdentityEventRouterTest() |
+ : test_profile_(new TestingProfile()), |
+ identity_event_router_(test_profile_.get()), |
+ extension_counter_(0) {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ fake_extension_system_ = static_cast<FakeExtensionSystem*>( |
+ ExtensionSystemFactory::GetInstance()->SetTestingFactoryAndUse( |
+ test_profile_.get(), &BuildFakeExtensionSystem)); |
+ } |
+ |
+ FakeEventRouter* fake_event_router() { |
+ return fake_extension_system_->fake_event_router(); |
+ } |
+ |
+ Profile* profile() { |
+ return test_profile_.get(); |
+ } |
+ |
+ protected: |
+ scoped_refptr<const Extension> CreateExtension(bool has_email_permission) { |
+ ListBuilder permissions; |
+ if (has_email_permission) |
+ permissions.Append("identity.email"); |
+ |
+ std::string id = base::StringPrintf("id.%d", extension_counter_++); |
+ scoped_refptr<const Extension> extension = ExtensionBuilder() |
+ .SetID(id) |
+ .SetManifest(DictionaryBuilder() |
+ .Set("name", "Extension with ID " + id) |
+ .Set("version", "1.0") |
+ .Set("manifest_version", 2) |
+ .Set("permissions", permissions)) |
+ .Build(); |
+ fake_extension_system_->extension_service()->AddExtension(extension.get()); |
+ fake_event_router()->AddEventListener( |
+ api::identity::OnSignInChanged::kEventName, NULL, extension->id()); |
+ return extension; |
+ } |
+ |
+ scoped_ptr<TestingProfile> test_profile_; |
+ IdentityEventRouter identity_event_router_; |
+ FakeExtensionSystem* fake_extension_system_; |
+ content::TestBrowserThreadBundle thread_bundle_; |
+ int extension_counter_; |
+}; |
+ |
+TEST_F(IdentityEventRouterTest, SignInNoListeners) { |
+ identity_event_router_.DispatchSignInEvent( |
+ "test_user_id", "test_email", true); |
+ EXPECT_EQ(0ul, fake_event_router()->GetEventCount()); |
+} |
+ |
+TEST_F(IdentityEventRouterTest, SignInNoEmailListener) { |
+ scoped_refptr<const Extension> ext = CreateExtension(false); |
+ identity_event_router_.DispatchSignInEvent( |
+ "test_user_id", "test_email", true); |
+ EXPECT_EQ(1ul, fake_event_router()->GetEventCount()); |
+ EXPECT_TRUE(fake_event_router()->ContainsExtensionId(ext->id())); |
+ EXPECT_EQ("test_user_id", |
+ fake_event_router()->GetEventInfo(ext->id()).user_id); |
+ EXPECT_TRUE(fake_event_router()->GetEventInfo(ext->id()).email.empty()); |
+ EXPECT_TRUE(fake_event_router()->GetEventInfo(ext->id()).is_signed_in); |
+} |
+ |
+TEST_F(IdentityEventRouterTest, SignInWithEmailListener) { |
+ scoped_refptr<const Extension> ext = CreateExtension(true); |
+ identity_event_router_.DispatchSignInEvent( |
+ "test_user_id", "test_email", true); |
+ EXPECT_EQ(1ul, fake_event_router()->GetEventCount()); |
+ EXPECT_TRUE(fake_event_router()->ContainsExtensionId(ext->id())); |
+ EXPECT_EQ("test_user_id", |
+ fake_event_router()->GetEventInfo(ext->id()).user_id); |
+ EXPECT_EQ("test_email", fake_event_router()->GetEventInfo(ext->id()).email); |
+ EXPECT_TRUE(fake_event_router()->GetEventInfo(ext->id()).is_signed_in); |
+} |
+ |
+TEST_F(IdentityEventRouterTest, SignInMultipleListeners) { |
+ typedef std::vector<scoped_refptr<const Extension> > ExtensionVector; |
+ ExtensionVector with_email; |
+ ExtensionVector no_email; |
+ |
+ for (int i = 0; i < 3; i++) |
+ with_email.push_back(CreateExtension(true)); |
+ |
+ for (int i = 0; i < 2; i++) |
+ no_email.push_back(CreateExtension(false)); |
+ |
+ identity_event_router_.DispatchSignInEvent( |
+ "test_user_id", "test_email", true); |
+ |
+ EXPECT_EQ(with_email.size() + no_email.size(), |
+ fake_event_router()->GetEventCount()); |
+ |
+ for (ExtensionVector::const_iterator it = with_email.begin(); |
+ it != with_email.end(); |
+ ++it) { |
+ EXPECT_TRUE(fake_event_router()->ContainsExtensionId((*it)->id())); |
+ EXPECT_EQ("test_user_id", |
+ fake_event_router()->GetEventInfo((*it)->id()).user_id); |
+ EXPECT_EQ("test_email", |
+ fake_event_router()->GetEventInfo((*it)->id()).email); |
+ EXPECT_TRUE(fake_event_router()->GetEventInfo((*it)->id()).is_signed_in); |
+ } |
+ |
+ for (ExtensionVector::const_iterator it = no_email.begin(); |
+ it != no_email.end(); |
+ ++it) { |
+ EXPECT_TRUE(fake_event_router()->ContainsExtensionId((*it)->id())); |
+ EXPECT_EQ("test_user_id", |
+ fake_event_router()->GetEventInfo((*it)->id()).user_id); |
+ EXPECT_TRUE(fake_event_router()->GetEventInfo((*it)->id()).email.empty()); |
+ EXPECT_TRUE(fake_event_router()->GetEventInfo((*it)->id()).is_signed_in); |
+ } |
+} |
+ |
+TEST_F(IdentityEventRouterTest, SignInWithTwoListenersOnOneExtension) { |
+ scoped_refptr<const Extension> ext = CreateExtension(true); |
+ |
+ scoped_ptr<content::MockRenderProcessHost> fake_render_process( |
+ new content::MockRenderProcessHost(profile())); |
+ fake_event_router()->AddEventListener( |
+ api::identity::OnSignInChanged::kEventName, |
+ fake_render_process.get(), |
+ ext->id()); |
+ |
+ identity_event_router_.DispatchSignInEvent( |
+ "test_user_id", "test_email", true); |
+ EXPECT_EQ(1ul, fake_event_router()->GetEventCount()); |
+ EXPECT_TRUE(fake_event_router()->ContainsExtensionId(ext->id())); |
+ EXPECT_EQ("test_user_id", |
+ fake_event_router()->GetEventInfo(ext->id()).user_id); |
+ EXPECT_EQ("test_email", fake_event_router()->GetEventInfo(ext->id()).email); |
+ EXPECT_TRUE(fake_event_router()->GetEventInfo(ext->id()).is_signed_in); |
+ |
+ fake_event_router()->RemoveEventListener( |
+ api::identity::OnSignInChanged::kEventName, |
+ fake_render_process.get(), |
+ ext->id()); |
+} |
+ |
+TEST_F(IdentityEventRouterTest, SignOut) { |
+ scoped_refptr<const Extension> ext = CreateExtension(false); |
+ identity_event_router_.DispatchSignInEvent( |
+ "test_user_id", "test_email", false); |
+ EXPECT_EQ(1ul, fake_event_router()->GetEventCount()); |
+ EXPECT_TRUE(fake_event_router()->ContainsExtensionId(ext->id())); |
+ EXPECT_EQ("test_user_id", |
+ fake_event_router()->GetEventInfo(ext->id()).user_id); |
+ EXPECT_TRUE(fake_event_router()->GetEventInfo(ext->id()).email.empty()); |
+ EXPECT_FALSE(fake_event_router()->GetEventInfo(ext->id()).is_signed_in); |
+} |
+ |
+} // namespace extensions |