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

Side by Side Diff: chrome/browser/extensions/api/identity/identity_event_router_unittest.cc

Issue 27283002: Identity API: Add chrome.identity.onSignInChanged routing and IDL (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove unintended IdentityAPI changes Created 7 years, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698