| Index: chrome/browser/extensions/extension_service_unittest.cc
|
| diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
|
| index 55255f35ec69b7d509dd2f02927491b579f998cd..8b6d54620078e32e32ec95a253814bda7f538d11 100644
|
| --- a/chrome/browser/extensions/extension_service_unittest.cc
|
| +++ b/chrome/browser/extensions/extension_service_unittest.cc
|
| @@ -3034,6 +3034,67 @@ TEST_F(ExtensionServiceTest, ExternalUninstall) {
|
| ASSERT_EQ(0u, loaded_.size());
|
| }
|
|
|
| +// Test that running multiple update checks simultaneously does not
|
| +// keep the update from succeeding.
|
| +TEST_F(ExtensionServiceTest, MultipleExternalUpdateCheck) {
|
| + InitializeEmptyExtensionService();
|
| +
|
| + MockExtensionProvider* provider =
|
| + new MockExtensionProvider(service_.get(), Extension::EXTERNAL_PREF);
|
| + AddMockExternalProvider(provider);
|
| +
|
| + // Verify that starting with no providers loads no extensions.
|
| + service_->Init();
|
| + loop_.RunAllPending();
|
| + ASSERT_EQ(0u, loaded_.size());
|
| +
|
| + // Start two checks for updates.
|
| + provider->set_visit_count(0);
|
| + service_->CheckForExternalUpdates();
|
| + service_->CheckForExternalUpdates();
|
| + loop_.RunAllPending();
|
| +
|
| + // Two calls should cause two checks for external extensions.
|
| + EXPECT_EQ(2, provider->visit_count());
|
| + EXPECT_EQ(0u, GetErrors().size());
|
| + EXPECT_EQ(0u, loaded_.size());
|
| +
|
| + // Register a test extension externally using the mock registry provider.
|
| + FilePath source_path;
|
| + ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &source_path));
|
| + source_path = source_path.AppendASCII("extensions").AppendASCII("good.crx");
|
| + provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path);
|
| +
|
| + // Two checks for external updates should find the extension, and install it
|
| + // once.
|
| + provider->set_visit_count(0);
|
| + service_->CheckForExternalUpdates();
|
| + service_->CheckForExternalUpdates();
|
| + loop_.RunAllPending();
|
| + EXPECT_EQ(2, provider->visit_count());
|
| + ASSERT_EQ(0u, GetErrors().size());
|
| + ASSERT_EQ(1u, loaded_.size());
|
| + ASSERT_EQ(Extension::EXTERNAL_PREF, loaded_[0]->location());
|
| + ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString());
|
| + ValidatePrefKeyCount(1);
|
| + ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
|
| + ValidateIntegerPref(good_crx, "location", Extension::EXTERNAL_PREF);
|
| +
|
| + provider->RemoveExtension(good_crx);
|
| + provider->set_visit_count(0);
|
| + service_->CheckForExternalUpdates();
|
| + service_->CheckForExternalUpdates();
|
| + loop_.RunAllPending();
|
| +
|
| + // Two calls should cause two checks for external extensions.
|
| + // Because the external source no longer includes good_crx,
|
| + // good_crx will be uninstalled. So, expect that no extensions
|
| + // are loaded.
|
| + EXPECT_EQ(2, provider->visit_count());
|
| + EXPECT_EQ(0u, GetErrors().size());
|
| + EXPECT_EQ(0u, loaded_.size());
|
| +}
|
| +
|
| TEST_F(ExtensionServiceTest, ExternalPrefProvider) {
|
| InitializeEmptyExtensionService();
|
|
|
|
|