Index: chrome/browser/extensions/extension_management_unittest.cc |
diff --git a/chrome/browser/extensions/extension_management_unittest.cc b/chrome/browser/extensions/extension_management_unittest.cc |
index 377d708da7776a553253a0c0e805d201c5801207..e040d5377d1abafde0c6ed6a911a24f45accbd68 100644 |
--- a/chrome/browser/extensions/extension_management_unittest.cc |
+++ b/chrome/browser/extensions/extension_management_unittest.cc |
@@ -3,30 +3,61 @@ |
// found in the LICENSE file. |
#include <algorithm> |
+#include <vector> |
+#include "base/json/json_parser.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/prefs/pref_registry_simple.h" |
#include "base/prefs/testing_pref_service.h" |
#include "base/values.h" |
#include "chrome/browser/extensions/extension_management.h" |
+#include "chrome/browser/extensions/extension_management_test_util.h" |
#include "chrome/browser/extensions/external_policy_loader.h" |
#include "extensions/browser/pref_names.h" |
+#include "extensions/common/manifest.h" |
#include "extensions/common/manifest_constants.h" |
#include "extensions/common/url_pattern.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "url/gurl.h" |
namespace extensions { |
namespace { |
+ |
const char kTargetExtension[] = "abcdefghijklmnopabcdefghijklmnop"; |
+const char kTargetExtension2[] = "bcdefghijklmnopabcdefghijklmnopa"; |
+const char kTargetExtension3[] = "cdefghijklmnopabcdefghijklmnopab"; |
const char kOtherExtension[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; |
const char kExampleUpdateUrl[] = "http://example.com/update_url"; |
+ |
+const char kExampleDictPreference[] = |
+ "{" |
+ " \"abcdefghijklmnopabcdefghijklmnop\": {" // kTargetExtension |
+ " \"installation_mode\": \"allowed\"," |
+ " }," |
+ " \"bcdefghijklmnopabcdefghijklmnopa\": {" // kTargetExtension2 |
+ " \"installation_mode\": \"force_installed\"," |
+ " \"update_url\": \"http://example.com/update_url\"," |
+ " }," |
+ " \"cdefghijklmnopabcdefghijklmnopab\": {" // kTargetExtension3 |
+ " \"installation_mode\": \"normal_installed\"," |
+ " \"update_url\": \"http://example.com/update_url\"," |
+ " }," |
+ " \"*\": {" |
+ " \"installation_mode\": \"blocked\"," |
+ " \"install_sources\": [\"*://foo.com/*\"]," |
+ " \"allowed_types\": [\"theme\", \"user_script\"]," |
+ " }," |
+ "}"; |
+ |
} // namespace |
-class ExtensionManagementTest : public testing::Test { |
+class ExtensionManagementServiceTest : public testing::Test { |
public: |
- ExtensionManagementTest() {} |
- virtual ~ExtensionManagementTest() {} |
+ typedef ExtensionManagementPrefUpdater<TestingPrefServiceSimple> PrefUpdater; |
+ |
+ ExtensionManagementServiceTest() {} |
+ virtual ~ExtensionManagementServiceTest() {} |
// testing::Test: |
virtual void SetUp() OVERRIDE { |
@@ -43,6 +74,8 @@ class ExtensionManagementTest : public testing::Test { |
pref_service_->registry()->RegisterListPref(pref_names::kInstallAllowList); |
pref_service_->registry()->RegisterDictionaryPref( |
pref_names::kInstallForceList); |
+ pref_service_->registry()->RegisterDictionaryPref( |
+ pref_names::kExtensionManagement); |
extension_management_.reset(new ExtensionManagement(pref_service_.get())); |
} |
@@ -60,12 +93,24 @@ class ExtensionManagementTest : public testing::Test { |
pref_service_->RemoveUserPref(path); |
} |
+ void SetExampleDictPref() { |
+ std::string error_msg; |
+ scoped_ptr<base::Value> parsed(base::JSONReader::ReadAndReturnError( |
+ kExampleDictPreference, |
+ base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS, |
+ NULL, |
+ &error_msg)); |
+ ASSERT_TRUE(parsed && parsed->IsType(base::Value::TYPE_DICTIONARY)) |
+ << error_msg; |
+ SetPref(true, pref_names::kExtensionManagement, parsed.release()); |
+ } |
+ |
protected: |
scoped_ptr<TestingPrefServiceSimple> pref_service_; |
scoped_ptr<ExtensionManagement> extension_management_; |
}; |
-class ExtensionAdminPolicyTest : public ExtensionManagementTest { |
+class ExtensionAdminPolicyTest : public ExtensionManagementServiceTest { |
public: |
ExtensionAdminPolicyTest() {} |
virtual ~ExtensionAdminPolicyTest() {} |
@@ -151,7 +196,7 @@ bool ExtensionAdminPolicyTest::MustRemainEnabled(const Extension* extension, |
// Verify that preference controlled by legacy ExtensionInstallSources policy is |
// handled well. |
-TEST_F(ExtensionManagementTest, LegacyInstallSources) { |
+TEST_F(ExtensionManagementServiceTest, LegacyInstallSources) { |
base::ListValue allowed_sites_pref; |
allowed_sites_pref.AppendString("https://www.example.com/foo"); |
allowed_sites_pref.AppendString("https://corp.mycompany.com/*"); |
@@ -172,7 +217,7 @@ TEST_F(ExtensionManagementTest, LegacyInstallSources) { |
// Verify that preference controlled by legacy ExtensionAllowedTypes policy is |
// handled well. |
-TEST_F(ExtensionManagementTest, LegacyAllowedTypes) { |
+TEST_F(ExtensionManagementServiceTest, LegacyAllowedTypes) { |
base::ListValue allowed_types_pref; |
allowed_types_pref.AppendInteger(Manifest::TYPE_THEME); |
allowed_types_pref.AppendInteger(Manifest::TYPE_USER_SCRIPT); |
@@ -196,7 +241,7 @@ TEST_F(ExtensionManagementTest, LegacyAllowedTypes) { |
// Verify that preference controlled by legacy ExtensionInstallBlacklist policy |
// is handled well. |
-TEST_F(ExtensionManagementTest, LegacyInstallBlacklist) { |
+TEST_F(ExtensionManagementServiceTest, LegacyInstallBlacklist) { |
base::ListValue denied_list_pref; |
denied_list_pref.AppendString(kTargetExtension); |
@@ -209,7 +254,7 @@ TEST_F(ExtensionManagementTest, LegacyInstallBlacklist) { |
// Verify that preference controlled by legacy ExtensionInstallWhitelist policy |
// is handled well. |
-TEST_F(ExtensionManagementTest, LegacyInstallWhitelist) { |
+TEST_F(ExtensionManagementServiceTest, LegacyInstallWhitelist) { |
base::ListValue denied_list_pref; |
denied_list_pref.AppendString("*"); |
base::ListValue allowed_list_pref; |
@@ -231,7 +276,7 @@ TEST_F(ExtensionManagementTest, LegacyInstallWhitelist) { |
// Verify that preference controlled by legacy ExtensionInstallForcelist policy |
// is handled well. |
-TEST_F(ExtensionManagementTest, LegacyInstallForcelist) { |
+TEST_F(ExtensionManagementServiceTest, LegacyInstallForcelist) { |
base::DictionaryValue forced_list_pref; |
ExternalPolicyLoader::AddExtension( |
&forced_list_pref, kTargetExtension, kExampleUpdateUrl); |
@@ -251,6 +296,219 @@ TEST_F(ExtensionManagementTest, LegacyInstallForcelist) { |
ExtensionManagement::INSTALLATION_ALLOWED); |
} |
+// Tests parsing of new dictionary preference. |
+TEST_F(ExtensionManagementServiceTest, PreferenceParsing) { |
+ SetExampleDictPref(); |
+ |
+ // Verifies the installation mode settings. |
+ EXPECT_TRUE(extension_management_->BlacklistedByDefault()); |
+ EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_ALLOWED); |
+ EXPECT_EQ( |
+ extension_management_->ReadById(kTargetExtension2).installation_mode, |
+ ExtensionManagement::INSTALLATION_FORCED); |
+ EXPECT_EQ(extension_management_->ReadById(kTargetExtension2).update_url, |
+ kExampleUpdateUrl); |
+ EXPECT_EQ( |
+ extension_management_->ReadById(kTargetExtension3).installation_mode, |
+ ExtensionManagement::INSTALLATION_RECOMMENDED); |
+ EXPECT_EQ(extension_management_->ReadById(kTargetExtension3).update_url, |
+ kExampleUpdateUrl); |
+ EXPECT_EQ(extension_management_->ReadById(kOtherExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_BLOCKED); |
+ |
+ // Verifies global settings. |
+ EXPECT_TRUE(extension_management_->ReadGlobalSettings() |
+ .has_restricted_install_sources); |
+ const URLPatternSet& allowed_sites = |
+ extension_management_->ReadGlobalSettings().install_sources; |
+ EXPECT_EQ(allowed_sites.size(), 1u); |
+ EXPECT_TRUE(allowed_sites.MatchesURL(GURL("http://foo.com/entry"))); |
+ EXPECT_FALSE(allowed_sites.MatchesURL(GURL("http://bar.com/entry"))); |
+ |
+ EXPECT_TRUE( |
+ extension_management_->ReadGlobalSettings().has_restricted_allowed_types); |
+ const std::vector<Manifest::Type>& allowed_types = |
+ extension_management_->ReadGlobalSettings().allowed_types; |
+ EXPECT_EQ(allowed_types.size(), 2u); |
+ EXPECT_TRUE(std::find(allowed_types.begin(), |
+ allowed_types.end(), |
+ Manifest::TYPE_THEME) != allowed_types.end()); |
+ EXPECT_TRUE(std::find(allowed_types.begin(), |
+ allowed_types.end(), |
+ Manifest::TYPE_USER_SCRIPT) != allowed_types.end()); |
+} |
+ |
+// Tests functionality of new preference as to deprecate legacy |
+// ExtensionInstallSources policy. |
+TEST_F(ExtensionManagementServiceTest, NewInstallSources) { |
+ // Set the legacy preference, and verifies that it works. |
+ base::ListValue allowed_sites_pref; |
+ allowed_sites_pref.AppendString("https://www.example.com/foo"); |
+ SetPref( |
+ true, pref_names::kAllowedInstallSites, allowed_sites_pref.DeepCopy()); |
+ EXPECT_TRUE(extension_management_->ReadGlobalSettings() |
+ .has_restricted_install_sources); |
+ EXPECT_TRUE( |
+ extension_management_->ReadGlobalSettings() |
+ .install_sources.MatchesURL(GURL("https://www.example.com/foo"))); |
+ |
+ // Set the new dictionary preference. |
+ { |
+ PrefUpdater updater(pref_service_.get()); |
+ updater.ClearInstallSources(); |
+ } |
+ // Verifies that the new one overrides the legacy ones. |
+ EXPECT_TRUE(extension_management_->ReadGlobalSettings() |
+ .has_restricted_install_sources); |
+ EXPECT_FALSE( |
+ extension_management_->ReadGlobalSettings() |
+ .install_sources.MatchesURL(GURL("https://www.example.com/foo"))); |
+ |
+ // Updates the new dictionary preference. |
+ { |
+ PrefUpdater updater(pref_service_.get()); |
+ updater.AddInstallSource("https://corp.mycompany.com/*"); |
+ } |
+ EXPECT_TRUE(extension_management_->ReadGlobalSettings() |
+ .has_restricted_install_sources); |
+ EXPECT_TRUE(extension_management_->ReadGlobalSettings() |
+ .install_sources.MatchesURL( |
+ GURL("https://corp.mycompany.com/entry"))); |
+} |
+ |
+// Tests functionality of new preference as to deprecate legacy |
+// ExtensionAllowedTypes policy. |
+TEST_F(ExtensionManagementServiceTest, NewAllowedTypes) { |
+ // Set the legacy preference, and verifies that it works. |
+ base::ListValue allowed_types_pref; |
+ allowed_types_pref.AppendInteger(Manifest::TYPE_USER_SCRIPT); |
+ SetPref(true, pref_names::kAllowedTypes, allowed_types_pref.DeepCopy()); |
+ EXPECT_TRUE( |
+ extension_management_->ReadGlobalSettings().has_restricted_allowed_types); |
+ EXPECT_EQ(extension_management_->ReadGlobalSettings().allowed_types.size(), |
+ 1u); |
+ EXPECT_EQ(extension_management_->ReadGlobalSettings().allowed_types[0], |
+ Manifest::TYPE_USER_SCRIPT); |
+ |
+ // Set the new dictionary preference. |
+ { |
+ PrefUpdater updater(pref_service_.get()); |
+ updater.ClearAllowedTypes(); |
+ } |
+ // Verifies that the new one overrides the legacy ones. |
+ EXPECT_TRUE( |
+ extension_management_->ReadGlobalSettings().has_restricted_allowed_types); |
+ EXPECT_EQ(extension_management_->ReadGlobalSettings().allowed_types.size(), |
+ 0u); |
+ |
+ // Updates the new dictionary preference. |
+ { |
+ PrefUpdater updater(pref_service_.get()); |
+ updater.AddAllowedType("theme"); |
+ } |
+ EXPECT_TRUE( |
+ extension_management_->ReadGlobalSettings().has_restricted_allowed_types); |
+ EXPECT_EQ(extension_management_->ReadGlobalSettings().allowed_types.size(), |
+ 1u); |
+ EXPECT_EQ(extension_management_->ReadGlobalSettings().allowed_types[0], |
+ Manifest::TYPE_THEME); |
+} |
+ |
+// Tests functionality of new preference as to deprecate legacy |
+// ExtensionInstallBlacklist policy. |
+TEST_F(ExtensionManagementServiceTest, NewInstallBlacklist) { |
+ // Set the new dictionary preference. |
+ { |
+ PrefUpdater updater(pref_service_.get()); |
+ updater.SetBlacklistedByDefault(false); // Allowed by default. |
+ updater.SetIndividualExtensionInstallationAllowed(kTargetExtension, false); |
+ } |
+ EXPECT_FALSE(extension_management_->BlacklistedByDefault()); |
+ EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_BLOCKED); |
+ EXPECT_EQ(extension_management_->ReadById(kOtherExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_ALLOWED); |
+ |
+ // Set legacy preference. |
+ base::ListValue denied_list_pref; |
+ denied_list_pref.AppendString("*"); |
+ denied_list_pref.AppendString(kTargetExtension2); |
+ SetPref(true, pref_names::kInstallDenyList, denied_list_pref.DeepCopy()); |
+ |
+ base::ListValue allowed_list_pref; |
+ allowed_list_pref.AppendString(kTargetExtension); |
+ SetPref(true, pref_names::kInstallAllowList, allowed_list_pref.DeepCopy()); |
+ |
+ // Verifies that the new one have higher priority over the legacy ones. |
+ EXPECT_FALSE(extension_management_->BlacklistedByDefault()); |
+ EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_BLOCKED); |
+ EXPECT_EQ( |
+ extension_management_->ReadById(kTargetExtension2).installation_mode, |
+ ExtensionManagement::INSTALLATION_BLOCKED); |
+ EXPECT_EQ(extension_management_->ReadById(kOtherExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_ALLOWED); |
+} |
+ |
+// Tests functionality of new preference as to deprecate legacy |
+// ExtensionInstallWhitelist policy. |
+TEST_F(ExtensionManagementServiceTest, NewInstallWhitelist) { |
+ // Set the new dictionary preference. |
+ { |
+ PrefUpdater updater(pref_service_.get()); |
+ updater.SetBlacklistedByDefault(true); // Disallowed by default. |
+ updater.SetIndividualExtensionInstallationAllowed(kTargetExtension, true); |
+ } |
+ EXPECT_TRUE(extension_management_->BlacklistedByDefault()); |
+ EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_ALLOWED); |
+ EXPECT_EQ(extension_management_->ReadById(kOtherExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_BLOCKED); |
+ |
+ // Set legacy preference. |
+ base::ListValue denied_list_pref; |
+ denied_list_pref.AppendString(kTargetExtension); |
+ SetPref(true, pref_names::kInstallDenyList, denied_list_pref.DeepCopy()); |
+ |
+ base::ListValue allowed_list_pref; |
+ allowed_list_pref.AppendString(kTargetExtension2); |
+ SetPref(true, pref_names::kInstallAllowList, allowed_list_pref.DeepCopy()); |
+ |
+ // Verifies that the new one have higher priority over the legacy ones. |
+ EXPECT_TRUE(extension_management_->BlacklistedByDefault()); |
+ EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_ALLOWED); |
+ EXPECT_EQ( |
+ extension_management_->ReadById(kTargetExtension2).installation_mode, |
+ ExtensionManagement::INSTALLATION_ALLOWED); |
+ EXPECT_EQ(extension_management_->ReadById(kOtherExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_BLOCKED); |
+} |
+ |
+// Tests functionality of new preference as to deprecate legacy |
+// ExtensionInstallForcelist policy. |
+TEST_F(ExtensionManagementServiceTest, NewInstallForcelist) { |
+ // Set some legacy preferences, to verify that the new one overrides the |
+ // legacy ones. |
+ base::ListValue denied_list_pref; |
+ denied_list_pref.AppendString(kTargetExtension); |
+ SetPref(true, pref_names::kInstallDenyList, denied_list_pref.DeepCopy()); |
+ |
+ // Set the new dictionary preference. |
+ { |
+ PrefUpdater updater(pref_service_.get()); |
+ updater.SetIndividualExtensionAutoInstalled( |
+ kTargetExtension, kExampleUpdateUrl, true); |
+ } |
+ EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_FORCED); |
+ EXPECT_EQ(extension_management_->ReadById(kTargetExtension).update_url, |
+ kExampleUpdateUrl); |
+ EXPECT_EQ(extension_management_->ReadById(kOtherExtension).installation_mode, |
+ ExtensionManagement::INSTALLATION_ALLOWED); |
+} |
+ |
// Tests the flag value indicating that extensions are blacklisted by default. |
TEST_F(ExtensionAdminPolicyTest, BlacklistedByDefault) { |
EXPECT_FALSE(BlacklistedByDefault(NULL)); |