OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/extensions/api/identity/identity_event_router.h" |
| 6 |
| 7 #include <map> |
| 8 #include <string> |
| 9 #include <vector> |
| 10 |
| 11 #include "base/command_line.h" |
| 12 #include "base/files/file_path.h" |
| 13 #include "base/path_service.h" |
| 14 #include "base/stl_util.h" |
| 15 #include "base/strings/stringprintf.h" |
| 16 #include "base/values.h" |
| 17 #include "chrome/browser/extensions/event_router.h" |
| 18 #include "chrome/browser/extensions/extension_service.h" |
| 19 #include "chrome/browser/extensions/extension_system.h" |
| 20 #include "chrome/browser/extensions/extension_system_factory.h" |
| 21 #include "chrome/browser/extensions/test_extension_service.h" |
| 22 #include "chrome/browser/extensions/test_extension_system.h" |
| 23 #include "chrome/browser/profiles/profile.h" |
| 24 #include "chrome/common/chrome_paths.h" |
| 25 #include "chrome/common/extensions/api/identity.h" |
| 26 #include "chrome/common/extensions/extension.h" |
| 27 #include "chrome/common/extensions/extension_builder.h" |
| 28 #include "chrome/common/extensions/extension_set.h" |
| 29 #include "chrome/common/extensions/permissions/api_permission.h" |
| 30 #include "chrome/common/extensions/permissions/permissions_data.h" |
| 31 #include "chrome/common/extensions/value_builder.h" |
| 32 #include "chrome/test/base/testing_profile.h" |
| 33 #include "content/public/test/test_browser_thread_bundle.h" |
| 34 #include "testing/gtest/include/gtest/gtest.h" |
| 35 |
| 36 namespace { |
| 37 |
| 38 struct EventInfo { |
| 39 std::string user_id; |
| 40 std::string email; |
| 41 bool is_signed_in; |
| 42 }; |
| 43 |
| 44 class FakeEventRouter : public extensions::EventRouter { |
| 45 public: |
| 46 explicit FakeEventRouter(Profile* profile) : EventRouter(profile, NULL) {} |
| 47 |
| 48 virtual void DispatchEventToExtension( |
| 49 const std::string& extension_id, |
| 50 scoped_ptr<extensions::Event> event) OVERRIDE { |
| 51 EventInfo event_info; |
| 52 base::DictionaryValue* event_object = NULL; |
| 53 EXPECT_TRUE(event->event_args->GetDictionary(0, &event_object)); |
| 54 EXPECT_TRUE(event_object->GetString("id", &event_info.user_id)); |
| 55 event_object->GetString("email", &event_info.email); |
| 56 |
| 57 EXPECT_TRUE(event->event_args->GetBoolean(1, &event_info.is_signed_in)); |
| 58 |
| 59 EXPECT_FALSE(ContainsKey(extension_id_to_event_, extension_id)); |
| 60 extension_id_to_event_[extension_id] = event_info; |
| 61 } |
| 62 |
| 63 size_t GetEventCount() { |
| 64 return extension_id_to_event_.size(); |
| 65 } |
| 66 |
| 67 bool ContainsExtensionId(const std::string extension_id) { |
| 68 return ContainsKey(extension_id_to_event_, extension_id); |
| 69 } |
| 70 |
| 71 const EventInfo& GetEventInfo(const std::string extension_id) { |
| 72 return extension_id_to_event_[extension_id]; |
| 73 } |
| 74 |
| 75 private: |
| 76 std::map<std::string, EventInfo> extension_id_to_event_; |
| 77 |
| 78 DISALLOW_COPY_AND_ASSIGN(FakeEventRouter); |
| 79 }; |
| 80 |
| 81 class FakeExtensionService : public TestExtensionService { |
| 82 public: |
| 83 FakeExtensionService() {} |
| 84 virtual ~FakeExtensionService() {} |
| 85 |
| 86 virtual const ExtensionSet* extensions() const OVERRIDE { |
| 87 return &extensions_; |
| 88 } |
| 89 |
| 90 virtual void AddExtension(const extensions::Extension* extension) OVERRIDE { |
| 91 extensions_.Insert(extension); |
| 92 } |
| 93 |
| 94 private: |
| 95 ExtensionSet extensions_; |
| 96 }; |
| 97 |
| 98 class FakeExtensionSystem : public extensions::TestExtensionSystem { |
| 99 public: |
| 100 explicit FakeExtensionSystem(Profile* profile) |
| 101 : extensions::TestExtensionSystem(profile) {} |
| 102 |
| 103 virtual extensions::EventRouter* event_router() OVERRIDE { |
| 104 return fake_event_router(); |
| 105 } |
| 106 |
| 107 virtual ExtensionService* extension_service() OVERRIDE { |
| 108 ExtensionServiceInterface* as_interface = |
| 109 static_cast<ExtensionServiceInterface*>(&fake_extension_service_); |
| 110 return static_cast<ExtensionService*>(as_interface); |
| 111 } |
| 112 |
| 113 FakeEventRouter* fake_event_router() { |
| 114 if (!fake_event_router_) |
| 115 fake_event_router_.reset(new FakeEventRouter(profile_)); |
| 116 return fake_event_router_.get(); |
| 117 } |
| 118 |
| 119 private: |
| 120 FakeExtensionService fake_extension_service_; |
| 121 scoped_ptr<FakeEventRouter> fake_event_router_; |
| 122 |
| 123 DISALLOW_COPY_AND_ASSIGN(FakeExtensionSystem); |
| 124 }; |
| 125 |
| 126 BrowserContextKeyedService* BuildFakeExtensionSystem( |
| 127 content::BrowserContext* profile) { |
| 128 return new FakeExtensionSystem(static_cast<Profile*>(profile)); |
| 129 } |
| 130 |
| 131 } // namespace |
| 132 |
| 133 namespace extensions { |
| 134 |
| 135 class IdentityEventRouterTest : public testing::Test { |
| 136 public: |
| 137 IdentityEventRouterTest() |
| 138 : test_profile_(new TestingProfile()), |
| 139 identity_event_router_(test_profile_.get()), |
| 140 extension_counter_(0) {} |
| 141 |
| 142 virtual void SetUp() OVERRIDE { |
| 143 fake_extension_system_ = static_cast<FakeExtensionSystem*>( |
| 144 ExtensionSystemFactory::GetInstance()->SetTestingFactoryAndUse( |
| 145 test_profile_.get(), &BuildFakeExtensionSystem)); |
| 146 } |
| 147 |
| 148 FakeEventRouter* fake_event_router() { |
| 149 return fake_extension_system_->fake_event_router(); |
| 150 } |
| 151 |
| 152 protected: |
| 153 scoped_refptr<const Extension> CreateExtension(bool has_email_permission) { |
| 154 ListBuilder permissions; |
| 155 if (has_email_permission) |
| 156 permissions.Append("identity.email"); |
| 157 |
| 158 std::string id = base::StringPrintf("id.%d", extension_counter_++); |
| 159 scoped_refptr<const Extension> extension = ExtensionBuilder() |
| 160 .SetID(id) |
| 161 .SetManifest(DictionaryBuilder() |
| 162 .Set("name", "Extension with ID " + id) |
| 163 .Set("version", "1.0") |
| 164 .Set("manifest_version", 2) |
| 165 .Set("permissions", permissions)) |
| 166 .Build(); |
| 167 fake_extension_system_->extension_service()->AddExtension(extension.get()); |
| 168 fake_event_router()->AddEventListener( |
| 169 api::identity::OnSignInChanged::kEventName, NULL, extension->id()); |
| 170 return extension; |
| 171 } |
| 172 |
| 173 scoped_ptr<TestingProfile> test_profile_; |
| 174 IdentityEventRouter identity_event_router_; |
| 175 FakeExtensionSystem* fake_extension_system_; |
| 176 content::TestBrowserThreadBundle thread_bundle_; |
| 177 int extension_counter_; |
| 178 }; |
| 179 |
| 180 TEST_F(IdentityEventRouterTest, SignInNoListeners) { |
| 181 identity_event_router_.DispatchSignInEvent( |
| 182 "test_user_id", "test_email", true); |
| 183 EXPECT_EQ(0ul, fake_event_router()->GetEventCount()); |
| 184 } |
| 185 |
| 186 TEST_F(IdentityEventRouterTest, SignInNoEmailListener) { |
| 187 scoped_refptr<const Extension> ext = CreateExtension(false); |
| 188 identity_event_router_.DispatchSignInEvent( |
| 189 "test_user_id", "test_email", true); |
| 190 EXPECT_EQ(1ul, fake_event_router()->GetEventCount()); |
| 191 EXPECT_TRUE(fake_event_router()->ContainsExtensionId(ext->id())); |
| 192 EXPECT_EQ("test_user_id", |
| 193 fake_event_router()->GetEventInfo(ext->id()).user_id); |
| 194 EXPECT_TRUE(fake_event_router()->GetEventInfo(ext->id()).email.empty()); |
| 195 EXPECT_TRUE(fake_event_router()->GetEventInfo(ext->id()).is_signed_in); |
| 196 } |
| 197 |
| 198 TEST_F(IdentityEventRouterTest, SignInWithEmailListener) { |
| 199 scoped_refptr<const Extension> ext = CreateExtension(true); |
| 200 identity_event_router_.DispatchSignInEvent( |
| 201 "test_user_id", "test_email", true); |
| 202 EXPECT_EQ(1ul, fake_event_router()->GetEventCount()); |
| 203 EXPECT_TRUE(fake_event_router()->ContainsExtensionId(ext->id())); |
| 204 EXPECT_EQ("test_user_id", |
| 205 fake_event_router()->GetEventInfo(ext->id()).user_id); |
| 206 EXPECT_EQ("test_email", fake_event_router()->GetEventInfo(ext->id()).email); |
| 207 EXPECT_TRUE(fake_event_router()->GetEventInfo(ext->id()).is_signed_in); |
| 208 } |
| 209 |
| 210 TEST_F(IdentityEventRouterTest, SignInMultipleListeners) { |
| 211 typedef std::vector<scoped_refptr<const Extension> > ExtensionVector; |
| 212 ExtensionVector with_email; |
| 213 ExtensionVector no_email; |
| 214 |
| 215 for (int i = 0; i < 3; i++) |
| 216 with_email.push_back(CreateExtension(true)); |
| 217 |
| 218 for (int i = 0; i < 2; i++) |
| 219 no_email.push_back(CreateExtension(false)); |
| 220 |
| 221 identity_event_router_.DispatchSignInEvent( |
| 222 "test_user_id", "test_email", true); |
| 223 |
| 224 EXPECT_EQ(with_email.size() + no_email.size(), |
| 225 fake_event_router()->GetEventCount()); |
| 226 |
| 227 for (ExtensionVector::const_iterator it = with_email.begin(); |
| 228 it != with_email.end(); |
| 229 ++it) { |
| 230 EXPECT_TRUE(fake_event_router()->ContainsExtensionId((*it)->id())); |
| 231 EXPECT_EQ("test_user_id", |
| 232 fake_event_router()->GetEventInfo((*it)->id()).user_id); |
| 233 EXPECT_EQ("test_email", |
| 234 fake_event_router()->GetEventInfo((*it)->id()).email); |
| 235 EXPECT_TRUE(fake_event_router()->GetEventInfo((*it)->id()).is_signed_in); |
| 236 } |
| 237 |
| 238 for (ExtensionVector::const_iterator it = no_email.begin(); |
| 239 it != no_email.end(); |
| 240 ++it) { |
| 241 EXPECT_TRUE(fake_event_router()->ContainsExtensionId((*it)->id())); |
| 242 EXPECT_EQ("test_user_id", |
| 243 fake_event_router()->GetEventInfo((*it)->id()).user_id); |
| 244 EXPECT_TRUE(fake_event_router()->GetEventInfo((*it)->id()).email.empty()); |
| 245 EXPECT_TRUE(fake_event_router()->GetEventInfo((*it)->id()).is_signed_in); |
| 246 } |
| 247 } |
| 248 |
| 249 TEST_F(IdentityEventRouterTest, SignOut) { |
| 250 scoped_refptr<const Extension> ext = CreateExtension(false); |
| 251 identity_event_router_.DispatchSignInEvent( |
| 252 "test_user_id", "test_email", false); |
| 253 EXPECT_EQ(1ul, fake_event_router()->GetEventCount()); |
| 254 EXPECT_TRUE(fake_event_router()->ContainsExtensionId(ext->id())); |
| 255 EXPECT_EQ("test_user_id", |
| 256 fake_event_router()->GetEventInfo(ext->id()).user_id); |
| 257 EXPECT_TRUE(fake_event_router()->GetEventInfo(ext->id()).email.empty()); |
| 258 EXPECT_FALSE(fake_event_router()->GetEventInfo(ext->id()).is_signed_in); |
| 259 } |
| 260 |
| 261 } // namespace extensions |
OLD | NEW |