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

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

Issue 10382149: Refactor the various ways to control what users can do to extensions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 7 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
Index: chrome/browser/extensions/extension_service_unittest.cc
===================================================================
--- chrome/browser/extensions/extension_service_unittest.cc (revision 138227)
+++ chrome/browser/extensions/extension_service_unittest.cc (working copy)
@@ -46,6 +46,7 @@
#include "chrome/browser/extensions/pending_extension_info.h"
#include "chrome/browser/extensions/pending_extension_manager.h"
#include "chrome/browser/extensions/test_extension_system.h"
+#include "chrome/browser/extensions/test_management_policy.h"
#include "chrome/browser/extensions/unpacked_installer.h"
#include "chrome/browser/extensions/updater/extension_updater.h"
#include "chrome/browser/plugin_prefs_factory.h"
@@ -372,6 +373,7 @@
ExtensionServiceTestBase::ExtensionServiceTestBase()
: loop_(MessageLoop::TYPE_IO),
service_(NULL),
+ management_policy_(NULL),
expected_extensions_count_(0),
ui_thread_(BrowserThread::UI, &loop_),
db_thread_(BrowserThread::DB, &loop_),
@@ -421,6 +423,9 @@
service_->set_extensions_enabled(true);
service_->set_show_extensions_prompts(false);
+ management_policy_ = static_cast<TestExtensionSystem*>(
+ ExtensionSystem::Get(profile))->CreateManagementPolicy();
+
// When we start up, we want to make sure there is no external provider,
// since the ExtensionService on Windows will use the Registry as a default
// provider and if there is something already registered there then it will
@@ -616,6 +621,8 @@
return PackAndInstallCRX(dir_path, FilePath(), install_state);
}
+ // Attempts to install an extension. Use INSTALL_FAILED if the installation
+ // is expected to fail.
const Extension* InstallCRX(const FilePath& path,
InstallState install_state) {
StartCRXInstall(path);
@@ -642,7 +649,8 @@
return WaitForCrxInstall(crx_path, install_state);
}
- // Wait for a CrxInstaller to finish. Used by InstallCRX.
+ // Wait for a CrxInstaller to finish. Used by InstallCRX. Set the
+ // |install_state| to INSTALL_FAILED if the installation is expected to fail.
// Returns an Extension pointer if the install succeeded, NULL otherwise.
const Extension* WaitForCrxInstall(const FilePath& path,
InstallState install_state) {
@@ -2032,7 +2040,6 @@
EXPECT_TRUE(profile_->GetExtensionSpecialStoragePolicy()->
IsStorageUnlimited(origin1));
-
// Uninstall the other, unlimited storage should be revoked.
UninstallExtension(id2, false);
EXPECT_EQ(0u, service_->extensions()->size());
@@ -2870,6 +2877,192 @@
EXPECT_TRUE(service_->GetExtensionById(good_crx, false));
}
+// Tests that extensions cannot be installed if the policy provider prohibits
+// it. This functionality is implemented in CrxInstaller::ConfirmInstall().
+TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsInstall) {
+ InitializeEmptyExtensionService();
+
+ management_policy_->UnregisterAllProviders();
+ extensions::TestManagementPolicyProvider provider_(
+ extensions::TestManagementPolicyProvider::PROHIBIT_LOAD);
+ management_policy_->RegisterProvider(&provider_);
+
+ InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_FAILED);
+ EXPECT_EQ(0u, service_->extensions()->size());
+}
+
+// Tests that extensions cannot be loaded from prefs if the policy provider
+// prohibits it. This functionality is implemented in InstalledLoader::Load().
+TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsLoadFromPrefs) {
+ InitializeEmptyExtensionService();
+
+ // Create a fake extension to be loaded as though it were read from prefs.
+ FilePath path = data_dir_.AppendASCII("management")
+ .AppendASCII("simple_extension");
+ DictionaryValue manifest;
+ manifest.SetString(keys::kName, "simple_extension");
+ manifest.SetString(keys::kVersion, "1");
+ // LOAD is for extensions loaded from the command line. We use it here, even
+ // though we're testing loading from prefs, so that we don't need to provide
+ // an extension key.
+ extensions::ExtensionInfo extension_info(&manifest, "", path,
+ Extension::LOAD);
+
+ // Ensure we can load it with no management policy in place.
+ management_policy_->UnregisterAllProviders();
+ EXPECT_EQ(0u, service_->extensions()->size());
+ extensions::InstalledLoader(service_).Load(extension_info, false);
+ EXPECT_EQ(1u, service_->extensions()->size());
+
+ const Extension* extension = *(service_->extensions()->begin());
+ EXPECT_TRUE(service_->UninstallExtension(extension->id(), false, NULL));
+ EXPECT_EQ(0u, service_->extensions()->size());
+
+ // Ensure we cannot load it if management policy prohibits installation.
+ extensions::TestManagementPolicyProvider provider_(
+ extensions::TestManagementPolicyProvider::PROHIBIT_LOAD);
+ management_policy_->RegisterProvider(&provider_);
+
+ extensions::InstalledLoader(service_).Load(extension_info, false);
+ EXPECT_EQ(0u, service_->extensions()->size());
+}
+
+// Tests disabling an extension when prohibited by the ManagementPolicy.
+TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsDisable) {
+ InitializeEmptyExtensionService();
+
+ InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW);
+ EXPECT_EQ(1u, service_->extensions()->size());
+ EXPECT_EQ(0u, service_->disabled_extensions()->size());
+
+ management_policy_->UnregisterAllProviders();
+ extensions::TestManagementPolicyProvider provider(
+ extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
+ management_policy_->RegisterProvider(&provider);
+
+ // Attempt to disable it.
+ service_->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
+
+ EXPECT_EQ(1u, service_->extensions()->size());
+ EXPECT_TRUE(service_->GetExtensionById(good_crx, false));
+ EXPECT_EQ(0u, service_->disabled_extensions()->size());
+}
+
+// Tests uninstalling an extension when prohibited by the ManagementPolicy.
+TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsUninstall) {
+ InitializeEmptyExtensionService();
+
+ InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW);
+ EXPECT_EQ(1u, service_->extensions()->size());
+ EXPECT_EQ(0u, service_->disabled_extensions()->size());
+
+ management_policy_->UnregisterAllProviders();
+ extensions::TestManagementPolicyProvider provider(
+ extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
+ management_policy_->RegisterProvider(&provider);
+
+ // Attempt to uninstall it.
+ EXPECT_FALSE(service_->UninstallExtension(good_crx, false, NULL));
+
+ EXPECT_EQ(1u, service_->extensions()->size());
+ EXPECT_TRUE(service_->GetExtensionById(good_crx, false));
+}
+
+// Tests that previously installed extensions that are now prohibited from
+// being installed are removed.
+TEST_F(ExtensionServiceTest, ManagementPolicyUnloadsAllProhibited) {
+ InitializeEmptyExtensionService();
+
+ InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW);
+ InstallCRX(data_dir_.AppendASCII("page_action.crx"), INSTALL_NEW);
+ EXPECT_EQ(2u, service_->extensions()->size());
+ EXPECT_EQ(0u, service_->disabled_extensions()->size());
+
+ management_policy_->UnregisterAllProviders();
+ extensions::TestManagementPolicyProvider provider(
+ extensions::TestManagementPolicyProvider::PROHIBIT_LOAD);
+ management_policy_->RegisterProvider(&provider);
+
+ // Run the policy check.
+ service_->CheckAdminBlacklist();
+ EXPECT_EQ(0u, service_->extensions()->size());
+ EXPECT_EQ(0u, service_->disabled_extensions()->size());
+}
+
+// Tests that previously disabled extensions that are now required to be
+// enabled are re-enabled on reinstall.
+TEST_F(ExtensionServiceTest, ManagementPolicyRequiresEnable) {
+ InitializeEmptyExtensionService();
+
+ // Install, then disable, an extension.
+ InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW);
+ EXPECT_EQ(1u, service_->extensions()->size());
+ service_->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
+ EXPECT_EQ(1u, service_->disabled_extensions()->size());
+
+ // Register an ExtensionMnagementPolicy that requires the extension to remain
+ // enabled.
+ management_policy_->UnregisterAllProviders();
+ extensions::TestManagementPolicyProvider provider(
+ extensions::TestManagementPolicyProvider::MUST_REMAIN_ENABLED);
+ management_policy_->RegisterProvider(&provider);
+
+ // Reinstall the extension.
+ InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_UPDATED);
+ EXPECT_EQ(1u, service_->extensions()->size());
+ EXPECT_EQ(0u, service_->disabled_extensions()->size());
+}
+
+// Tests the behavior of the ManagementPolicy provider methods for an
+// extension required by policy.
+TEST_F(ExtensionServiceTest, ManagementPolicyProviderRequiredExtension) {
+ InitializeEmptyExtensionService();
+ Extension::Location location = Extension::EXTERNAL_POLICY_DOWNLOAD;
+ ASSERT_TRUE(Extension::IsRequired(location));
+
+ DictionaryValue values;
+ values.SetString(keys::kName, "test");
+ values.SetString(keys::kVersion, "0.1");
+ std::string error;
+ scoped_refptr<Extension> extension(Extension::Create(
+ FilePath(), location, values, Extension::NO_FLAGS, &error));
+ ASSERT_TRUE(extension.get());
+
+ string16 error16;
+ EXPECT_TRUE(service_->UserMayLoad(NULL, location, &error16));
+ EXPECT_EQ(string16(), error16);
+
+ // We won't check the exact wording of the error, but it should say something.
+ EXPECT_FALSE(service_->UserMayModifyStatus(extension.get(), &error16));
+ EXPECT_NE(string16(), error16);
+ EXPECT_TRUE(service_->MustRemainEnabled(extension.get(), &error16));
+ EXPECT_NE(string16(), error16);
+}
+
+// Tests the behavior of the ManagementPolicy provider methods for an
+// extension not required by policy.
+TEST_F(ExtensionServiceTest, ManagementPolicyProviderNotRequiredExtension) {
+ InitializeEmptyExtensionService();
+ Extension::Location location = Extension::INTERNAL;
+ ASSERT_FALSE(Extension::IsRequired(location));
+
+ DictionaryValue values;
+ values.SetString(keys::kName, "test");
+ values.SetString(keys::kVersion, "0.1");
+ std::string error;
+ scoped_refptr<Extension> extension(Extension::Create(
+ FilePath(), location, values, Extension::NO_FLAGS, &error));
+ ASSERT_TRUE(extension.get());
+
+ string16 error16;
+ EXPECT_TRUE(service_->UserMayLoad(NULL, location, &error16));
+ EXPECT_EQ(string16(), error16);
+ EXPECT_TRUE(service_->UserMayModifyStatus(extension.get(), &error16));
+ EXPECT_EQ(string16(), error16);
+ EXPECT_FALSE(service_->MustRemainEnabled(extension.get(), &error16));
+ EXPECT_EQ(string16(), error16);
+}
+
TEST_F(ExtensionServiceTest, ExternalExtensionAutoAcknowledgement) {
InitializeEmptyExtensionService();
set_extensions_enabled(true);
@@ -3010,7 +3203,9 @@
TEST_F(ExtensionServiceTest, UninstallExtension) {
InitializeEmptyExtensionService();
InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW);
+ EXPECT_EQ(1u, service_->extensions()->size());
UninstallExtension(good_crx, false);
+ EXPECT_EQ(0u, service_->extensions()->size());
}
TEST_F(ExtensionServiceTest, UninstallTerminatedExtension) {
@@ -3393,8 +3588,10 @@
loop_.RunAllPending();
FilePath install_path = extensions_install_dir_.AppendASCII(id);
- // It should not be possible to uninstall a policy controlled extension.
- if (Extension::UserMayDisable(location)) {
+ if (Extension::IsRequired(location)) {
+ // Policy controlled extensions should not have been touched by uninstall.
+ ASSERT_TRUE(file_util::PathExists(install_path));
+ } else {
// The extension should also be gone from the install directory.
ASSERT_FALSE(file_util::PathExists(install_path));
loaded_.clear();
@@ -3413,15 +3610,14 @@
service_->CheckForExternalUpdates();
loop_.RunAllPending();
ASSERT_EQ(1u, loaded_.size());
- } else {
- // Policy controlled extesions should not have been touched by uninstall.
- ASSERT_TRUE(file_util::PathExists(install_path));
}
ValidatePrefKeyCount(1);
ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
ValidateIntegerPref(good_crx, "location", location);
- if (Extension::UserMayDisable(location)) {
+ if (Extension::IsRequired(location)) {
+ EXPECT_EQ(2, provider->visit_count());
+ } else {
// Now test an externally triggered uninstall (deleting the registry key or
// the pref entry).
provider->RemoveExtension(good_crx);
@@ -3461,8 +3657,6 @@
ValidatePrefKeyCount(1);
EXPECT_EQ(5, provider->visit_count());
- } else {
- EXPECT_EQ(2, provider->visit_count());
}
}

Powered by Google App Engine
This is Rietveld 408576698