| Index: chrome/browser/extensions/extension_service_unittest.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_service_unittest.cc (revision 136836)
|
| +++ 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_extension_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"
|
| @@ -614,6 +615,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);
|
| @@ -640,7 +643,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) {
|
| @@ -2030,7 +2034,6 @@
|
| EXPECT_TRUE(profile_->GetExtensionSpecialStoragePolicy()->
|
| IsStorageUnlimited(origin1));
|
|
|
| -
|
| // Uninstall the other, unlimited storage should be revoked.
|
| UninstallExtension(id2, false);
|
| EXPECT_EQ(0u, service_->extensions()->size());
|
| @@ -2868,6 +2871,197 @@
|
| EXPECT_TRUE(service_->GetExtensionById(good_crx, false));
|
| }
|
|
|
| +// Tests that extensions cannot be installed if the policy delegate prohibits
|
| +// it. This functionality is implemented in CrxInstaller::ConfirmInstall().
|
| +TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsInstall) {
|
| + InitializeEmptyExtensionService();
|
| +
|
| + service_->extension_management_policy()->UnregisterAllDelegates();
|
| + TestExtensionManagementPolicyDelegate management_policy(
|
| + TestExtensionManagementPolicyDelegate::PROHIBIT_INSTALL);
|
| + service_->extension_management_policy()->RegisterDelegate(&management_policy);
|
| +
|
| + 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 delegate
|
| +// 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.
|
| + ExtensionInfo extension_info(&manifest, "", path, Extension::LOAD);
|
| +
|
| + // Ensure we can load it with no management policy in place.
|
| + service_->extension_management_policy()->UnregisterAllDelegates();
|
| + 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.
|
| + TestExtensionManagementPolicyDelegate management_policy(
|
| + TestExtensionManagementPolicyDelegate::PROHIBIT_INSTALL);
|
| + service_->extension_management_policy()->RegisterDelegate(&management_policy);
|
| +
|
| + extensions::InstalledLoader(service_).Load(extension_info, false);
|
| + EXPECT_EQ(0u, service_->extensions()->size());
|
| +}
|
| +
|
| +// Tests disabling an extension when prohibited by the
|
| +// ExtensionManagementPolicy.
|
| +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());
|
| +
|
| + service_->extension_management_policy()->UnregisterAllDelegates();
|
| + TestExtensionManagementPolicyDelegate management_policy(
|
| + TestExtensionManagementPolicyDelegate::PROHIBIT_MODIFY_STATUS);
|
| + service_->extension_management_policy()->RegisterDelegate(&management_policy);
|
| +
|
| + // 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
|
| +// ExtensionManagementPolicy.
|
| +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());
|
| +
|
| + service_->extension_management_policy()->UnregisterAllDelegates();
|
| + TestExtensionManagementPolicyDelegate management_policy(
|
| + TestExtensionManagementPolicyDelegate::PROHIBIT_MODIFY_STATUS);
|
| + service_->extension_management_policy()->RegisterDelegate(&management_policy);
|
| +
|
| + // 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());
|
| +
|
| + service_->extension_management_policy()->UnregisterAllDelegates();
|
| + TestExtensionManagementPolicyDelegate management_policy(
|
| + TestExtensionManagementPolicyDelegate::PROHIBIT_INSTALL);
|
| + service_->extension_management_policy()->RegisterDelegate(&management_policy);
|
| +
|
| + // 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.
|
| + service_->extension_management_policy()->UnregisterAllDelegates();
|
| + TestExtensionManagementPolicyDelegate management_policy(
|
| + TestExtensionManagementPolicyDelegate::MUST_REMAIN_ENABLED);
|
| + service_->extension_management_policy()->RegisterDelegate(&management_policy);
|
| +
|
| + // 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 ExtensionManagementPolicy delegate methods for an
|
| +// extension required by policy.
|
| +TEST_F(ExtensionServiceTest, ManagementPolicyDelegateRequiredExtension) {
|
| + 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_->UserMayInstall("", 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_FALSE(service_->UserMayModifyUsage(extension.get(), &error16));
|
| + EXPECT_NE(string16(), error16);
|
| + EXPECT_TRUE(service_->MustRemainEnabled(extension.get(), &error16));
|
| + EXPECT_NE(string16(), error16);
|
| +}
|
| +
|
| +// Tests the behavior of the ExtensionManagementPolicy delegate methods for an
|
| +// extension not required by policy.
|
| +TEST_F(ExtensionServiceTest, ManagementPolicyDelegateNotRequiredExtension) {
|
| + 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_->UserMayInstall("", location, "", &error16));
|
| + EXPECT_EQ(string16(), error16);
|
| + EXPECT_TRUE(service_->UserMayModifyStatus(extension.get(), &error16));
|
| + EXPECT_EQ(string16(), error16);
|
| + EXPECT_TRUE(service_->UserMayModifyUsage(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);
|
| @@ -3008,7 +3202,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) {
|
| @@ -3391,8 +3587,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();
|
| @@ -3411,15 +3609,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);
|
| @@ -3459,8 +3656,6 @@
|
| ValidatePrefKeyCount(1);
|
|
|
| EXPECT_EQ(5, provider->visit_count());
|
| - } else {
|
| - EXPECT_EQ(2, provider->visit_count());
|
| }
|
| }
|
|
|
|
|