OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // TODO(rickcam): Bug 73183: Add unit tests for image loading | 5 // TODO(rickcam): Bug 73183: Add unit tests for image loading |
6 | 6 |
7 #include <cstdlib> | 7 #include <cstdlib> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "chrome/browser/background/background_application_list_model.h" | 10 #include "chrome/browser/background/background_application_list_model.h" |
11 | 11 |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
17 #include "chrome/browser/extensions/extension_service.h" | 17 #include "chrome/browser/extensions/extension_service.h" |
18 #include "chrome/browser/extensions/extension_service_test_base.h" | 18 #include "chrome/browser/extensions/extension_service_test_base.h" |
19 #include "chrome/browser/extensions/permissions_updater.h" | 19 #include "chrome/browser/extensions/permissions_updater.h" |
20 #include "chrome/test/base/testing_profile.h" | 20 #include "chrome/test/base/testing_profile.h" |
21 #include "content/public/browser/notification_registrar.h" | 21 #include "content/public/browser/notification_registrar.h" |
22 #include "content/public/browser/notification_types.h" | 22 #include "content/public/browser/notification_types.h" |
23 #include "extensions/browser/extension_prefs.h" | 23 #include "extensions/browser/extension_prefs.h" |
24 #include "extensions/browser/extension_system.h" | 24 #include "extensions/browser/extension_registry.h" |
25 #include "extensions/browser/uninstall_reason.h" | 25 #include "extensions/browser/uninstall_reason.h" |
26 #include "extensions/common/extension.h" | 26 #include "extensions/common/extension.h" |
27 #include "extensions/common/manifest_constants.h" | 27 #include "extensions/common/manifest_constants.h" |
28 #include "extensions/common/permissions/api_permission.h" | 28 #include "extensions/common/permissions/api_permission.h" |
29 #include "extensions/common/permissions/permission_set.h" | 29 #include "extensions/common/permissions/permission_set.h" |
30 #include "extensions/common/permissions/permissions_data.h" | 30 #include "extensions/common/permissions/permissions_data.h" |
31 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
32 | 32 |
33 // This value is used to seed the PRNG at the beginning of a sequence of | 33 // This value is used to seed the PRNG at the beginning of a sequence of |
34 // operations to produce a repeatable sequence. | 34 // operations to produce a repeatable sequence. |
35 #define RANDOM_SEED (0x33F7A7A7) | 35 #define RANDOM_SEED (0x33F7A7A7) |
36 | 36 |
37 using extensions::APIPermission; | 37 using extensions::APIPermission; |
38 using extensions::Extension; | 38 using extensions::Extension; |
| 39 using extensions::ExtensionRegistry; |
39 | 40 |
40 // For ExtensionService interface when it requires a path that is not used. | 41 // For ExtensionService interface when it requires a path that is not used. |
41 base::FilePath bogus_file_pathname(const std::string& name) { | 42 base::FilePath bogus_file_pathname(const std::string& name) { |
42 return base::FilePath(FILE_PATH_LITERAL("//foobar_nonexistent")) | 43 return base::FilePath(FILE_PATH_LITERAL("//foobar_nonexistent")) |
43 .AppendASCII(name); | 44 .AppendASCII(name); |
44 } | 45 } |
45 | 46 |
46 class BackgroundApplicationListModelTest | 47 class BackgroundApplicationListModelTest |
47 : public extensions::ExtensionServiceTestBase { | 48 : public extensions::ExtensionServiceTestBase { |
48 public: | 49 public: |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 // http://crbug.com/165458 | 178 // http://crbug.com/165458 |
178 #if defined(OS_MACOSX) || defined(OS_LINUX) | 179 #if defined(OS_MACOSX) || defined(OS_LINUX) |
179 #define MAYBE_ExplicitTest DISABLED_ExplicitTest | 180 #define MAYBE_ExplicitTest DISABLED_ExplicitTest |
180 #else | 181 #else |
181 #define MAYBE_ExplicitTest ExplicitTest | 182 #define MAYBE_ExplicitTest ExplicitTest |
182 #endif | 183 #endif |
183 // With minimal test logic, verifies behavior over an explicit set of | 184 // With minimal test logic, verifies behavior over an explicit set of |
184 // extensions, of which some are Background Apps and others are not. | 185 // extensions, of which some are Background Apps and others are not. |
185 TEST_F(BackgroundApplicationListModelTest, MAYBE_ExplicitTest) { | 186 TEST_F(BackgroundApplicationListModelTest, MAYBE_ExplicitTest) { |
186 InitializeAndLoadEmptyExtensionService(); | 187 InitializeAndLoadEmptyExtensionService(); |
187 ExtensionService* service = extensions::ExtensionSystem::Get(profile_.get())-> | 188 ASSERT_TRUE(service()->is_ready()); |
188 extension_service(); | 189 ASSERT_TRUE(registry()->enabled_extensions().is_empty()); |
189 ASSERT_TRUE(service); | |
190 ASSERT_TRUE(service->is_ready()); | |
191 ASSERT_TRUE(service->extensions()); | |
192 ASSERT_TRUE(service->extensions()->is_empty()); | |
193 scoped_ptr<BackgroundApplicationListModel> model( | 190 scoped_ptr<BackgroundApplicationListModel> model( |
194 new BackgroundApplicationListModel(profile_.get())); | 191 new BackgroundApplicationListModel(profile_.get())); |
195 ASSERT_EQ(0U, model->size()); | 192 ASSERT_EQ(0U, model->size()); |
196 | 193 |
197 scoped_refptr<Extension> ext1 = CreateExtension("alpha", false); | 194 scoped_refptr<Extension> ext1 = CreateExtension("alpha", false); |
198 scoped_refptr<Extension> ext2 = CreateExtension("bravo", false); | 195 scoped_refptr<Extension> ext2 = CreateExtension("bravo", false); |
199 scoped_refptr<Extension> ext3 = CreateExtension("charlie", false); | 196 scoped_refptr<Extension> ext3 = CreateExtension("charlie", false); |
200 scoped_refptr<Extension> bgapp1 = CreateExtension("delta", true); | 197 scoped_refptr<Extension> bgapp1 = CreateExtension("delta", true); |
201 scoped_refptr<Extension> bgapp2 = CreateExtension("echo", true); | 198 scoped_refptr<Extension> bgapp2 = CreateExtension("echo", true); |
202 ASSERT_TRUE(service->extensions() != NULL); | 199 ASSERT_EQ(0U, registry()->enabled_extensions().size()); |
203 ASSERT_EQ(0U, service->extensions()->size()); | |
204 ASSERT_EQ(0U, model->size()); | 200 ASSERT_EQ(0U, model->size()); |
205 | 201 |
206 // Add alternating Extensions and Background Apps | 202 // Add alternating Extensions and Background Apps |
207 ASSERT_FALSE(IsBackgroundApp(*ext1.get())); | 203 ASSERT_FALSE(IsBackgroundApp(*ext1.get())); |
208 service->AddExtension(ext1.get()); | 204 service()->AddExtension(ext1.get()); |
209 ASSERT_EQ(1U, service->extensions()->size()); | 205 ASSERT_EQ(1U, registry()->enabled_extensions().size()); |
210 ASSERT_EQ(0U, model->size()); | 206 ASSERT_EQ(0U, model->size()); |
211 ASSERT_TRUE(IsBackgroundApp(*bgapp1.get())); | 207 ASSERT_TRUE(IsBackgroundApp(*bgapp1.get())); |
212 service->AddExtension(bgapp1.get()); | 208 service()->AddExtension(bgapp1.get()); |
213 ASSERT_EQ(2U, service->extensions()->size()); | 209 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
214 ASSERT_EQ(1U, model->size()); | 210 ASSERT_EQ(1U, model->size()); |
215 ASSERT_FALSE(IsBackgroundApp(*ext2.get())); | 211 ASSERT_FALSE(IsBackgroundApp(*ext2.get())); |
216 service->AddExtension(ext2.get()); | 212 service()->AddExtension(ext2.get()); |
217 ASSERT_EQ(3U, service->extensions()->size()); | 213 ASSERT_EQ(3U, registry()->enabled_extensions().size()); |
218 ASSERT_EQ(1U, model->size()); | 214 ASSERT_EQ(1U, model->size()); |
219 ASSERT_TRUE(IsBackgroundApp(*bgapp2.get())); | 215 ASSERT_TRUE(IsBackgroundApp(*bgapp2.get())); |
220 service->AddExtension(bgapp2.get()); | 216 service()->AddExtension(bgapp2.get()); |
221 ASSERT_EQ(4U, service->extensions()->size()); | 217 ASSERT_EQ(4U, registry()->enabled_extensions().size()); |
222 ASSERT_EQ(2U, model->size()); | 218 ASSERT_EQ(2U, model->size()); |
223 ASSERT_FALSE(IsBackgroundApp(*ext3.get())); | 219 ASSERT_FALSE(IsBackgroundApp(*ext3.get())); |
224 service->AddExtension(ext3.get()); | 220 service()->AddExtension(ext3.get()); |
225 ASSERT_EQ(5U, service->extensions()->size()); | 221 ASSERT_EQ(5U, registry()->enabled_extensions().size()); |
226 ASSERT_EQ(2U, model->size()); | 222 ASSERT_EQ(2U, model->size()); |
227 | 223 |
228 // Remove in FIFO order. | 224 // Remove in FIFO order. |
229 ASSERT_FALSE(IsBackgroundApp(*ext1.get())); | 225 ASSERT_FALSE(IsBackgroundApp(*ext1.get())); |
230 service->UninstallExtension(ext1->id(), | 226 service()->UninstallExtension(ext1->id(), |
231 extensions::UNINSTALL_REASON_FOR_TESTING, | 227 extensions::UNINSTALL_REASON_FOR_TESTING, |
232 base::Bind(&base::DoNothing), | 228 base::Bind(&base::DoNothing), NULL); |
233 NULL); | 229 ASSERT_EQ(4U, registry()->enabled_extensions().size()); |
234 ASSERT_EQ(4U, service->extensions()->size()); | |
235 ASSERT_EQ(2U, model->size()); | 230 ASSERT_EQ(2U, model->size()); |
236 ASSERT_TRUE(IsBackgroundApp(*bgapp1.get())); | 231 ASSERT_TRUE(IsBackgroundApp(*bgapp1.get())); |
237 service->UninstallExtension(bgapp1->id(), | 232 service()->UninstallExtension(bgapp1->id(), |
238 extensions::UNINSTALL_REASON_FOR_TESTING, | 233 extensions::UNINSTALL_REASON_FOR_TESTING, |
239 base::Bind(&base::DoNothing), | 234 base::Bind(&base::DoNothing), NULL); |
240 NULL); | 235 ASSERT_EQ(3U, registry()->enabled_extensions().size()); |
241 ASSERT_EQ(3U, service->extensions()->size()); | |
242 ASSERT_EQ(1U, model->size()); | 236 ASSERT_EQ(1U, model->size()); |
243 ASSERT_FALSE(IsBackgroundApp(*ext2.get())); | 237 ASSERT_FALSE(IsBackgroundApp(*ext2.get())); |
244 service->UninstallExtension(ext2->id(), | 238 service()->UninstallExtension(ext2->id(), |
245 extensions::UNINSTALL_REASON_FOR_TESTING, | 239 extensions::UNINSTALL_REASON_FOR_TESTING, |
246 base::Bind(&base::DoNothing), | 240 base::Bind(&base::DoNothing), NULL); |
247 NULL); | 241 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
248 ASSERT_EQ(2U, service->extensions()->size()); | |
249 ASSERT_EQ(1U, model->size()); | 242 ASSERT_EQ(1U, model->size()); |
250 ASSERT_TRUE(IsBackgroundApp(*bgapp2.get())); | 243 ASSERT_TRUE(IsBackgroundApp(*bgapp2.get())); |
251 service->UninstallExtension(bgapp2->id(), | 244 service()->UninstallExtension(bgapp2->id(), |
252 extensions::UNINSTALL_REASON_FOR_TESTING, | 245 extensions::UNINSTALL_REASON_FOR_TESTING, |
253 base::Bind(&base::DoNothing), | 246 base::Bind(&base::DoNothing), NULL); |
254 NULL); | 247 ASSERT_EQ(1U, registry()->enabled_extensions().size()); |
255 ASSERT_EQ(1U, service->extensions()->size()); | |
256 ASSERT_EQ(0U, model->size()); | 248 ASSERT_EQ(0U, model->size()); |
257 ASSERT_FALSE(IsBackgroundApp(*ext3.get())); | 249 ASSERT_FALSE(IsBackgroundApp(*ext3.get())); |
258 service->UninstallExtension(ext3->id(), | 250 service()->UninstallExtension(ext3->id(), |
259 extensions::UNINSTALL_REASON_FOR_TESTING, | 251 extensions::UNINSTALL_REASON_FOR_TESTING, |
260 base::Bind(&base::DoNothing), | 252 base::Bind(&base::DoNothing), NULL); |
261 NULL); | 253 ASSERT_EQ(0U, registry()->enabled_extensions().size()); |
262 ASSERT_EQ(0U, service->extensions()->size()); | |
263 ASSERT_EQ(0U, model->size()); | 254 ASSERT_EQ(0U, model->size()); |
264 } | 255 } |
265 | 256 |
266 // Verifies that pushMessaging also triggers background detection, except | 257 // Verifies that pushMessaging also triggers background detection, except |
267 // when extension is in a whitelist. | 258 // when extension is in a whitelist. |
268 TEST_F(BackgroundApplicationListModelTest, PushMessagingTest) { | 259 TEST_F(BackgroundApplicationListModelTest, PushMessagingTest) { |
269 InitializeAndLoadEmptyExtensionService(); | 260 InitializeAndLoadEmptyExtensionService(); |
270 ExtensionService* service = extensions::ExtensionSystem::Get(profile_.get())-> | 261 ASSERT_TRUE(service()->is_ready()); |
271 extension_service(); | 262 ASSERT_TRUE(registry()->enabled_extensions().is_empty()); |
272 ASSERT_TRUE(service); | |
273 ASSERT_TRUE(service->is_ready()); | |
274 ASSERT_TRUE(service->extensions()); | |
275 ASSERT_TRUE(service->extensions()->is_empty()); | |
276 scoped_ptr<BackgroundApplicationListModel> model( | 263 scoped_ptr<BackgroundApplicationListModel> model( |
277 new BackgroundApplicationListModel(profile_.get())); | 264 new BackgroundApplicationListModel(profile_.get())); |
278 ASSERT_EQ(0U, model->size()); | 265 ASSERT_EQ(0U, model->size()); |
279 | 266 |
280 scoped_refptr<Extension> ext1 = CreateExtension("alpha", false); | 267 scoped_refptr<Extension> ext1 = CreateExtension("alpha", false); |
281 scoped_refptr<Extension> ext2 = | 268 scoped_refptr<Extension> ext2 = |
282 CreateExtensionBase("charlie", false, PUSH_MESSAGING_BUT_NOT_BACKGROUND); | 269 CreateExtensionBase("charlie", false, PUSH_MESSAGING_BUT_NOT_BACKGROUND); |
283 scoped_refptr<Extension> bgapp1 = | 270 scoped_refptr<Extension> bgapp1 = |
284 CreateExtensionBase("bravo", false, PUSH_MESSAGING_PERMISSION); | 271 CreateExtensionBase("bravo", false, PUSH_MESSAGING_PERMISSION); |
285 scoped_refptr<Extension> bgapp2 = | 272 scoped_refptr<Extension> bgapp2 = |
286 CreateExtensionBase("delta", true, PUSH_MESSAGING_PERMISSION); | 273 CreateExtensionBase("delta", true, PUSH_MESSAGING_PERMISSION); |
287 scoped_refptr<Extension> bgapp3 = | 274 scoped_refptr<Extension> bgapp3 = |
288 CreateExtensionBase("echo", true, PUSH_MESSAGING_BUT_NOT_BACKGROUND); | 275 CreateExtensionBase("echo", true, PUSH_MESSAGING_BUT_NOT_BACKGROUND); |
289 ASSERT_TRUE(service->extensions() != NULL); | 276 ASSERT_EQ(0U, registry()->enabled_extensions().size()); |
290 ASSERT_EQ(0U, service->extensions()->size()); | |
291 ASSERT_EQ(0U, model->size()); | 277 ASSERT_EQ(0U, model->size()); |
292 | 278 |
293 // Add alternating Extensions and Background Apps | 279 // Add alternating Extensions and Background Apps |
294 ASSERT_FALSE(IsBackgroundApp(*ext1.get())); | 280 ASSERT_FALSE(IsBackgroundApp(*ext1.get())); |
295 service->AddExtension(ext1.get()); | 281 service()->AddExtension(ext1.get()); |
296 ASSERT_EQ(1U, service->extensions()->size()); | 282 ASSERT_EQ(1U, registry()->enabled_extensions().size()); |
297 ASSERT_EQ(0U, model->size()); | 283 ASSERT_EQ(0U, model->size()); |
298 ASSERT_TRUE(IsBackgroundApp(*bgapp1.get())); | 284 ASSERT_TRUE(IsBackgroundApp(*bgapp1.get())); |
299 service->AddExtension(bgapp1.get()); | 285 service()->AddExtension(bgapp1.get()); |
300 ASSERT_EQ(2U, service->extensions()->size()); | 286 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
301 ASSERT_EQ(1U, model->size()); | 287 ASSERT_EQ(1U, model->size()); |
302 ASSERT_FALSE(IsBackgroundApp(*ext2.get())); | 288 ASSERT_FALSE(IsBackgroundApp(*ext2.get())); |
303 service->AddExtension(ext2.get()); | 289 service()->AddExtension(ext2.get()); |
304 ASSERT_EQ(3U, service->extensions()->size()); | 290 ASSERT_EQ(3U, registry()->enabled_extensions().size()); |
305 ASSERT_EQ(1U, model->size()); | 291 ASSERT_EQ(1U, model->size()); |
306 ASSERT_TRUE(IsBackgroundApp(*bgapp2.get())); | 292 ASSERT_TRUE(IsBackgroundApp(*bgapp2.get())); |
307 service->AddExtension(bgapp2.get()); | 293 service()->AddExtension(bgapp2.get()); |
308 ASSERT_EQ(4U, service->extensions()->size()); | 294 ASSERT_EQ(4U, registry()->enabled_extensions().size()); |
309 ASSERT_EQ(2U, model->size()); | 295 ASSERT_EQ(2U, model->size()); |
310 // Need to remove ext2 because it uses same id as bgapp3. | 296 // Need to remove ext2 because it uses same id as bgapp3. |
311 ASSERT_FALSE(IsBackgroundApp(*ext2.get())); | 297 ASSERT_FALSE(IsBackgroundApp(*ext2.get())); |
312 service->UninstallExtension(ext2->id(), | 298 service()->UninstallExtension(ext2->id(), |
313 extensions::UNINSTALL_REASON_FOR_TESTING, | 299 extensions::UNINSTALL_REASON_FOR_TESTING, |
314 base::Bind(&base::DoNothing), | 300 base::Bind(&base::DoNothing), NULL); |
315 NULL); | 301 ASSERT_EQ(3U, registry()->enabled_extensions().size()); |
316 ASSERT_EQ(3U, service->extensions()->size()); | |
317 ASSERT_EQ(2U, model->size()); | 302 ASSERT_EQ(2U, model->size()); |
318 ASSERT_TRUE(IsBackgroundApp(*bgapp3.get())); | 303 ASSERT_TRUE(IsBackgroundApp(*bgapp3.get())); |
319 service->AddExtension(bgapp3.get()); | 304 service()->AddExtension(bgapp3.get()); |
320 ASSERT_EQ(4U, service->extensions()->size()); | 305 ASSERT_EQ(4U, registry()->enabled_extensions().size()); |
321 ASSERT_EQ(3U, model->size()); | 306 ASSERT_EQ(3U, model->size()); |
322 | 307 |
323 // Remove in FIFO order. | 308 // Remove in FIFO order. |
324 ASSERT_FALSE(IsBackgroundApp(*ext1.get())); | 309 ASSERT_FALSE(IsBackgroundApp(*ext1.get())); |
325 service->UninstallExtension(ext1->id(), | 310 service()->UninstallExtension(ext1->id(), |
326 extensions::UNINSTALL_REASON_FOR_TESTING, | 311 extensions::UNINSTALL_REASON_FOR_TESTING, |
327 base::Bind(&base::DoNothing), | 312 base::Bind(&base::DoNothing), NULL); |
328 NULL); | 313 ASSERT_EQ(3U, registry()->enabled_extensions().size()); |
329 ASSERT_EQ(3U, service->extensions()->size()); | |
330 ASSERT_EQ(3U, model->size()); | 314 ASSERT_EQ(3U, model->size()); |
331 ASSERT_TRUE(IsBackgroundApp(*bgapp1.get())); | 315 ASSERT_TRUE(IsBackgroundApp(*bgapp1.get())); |
332 service->UninstallExtension(bgapp1->id(), | 316 service()->UninstallExtension(bgapp1->id(), |
333 extensions::UNINSTALL_REASON_FOR_TESTING, | 317 extensions::UNINSTALL_REASON_FOR_TESTING, |
334 base::Bind(&base::DoNothing), | 318 base::Bind(&base::DoNothing), NULL); |
335 NULL); | 319 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
336 ASSERT_EQ(2U, service->extensions()->size()); | |
337 ASSERT_EQ(2U, model->size()); | 320 ASSERT_EQ(2U, model->size()); |
338 ASSERT_TRUE(IsBackgroundApp(*bgapp2.get())); | 321 ASSERT_TRUE(IsBackgroundApp(*bgapp2.get())); |
339 service->UninstallExtension(bgapp2->id(), | 322 service()->UninstallExtension(bgapp2->id(), |
340 extensions::UNINSTALL_REASON_FOR_TESTING, | 323 extensions::UNINSTALL_REASON_FOR_TESTING, |
341 base::Bind(&base::DoNothing), | 324 base::Bind(&base::DoNothing), NULL); |
342 NULL); | 325 ASSERT_EQ(1U, registry()->enabled_extensions().size()); |
343 ASSERT_EQ(1U, service->extensions()->size()); | |
344 ASSERT_EQ(1U, model->size()); | 326 ASSERT_EQ(1U, model->size()); |
345 ASSERT_TRUE(IsBackgroundApp(*bgapp3.get())); | 327 ASSERT_TRUE(IsBackgroundApp(*bgapp3.get())); |
346 service->UninstallExtension(bgapp3->id(), | 328 service()->UninstallExtension(bgapp3->id(), |
347 extensions::UNINSTALL_REASON_FOR_TESTING, | 329 extensions::UNINSTALL_REASON_FOR_TESTING, |
348 base::Bind(&base::DoNothing), | 330 base::Bind(&base::DoNothing), NULL); |
349 NULL); | 331 ASSERT_EQ(0U, registry()->enabled_extensions().size()); |
350 ASSERT_EQ(0U, service->extensions()->size()); | |
351 ASSERT_EQ(0U, model->size()); | 332 ASSERT_EQ(0U, model->size()); |
352 } | 333 } |
353 | 334 |
354 // Verifies that an ephemeral app cannot trigger background mode. | 335 // Verifies that an ephemeral app cannot trigger background mode. |
355 TEST_F(BackgroundApplicationListModelTest, EphemeralAppTest) { | 336 TEST_F(BackgroundApplicationListModelTest, EphemeralAppTest) { |
356 InitializeAndLoadEmptyExtensionService(); | 337 InitializeAndLoadEmptyExtensionService(); |
357 ExtensionService* service = extensions::ExtensionSystem::Get(profile_.get())-> | 338 ASSERT_TRUE(service()->is_ready()); |
358 extension_service(); | 339 ASSERT_TRUE(registry()->enabled_extensions().is_empty()); |
359 ASSERT_TRUE(service); | |
360 ASSERT_TRUE(service->is_ready()); | |
361 ASSERT_TRUE(service->extensions()); | |
362 ASSERT_TRUE(service->extensions()->is_empty()); | |
363 scoped_ptr<BackgroundApplicationListModel> model( | 340 scoped_ptr<BackgroundApplicationListModel> model( |
364 new BackgroundApplicationListModel(profile_.get())); | 341 new BackgroundApplicationListModel(profile_.get())); |
365 ASSERT_EQ(0U, model->size()); | 342 ASSERT_EQ(0U, model->size()); |
366 | 343 |
367 scoped_refptr<Extension> installed = | 344 scoped_refptr<Extension> installed = |
368 CreateExtensionBase("installed", false, PUSH_MESSAGING_PERMISSION); | 345 CreateExtensionBase("installed", false, PUSH_MESSAGING_PERMISSION); |
369 scoped_refptr<Extension> ephemeral = | 346 scoped_refptr<Extension> ephemeral = |
370 CreateExtensionBase("ephemeral", false, PUSH_MESSAGING_PERMISSION); | 347 CreateExtensionBase("ephemeral", false, PUSH_MESSAGING_PERMISSION); |
371 scoped_refptr<Extension> background = CreateExtension("background", true); | 348 scoped_refptr<Extension> background = CreateExtension("background", true); |
372 | 349 |
373 // Installed app with push messaging permissions can trigger background mode. | 350 // Installed app with push messaging permissions can trigger background mode. |
374 ASSERT_TRUE(IsBackgroundApp(*installed.get())); | 351 ASSERT_TRUE(IsBackgroundApp(*installed.get())); |
375 service->AddExtension(installed.get()); | 352 service()->AddExtension(installed.get()); |
376 ASSERT_EQ(1U, service->extensions()->size()); | 353 ASSERT_EQ(1U, registry()->enabled_extensions().size()); |
377 ASSERT_EQ(1U, model->size()); | 354 ASSERT_EQ(1U, model->size()); |
378 // An ephemeral app with push messaging permissions should not trigger | 355 // An ephemeral app with push messaging permissions should not trigger |
379 // background mode. | 356 // background mode. |
380 AddEphemeralApp(ephemeral.get(), service); | 357 AddEphemeralApp(ephemeral.get(), service()); |
381 ASSERT_FALSE(IsBackgroundApp(*ephemeral.get())); | 358 ASSERT_FALSE(IsBackgroundApp(*ephemeral.get())); |
382 ASSERT_EQ(2U, service->extensions()->size()); | 359 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
383 ASSERT_EQ(1U, model->size()); | 360 ASSERT_EQ(1U, model->size()); |
384 // An ephemeral app with the background permission should not trigger | 361 // An ephemeral app with the background permission should not trigger |
385 // background mode. | 362 // background mode. |
386 AddEphemeralApp(background.get(), service); | 363 AddEphemeralApp(background.get(), service()); |
387 ASSERT_FALSE(IsBackgroundApp(*background.get())); | 364 ASSERT_FALSE(IsBackgroundApp(*background.get())); |
388 ASSERT_EQ(3U, service->extensions()->size()); | 365 ASSERT_EQ(3U, registry()->enabled_extensions().size()); |
389 ASSERT_EQ(1U, model->size()); | 366 ASSERT_EQ(1U, model->size()); |
390 | 367 |
391 // If the ephemeral app becomes promoted to an installed app, it can now | 368 // If the ephemeral app becomes promoted to an installed app, it can now |
392 // trigger background mode. | 369 // trigger background mode. |
393 service->PromoteEphemeralApp(ephemeral.get(), false /*from sync*/); | 370 service()->PromoteEphemeralApp(ephemeral.get(), false /*from sync*/); |
394 ASSERT_TRUE(IsBackgroundApp(*ephemeral.get())); | 371 ASSERT_TRUE(IsBackgroundApp(*ephemeral.get())); |
395 ASSERT_EQ(3U, service->extensions()->size()); | 372 ASSERT_EQ(3U, registry()->enabled_extensions().size()); |
396 ASSERT_EQ(2U, model->size()); | 373 ASSERT_EQ(2U, model->size()); |
397 } | 374 } |
398 | 375 |
399 // With minimal test logic, verifies behavior with dynamic permissions. | 376 // With minimal test logic, verifies behavior with dynamic permissions. |
400 TEST_F(BackgroundApplicationListModelTest, AddRemovePermissionsTest) { | 377 TEST_F(BackgroundApplicationListModelTest, AddRemovePermissionsTest) { |
401 InitializeAndLoadEmptyExtensionService(); | 378 InitializeAndLoadEmptyExtensionService(); |
402 ExtensionService* service = extensions::ExtensionSystem::Get(profile_.get())-> | 379 ASSERT_TRUE(service()->is_ready()); |
403 extension_service(); | 380 ASSERT_TRUE(registry()->enabled_extensions().is_empty()); |
404 ASSERT_TRUE(service); | |
405 ASSERT_TRUE(service->is_ready()); | |
406 ASSERT_TRUE(service->extensions()); | |
407 ASSERT_TRUE(service->extensions()->is_empty()); | |
408 scoped_ptr<BackgroundApplicationListModel> model( | 381 scoped_ptr<BackgroundApplicationListModel> model( |
409 new BackgroundApplicationListModel(profile_.get())); | 382 new BackgroundApplicationListModel(profile_.get())); |
410 ASSERT_EQ(0U, model->size()); | 383 ASSERT_EQ(0U, model->size()); |
411 | 384 |
412 scoped_refptr<Extension> ext = CreateExtension("extension", false); | 385 scoped_refptr<Extension> ext = CreateExtension("extension", false); |
413 ASSERT_FALSE( | 386 ASSERT_FALSE( |
414 ext->permissions_data()->HasAPIPermission(APIPermission::kBackground)); | 387 ext->permissions_data()->HasAPIPermission(APIPermission::kBackground)); |
415 scoped_refptr<Extension> bgapp = CreateExtension("application", true); | 388 scoped_refptr<Extension> bgapp = CreateExtension("application", true); |
416 ASSERT_TRUE( | 389 ASSERT_TRUE( |
417 bgapp->permissions_data()->HasAPIPermission(APIPermission::kBackground)); | 390 bgapp->permissions_data()->HasAPIPermission(APIPermission::kBackground)); |
418 ASSERT_TRUE(service->extensions() != NULL); | 391 ASSERT_EQ(0U, registry()->enabled_extensions().size()); |
419 ASSERT_EQ(0U, service->extensions()->size()); | |
420 ASSERT_EQ(0U, model->size()); | 392 ASSERT_EQ(0U, model->size()); |
421 | 393 |
422 // Add one (non-background) extension and one background application | 394 // Add one (non-background) extension and one background application |
423 ASSERT_FALSE(IsBackgroundApp(*ext.get())); | 395 ASSERT_FALSE(IsBackgroundApp(*ext.get())); |
424 service->AddExtension(ext.get()); | 396 service()->AddExtension(ext.get()); |
425 ASSERT_EQ(1U, service->extensions()->size()); | 397 ASSERT_EQ(1U, registry()->enabled_extensions().size()); |
426 ASSERT_EQ(0U, model->size()); | 398 ASSERT_EQ(0U, model->size()); |
427 ASSERT_TRUE(IsBackgroundApp(*bgapp.get())); | 399 ASSERT_TRUE(IsBackgroundApp(*bgapp.get())); |
428 service->AddExtension(bgapp.get()); | 400 service()->AddExtension(bgapp.get()); |
429 ASSERT_EQ(2U, service->extensions()->size()); | 401 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
430 ASSERT_EQ(1U, model->size()); | 402 ASSERT_EQ(1U, model->size()); |
431 | 403 |
432 // Change permissions back and forth | 404 // Change permissions back and forth |
433 AddBackgroundPermission(service, ext.get()); | 405 AddBackgroundPermission(service(), ext.get()); |
434 ASSERT_TRUE( | 406 ASSERT_TRUE( |
435 ext->permissions_data()->HasAPIPermission(APIPermission::kBackground)); | 407 ext->permissions_data()->HasAPIPermission(APIPermission::kBackground)); |
436 ASSERT_EQ(2U, service->extensions()->size()); | 408 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
437 ASSERT_EQ(2U, model->size()); | 409 ASSERT_EQ(2U, model->size()); |
438 RemoveBackgroundPermission(service, bgapp.get()); | 410 RemoveBackgroundPermission(service(), bgapp.get()); |
439 ASSERT_FALSE( | 411 ASSERT_FALSE( |
440 bgapp->permissions_data()->HasAPIPermission(APIPermission::kBackground)); | 412 bgapp->permissions_data()->HasAPIPermission(APIPermission::kBackground)); |
441 ASSERT_EQ(2U, service->extensions()->size()); | 413 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
442 ASSERT_EQ(1U, model->size()); | 414 ASSERT_EQ(1U, model->size()); |
443 RemoveBackgroundPermission(service, ext.get()); | 415 RemoveBackgroundPermission(service(), ext.get()); |
444 ASSERT_FALSE( | 416 ASSERT_FALSE( |
445 ext->permissions_data()->HasAPIPermission(APIPermission::kBackground)); | 417 ext->permissions_data()->HasAPIPermission(APIPermission::kBackground)); |
446 ASSERT_EQ(2U, service->extensions()->size()); | 418 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
447 ASSERT_EQ(0U, model->size()); | 419 ASSERT_EQ(0U, model->size()); |
448 AddBackgroundPermission(service, bgapp.get()); | 420 AddBackgroundPermission(service(), bgapp.get()); |
449 ASSERT_TRUE( | 421 ASSERT_TRUE( |
450 bgapp->permissions_data()->HasAPIPermission(APIPermission::kBackground)); | 422 bgapp->permissions_data()->HasAPIPermission(APIPermission::kBackground)); |
451 ASSERT_EQ(2U, service->extensions()->size()); | 423 ASSERT_EQ(2U, registry()->enabled_extensions().size()); |
452 ASSERT_EQ(1U, model->size()); | 424 ASSERT_EQ(1U, model->size()); |
453 } | 425 } |
454 | 426 |
455 typedef std::set<scoped_refptr<Extension> > ExtensionCollection; | 427 typedef std::set<scoped_refptr<Extension> > ExtensionCollection; |
456 | 428 |
457 namespace { | 429 namespace { |
458 void AddExtension(ExtensionService* service, | 430 void AddExtension(ExtensionService* service, |
459 ExtensionCollection* extensions, | 431 ExtensionCollection* extensions, |
460 BackgroundApplicationListModel* model, | 432 BackgroundApplicationListModel* model, |
461 size_t* expected, | 433 size_t* expected, |
462 size_t* count) { | 434 size_t* count) { |
| 435 ExtensionRegistry* registry = ExtensionRegistry::Get(service->profile()); |
463 bool create_background = false; | 436 bool create_background = false; |
464 if (rand() % 2) { | 437 if (rand() % 2) { |
465 create_background = true; | 438 create_background = true; |
466 ++*expected; | 439 ++*expected; |
467 } | 440 } |
468 scoped_refptr<Extension> extension = | 441 scoped_refptr<Extension> extension = |
469 CreateExtension(GenerateUniqueExtensionName(), create_background); | 442 CreateExtension(GenerateUniqueExtensionName(), create_background); |
470 ASSERT_EQ(BackgroundApplicationListModel::IsBackgroundApp(*extension.get(), | 443 ASSERT_EQ(BackgroundApplicationListModel::IsBackgroundApp(*extension.get(), |
471 service->profile()), | 444 service->profile()), |
472 create_background); | 445 create_background); |
473 extensions->insert(extension); | 446 extensions->insert(extension); |
474 ++*count; | 447 ++*count; |
475 ASSERT_EQ(*count, extensions->size()); | 448 ASSERT_EQ(*count, extensions->size()); |
476 service->AddExtension(extension.get()); | 449 service->AddExtension(extension.get()); |
477 ASSERT_EQ(*count, service->extensions()->size()); | 450 ASSERT_EQ(*count, registry->enabled_extensions().size()); |
478 ASSERT_EQ(*expected, model->size()); | 451 ASSERT_EQ(*expected, model->size()); |
479 } | 452 } |
480 | 453 |
481 void RemoveExtension(ExtensionService* service, | 454 void RemoveExtension(ExtensionService* service, |
482 ExtensionCollection* extensions, | 455 ExtensionCollection* extensions, |
483 BackgroundApplicationListModel* model, | 456 BackgroundApplicationListModel* model, |
484 size_t* expected, | 457 size_t* expected, |
485 size_t* count) { // Maybe remove an extension. | 458 size_t* count) { // Maybe remove an extension. |
| 459 ExtensionRegistry* registry = ExtensionRegistry::Get(service->profile()); |
486 ExtensionCollection::iterator cursor = extensions->begin(); | 460 ExtensionCollection::iterator cursor = extensions->begin(); |
487 if (cursor == extensions->end()) { | 461 if (cursor == extensions->end()) { |
488 // Nothing to remove. Just verify accounting. | 462 // Nothing to remove. Just verify accounting. |
489 ASSERT_EQ(0U, *count); | 463 ASSERT_EQ(0U, *count); |
490 ASSERT_EQ(0U, *expected); | 464 ASSERT_EQ(0U, *expected); |
491 ASSERT_EQ(0U, service->extensions()->size()); | 465 ASSERT_EQ(0U, registry->enabled_extensions().size()); |
492 ASSERT_EQ(0U, model->size()); | 466 ASSERT_EQ(0U, model->size()); |
493 } else { | 467 } else { |
494 // Randomly select which extension to remove | 468 // Randomly select which extension to remove |
495 if (extensions->size() > 1) { | 469 if (extensions->size() > 1) { |
496 int offset = rand() % (extensions->size() - 1); | 470 int offset = rand() % (extensions->size() - 1); |
497 for (int index = 0; index < offset; ++index) | 471 for (int index = 0; index < offset; ++index) |
498 ++cursor; | 472 ++cursor; |
499 } | 473 } |
500 scoped_refptr<Extension> extension = cursor->get(); | 474 scoped_refptr<Extension> extension = cursor->get(); |
501 std::string id = extension->id(); | 475 std::string id = extension->id(); |
502 if (BackgroundApplicationListModel::IsBackgroundApp(*extension.get(), | 476 if (BackgroundApplicationListModel::IsBackgroundApp(*extension.get(), |
503 service->profile())) { | 477 service->profile())) { |
504 --*expected; | 478 --*expected; |
505 } | 479 } |
506 extensions->erase(cursor); | 480 extensions->erase(cursor); |
507 --*count; | 481 --*count; |
508 ASSERT_EQ(*count, extensions->size()); | 482 ASSERT_EQ(*count, extensions->size()); |
509 service->UninstallExtension(extension->id(), | 483 service->UninstallExtension(extension->id(), |
510 extensions::UNINSTALL_REASON_FOR_TESTING, | 484 extensions::UNINSTALL_REASON_FOR_TESTING, |
511 base::Bind(&base::DoNothing), | 485 base::Bind(&base::DoNothing), NULL); |
512 NULL); | 486 ASSERT_EQ(*count, registry->enabled_extensions().size()); |
513 ASSERT_EQ(*count, service->extensions()->size()); | |
514 ASSERT_EQ(*expected, model->size()); | 487 ASSERT_EQ(*expected, model->size()); |
515 } | 488 } |
516 } | 489 } |
517 | 490 |
518 void TogglePermission(ExtensionService* service, | 491 void TogglePermission(ExtensionService* service, |
519 ExtensionCollection* extensions, | 492 ExtensionCollection* extensions, |
520 BackgroundApplicationListModel* model, | 493 BackgroundApplicationListModel* model, |
521 size_t* expected, | 494 size_t* expected, |
522 size_t* count) { | 495 size_t* count) { |
| 496 ExtensionRegistry* registry = ExtensionRegistry::Get(service->profile()); |
523 ExtensionCollection::iterator cursor = extensions->begin(); | 497 ExtensionCollection::iterator cursor = extensions->begin(); |
524 if (cursor == extensions->end()) { | 498 if (cursor == extensions->end()) { |
525 // Nothing to toggle. Just verify accounting. | 499 // Nothing to toggle. Just verify accounting. |
526 ASSERT_EQ(0U, *count); | 500 ASSERT_EQ(0U, *count); |
527 ASSERT_EQ(0U, *expected); | 501 ASSERT_EQ(0U, *expected); |
528 ASSERT_EQ(0U, service->extensions()->size()); | 502 ASSERT_EQ(0U, registry->enabled_extensions().size()); |
529 ASSERT_EQ(0U, model->size()); | 503 ASSERT_EQ(0U, model->size()); |
530 } else { | 504 } else { |
531 // Randomly select which extension to toggle. | 505 // Randomly select which extension to toggle. |
532 if (extensions->size() > 1) { | 506 if (extensions->size() > 1) { |
533 int offset = rand() % (extensions->size() - 1); | 507 int offset = rand() % (extensions->size() - 1); |
534 for (int index = 0; index < offset; ++index) | 508 for (int index = 0; index < offset; ++index) |
535 ++cursor; | 509 ++cursor; |
536 } | 510 } |
537 scoped_refptr<Extension> extension = cursor->get(); | 511 scoped_refptr<Extension> extension = cursor->get(); |
538 std::string id = extension->id(); | 512 std::string id = extension->id(); |
539 if (BackgroundApplicationListModel::IsBackgroundApp(*extension.get(), | 513 if (BackgroundApplicationListModel::IsBackgroundApp(*extension.get(), |
540 service->profile())) { | 514 service->profile())) { |
541 --*expected; | 515 --*expected; |
542 ASSERT_EQ(*count, extensions->size()); | 516 ASSERT_EQ(*count, extensions->size()); |
543 RemoveBackgroundPermission(service, extension.get()); | 517 RemoveBackgroundPermission(service, extension.get()); |
544 ASSERT_EQ(*count, service->extensions()->size()); | 518 ASSERT_EQ(*count, registry->enabled_extensions().size()); |
545 ASSERT_EQ(*expected, model->size()); | 519 ASSERT_EQ(*expected, model->size()); |
546 } else { | 520 } else { |
547 ++*expected; | 521 ++*expected; |
548 ASSERT_EQ(*count, extensions->size()); | 522 ASSERT_EQ(*count, extensions->size()); |
549 AddBackgroundPermission(service, extension.get()); | 523 AddBackgroundPermission(service, extension.get()); |
550 ASSERT_EQ(*count, service->extensions()->size()); | 524 ASSERT_EQ(*count, registry->enabled_extensions().size()); |
551 ASSERT_EQ(*expected, model->size()); | 525 ASSERT_EQ(*expected, model->size()); |
552 } | 526 } |
553 } | 527 } |
554 } | 528 } |
555 } // namespace | 529 } // namespace |
556 | 530 |
557 // Verifies behavior with a pseudo-randomly generated set of actions: Adding and | 531 // Verifies behavior with a pseudo-randomly generated set of actions: Adding and |
558 // removing extensions, of which some are Background Apps and others are not. | 532 // removing extensions, of which some are Background Apps and others are not. |
559 TEST_F(BackgroundApplicationListModelTest, RandomTest) { | 533 TEST_F(BackgroundApplicationListModelTest, RandomTest) { |
560 InitializeAndLoadEmptyExtensionService(); | 534 InitializeAndLoadEmptyExtensionService(); |
561 ExtensionService* service = extensions::ExtensionSystem::Get(profile_.get())-> | 535 ASSERT_TRUE(service()->is_ready()); |
562 extension_service(); | 536 ASSERT_TRUE(registry()->enabled_extensions().is_empty()); |
563 ASSERT_TRUE(service); | |
564 ASSERT_TRUE(service->is_ready()); | |
565 ASSERT_TRUE(service->extensions()); | |
566 ASSERT_TRUE(service->extensions()->is_empty()); | |
567 scoped_ptr<BackgroundApplicationListModel> model( | 537 scoped_ptr<BackgroundApplicationListModel> model( |
568 new BackgroundApplicationListModel(profile_.get())); | 538 new BackgroundApplicationListModel(profile_.get())); |
569 ASSERT_EQ(0U, model->size()); | 539 ASSERT_EQ(0U, model->size()); |
570 | 540 |
571 static const int kIterations = 20; | 541 static const int kIterations = 20; |
572 ExtensionCollection extensions; | 542 ExtensionCollection extensions; |
573 size_t count = 0; | 543 size_t count = 0; |
574 size_t expected = 0; | 544 size_t expected = 0; |
575 srand(RANDOM_SEED); | 545 srand(RANDOM_SEED); |
576 for (int index = 0; index < kIterations; ++index) { | 546 for (int index = 0; index < kIterations; ++index) { |
577 switch (rand() % 3) { | 547 switch (rand() % 3) { |
578 case 0: | 548 case 0: |
579 AddExtension(service, &extensions, model.get(), &expected, &count); | 549 AddExtension(service(), &extensions, model.get(), &expected, &count); |
580 break; | 550 break; |
581 case 1: | 551 case 1: |
582 RemoveExtension(service, &extensions, model.get(), &expected, &count); | 552 RemoveExtension(service(), &extensions, model.get(), &expected, &count); |
583 break; | 553 break; |
584 case 2: | 554 case 2: |
585 TogglePermission(service, &extensions, model.get(), &expected, &count); | 555 TogglePermission(service(), &extensions, model.get(), &expected, |
| 556 &count); |
586 break; | 557 break; |
587 default: | 558 default: |
588 NOTREACHED(); | 559 NOTREACHED(); |
589 break; | 560 break; |
590 } | 561 } |
591 } | 562 } |
592 } | 563 } |
OLD | NEW |