Chromium Code Reviews| 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 |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c90dab70a1118f29ce62f98647060650cc8b7191 |
| --- /dev/null |
| +++ b/chrome/browser/extensions/extension_management_unittest.cc |
| @@ -0,0 +1,178 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <algorithm> |
| + |
| +#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/external_policy_loader.h" |
| +#include "extensions/browser/pref_names.h" |
| +#include "extensions/common/url_pattern.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace extensions { |
| + |
| +namespace { |
| +const std::string kTargetExtension = "abcdefghijklmnopabcdefghijklmnop"; |
|
Joao da Silva
2014/09/02 19:34:02
Make this const char kTargetExtension[] = "..."; (
binjin
2014/09/02 20:02:56
Done.
|
| +const std::string kOtherExtension = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; |
| +const std::string kExampleUpdateUrl = "http://example.com/update_url"; |
| +}; |
|
Joao da Silva
2014/09/02 19:34:02
nit: no ";" when closing a namespace.
Add a comme
binjin
2014/09/02 20:02:56
Done.
|
| + |
| +class ExtensionManagementTest : public testing::Test { |
| + public: |
| + ExtensionManagementTest() {} |
| + virtual ~ExtensionManagementTest() {} |
| + |
| + // testing::Test: |
| + virtual void SetUp() OVERRIDE { |
| + pref_service_.reset(new TestingPrefServiceSimple()); |
|
Joao da Silva
2014/09/02 19:34:02
Why is this in a scoped_ptr and not just directly
binjin
2014/09/02 20:02:56
See below.
|
| + pref_service_->registry()->RegisterListPref( |
| + pref_names::kAllowedInstallSites); |
| + pref_service_->registry()->RegisterListPref(pref_names::kAllowedTypes); |
| + pref_service_->registry()->RegisterListPref(pref_names::kInstallDenyList); |
| + pref_service_->registry()->RegisterListPref(pref_names::kInstallAllowList); |
| + pref_service_->registry()->RegisterDictionaryPref( |
| + pref_names::kInstallForceList); |
| + extension_management_.reset(new ExtensionManagement(pref_service_.get())); |
|
Joao da Silva
2014/09/02 19:34:02
Same for this one, can't it be directly used as a
binjin
2014/09/02 20:02:56
See below.
|
| + } |
| + |
| + virtual void TearDown() OVERRIDE { |
| + extension_management_.reset(); |
| + pref_service_.reset(); |
|
Joao da Silva
2014/09/02 19:34:02
Is this TearDown needed?
binjin
2014/09/02 20:02:56
Because extension_management_ doesn't own pref_ser
Joao da Silva
2014/09/03 09:20:40
They will be destroyed in the reverse order of dec
binjin
2014/09/03 11:28:21
I see. But in the following CL I need to reset bot
|
| + } |
| + |
| + void SetPref(bool managed, const char* path, base::Value* value) { |
| + if (managed) |
| + pref_service_->SetManagedPref(path, value); |
| + else |
| + pref_service_->SetUserPref(path, value); |
| + } |
| + |
| + void RemovePref(bool managed, const char* path) { |
| + if (managed) |
| + pref_service_->RemoveManagedPref(path); |
| + else |
| + pref_service_->RemoveUserPref(path); |
| + } |
| + |
| + void Refresh() { |
| + extension_management_->Refresh(); |
| + } |
| + |
| + protected: |
| + scoped_ptr<TestingPrefServiceSimple> pref_service_; |
| + scoped_ptr<ExtensionManagement> extension_management_; |
| +}; |
| + |
| +// Verify that preference controlled by legacy ExtensionInstallSources policy is |
| +// handled well. |
| +TEST_F(ExtensionManagementTest, LegacyInstallSources) { |
| + base::ListValue allowed_sites_pref; |
| + allowed_sites_pref.AppendString("https://www.example.com/foo"); |
| + 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.get(); |
| + ASSERT_TRUE(allowed_sites); |
| + EXPECT_FALSE(allowed_sites->is_empty()); |
| + EXPECT_TRUE(allowed_sites->MatchesURL(GURL("https://www.example.com/foo"))); |
| + EXPECT_FALSE(allowed_sites->MatchesURL(GURL("https://www.example.com/bar"))); |
| + EXPECT_TRUE( |
| + allowed_sites->MatchesURL(GURL("https://corp.mycompany.com/entry"))); |
| + EXPECT_FALSE( |
| + allowed_sites->MatchesURL(GURL("https://www.mycompany.com/entry"))); |
| +} |
| + |
| +// Verify that preference controlled by legacy ExtensionAllowedTypes policy is |
| +// handled well. |
| +TEST_F(ExtensionManagementTest, LegacyAllowedTypes) { |
| + base::ListValue allowed_types_pref; |
| + allowed_types_pref.AppendInteger(Manifest::TYPE_THEME); |
| + 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.get(); |
| + ASSERT_TRUE(allowed_types); |
| + EXPECT_TRUE(allowed_types->size() == 2); |
| + EXPECT_FALSE(find(allowed_types->begin(), |
|
Joao da Silva
2014/09/02 19:34:02
Use Contains from base/stl_util.h
binjin
2014/09/02 20:02:56
stl_util.h only provide ContainsKey for containers
|
| + allowed_types->end(), |
| + Manifest::TYPE_EXTENSION) != allowed_types->end()); |
| + EXPECT_TRUE(find(allowed_types->begin(), |
| + allowed_types->end(), |
| + Manifest::TYPE_THEME) != allowed_types->end()); |
| + EXPECT_TRUE(find(allowed_types->begin(), |
| + allowed_types->end(), |
| + Manifest::TYPE_USER_SCRIPT) != allowed_types->end()); |
| +} |
| + |
| +// Verify that preference controlled by legacy ExtensionInstallBlacklist policy |
| +// is handled well. |
| +TEST_F(ExtensionManagementTest, LegacyInstallBlacklist) { |
| + base::ListValue denied_list_pref; |
| + 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, |
| + ExtensionManagement::INSTALLATION_ALLOWED); |
| +} |
| + |
| +// Verify that preference controlled by legacy ExtensionInstallWhitelist policy |
| +// is handled well. |
| +TEST_F(ExtensionManagementTest, LegacyInstallWhitelist) { |
| + base::ListValue denied_list_pref; |
| + denied_list_pref.AppendString("*"); |
| + base::ListValue allowed_list_pref; |
| + allowed_list_pref.AppendString(kTargetExtension); |
| + |
| + 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, |
| + ExtensionManagement::INSTALLATION_BLOCKED); |
| + |
| + // 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); |
| +} |
| + |
| +// Verify that preference controlled by legacy ExtensionInstallForcelist policy |
| +// is handled well. |
| +TEST_F(ExtensionManagementTest, LegacyInstallForcelist) { |
| + base::DictionaryValue forced_list_pref; |
| + ExternalPolicyLoader::AddExtension( |
| + &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, |
| + kExampleUpdateUrl); |
| + EXPECT_EQ(extension_management_->ReadById(kOtherExtension).installation_mode, |
| + ExtensionManagement::INSTALLATION_ALLOWED); |
| + |
| + // 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); |
| +} |
| + |
| +} // namespace extensions |