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 6ecc8ccdc0b8381d7fb11555b7aad52271ac22b2..1aad76b4049f8738d04b403fbdaca331c9ac51a0 100644 |
--- a/chrome/browser/extensions/extension_management_unittest.cc |
+++ b/chrome/browser/extensions/extension_management_unittest.cc |
@@ -11,6 +11,7 @@ |
#include "chrome/browser/extensions/extension_management.h" |
#include "chrome/browser/extensions/external_policy_loader.h" |
#include "extensions/browser/pref_names.h" |
+#include "extensions/common/manifest_constants.h" |
#include "extensions/common/url_pattern.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -29,6 +30,16 @@ class ExtensionManagementTest : public testing::Test { |
// testing::Test: |
virtual void SetUp() OVERRIDE { |
+ InitPrefService(); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ extension_management_.reset(); |
+ pref_service_.reset(); |
+ } |
+ |
+ void InitPrefService() { |
+ extension_management_.reset(); |
pref_service_.reset(new TestingPrefServiceSimple()); |
pref_service_->registry()->RegisterListPref( |
pref_names::kAllowedInstallSites); |
@@ -40,11 +51,6 @@ class ExtensionManagementTest : public testing::Test { |
extension_management_.reset(new ExtensionManagement(pref_service_.get())); |
} |
- virtual void TearDown() OVERRIDE { |
- extension_management_.reset(); |
- pref_service_.reset(); |
- } |
- |
void SetPref(bool managed, const char* path, base::Value* value) { |
if (managed) |
pref_service_->SetManagedPref(path, value); |
@@ -59,15 +65,95 @@ class ExtensionManagementTest : public testing::Test { |
pref_service_->RemoveUserPref(path); |
} |
- void Refresh() { |
- extension_management_->Refresh(); |
- } |
- |
protected: |
scoped_ptr<TestingPrefServiceSimple> pref_service_; |
scoped_ptr<ExtensionManagement> extension_management_; |
}; |
+class ExtensionAdminPolicyTest : public ExtensionManagementTest { |
+ public: |
+ ExtensionAdminPolicyTest() {} |
+ virtual ~ExtensionAdminPolicyTest() {} |
+ |
+ void CreateExtension(Manifest::Location location) { |
+ base::DictionaryValue values; |
+ CreateExtensionFromValues(location, &values); |
+ } |
+ |
+ void CreateHostedApp(Manifest::Location location) { |
+ base::DictionaryValue values; |
+ values.Set(extensions::manifest_keys::kWebURLs, new base::ListValue()); |
+ values.SetString(extensions::manifest_keys::kLaunchWebURL, |
+ "http://www.example.com"); |
+ CreateExtensionFromValues(location, &values); |
+ } |
+ |
+ void CreateExtensionFromValues(Manifest::Location location, |
+ base::DictionaryValue* values) { |
+ values->SetString(extensions::manifest_keys::kName, "test"); |
+ values->SetString(extensions::manifest_keys::kVersion, "0.1"); |
+ std::string error; |
+ extension_ = Extension::Create(base::FilePath(), location, *values, |
+ Extension::NO_FLAGS, &error); |
+ ASSERT_TRUE(extension_.get()); |
+ } |
+ |
+ // Wrappers for legacy admin policy functions, for testing purpose only. |
+ bool BlacklistedByDefault(const base::ListValue* blacklist); |
+ bool UserMayLoad(const base::ListValue* blacklist, |
+ const base::ListValue* whitelist, |
+ const base::DictionaryValue* forcelist, |
+ const base::ListValue* allowed_types, |
+ const Extension* extension, |
+ base::string16* error); |
+ bool UserMayModifySettings(const Extension* extension, base::string16* error); |
+ bool MustRemainEnabled(const Extension* extension, base::string16* error); |
+ |
+ protected: |
+ scoped_refptr<Extension> extension_; |
+}; |
+ |
+bool ExtensionAdminPolicyTest::BlacklistedByDefault( |
+ const base::ListValue* blacklist) { |
+ InitPrefService(); |
+ if (blacklist) |
+ SetPref(true, pref_names::kInstallDenyList, blacklist->DeepCopy()); |
+ return extension_management_->BlacklistedByDefault(); |
+} |
+ |
+bool ExtensionAdminPolicyTest::UserMayLoad( |
+ const base::ListValue* blacklist, |
+ const base::ListValue* whitelist, |
+ const base::DictionaryValue* forcelist, |
+ const base::ListValue* allowed_types, |
+ const Extension* extension, |
+ base::string16* error) { |
+ InitPrefService(); |
+ if (blacklist) |
+ SetPref(true, pref_names::kInstallDenyList, blacklist->DeepCopy()); |
+ if (whitelist) |
+ SetPref(true, pref_names::kInstallAllowList, whitelist->DeepCopy()); |
+ if (forcelist) |
+ SetPref(true, pref_names::kInstallForceList, forcelist->DeepCopy()); |
+ if (allowed_types) |
+ SetPref(true, pref_names::kAllowedTypes, allowed_types->DeepCopy()); |
+ return extension_management_->GetProvider()->UserMayLoad(extension, error); |
+} |
+ |
+bool ExtensionAdminPolicyTest::UserMayModifySettings(const Extension* extension, |
+ base::string16* error) { |
+ InitPrefService(); |
+ return extension_management_->GetProvider()->UserMayModifySettings(extension, |
+ error); |
+} |
+ |
+bool ExtensionAdminPolicyTest::MustRemainEnabled(const Extension* extension, |
+ base::string16* error) { |
+ InitPrefService(); |
+ return extension_management_->GetProvider()->MustRemainEnabled(extension, |
+ error); |
+} |
+ |
// Verify that preference controlled by legacy ExtensionInstallSources policy is |
// handled well. |
TEST_F(ExtensionManagementTest, LegacyInstallSources) { |
@@ -76,7 +162,6 @@ TEST_F(ExtensionManagementTest, LegacyInstallSources) { |
allowed_sites_pref.AppendString("https://corp.mycompany.com/*"); |
SetPref( |
true, pref_names::kAllowedInstallSites, allowed_sites_pref.DeepCopy()); |
- Refresh(); |
const URLPatternSet& allowed_sites = |
extension_management_->ReadGlobalSettings().install_sources; |
ASSERT_TRUE(extension_management_->ReadGlobalSettings() |
@@ -98,7 +183,6 @@ TEST_F(ExtensionManagementTest, LegacyAllowedTypes) { |
allowed_types_pref.AppendInteger(Manifest::TYPE_USER_SCRIPT); |
SetPref(true, pref_names::kAllowedTypes, allowed_types_pref.DeepCopy()); |
- Refresh(); |
const std::vector<Manifest::Type>& allowed_types = |
extension_management_->ReadGlobalSettings().allowed_types; |
ASSERT_TRUE( |
@@ -122,7 +206,6 @@ TEST_F(ExtensionManagementTest, LegacyInstallBlacklist) { |
denied_list_pref.AppendString(kTargetExtension); |
SetPref(true, pref_names::kInstallDenyList, denied_list_pref.DeepCopy()); |
- Refresh(); |
EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
ExtensionManagement::INSTALLATION_BLOCKED); |
EXPECT_EQ(extension_management_->ReadById(kOtherExtension).installation_mode, |
@@ -139,7 +222,6 @@ TEST_F(ExtensionManagementTest, LegacyInstallWhitelist) { |
SetPref(true, pref_names::kInstallDenyList, denied_list_pref.DeepCopy()); |
SetPref(true, pref_names::kInstallAllowList, allowed_list_pref.DeepCopy()); |
- Refresh(); |
EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
ExtensionManagement::INSTALLATION_ALLOWED); |
EXPECT_EQ(extension_management_->ReadById(kOtherExtension).installation_mode, |
@@ -148,7 +230,6 @@ TEST_F(ExtensionManagementTest, LegacyInstallWhitelist) { |
// Verify that install whitelist preference set by user is ignored. |
RemovePref(true, pref_names::kInstallAllowList); |
SetPref(false, pref_names::kInstallAllowList, allowed_list_pref.DeepCopy()); |
- Refresh(); |
EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
ExtensionManagement::INSTALLATION_BLOCKED); |
} |
@@ -161,7 +242,6 @@ TEST_F(ExtensionManagementTest, LegacyInstallForcelist) { |
&forced_list_pref, kTargetExtension, kExampleUpdateUrl); |
SetPref(true, pref_names::kInstallForceList, forced_list_pref.DeepCopy()); |
- Refresh(); |
EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
ExtensionManagement::INSTALLATION_FORCED); |
EXPECT_EQ(extension_management_->ReadById(kTargetExtension).update_url, |
@@ -172,9 +252,156 @@ TEST_F(ExtensionManagementTest, LegacyInstallForcelist) { |
// Verify that install forcelist preference set by user is ignored. |
RemovePref(true, pref_names::kInstallForceList); |
SetPref(false, pref_names::kInstallForceList, forced_list_pref.DeepCopy()); |
- Refresh(); |
EXPECT_EQ(extension_management_->ReadById(kTargetExtension).installation_mode, |
ExtensionManagement::INSTALLATION_ALLOWED); |
} |
+// Tests the flag value indicating that extensions are blacklisted by default. |
+TEST_F(ExtensionAdminPolicyTest, BlacklistedByDefault) { |
+ EXPECT_FALSE(BlacklistedByDefault(NULL)); |
+ |
+ base::ListValue blacklist; |
+ blacklist.Append(new base::StringValue(kOtherExtension)); |
+ EXPECT_FALSE(BlacklistedByDefault(&blacklist)); |
+ blacklist.Append(new base::StringValue("*")); |
+ EXPECT_TRUE(BlacklistedByDefault(&blacklist)); |
+ |
+ blacklist.Clear(); |
+ blacklist.Append(new base::StringValue("*")); |
+ EXPECT_TRUE(BlacklistedByDefault(&blacklist)); |
+} |
+ |
+// Tests UserMayLoad for required extensions. |
+TEST_F(ExtensionAdminPolicyTest, UserMayLoadRequired) { |
+ CreateExtension(Manifest::COMPONENT); |
+ EXPECT_TRUE(UserMayLoad(NULL, NULL, NULL, NULL, extension_.get(), NULL)); |
+ base::string16 error; |
+ EXPECT_TRUE(UserMayLoad(NULL, NULL, NULL, NULL, extension_.get(), &error)); |
+ EXPECT_TRUE(error.empty()); |
+ |
+ // Required extensions may load even if they're on the blacklist. |
+ base::ListValue blacklist; |
+ blacklist.Append(new base::StringValue(extension_->id())); |
+ EXPECT_TRUE( |
+ UserMayLoad(&blacklist, NULL, NULL, NULL, extension_.get(), NULL)); |
+ |
+ blacklist.Append(new base::StringValue("*")); |
+ EXPECT_TRUE( |
+ UserMayLoad(&blacklist, NULL, NULL, NULL, extension_.get(), NULL)); |
+} |
+ |
+// Tests UserMayLoad when no blacklist exists, or it's empty. |
+TEST_F(ExtensionAdminPolicyTest, UserMayLoadNoBlacklist) { |
+ CreateExtension(Manifest::INTERNAL); |
+ EXPECT_TRUE(UserMayLoad(NULL, NULL, NULL, NULL, extension_.get(), NULL)); |
+ base::ListValue blacklist; |
+ EXPECT_TRUE( |
+ UserMayLoad(&blacklist, NULL, NULL, NULL, extension_.get(), NULL)); |
+ base::string16 error; |
+ EXPECT_TRUE( |
+ UserMayLoad(&blacklist, NULL, NULL, NULL, extension_.get(), &error)); |
+ EXPECT_TRUE(error.empty()); |
+} |
+ |
+// Tests UserMayLoad for an extension on the whitelist. |
+TEST_F(ExtensionAdminPolicyTest, UserMayLoadWhitelisted) { |
+ CreateExtension(Manifest::INTERNAL); |
+ |
+ base::ListValue whitelist; |
+ whitelist.Append(new base::StringValue(extension_->id())); |
+ EXPECT_TRUE( |
+ UserMayLoad(NULL, &whitelist, NULL, NULL, extension_.get(), NULL)); |
+ |
+ base::ListValue blacklist; |
+ blacklist.Append(new base::StringValue(extension_->id())); |
+ EXPECT_TRUE( |
+ UserMayLoad(NULL, &whitelist, NULL, NULL, extension_.get(), NULL)); |
+ base::string16 error; |
+ EXPECT_TRUE( |
+ UserMayLoad(NULL, &whitelist, NULL, NULL, extension_.get(), &error)); |
+ EXPECT_TRUE(error.empty()); |
+} |
+ |
+// Tests UserMayLoad for an extension on the blacklist. |
+TEST_F(ExtensionAdminPolicyTest, UserMayLoadBlacklisted) { |
+ CreateExtension(Manifest::INTERNAL); |
+ |
+ // Blacklisted by default. |
+ base::ListValue blacklist; |
+ blacklist.Append(new base::StringValue("*")); |
+ EXPECT_FALSE( |
+ UserMayLoad(&blacklist, NULL, NULL, NULL, extension_.get(), NULL)); |
+ base::string16 error; |
+ EXPECT_FALSE( |
+ UserMayLoad(&blacklist, NULL, NULL, NULL, extension_.get(), &error)); |
+ EXPECT_FALSE(error.empty()); |
+ |
+ // Extension on the blacklist, with and without wildcard. |
+ blacklist.Append(new base::StringValue(extension_->id())); |
+ EXPECT_FALSE( |
+ UserMayLoad(&blacklist, NULL, NULL, NULL, extension_.get(), NULL)); |
+ blacklist.Clear(); |
+ blacklist.Append(new base::StringValue(extension_->id())); |
+ EXPECT_FALSE( |
+ UserMayLoad(&blacklist, NULL, NULL, NULL, extension_.get(), NULL)); |
+ |
+ // With a whitelist. There's no such thing as a whitelist wildcard. |
+ base::ListValue whitelist; |
+ whitelist.Append(new base::StringValue("behllobkkfkfnphdnhnkndlbkcpglgmj")); |
+ EXPECT_FALSE( |
+ UserMayLoad(&blacklist, &whitelist, NULL, NULL, extension_.get(), NULL)); |
+ whitelist.Append(new base::StringValue("*")); |
+ EXPECT_FALSE( |
+ UserMayLoad(&blacklist, &whitelist, NULL, NULL, extension_.get(), NULL)); |
+} |
+ |
+TEST_F(ExtensionAdminPolicyTest, UserMayLoadAllowedTypes) { |
+ CreateExtension(Manifest::INTERNAL); |
+ EXPECT_TRUE(UserMayLoad(NULL, NULL, NULL, NULL, extension_.get(), NULL)); |
+ |
+ base::ListValue allowed_types; |
+ EXPECT_FALSE( |
+ UserMayLoad(NULL, NULL, NULL, &allowed_types, extension_.get(), NULL)); |
+ |
+ allowed_types.AppendInteger(Manifest::TYPE_EXTENSION); |
+ EXPECT_TRUE( |
+ UserMayLoad(NULL, NULL, NULL, &allowed_types, extension_.get(), NULL)); |
+ |
+ CreateHostedApp(Manifest::INTERNAL); |
+ EXPECT_FALSE( |
+ UserMayLoad(NULL, NULL, NULL, &allowed_types, extension_.get(), NULL)); |
+ |
+ CreateHostedApp(Manifest::EXTERNAL_POLICY_DOWNLOAD); |
+ EXPECT_FALSE( |
+ UserMayLoad(NULL, NULL, NULL, &allowed_types, extension_.get(), NULL)); |
+} |
+ |
+TEST_F(ExtensionAdminPolicyTest, UserMayModifySettings) { |
+ CreateExtension(Manifest::INTERNAL); |
+ EXPECT_TRUE(UserMayModifySettings(extension_.get(), NULL)); |
+ base::string16 error; |
+ EXPECT_TRUE(UserMayModifySettings(extension_.get(), &error)); |
+ EXPECT_TRUE(error.empty()); |
+ |
+ CreateExtension(Manifest::EXTERNAL_POLICY_DOWNLOAD); |
+ error.clear(); |
+ EXPECT_FALSE(UserMayModifySettings(extension_.get(), NULL)); |
+ EXPECT_FALSE(UserMayModifySettings(extension_.get(), &error)); |
+ EXPECT_FALSE(error.empty()); |
+} |
+ |
+TEST_F(ExtensionAdminPolicyTest, MustRemainEnabled) { |
+ CreateExtension(Manifest::EXTERNAL_POLICY_DOWNLOAD); |
+ EXPECT_TRUE(MustRemainEnabled(extension_.get(), NULL)); |
+ base::string16 error; |
+ EXPECT_TRUE(MustRemainEnabled(extension_.get(), &error)); |
+ EXPECT_FALSE(error.empty()); |
+ |
+ CreateExtension(Manifest::INTERNAL); |
+ error.clear(); |
+ EXPECT_FALSE(MustRemainEnabled(extension_.get(), NULL)); |
+ EXPECT_FALSE(MustRemainEnabled(extension_.get(), &error)); |
+ EXPECT_TRUE(error.empty()); |
+} |
+ |
} // namespace extensions |