| 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 |