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

Unified Diff: chrome/browser/extensions/shared_module_service_unittest.cc

Issue 386033002: Prune shared extendion module after extension updating. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix review issues Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/extensions/shared_module_service.cc ('k') | chrome/browser/extensions/webstore_installer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/shared_module_service_unittest.cc
diff --git a/chrome/browser/extensions/shared_module_service_unittest.cc b/chrome/browser/extensions/shared_module_service_unittest.cc
index 8dd520d9ac66578285ea1d4d1faff102266171e1..de21dcff5c110123470e82c3f13fd914d9d16d61 100644
--- a/chrome/browser/extensions/shared_module_service_unittest.cc
+++ b/chrome/browser/extensions/shared_module_service_unittest.cc
@@ -25,15 +25,18 @@ namespace {
// Return an extension with |id| which imports a module with the given
// |import_id|.
scoped_refptr<Extension> CreateExtensionImportingModule(
- const std::string& import_id, const std::string& id) {
- scoped_ptr<base::DictionaryValue> manifest =
- DictionaryBuilder()
- .Set("name", "Has Dependent Modules")
- .Set("version", "1.0")
- .Set("manifest_version", 2)
- .Set("import",
- ListBuilder().Append(DictionaryBuilder().Set("id", import_id)))
- .Build();
+ const std::string& import_id,
+ const std::string& id,
+ const std::string& version) {
+ DictionaryBuilder builder;
+ builder.Set("name", "Has Dependent Modules")
+ .Set("version", version)
+ .Set("manifest_version", 2);
+ if (!import_id.empty()) {
+ builder.Set("import",
+ ListBuilder().Append(DictionaryBuilder().Set("id", import_id)));
+ }
+ scoped_ptr<base::DictionaryValue> manifest = builder.Build();
return ExtensionBuilder().SetManifest(manifest.Pass())
.AddFlags(Extension::FROM_WEBSTORE)
@@ -53,27 +56,37 @@ class SharedModuleServiceUnitTest : public ExtensionServiceTestBase {
virtual void SetUp() OVERRIDE;
// Install an extension and notify the ExtensionService.
- testing::AssertionResult InstallExtension(const Extension* extension);
+ testing::AssertionResult InstallExtension(const Extension* extension,
+ bool is_update);
ScopedCurrentChannel current_channel_;
};
void SharedModuleServiceUnitTest::SetUp() {
ExtensionServiceTestBase::SetUp();
InitializeGoodInstalledExtensionService();
- service_->Init();
+ service()->Init();
}
testing::AssertionResult SharedModuleServiceUnitTest::InstallExtension(
- const Extension* extension) {
- // Verify the extension is not already installed.
- if (registry()->GetExtensionById(extension->id(),
- ExtensionRegistry::ENABLED)) {
- return testing::AssertionFailure() << "Extension already installed.";
+ const Extension* extension,
+ bool is_update) {
+
+ const Extension* old = registry()->GetExtensionById(
+ extension->id(),
+ ExtensionRegistry::ENABLED);
+
+ // Verify the extension is not already installed, if it is not update.
+ if (!is_update) {
+ if (old)
+ return testing::AssertionFailure() << "Extension already installed.";
+ } else {
+ if (!old)
+ return testing::AssertionFailure() << "The extension does not exist.";
}
// Notify the service that the extension is installed. This adds it to the
// registry, notifies interested parties, etc.
- service_->OnExtensionInstalled(
+ service()->OnExtensionInstalled(
extension, syncer::StringOrdinal(), kInstallFlagInstallImmediately);
// Verify that the extension is now installed.
@@ -90,17 +103,17 @@ TEST_F(SharedModuleServiceUnitTest, AddDependentSharedModules) {
std::string import_id = id_util::GenerateId("id");
std::string extension_id = id_util::GenerateId("extension_id");
scoped_refptr<Extension> extension =
- CreateExtensionImportingModule(import_id, extension_id);
+ CreateExtensionImportingModule(import_id, extension_id, "1.0");
PendingExtensionManager* pending_extension_manager =
- service_->pending_extension_manager();
+ service()->pending_extension_manager();
// Verify that we don't currently want to install the imported module.
EXPECT_FALSE(pending_extension_manager->IsIdPending(import_id));
// Try to satisfy imports for the extension. This should queue the imported
// module's installation.
- service_->shared_module_service()->SatisfyImports(extension);
+ service()->shared_module_service()->SatisfyImports(extension);
EXPECT_TRUE(pending_extension_manager->IsIdPending(import_id));
}
@@ -120,17 +133,17 @@ TEST_F(SharedModuleServiceUnitTest, PruneSharedModulesOnUninstall) {
.SetID(id_util::GenerateId("shared_module"))
.Build();
- EXPECT_TRUE(InstallExtension(shared_module));
+ EXPECT_TRUE(InstallExtension(shared_module, false));
std::string extension_id = id_util::GenerateId("extension_id");
// Create and install an extension that imports our new module.
scoped_refptr<Extension> importing_extension =
- CreateExtensionImportingModule(shared_module->id(), extension_id);
- EXPECT_TRUE(InstallExtension(importing_extension));
+ CreateExtensionImportingModule(shared_module->id(), extension_id, "1.0");
+ EXPECT_TRUE(InstallExtension(importing_extension, false));
// Uninstall the extension that imports our module.
base::string16 error;
- service_->UninstallExtension(importing_extension->id(),
+ service()->UninstallExtension(importing_extension->id(),
ExtensionService::UNINSTALL_REASON_FOR_TESTING,
&error);
EXPECT_TRUE(error.empty());
@@ -142,6 +155,77 @@ TEST_F(SharedModuleServiceUnitTest, PruneSharedModulesOnUninstall) {
ExtensionRegistry::EVERYTHING));
}
+TEST_F(SharedModuleServiceUnitTest, PruneSharedModulesOnUpdate) {
+ // Create two modules which export a resource, and install them.
+ scoped_ptr<base::DictionaryValue> manifest_1 =
+ DictionaryBuilder()
+ .Set("name", "Shared Module 1")
+ .Set("version", "1.0")
+ .Set("manifest_version", 2)
+ .Set("export",
+ DictionaryBuilder().Set("resources",
+ ListBuilder().Append("foo.js"))).Build();
+ scoped_refptr<Extension> shared_module_1 =
+ ExtensionBuilder().SetManifest(manifest_1.Pass())
+ .AddFlags(Extension::FROM_WEBSTORE)
+ .SetID(id_util::GenerateId("shared_module_1"))
+ .Build();
+ EXPECT_TRUE(InstallExtension(shared_module_1, false));
+
+ scoped_ptr<base::DictionaryValue> manifest_2 =
+ DictionaryBuilder()
+ .Set("name", "Shared Module 2")
+ .Set("version", "1.0")
+ .Set("manifest_version", 2)
+ .Set("export",
+ DictionaryBuilder().Set("resources",
+ ListBuilder().Append("foo.js"))).Build();
+ scoped_refptr<Extension> shared_module_2 =
+ ExtensionBuilder().SetManifest(manifest_2.Pass())
+ .AddFlags(Extension::FROM_WEBSTORE)
+ .SetID(id_util::GenerateId("shared_module_2"))
+ .Build();
+ EXPECT_TRUE(InstallExtension(shared_module_2, false));
+
+ std::string extension_id = id_util::GenerateId("extension_id");
+
+ // Create and install an extension v1.0 that imports our new module 1.
+ scoped_refptr<Extension> importing_extension_1 =
+ CreateExtensionImportingModule(shared_module_1->id(),
+ extension_id,
+ "1.0");
+ EXPECT_TRUE(InstallExtension(importing_extension_1, false));
+
+ // Create and install a new version of the extension that imports our new
+ // module 2.
+ scoped_refptr<Extension> importing_extension_2 =
+ CreateExtensionImportingModule(shared_module_2->id(),
+ extension_id,
+ "1.1");
+ EXPECT_TRUE(InstallExtension(importing_extension_2, true));
+
+ // Since the extension v1.1 depends the module 2 insteand module 1.
+ // So the module 1 should be uninstalled.
+ EXPECT_FALSE(registry()->GetExtensionById(shared_module_1->id(),
+ ExtensionRegistry::EVERYTHING));
+ EXPECT_TRUE(registry()->GetExtensionById(shared_module_2->id(),
+ ExtensionRegistry::EVERYTHING));
+
+ // Create and install a new version of the extension that does not import any
+ // module.
+ scoped_refptr<Extension> importing_extension_3 =
+ CreateExtensionImportingModule("", extension_id, "1.2");
+ EXPECT_TRUE(InstallExtension(importing_extension_3, true));
+
+ // Since the extension v1.2 does not depend any module, so the all models
+ // should have been uninstalled.
+ EXPECT_FALSE(registry()->GetExtensionById(shared_module_1->id(),
+ ExtensionRegistry::EVERYTHING));
+ EXPECT_FALSE(registry()->GetExtensionById(shared_module_2->id(),
+ ExtensionRegistry::EVERYTHING));
+
+}
+
TEST_F(SharedModuleServiceUnitTest, WhitelistedImports) {
std::string whitelisted_id = id_util::GenerateId("whitelisted");
std::string nonwhitelisted_id = id_util::GenerateId("nonwhitelisted");
@@ -163,17 +247,21 @@ TEST_F(SharedModuleServiceUnitTest, WhitelistedImports) {
.SetID(id_util::GenerateId("shared_module"))
.Build();
- EXPECT_TRUE(InstallExtension(shared_module));
+ EXPECT_TRUE(InstallExtension(shared_module, false));
// Create and install an extension with the whitelisted ID.
scoped_refptr<Extension> whitelisted_extension =
- CreateExtensionImportingModule(shared_module->id(), whitelisted_id);
- EXPECT_TRUE(InstallExtension(whitelisted_extension));
+ CreateExtensionImportingModule(shared_module->id(),
+ whitelisted_id,
+ "1.0");
+ EXPECT_TRUE(InstallExtension(whitelisted_extension, false));
// Try to install an extension with an ID that is not whitelisted.
scoped_refptr<Extension> nonwhitelisted_extension =
- CreateExtensionImportingModule(shared_module->id(), nonwhitelisted_id);
- EXPECT_FALSE(InstallExtension(nonwhitelisted_extension));
+ CreateExtensionImportingModule(shared_module->id(),
+ nonwhitelisted_id,
+ "1.0");
+ EXPECT_FALSE(InstallExtension(nonwhitelisted_extension, false));
}
} // namespace extensions
« no previous file with comments | « chrome/browser/extensions/shared_module_service.cc ('k') | chrome/browser/extensions/webstore_installer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698