| 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 634ce5999535c57dcc75c09d786331fed877acea..4c475ffff76b1d3faa1b557087c5f62df5e1c117 100644
|
| --- a/chrome/browser/extensions/extension_service_unittest.cc
|
| +++ b/chrome/browser/extensions/extension_service_unittest.cc
|
| @@ -59,6 +59,8 @@
|
| #include "chrome/browser/extensions/unpacked_installer.h"
|
| #include "chrome/browser/extensions/updater/extension_updater.h"
|
| #include "chrome/browser/prefs/pref_service_syncable.h"
|
| +#include "chrome/browser/supervised_user/supervised_user_service.h"
|
| +#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
|
| #include "chrome/browser/sync/profile_sync_service.h"
|
| #include "chrome/browser/sync/profile_sync_service_factory.h"
|
| #include "chrome/common/chrome_constants.h"
|
| @@ -744,6 +746,7 @@ class ExtensionServiceTest : public extensions::ExtensionServiceTestBase,
|
| FAILED,
|
| UPDATED,
|
| INSTALLED,
|
| + DISABLED,
|
| ENABLED
|
| };
|
|
|
| @@ -774,6 +777,18 @@ class ExtensionServiceTest : public extensions::ExtensionServiceTestBase,
|
| *installer;
|
| }
|
|
|
| + void PackCRXAndUpdateExtension(const std::string& id,
|
| + const base::FilePath& dir_path,
|
| + const base::FilePath& pem_path,
|
| + UpdateState expected_state) {
|
| + base::ScopedTempDir temp_dir;
|
| + EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
|
| + base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx");
|
| +
|
| + PackCRX(dir_path, pem_path, crx_path);
|
| + UpdateExtension(id, crx_path, expected_state);
|
| + }
|
| +
|
| void UpdateExtension(const std::string& id,
|
| const base::FilePath& in_path,
|
| UpdateState expected_state) {
|
| @@ -6104,7 +6119,104 @@ TEST_F(ExtensionServiceTest, ProcessSyncDataNotInstalled) {
|
| // TODO(akalin): Figure out a way to test |info.ShouldAllowInstall()|.
|
| }
|
|
|
| -TEST_F(ExtensionServiceTest, SyncUninstallForSupervisedUser) {
|
| +TEST_F(ExtensionServiceTest, SupervisedUser_InstallOnlyAllowedByCustodian) {
|
| + ExtensionServiceInitParams params = CreateDefaultInitParams();
|
| + params.profile_is_supervised = true;
|
| + InitializeExtensionService(params);
|
| +
|
| + SupervisedUserService* supervised_user_service =
|
| + SupervisedUserServiceFactory::GetForProfile(profile());
|
| + GetManagementPolicy()->RegisterProvider(supervised_user_service);
|
| +
|
| + base::FilePath path1 = data_dir().AppendASCII("good.crx");
|
| + base::FilePath path2 = data_dir().AppendASCII("good2048.crx");
|
| + const Extension* extensions[] = {
|
| + InstallCRX(path1, INSTALL_FAILED),
|
| + InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN)
|
| + };
|
| +
|
| + // Only the extension with the "installed by custodian" flag should have been
|
| + // installed and enabled.
|
| + EXPECT_FALSE(extensions[0]);
|
| + ASSERT_TRUE(extensions[1]);
|
| + EXPECT_TRUE(registry()->enabled_extensions().Contains(extensions[1]->id()));
|
| +}
|
| +
|
| +TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithoutPermissionIncrease) {
|
| + ExtensionServiceInitParams params = CreateDefaultInitParams();
|
| + params.profile_is_supervised = true;
|
| + InitializeExtensionService(params);
|
| +
|
| + SupervisedUserService* supervised_user_service =
|
| + SupervisedUserServiceFactory::GetForProfile(profile());
|
| + GetManagementPolicy()->RegisterProvider(supervised_user_service);
|
| +
|
| + base::FilePath base_path = data_dir().AppendASCII("autoupdate");
|
| + base::FilePath pem_path = base_path.AppendASCII("key.pem");
|
| +
|
| + base::FilePath path = base_path.AppendASCII("v1");
|
| + const Extension* extension =
|
| + PackAndInstallCRX(path, pem_path, INSTALL_NEW,
|
| + Extension::WAS_INSTALLED_BY_CUSTODIAN);
|
| + // The extension must now be installed and enabled.
|
| + ASSERT_TRUE(extension);
|
| + ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id()));
|
| +
|
| + // Save the id, as the extension object will be destroyed during updating.
|
| + std::string id = extension->id();
|
| +
|
| + std::string old_version = extension->VersionString();
|
| +
|
| + // Update to a new version.
|
| + path = base_path.AppendASCII("v2");
|
| + PackCRXAndUpdateExtension(id, path, pem_path, ENABLED);
|
| +
|
| + // The extension should still be there and enabled.
|
| + extension = registry()->enabled_extensions().GetByID(id);
|
| + ASSERT_TRUE(extension);
|
| + // The version should have changed.
|
| + EXPECT_NE(extension->VersionString(), old_version);
|
| +}
|
| +
|
| +TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithPermissionIncrease) {
|
| + ExtensionServiceInitParams params = CreateDefaultInitParams();
|
| + params.profile_is_supervised = true;
|
| + InitializeExtensionService(params);
|
| +
|
| + SupervisedUserService* supervised_user_service =
|
| + SupervisedUserServiceFactory::GetForProfile(profile());
|
| + GetManagementPolicy()->RegisterProvider(supervised_user_service);
|
| +
|
| + base::FilePath base_path = data_dir().AppendASCII("permissions_increase");
|
| + base::FilePath pem_path = base_path.AppendASCII("permissions.pem");
|
| +
|
| + base::FilePath path = base_path.AppendASCII("v1");
|
| + const Extension* extension =
|
| + PackAndInstallCRX(path, pem_path, INSTALL_NEW,
|
| + Extension::WAS_INSTALLED_BY_CUSTODIAN);
|
| + // The extension must now be installed and enabled.
|
| + ASSERT_TRUE(extension);
|
| + ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id()));
|
| +
|
| + // Save the id, as the extension object will be destroyed during updating.
|
| + std::string id = extension->id();
|
| +
|
| + std::string old_version = extension->VersionString();
|
| +
|
| + // Update to a new version with increased permissions.
|
| + path = base_path.AppendASCII("v2");
|
| + PackCRXAndUpdateExtension(id, path, pem_path, DISABLED);
|
| +
|
| + // The extension should still be there, but disabled.
|
| + EXPECT_FALSE(registry()->enabled_extensions().Contains(id));
|
| + extension = registry()->disabled_extensions().GetByID(id);
|
| + ASSERT_TRUE(extension);
|
| + // The version should have changed.
|
| + EXPECT_NE(extension->VersionString(), old_version);
|
| +}
|
| +
|
| +TEST_F(ExtensionServiceTest,
|
| + SupervisedUser_SyncUninstallByCustodianSkipsPolicy) {
|
| InitializeEmptyExtensionService();
|
| InitializeExtensionSyncService();
|
| extension_sync_service()->MergeDataAndStartSyncing(
|
| @@ -6117,7 +6229,7 @@ TEST_F(ExtensionServiceTest, SyncUninstallForSupervisedUser) {
|
| // Install two extensions.
|
| base::FilePath path1 = data_dir().AppendASCII("good.crx");
|
| base::FilePath path2 = data_dir().AppendASCII("good2048.crx");
|
| - const Extension* extensions[2] = {
|
| + const Extension* extensions[] = {
|
| InstallCRX(path1, INSTALL_NEW),
|
| InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN)
|
| };
|
| @@ -6129,7 +6241,7 @@ TEST_F(ExtensionServiceTest, SyncUninstallForSupervisedUser) {
|
|
|
| // Create a sync deletion for each extension.
|
| syncer::SyncChangeList change_list;
|
| - for (int i = 0; i < 2; i++) {
|
| + for (size_t i = 0; i < arraysize(extensions); i++) {
|
| const std::string& id = extensions[i]->id();
|
| sync_pb::EntitySpecifics specifics;
|
| sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
|
| @@ -6145,7 +6257,7 @@ TEST_F(ExtensionServiceTest, SyncUninstallForSupervisedUser) {
|
| }
|
|
|
| // Save the extension ids, as uninstalling destroys the Extension instance.
|
| - std::string extension_ids[2] = {
|
| + std::string extension_ids[] = {
|
| extensions[0]->id(),
|
| extensions[1]->id()
|
| };
|
| @@ -6154,11 +6266,12 @@ TEST_F(ExtensionServiceTest, SyncUninstallForSupervisedUser) {
|
| extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list);
|
|
|
| // Uninstalling the extension without installed_by_custodian should have been
|
| - // blocked by policy.
|
| - EXPECT_TRUE(service()->GetExtensionById(extension_ids[0], true));
|
| + // blocked by policy, so it should still be there.
|
| + EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_ids[0]));
|
|
|
| // But installed_by_custodian should result in bypassing the policy check.
|
| - EXPECT_FALSE(service()->GetExtensionById(extension_ids[1], true));
|
| + EXPECT_FALSE(
|
| + registry()->GenerateInstalledExtensionsSet()->Contains(extension_ids[1]));
|
| }
|
|
|
| TEST_F(ExtensionServiceTest, InstallPriorityExternalUpdateUrl) {
|
|
|